Ejemplo n.º 1
0
        public object BuildSensorWebModel(Sensor sensor)
        {
            if (sensor == null)
                return null;

            return new
            {
                Id = sensor.Id,
                Name = sensor.Name
            };
        }
Ejemplo n.º 2
0
        public object BuildSensorRichWebModel(Sensor sensor)
        {
            if (sensor == null)
                return null;

            List<SensorValue> svs = GetSensorValues(sensor, 10);

            return new
            {
                Id = sensor.Id,
                Name = sensor.Name,
                NodeNo = sensor.NodeNo,
                SensorNo = sensor.SensorNo,
                TypeName = sensor.TypeName,
                ProtocolVersion = sensor.ProtocolVersion,
                SensorValues = svs.ToArray(),
                SensorValueValue = svs.Count == 0 ? (float?)null : svs.Last().Value,
                SensorValueTimeStamp = svs.Count == 0 ? (DateTime?)null : svs.Last().TimeStamp
            };
        }
Ejemplo n.º 3
0
 public static bool IsMessageFromSensor(SensorMessage msg, Sensor sensor)
 {
     return msg != null && sensor != null && sensor.NodeNo == msg.NodeNo && sensor.SensorNo == msg.SensorNo;
 }
Ejemplo n.º 4
0
        private void ProcessSensorMessage(SensorMessage message)
        {
            Debug.WriteLine(message.ToString());

            bool isNodeMessage = message.NodeNo == 0 || message.SensorNo == 255;
            Node node = GetNode(message.NodeNo);
            Sensor sensor = GetSensor(message.NodeNo, message.SensorNo); // if message.SensorID == 255 it returns null

            switch (message.Type)
            {
                #region Presentation
                case SensorMessageType.Presentation: // sent by a nodes when they present attached sensors.
                    if (isNodeMessage)
                    {
                        if (node == null)
                        {
                            node = new Node
                            {
                                Id = Guid.NewGuid(),
                                NodeNo = message.NodeNo,
                                Type = (SensorType)message.SubType,
                                ProtocolVersion = message.Payload
                            };

                            Save(node);
                        }
                        else
                        {
                            node.Type = (SensorType)message.SubType;
                            node.ProtocolVersion = message.Payload;

                            SaveOrUpdate(node);
                        }

                        NotifyMessageReceivedForPlugins(message);
                        NotifyMessageReceivedForScripts(message);
                        NotifyForSignalR(new { MsgId = "NodePresentation", Data = BuildNodeRichWebModel(node) });
                    }
                    else // sensor message
                    {
                        if (node != null)
                        {
                            if (sensor == null)
                            {
                                sensor = new Sensor()
                                {
                                    Id = Guid.NewGuid(),
                                    NodeNo = node.NodeNo,
                                    SensorNo = message.SensorNo,
                                    Type = (SensorType)message.SubType,
                                    ProtocolVersion = message.Payload
                                };

                                Save(sensor);
                            }
                            else
                            {
                                sensor.Type = (SensorType)message.SubType;
                                sensor.ProtocolVersion = message.Payload;

                                SaveOrUpdate(sensor);
                            }

                            NotifyMessageReceivedForPlugins(message);
                            NotifyMessageReceivedForScripts(message);
                            NotifyForSignalR(new { MsgId = "SensorPresentation", Data = BuildSensorRichWebModel(sensor) });
                        }
                    }
                    break;
                #endregion

                #region Set
                case SensorMessageType.Set: // sent from or to a sensor when a sensor value should be updated
                    if (sensor != null)
                    {
                        NotifyMessageCalibrationForPlugins(message); // before saving to DB plugins may adjust the sensor value due to their calibration params
                        var sv = SaveSensorValueToDB(message);

                        NotifyForSignalR(new { MsgId = "MySensorsTileContent", Data = BuildTileContent() }); // update MySensors tile

                        NotifyMessageReceivedForPlugins(message);
                        NotifyMessageReceivedForScripts(message);
                        NotifyForSignalR(new { MsgId = "SensorValue", Data = sv }); // notify Web UI
                    }
                    break;
                #endregion

                #region Request
                case SensorMessageType.Request: // requests a variable value (usually from an actuator destined for controller)
                    break;
                #endregion

                #region Internal
                case SensorMessageType.Internal: // special internal message
                    InternalValueType ivt = (InternalValueType)message.SubType;

                    switch (ivt)
                    {
                        case InternalValueType.BatteryLevel: // int, in %
                            if (node != null)
                            {
                                var dtDB = DateTime.UtcNow;
                                var dt = DateTime.Now;

                                BatteryLevel bl = new BatteryLevel()
                                {
                                    Id = Guid.NewGuid(),
                                    NodeNo = message.NodeNo,
                                    TimeStamp = dtDB,
                                    Level = byte.Parse(message.Payload)
                                };

                                Save(bl);

                                bl.TimeStamp = dt;

                                NotifyMessageReceivedForPlugins(message);
                                NotifyMessageReceivedForScripts(message);
                                NotifyForSignalR(new { MsgId = "BatteryLevel", Data = bl });
                            }
                            break;
                        case InternalValueType.Time:
                            var result = Convert.ToInt64(DateTime.Now.Subtract(unixEpoch).TotalSeconds).ToString();
                            gatewayProxy.Send(new SensorMessage(message.NodeNo, message.SensorNo, SensorMessageType.Internal, false, (byte)InternalValueType.Time, result));
                            break;
                        case InternalValueType.Version:
                            break;
                        case InternalValueType.IDRequest:
                            GetNextAvailableNodeID();
                            break;
                        case InternalValueType.IDResponse:
                            break;
                        case InternalValueType.InclusionMode:
                            break;
                        case InternalValueType.Config:
                            gatewayProxy.Send(new SensorMessage(message.NodeNo, 255, SensorMessageType.Internal, false, (byte)InternalValueType.Config, GetSetting("UnitSystem").Value));
                            break;
                        case InternalValueType.FindParent:
                            break;
                        case InternalValueType.FindParentResponse:
                            break;
                        case InternalValueType.LogMessage:
                            break;
                        case InternalValueType.Children:
                            break;
                        case InternalValueType.SketchName:
                        case InternalValueType.SketchVersion:
                            if (node != null)
                            {
                                if (ivt == InternalValueType.SketchName)
                                    node.SketchName = message.Payload;
                                else
                                    node.SketchVersion = message.Payload;

                                SaveOrUpdate(node);

                                NotifyMessageReceivedForPlugins(message);
                                NotifyMessageReceivedForScripts(message);
                                NotifyForSignalR(new { MsgId = "NodePresentation", Data = BuildNodeRichWebModel(node) });
                            }
                            break;
                        case InternalValueType.Reboot:
                            break;
                        case InternalValueType.GatewayReady:
                            break;
                    }
                    break;
                #endregion

                #region Stream
                case SensorMessageType.Stream: //used for OTA firmware updates
                    switch ((StreamValueType)message.SubType)
                    {
                        case StreamValueType.FirmwareConfigRequest:
                            //var fwtype = pullWord(payload, 0);
                            //var fwversion = pullWord(payload, 2);
                            //sendFirmwareConfigResponse(sender, fwtype, fwversion, db, gw);
                            break;
                        case StreamValueType.FirmwareConfigResponse:
                            break;
                        case StreamValueType.FirmwareRequest:
                            break;
                        case StreamValueType.FirmwareResponse:
                            //var fwtype = pullWord(payload, 0);
                            //var fwversion = pullWord(payload, 2);
                            //var fwblock = pullWord(payload, 4);
                            //sendFirmwareResponse(sender, fwtype, fwversion, fwblock, db, gw);
                            break;
                        case StreamValueType.Sound:
                            break;
                        case StreamValueType.Image:
                            break;
                    }
                    break;
                #endregion
            }

            CheckRebootRequest(node);
        }
Ejemplo n.º 5
0
 public SensorValue GetLastSensorValue(Sensor sensor)
 {
     return sensor != null ? GetLastSensorValue(sensor.NodeNo, sensor.SensorNo) : null;
 }
Ejemplo n.º 6
0
 //public List<SensorValue> GetSensorValues(Sensor sensor, int hours, int count)
 //{
 //    return sensor != null ? GetSensorValues(sensor.NodeNo, sensor.SensorNo, hours, count) : new List<SensorValue>();
 //}
 public List<SensorValue> GetSensorValues(Sensor sensor, int count)
 {
     return sensor != null ? GetSensorValues(sensor.NodeNo, sensor.SensorNo, count) : new List<SensorValue>();
 }
Ejemplo n.º 7
0
 public void SetSensorValue(Sensor sensor, byte type, string value)
 {
     if (gatewayProxy != null && sensor != null)
         gatewayProxy.Send(new SensorMessage(sensor.NodeNo, sensor.SensorNo, SensorMessageType.Set, false, type, value));
 }
Ejemplo n.º 8
0
 public void SetSensorValue(Sensor sensor, SensorValueType type, string value)
 {
     SetSensorValue(sensor, (byte)type, value);
 }
Ejemplo n.º 9
0
 public void SetSensorValue(Sensor sensor, byte type, float value)
 {
     if (gatewayProxy != null && sensor != null)
     {
         var lastSV = GetLastSensorValue(sensor);
         if (lastSV == null || (lastSV.Value != value))
             gatewayProxy.Send(new SensorMessage(sensor.NodeNo, sensor.SensorNo, SensorMessageType.Set, false, type, value));
     }
 }
Ejemplo n.º 10
0
 public void SetSensorValue(Sensor sensor, SensorValueType type, float value)
 {
     SetSensorValue(sensor, (byte)type, value);
 }
Ejemplo n.º 11
0
 public void RequestSensorValue(Sensor sensor, SensorValueType type)
 {
     if (gatewayProxy != null && sensor != null)
         gatewayProxy.Send(new SensorMessage(sensor.NodeNo, sensor.SensorNo, SensorMessageType.Request, false, (byte)type, ""));
 }