Ejemplo n.º 1
0
        /// <summary>
        /// Send event to all subscribers
        /// </summary>
        /// <param name="event"></param>
        /// <param name="sender"></param>
        public void Send(Event @event, BaseProcessor sender)
        {
            var i = 0;
            foreach (var s in _subscriptions)
            {
                var ok = false;

                //Filter event
                if (s.Value != null)
                    foreach (var filter in s.Value)
                    {
                        if (filter.Evaluate(@event)) ok = true;
                    }
                else
                {
                    ok = true;
                }

                //Send event to subscriber
                if (ok && s.Key.OnSourceEvent != null)
                    s.Key.OnSourceEvent(@event, sender);
                i++;
            }
            Log.Debug(string.Format("Event {0} sent to {1} subscribers", @event, i));
        }
Ejemplo n.º 2
0
        public bool Evaluate(Event @event)
        {
            //Evaluate filter conditions
            if (!string.IsNullOrEmpty(Name) && Name != @event.Name) return false;
            if (!string.IsNullOrEmpty(Source) && Source != @event.Source) return false;
            if (!string.IsNullOrEmpty(Type) && Type != @event.Channel) return false;

            switch (ValueFilter)
            {
                case ">":   //Greater
                    break;
                case ">=":  //Greater than / equal to
                    break;
                case "<":   //Less than
                    break;
                case "<=":  //Less than / equal to
                    break;
                case "==":  //Equal
                    break;
                case "!=":  //Different
                    break;
                case "<>":  //Between
                    break;
                case "><":  //Outside
                    break;
            }

            //Todo Datetime filters


            //Evaluate child conditions

            return true;
        }
Ejemplo n.º 3
0
 public void WriteEvent(Event @event, BaseProcessor sender)
 {
     if (_fields != null)
     {
         for (int i = 0; i < _fields.Length; i++)
         {
             if (_fields[i] == @event.Source)
             {
                 _values[i] = @event.Value;
                 _total++;
                 break;
             }
         }
         if (_total == (_fields.Length - 1))
         {
             PostToThingSpeak(_values);
             _total = 0;
         }
     }
 }
Ejemplo n.º 4
0
        private void WriteEvent(Event @event, BaseProcessor sender)
        {
            try
            {
                //_conn = new MySqlConnection(_cs);
                //_conn.Open();

                const string stm = @"INSERT INTO events (name, source, type, value, status, unit, timestamp)
                                     VALUES(@Name, @Source, @Type, @Value, @Status, @Unit, @Timestamp)";

                var cmd = new MySqlCommand(stm, _conn);
                cmd.Prepare();
                cmd.Parameters.AddWithValue("@Name", @event.Name);
                cmd.Parameters.AddWithValue("@Source", @event.Source);
                cmd.Parameters.AddWithValue("@Type", @event.Channel);
                cmd.Parameters.AddWithValue("@Value", @event.Value);
                cmd.Parameters.AddWithValue("@Status", @event.Status);
                cmd.Parameters.AddWithValue("@Unit", @event.Unit);
                cmd.Parameters.AddWithValue("@Timestamp", @event.Timestamp);
                //Altri parametri
                cmd.ExecuteNonQuery();

                Log.Debug("Mysql written event");

            }
            catch (MySqlException ex)
            {
                //TODO LOG
                Log.Error("Mysql write event error", ex);
            }
            //finally
            //{
            //    //_conn?.Close();
            //    if (_conn != null)
            //        _conn.Close();
            //}
        }
Ejemplo n.º 5
0
    /// <summary>
    /// Process HBus ack messages
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="ack"></param>
    /// <param name="port"></param>
    /// <returns></returns>
    private bool OnAckReceived(object sender, Message ack, int port)
    {
      try
      {
        Event evt = null;

        //if (Status.NodeStatus != NodeStatusValues.Active) return false;
        if (ack.MessageType == MessageTypes.NackResponse)
        {
          var err = ack.Data.Length > 1 ? ack.Data[0] << 1 | ack.Data[1] : 0;
          Log.Debug(string.Format("HBus: nack from {0}:{1} with error {2}", ack.Source, port, err));
          return false;
        }

        Log.Debug(string.Format("HBus: ack from {0}:{1}", ack.Source, port));

        switch (ack.Command)
        {
          //case NodeCommands.CMD_GET_PIN_INFO:
          //    var pp = new Pin();
          //    var pi = PinSerializer.DeSerialize(ack.Data, ref pp);
          //    break;
          case NodeCommands.CMD_READ_PIN:
            var pe = new PinEvent(ack.Data);
            evt = new Event
            {
              Name = "pin-read",
              Source = pe.Pin,
              Channel = "hbus",
              Value = pe.Value,
              Status = pe.IsActive ? "active" : "inactive",
              Timestamp = DateTime.Now
            };
            break;
          case NodeCommands.CMD_GET_DEVICE_STATUS:
            var ds = new DeviceStatus(ack.Data);
            evt = new Event
            {
              Name = "device-status",
              Source = ds.Device,
              Channel = "hbus",
              Status = ds.Status,
              Timestamp = DateTime.Now
            };
            break;
          //case NodeCommands.CMD_GET_DEVICE_INFO:
          //    var dd = new Device();
          //    var di = DeviceSerializer.DeSerialize(ack.Data, ref dd);
          //    break;
          //case NodeCommands.CMD_GET_SENSOR_INFO:
          //    break;
          case NodeCommands.CMD_READ_SENSOR:
            var sr = new SensorRead(ack.Data);
            evt = new Event
            {
              Name = "sensor-read",
              Source = sr.Name,
              Channel = "hbus",
              Value = sr.Value,
              Unit = "", //sr.Unit, //TODO: add to HBus protocol
              Timestamp = DateTime.Now
            };
            break;
        }

        if (evt != null)
          //Send event to subscribers
          Send(evt, this);

        return true;
      }
      catch (Exception ex)
      {
        Log.Error(string.Format("HBus: error occurred with ack {0} from {1}", ack.Command, ack.Source), ex);

        //Propagate errors to observers
        Error(ex, this);
      }
      return false;
    }
Ejemplo n.º 6
0
    /// <summary>
    /// Process HBus command messages
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="message"></param>
    /// <param name="port"></param>
    /// <returns></returns>
    private bool OnCommandReceived(object sender, Message message, int port)
    {
      Log.Debug(string.Format("HBus command from {0}:{1}", message.Source, port));

      try
      {
        Event evt = null;

        //Clear bus & node errors
        _bus.ClearErrors();

        switch (message.Command)
        {
          case NodeCommands.CMD_PUSH_PIN_EVENT:
            var pe = new PinEvent(message.Data);
            evt = new Event
            {
              Name = "pin-change",
              Source = pe.Pin,
              //Channel = "hbus",
              Value = pe.Value,
              Status = pe.IsActive ? "active" : "inactive",
              Timestamp = DateTime.Now
            };
            break;
          case NodeCommands.CMD_PUSH_DEVICE_EVENT:
            var de = new DeviceEvent(message.Data);
            evt = new Event
            {
              Name = "device-event",
              Source = de.Device,
              //Channel = "hbus",
              Status = de.Status,
              Data = de.Values,
              Timestamp = DateTime.Now
            };
            break;
          case NodeCommands.CMD_PUSH_SENSOR_READ:
            var sr = new SensorRead(message.Data);
            evt = new Event
            {
              Name = "sensor-read",
              Source = sr.Name,
              //Channel = "hbus",
              Value = sr.Value,
              Unit = "", //sr.Unit, //TODO: add to HBus protocol
              Timestamp = DateTime.Now
            };
            break;
        }

        if (evt != null)
          //Send event to subscribers
          Send(evt, this);

        //HBus command processed
        return true;
      }
      catch (Exception ex)
      {
        Log.Error(string.Format("HBus: error with command {0} from {1}", message.Command, message.Source), ex);

        //Propagate errors to observers
        Error(ex, this);
      }
      return false;
    }
Ejemplo n.º 7
0
        /// <summary>
        /// Manage subscriptions from client requests
        /// </summary>
        /// <param name="message"></param>
        private void OnWsMessage(string message)
        {
            Log.Debug(string.Format("Websocket message {0}", message)); // socket.ConnectionInfo.ClientIpAddress, message));
            Event evt;
            try
            {
                dynamic obj = JObject.Parse(message);
                var type = obj.MessageType.ToString() as string;
                switch (type)
                {
                    case "page":
                        var request = JsonConvert.DeserializeObject<Subscription>(message);

                        foreach (var source in request.Sources)
                        {
                            evt = new Event()
                            {
                                Name = source.Type + "-subscribe",
                                Source = source.Source,
                                Channel = source.Channel,
                                Subscriber = request.Subscriber,
                                Address = source.Address.ToString(),
                                //Data = source.Data
                            };
                            Send(evt, this);
                        }
                        break;
                    case "event":
                        evt = JsonConvert.DeserializeObject<Event>(message);
                        Send(evt, this);
                        break;
                }
            }
            catch (Exception ex)
            {
                Error(ex, this);
            }
        }