protected override async Task HandleAsync(NodeStartedReport request, IList <OutgoingMessage> outgoingMessages, CancellationToken cToken) { var node = await _findNodeQuery.BySignatureAsync(request.Signature, NodeInclude.Metadata | NodeInclude.AggregatedData); if (node == default(Node)) { Logger.Info(() => $"Node not found based on signature {request.Signature}. A node will be created."); var rfId = _rfIdGenerationStrategy.FindAvailableRfAddress(); node = await _createNodeCommand.ExecuteAsync(request.Signature, rfId, request.NodeType); } _nodeLogger.Log(node, "STRT"); node.Metadata.Version = request.Version; node.AggregatedData.NodeStartCount = request.StartCount; node.AggregatedData.StartupTime = _timeProvider.UtcNow; node.Metadata.NodeType = request.NodeType; _touchNode.Touch(node, request.Rssi); outgoingMessages.Add(new NodeConfigCommand { Signature = request.Signature, ToRfAddress = request.FromRfAddress, NewRfAddress = node.RfAddress, ExtraFeatures = node.Metadata.ExtraFeatures }); }
protected override async Task HandleAsync(PulseReport request, IList <OutgoingMessage> outgoingMessages, CancellationToken cToken) { var node = await _findNodeQuery.ByRfIdAsync(request.FromRfAddress, NodeInclude.AggregatedData | NodeInclude.Ports); if (node == null) { throw new NodeNotFoundException(request.FromRfAddress); } _touchNode.Touch(node, request.Rssi); var port = node.Ports.OfType <PulseSensor>().SingleOrDefault(_ => _.PortNumber == request.PortNumber); if (port == null) { node.Ports.Add(port = new PulseSensor() { Node = node, PortNumber = request.PortNumber, PulseCount = 0, }); } port.PulseCount += request.NewPulse; port.History = new List <PulseHistory> { new PulseHistory { Timestamp = _timeProvider.UtcNow, Rssi = request.Rssi, NewPulses = request.NewPulse, Total = port.PulseCount, } }; }
protected override async Task HandleAsync(ActionConfirmedReport request, IList <OutgoingMessage> outgoingMessages, CancellationToken cToken) { if (request.ConfigmedAction is SetRelayStateCommand srCommand) { var port = await _findPortQuery.ByNodeRfAndPortNumberAsyn(srCommand.ToRfAddress, srCommand.PortNumber, PortInclude.NodeAggregatedData); if (port == null) { throw new ArgumentException($"Port {srCommand.PortNumber} on Node with rfAdr {srCommand.ToRfAddress} was not found in databse."); } _touchNode.Touch(port.Node, request.Rssi); if (port is RelayActuator raPort) { raPort.RelayState = (OnOffState)srCommand.NewState; raPort.History = new List <RelayHistory> { new RelayHistory { Rssi = request.Rssi, Timestamp = _timeProvider.UtcNow, NewRelayState = (OnOffState)srCommand.NewState, } }; } else { throw new ArgumentException($"Port {srCommand.PortNumber} on Node with rfAdr {srCommand.ToRfAddress} does not seems to of type {nameof(RelayActuator)}"); } } }
protected override async Task HandleAsync(PushButtonPressedReport request, IList <OutgoingMessage> outgoingMessages, CancellationToken cToken) { var node = await _findNodeQuery.ByRfIdAsync(request.FromRfAddress, NodeInclude.AggregatedData | NodeInclude.Ports); if (node == null) { throw new NodeNotFoundException(request.FromRfAddress); } _touchNode.Touch(node, request.Rssi); var port = node.Ports.OfType <PushButtonSensor>().SingleOrDefault(_ => _.PortNumber == request.PortNumber); if (port == null) { if (request.PortNumber < (byte)ReservedPortNumber.Last) { throw new ArgumentException($"PortNumber {request.PortNumber} is reserved."); } if (node.Ports.Any(x => x.PortNumber == request.PortNumber)) { throw new ArgumentException("A port already exist with that number that is not of type PushButton"); } node.Ports.Add(port = new PushButtonSensor() { Node = node, PortNumber = request.PortNumber, }); } port.LastPressStyle = request.PressStyle; port.History = new List <PushButtonHistory> { new PushButtonHistory() { Timestamp = _timeProvider.UtcNow, Rssi = request.Rssi, PressStyle = request.PressStyle, } }; //Check for trigger var triggers = await _findTriggersForPortQuery.ByPortIdAsync <PushTrigger>(port.Id, cToken); foreach (var trigger in triggers) { if (trigger.PressStyle == request.PressStyle) { var actions = _coreLogic.GetActionsFor(trigger); foreach (var a in actions) { outgoingMessages.Add(_actionToCommandMapper.Map(a)); } } } }
protected override async Task HandleAsync(EnvironmentalReport request, IList <OutgoingMessage> outgoingMessages, CancellationToken cToken) { var node = await _findNodeQuery.ByRfIdAsync(request.FromRfAddress, NodeInclude.AggregatedData | NodeInclude.Ports); if (node == null) { throw new NodeNotFoundException(request.FromRfAddress); } _touchNode.Touch(node, request.Rssi); var envPort = node.Ports.OfType <EnvironmentSensor>().SingleOrDefault(); if (envPort == null) { envPort = new EnvironmentSensor { PortNumber = (byte)ReservedPortNumber.Environment, Name = "Env", UpdateFrequency = 1, }; node.Ports.Add(envPort); } envPort.History = new List <EnvironmentHistory> { new EnvironmentHistory { Humidity = request.Humidity, Temperature = request.Temperature, Pressure = request.Pressure, Rssi = request.Rssi, Timestamp = _timeProvider.UtcNow } }; node.AggregatedData.Humidity = request.Humidity; node.AggregatedData.Temperature = request.Temperature; node.AggregatedData.AtmosphericPressure = request.Pressure; }
protected override async Task HandleAsync(NodeInfoReport request, IList <OutgoingMessage> outgoingMessages, CancellationToken cToken) { var node = await _findNodeQuery.ByRfIdAsync(request.FromRfAddress, NodeInclude.AggregatedData | NodeInclude.Ports); if (node == null) { throw new NodeNotFoundException(request.FromRfAddress); } _touchNode.Touch(node, request.Rssi); var healthPort = node.Ports.OfType <NodeHealthSensor>().SingleOrDefault(); if (healthPort == null) { healthPort = new NodeHealthSensor { PortNumber = (byte)ReservedPortNumber.NodeHealth, Name = "Health", UpdateFrequency = 1, }; node.Ports.Add(healthPort); } healthPort.History = new List <NodeHealthHistory> { new NodeHealthHistory { Timestamp = _timeProvider.UtcNow, Rssi = request.Rssi, SendErrorCount = request.SendErrorCount, VIn = request.Voltage, } }; node.AggregatedData.SendErrorCount = request.SendErrorCount; node.AggregatedData.VIn = request.Voltage; }