private void MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) { var deviceDescription = _allDevicesAndTopics.FirstOrDefault(x => x.Value.Contains(e.Topic)).Key; MqttDeviceEventArgs mqttDeviceEventArgs; if (MqttDeviceEventArgs.TryParse(e.Topic, e.Message, deviceDescription, out mqttDeviceEventArgs)) { OnReceivedMqttPublish(mqttDeviceEventArgs); } else { Logger.Error($"Unknown topic and message received:\nTopic: {e.Topic}\nMessage: {System.Text.Encoding.UTF8.GetString(e.Message)}"); } }
protected virtual void OnReceivedMqttPublish(MqttDeviceEventArgs mqttDeviceEventArgs) { ReceivedDeviceMessage?.Invoke(this, mqttDeviceEventArgs); }
public static bool TryParse(string topic, byte[] message, string deviceDescription, out MqttDeviceEventArgs mqttDeviceEventArgs) { mqttDeviceEventArgs = null; var messageString = System.Text.Encoding.UTF8.GetString(message); Type deviceType; MqttDeviceActions deviceAction; if (topic.StartsWith(MqttTopicGenerator.ShutterTopicPrefix)) { deviceType = typeof(Shutter); if (topic.EndsWith("timeron")) { deviceAction = MqttDeviceActions.SetOnTime; } else if (topic.EndsWith("timeroff")) { deviceAction = MqttDeviceActions.SetOffTime; } else if (topic.EndsWith(deviceDescription)) { switch (messageString) { case "open": deviceAction = MqttDeviceActions.Open; break; case "close": deviceAction = MqttDeviceActions.Close; break; case "stop": deviceAction = MqttDeviceActions.Stop; break; case "disable": deviceAction = MqttDeviceActions.DisableDevice; break; case "enable": deviceAction = MqttDeviceActions.EnableDevice; break; case "disabletimer": deviceAction = MqttDeviceActions.DisableTimer; break; case "enabletimer": deviceAction = MqttDeviceActions.EnableTimer; break; case "enableemergency": deviceAction = MqttDeviceActions.EnableEmergency; break; case "disableemergency": deviceAction = MqttDeviceActions.DisableEmergency; break; default: return(false); } } else { Logger.Fatal($"Shutter topic: {topic} not subscribed by MqttController, something went terribly wrong.."); return(false); } } else if (topic.StartsWith(MqttTopicGenerator.LightingTopicPrefix)) { deviceType = typeof(Lighting); if (topic.EndsWith(deviceDescription)) { switch (messageString) { case "on": deviceAction = MqttDeviceActions.On; break; case "off": deviceAction = MqttDeviceActions.Off; break; case "disable": deviceAction = MqttDeviceActions.DisableDevice; break; case "enable": deviceAction = MqttDeviceActions.EnableDevice; break; case "disabletimer": deviceAction = MqttDeviceActions.DisableTimer; break; case "enabletimer": deviceAction = MqttDeviceActions.EnableTimer; break; default: return(false); } } else if (topic.EndsWith("timeron")) { deviceAction = MqttDeviceActions.SetOnTime; } else if (topic.EndsWith("timeroff")) { deviceAction = MqttDeviceActions.SetOffTime; } else { Logger.Fatal($"Lighting topic: {topic} not subscribed by MqttController, something went terribly wrong.."); return(false); } } else { Logger.Fatal($"Other topic: {topic} not subscribed by MqttController, something went terribly wrong.."); return(false); } mqttDeviceEventArgs = new MqttDeviceEventArgs(deviceDescription, deviceType, deviceAction, messageString); return(true); }