private void SetState(MqttIcueDevice mqttIcueDevice, bool isAllDevices, int R, int G, int B) { if (isAllDevices) { MqttIcueDeviceList.SetAllDeviceState(IcueSdk, R, G, B); foreach (MqttIcueDevice icueDevice in MqttIcueDeviceList.GetDevices()) { SendStateUpdate(icueDevice); } SendStateUpdate(MqttIcueDeviceList.TOPIC_ALL_DEVICE_STATE, MqttIcueDeviceList.GetAllDeviceAverageState()); } else { IcueSdk.SetDeviceColor(mqttIcueDevice.IcueDevice, R, G, B); SendStateUpdate(mqttIcueDevice); } }
/// <summary> /// Publishes the icue devices to the MQTT broker and sets up the control topics. /// </summary> internal void PublishDevices() { if (Client.IsConnected) { if (IcueSdk == null) { IcueSdk = new Sdk(false); } if (MqttIcueDeviceList.GetDevices().Length == 0) { GetListOfMqttDevices(); } for (int i = 0; i < MqttIcueDeviceList.GetDevices().Length; i++) { MqttIcueDevice mqttIcueDevice = MqttIcueDeviceList.GetDevices()[i]; if (mqttIcueDevice != null) { Logger.LogInformation(String.Format("Publishing device {0}", mqttIcueDevice.IcueDevice.CorsairDevice.Model)); MqttClientSubscribeOptions subscriptions = new MqttClientSubscribeOptions(); List <TopicFilter> topicFilters = new List <TopicFilter>(); topicFilters.Add(new TopicFilter() { Topic = mqttIcueDevice.CommandTopic, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }); subscriptions.TopicFilters = topicFilters; Client.SubscribeAsync(subscriptions); MqttApplicationMessage publishMessage = new MqttApplicationMessage() { Payload = Encoding.UTF8.GetBytes(mqttIcueDevice.Discovery.ToJson()), Topic = mqttIcueDevice.DiscoveryTopic, Retain = true, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }; Client.PublishAsync(publishMessage).ContinueWith(e => { SendStateUpdate(mqttIcueDevice); }); } } if (MqttIcueDeviceList.GetDevices().Length > 0) { //publish the all device entity MqttClientSubscribeOptions subscriptions = new MqttClientSubscribeOptions(); List <TopicFilter> topicFilters = new List <TopicFilter>(); topicFilters.Add(new TopicFilter() { Topic = MqttIcueDeviceList.TOPIC_ALL_DEVICE_SET, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }); subscriptions.TopicFilters = topicFilters; Client.SubscribeAsync(subscriptions); MqttApplicationMessage publishMessage = new MqttApplicationMessage() { Payload = Encoding.UTF8.GetBytes(MqttIcueDeviceList.GetAllDeviceDiscovery().ToJson()), Topic = MqttIcueDeviceList.TOPIC_ALL_DEVICE_CONFIG, Retain = true, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }; Client.PublishAsync(publishMessage).ContinueWith(e => { SendStateUpdate(MqttIcueDeviceList.TOPIC_ALL_DEVICE_STATE, MqttIcueDeviceList.GetAllDeviceAverageState()); }); //publish the icue control switch subscriptions = new MqttClientSubscribeOptions(); topicFilters = new List <TopicFilter>(); topicFilters.Add(new TopicFilter() { Topic = TOPIC_CONTROL_SWITCH_SET, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce }); subscriptions.TopicFilters = topicFilters; Client.SubscribeAsync(subscriptions); publishMessage = new MqttApplicationMessage() { Payload = Encoding.UTF8.GetBytes(new MqttIcueControlSwitchDiscovery(TOPIC_CONTROL_SWITCH_STATE, TOPIC_CONTROL_SWITCH_SET).ToJson()), Topic = TOPIC_CONTROL_SWITCH_CONFIG, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce }; Client.PublishAsync(publishMessage).ContinueWith(e => { SendControlSwitchUpdate(); }); } } else { Logger.LogInformation("MQTT broker connection lost."); } }