/// <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)); }
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; }
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; } } }
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(); //} }
/// <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; }
/// <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; }
/// <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); } }