diff --git a/OmniLinkBridge/MQTT/MappingExtensions.cs b/OmniLinkBridge/MQTT/MappingExtensions.cs index 88a0869..720628d 100644 --- a/OmniLinkBridge/MQTT/MappingExtensions.cs +++ b/OmniLinkBridge/MQTT/MappingExtensions.cs @@ -99,6 +99,45 @@ namespace OmniLinkBridge.MQTT return ret; } + public static Sensor ToConfigSensor(this clsZone zone) + { + Sensor ret = new Sensor(); + ret.name = zone.Name; + + switch (zone.ZoneType) + { + case enuZoneType.EntryExit: + case enuZoneType.X2EntryDelay: + case enuZoneType.X4EntryDelay: + ret.icon = "mdi:door"; + break; + case enuZoneType.Perimeter: + ret.icon = "mdi:window-closed"; + break; + case enuZoneType.Tamper: + ret.icon = "mdi:shield"; + break; + case enuZoneType.AwayInt: + case enuZoneType.NightInt: + ret.icon = "mdi:walk"; + break; + case enuZoneType.Water: + ret.icon = "mdi:water"; + break; + case enuZoneType.Fire: + ret.icon = "mdi:fire"; + break; + case enuZoneType.Gas: + ret.icon = "mdi:gas-cylinder"; + break; + } + + ret.value_template = @"{{ value|replace(""_"", "" "")|title }}"; + + ret.state_topic = zone.ToTopic(Topic.state); + return ret; + } + public static BinarySensor ToConfig(this clsZone zone) { BinarySensor ret = new BinarySensor(); @@ -211,6 +250,16 @@ namespace OmniLinkBridge.MQTT return $"{Global.mqtt_prefix}/thermostat{thermostat.Number.ToString()}/{topic.ToString()}"; } + public static Sensor ToConfigHumidity(this clsThermostat zone) + { + Sensor ret = new Sensor(); + ret.name = zone.Name; + ret.device_class = Sensor.DeviceClass.humidity; + ret.state_topic = zone.ToTopic(Topic.current_humidity); + ret.unit_of_measurement = "%"; + return ret; + } + public static Climate ToConfig(this clsThermostat thermostat) { Climate ret = new Climate(); diff --git a/OmniLinkBridge/MQTT/Sensor.cs b/OmniLinkBridge/MQTT/Sensor.cs index bda9a03..717ab17 100644 --- a/OmniLinkBridge/MQTT/Sensor.cs +++ b/OmniLinkBridge/MQTT/Sensor.cs @@ -20,7 +20,13 @@ namespace OmniLinkBridge.MQTT [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public DeviceClass? device_class { get; set; } + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] + public string icon { get; set; } + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public string unit_of_measurement { get; set; } + + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] + public string value_template { get; set; } } } diff --git a/OmniLinkBridge/Modules/MQTTModule.cs b/OmniLinkBridge/Modules/MQTTModule.cs index f061c1e..36ab64a 100644 --- a/OmniLinkBridge/Modules/MQTTModule.cs +++ b/OmniLinkBridge/Modules/MQTTModule.cs @@ -299,8 +299,10 @@ namespace OmniLinkBridge.Modules if (zone.DefaultProperties == true || Global.mqtt_discovery_ignore_zones.Contains(zone.Number)) { - MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/zone{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true); MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/zone{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true); + MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/zone{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true); + MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/zone{i.ToString()}temp/config", null, MqttQualityOfServiceLevel.AtMostOnce, true); + MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/zone{i.ToString()}humidity/config", null, MqttQualityOfServiceLevel.AtMostOnce, true); continue; } @@ -308,12 +310,14 @@ namespace OmniLinkBridge.Modules MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/zone{i.ToString()}/config", JsonConvert.SerializeObject(zone.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true); + MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/zone{i.ToString()}/config", + JsonConvert.SerializeObject(zone.ToConfigSensor()), MqttQualityOfServiceLevel.AtMostOnce, true); if (zone.IsTemperatureZone()) - MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/zone{i.ToString()}/config", + MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/zone{i.ToString()}temp/config", JsonConvert.SerializeObject(zone.ToConfigTemp()), MqttQualityOfServiceLevel.AtMostOnce, true); else if (zone.IsHumidityZone()) - MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/zone{i.ToString()}/config", + MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/zone{i.ToString()}humidity/config", JsonConvert.SerializeObject(zone.ToConfigHumidity()), MqttQualityOfServiceLevel.AtMostOnce, true); } } @@ -352,6 +356,7 @@ namespace OmniLinkBridge.Modules if (thermostat.DefaultProperties == true) { MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/climate/{Global.mqtt_prefix}/thermostat{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true); + MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/thermostat{i.ToString()}humidity/config", null, MqttQualityOfServiceLevel.AtMostOnce, true); continue; } @@ -359,6 +364,8 @@ namespace OmniLinkBridge.Modules MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/climate/{Global.mqtt_prefix}/thermostat{i.ToString()}/config", JsonConvert.SerializeObject(thermostat.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true); + MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/thermostat{i.ToString()}humidity/config", + JsonConvert.SerializeObject(thermostat.ToConfigHumidity()), MqttQualityOfServiceLevel.AtMostOnce, true); } }