- Add area json status and climate temp sensor

This commit is contained in:
Ryan Wagoner 2018-11-09 00:14:43 -05:00
parent cda76b6930
commit 09637316a5
6 changed files with 200 additions and 3 deletions

View file

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OmniLinkBridge.MQTT
{
public class AreaState
{
public string mode { get; set; }
public bool arming { get; set; }
public bool burglary_alarm { get; set; }
public bool fire_alarm { get; set; }
public bool gas_alarm { get; set; }
public bool auxiliary_alarm { get; set; }
public bool freeze_alarm { get; set; }
public bool water_alarm { get; set; }
public bool duress_alarm { get; set; }
public bool temperature_alarm { get; set; }
}
}

View file

@ -14,17 +14,23 @@ namespace OmniLinkBridge.MQTT
public enum DeviceClass
{
battery,
cold,
door,
garage_door,
gas,
heat,
moisture,
motion,
problem,
safety,
smoke,
window
}
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public DeviceClass? device_class { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string value_template { get; set; }
}
}

View file

@ -4,6 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HAI_Shared;
using Newtonsoft.Json;
namespace OmniLinkBridge.MQTT
{
@ -25,7 +26,9 @@ namespace OmniLinkBridge.MQTT
public static string ToState(this clsArea area)
{
if (area.AreaBurglaryAlarmText != "OK")
if (area.AreaAlarms.IsBitSet(0) || // Burgulary
area.AreaAlarms.IsBitSet(3) || // Auxiliary
area.AreaAlarms.IsBitSet(6)) // Duress
return "triggered";
else if (area.ExitTimer > 0)
return "pending";
@ -52,7 +55,9 @@ namespace OmniLinkBridge.MQTT
public static string ToBasicState(this clsArea area)
{
if (area.AreaBurglaryAlarmText != "OK")
if (area.AreaAlarms.IsBitSet(0) || // Burgulary
area.AreaAlarms.IsBitSet(3) || // Auxiliary
area.AreaAlarms.IsBitSet(6)) // Duress
return "triggered";
else if (area.ExitTimer > 0)
return "pending";
@ -74,6 +79,130 @@ namespace OmniLinkBridge.MQTT
}
}
public static BinarySensor ToConfigBurglary(this clsArea area)
{
BinarySensor ret = new BinarySensor();
ret.name = $"{Global.mqtt_discovery_name_prefix}{area.Name} Burglary";
ret.device_class = BinarySensor.DeviceClass.safety;
ret.state_topic = area.ToTopic(Topic.json_state);
ret.value_template = "{% if value_json.burglary_alarm %} ON {%- else -%} OFF {%- endif %}";
return ret;
}
public static BinarySensor ToConfigFire(this clsArea area)
{
BinarySensor ret = new BinarySensor();
ret.name = $"{Global.mqtt_discovery_name_prefix}{area.Name} Fire";
ret.device_class = BinarySensor.DeviceClass.smoke;
ret.state_topic = area.ToTopic(Topic.json_state);
ret.value_template = "{% if value_json.fire_alarm %} ON {%- else -%} OFF {%- endif %}";
return ret;
}
public static BinarySensor ToConfigGas(this clsArea area)
{
BinarySensor ret = new BinarySensor();
ret.name = $"{Global.mqtt_discovery_name_prefix}{area.Name} Gas";
ret.device_class = BinarySensor.DeviceClass.gas;
ret.state_topic = area.ToTopic(Topic.json_state);
ret.value_template = "{% if value_json.gas_alarm %} ON {%- else -%} OFF {%- endif %}";
return ret;
}
public static BinarySensor ToConfigAux(this clsArea area)
{
BinarySensor ret = new BinarySensor();
ret.name = $"{Global.mqtt_discovery_name_prefix}{area.Name} Auxiliary";
ret.device_class = BinarySensor.DeviceClass.problem;
ret.state_topic = area.ToTopic(Topic.json_state);
ret.value_template = "{% if value_json.burglary_alarm %} ON {%- else -%} OFF {%- endif %}";
return ret;
}
public static BinarySensor ToConfigFreeze(this clsArea area)
{
BinarySensor ret = new BinarySensor();
ret.name = $"{Global.mqtt_discovery_name_prefix}{area.Name} Freeze";
ret.device_class = BinarySensor.DeviceClass.cold;
ret.state_topic = area.ToTopic(Topic.json_state);
ret.value_template = "{% if value_json.freeze_alarm %} ON {%- else -%} OFF {%- endif %}";
return ret;
}
public static BinarySensor ToConfigWater(this clsArea area)
{
BinarySensor ret = new BinarySensor();
ret.name = $"{Global.mqtt_discovery_name_prefix}{area.Name} Water";
ret.device_class = BinarySensor.DeviceClass.moisture;
ret.state_topic = area.ToTopic(Topic.json_state);
ret.value_template = "{% if value_json.water_alarm %} ON {%- else -%} OFF {%- endif %}";
return ret;
}
public static BinarySensor ToConfigDuress(this clsArea area)
{
BinarySensor ret = new BinarySensor();
ret.name = $"{Global.mqtt_discovery_name_prefix}{area.Name} Duress";
ret.device_class = BinarySensor.DeviceClass.safety;
ret.state_topic = area.ToTopic(Topic.json_state);
ret.value_template = "{% if value_json.duress_alarm %} ON {%- else -%} OFF {%- endif %}";
return ret;
}
public static BinarySensor ToConfigTemp(this clsArea area)
{
BinarySensor ret = new BinarySensor();
ret.name = $"{Global.mqtt_discovery_name_prefix}{area.Name} Temp";
ret.device_class = BinarySensor.DeviceClass.heat;
ret.state_topic = area.ToTopic(Topic.json_state);
ret.value_template = "{% if value_json.temperature_alarm %} ON {%- else -%} OFF {%- endif %}";
return ret;
}
public static string ToJsonState(this clsArea area)
{
AreaState state = new AreaState()
{
arming = area.ExitTimer > 0,
burglary_alarm = area.AreaAlarms.IsBitSet(0),
fire_alarm = area.AreaAlarms.IsBitSet(1),
gas_alarm = area.AreaAlarms.IsBitSet(2),
auxiliary_alarm = area.AreaAlarms.IsBitSet(3),
freeze_alarm = area.AreaAlarms.IsBitSet(4),
water_alarm = area.AreaAlarms.IsBitSet(5),
duress_alarm = area.AreaAlarms.IsBitSet(6),
temperature_alarm = area.AreaAlarms.IsBitSet(7)
};
switch (area.AreaMode)
{
case enuSecurityMode.Night:
state.mode = "night";
break;
case enuSecurityMode.NightDly:
state.mode = "night_delay";
break;
case enuSecurityMode.Day:
state.mode = "home";
break;
case enuSecurityMode.DayInst:
state.mode = "home_instant";
break;
case enuSecurityMode.Away:
state.mode = "away";
break;
case enuSecurityMode.Vacation:
state.mode = "vacation";
break;
case enuSecurityMode.Off:
default:
state.mode = "off";
break;
}
return JsonConvert.SerializeObject(state);
}
public static string ToTopic(this clsZone zone, Topic topic)
{
return $"{Global.mqtt_prefix}/zone{zone.Number.ToString()}/{topic.ToString()}";
@ -250,10 +379,20 @@ namespace OmniLinkBridge.MQTT
return $"{Global.mqtt_prefix}/thermostat{thermostat.Number.ToString()}/{topic.ToString()}";
}
public static Sensor ToConfigTemp(this clsThermostat zone)
{
Sensor ret = new Sensor();
ret.name = $"{Global.mqtt_discovery_name_prefix}{zone.Name} Temp";
ret.device_class = Sensor.DeviceClass.temperature;
ret.state_topic = zone.ToTopic(Topic.current_temperature);
ret.unit_of_measurement = "°F";
return ret;
}
public static Sensor ToConfigHumidity(this clsThermostat zone)
{
Sensor ret = new Sensor();
ret.name = Global.mqtt_discovery_name_prefix + zone.Name;
ret.name = $"{Global.mqtt_discovery_name_prefix}{zone.Name} Humidity";
ret.device_class = Sensor.DeviceClass.humidity;
ret.state_topic = zone.ToTopic(Topic.current_humidity);
ret.unit_of_measurement = "%";

View file

@ -26,6 +26,7 @@ namespace OmniLinkBridge.MQTT
public static Topic command { get { return new Topic("command"); } }
public static Topic basic_state { get { return new Topic("basic_state"); } }
public static Topic json_state { get { return new Topic("json_state"); } }
public static Topic brightness_state { get { return new Topic("brightness_state"); } }
public static Topic brightness_command { get { return new Topic("brightness_command"); } }

View file

@ -290,6 +290,14 @@ namespace OmniLinkBridge.Modules
if (area.DefaultProperties == true)
{
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/alarm_control_panel/{Global.mqtt_prefix}/area{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}burglary/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}fire/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}gas/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}aux/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}freeze/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}water/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}duress/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}temp/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
continue;
}
@ -297,6 +305,22 @@ namespace OmniLinkBridge.Modules
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/alarm_control_panel/{Global.mqtt_prefix}/area{i.ToString()}/config",
JsonConvert.SerializeObject(area.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}burglary/config",
JsonConvert.SerializeObject(area.ToConfigBurglary()), MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}fire/config",
JsonConvert.SerializeObject(area.ToConfigFire()), MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}gas/config",
JsonConvert.SerializeObject(area.ToConfigGas()), MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}aux/config",
JsonConvert.SerializeObject(area.ToConfigAux()), MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}freeze/config",
JsonConvert.SerializeObject(area.ToConfigFreeze()), MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}water/config",
JsonConvert.SerializeObject(area.ToConfigWater()), MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}duress/config",
JsonConvert.SerializeObject(area.ToConfigDuress()), MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/area{i.ToString()}temp/config",
JsonConvert.SerializeObject(area.ToConfigTemp()), MqttQualityOfServiceLevel.AtMostOnce, true);
}
}
@ -367,6 +391,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()}temp/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;
}
@ -375,6 +400,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()}temp/config",
JsonConvert.SerializeObject(thermostat.ToConfigTemp()), 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);
}
@ -452,6 +479,7 @@ namespace OmniLinkBridge.Modules
{
MqttClient.PublishAsync(area.ToTopic(Topic.state), area.ToState(), MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync(area.ToTopic(Topic.basic_state), area.ToBasicState(), MqttQualityOfServiceLevel.AtMostOnce, true);
MqttClient.PublishAsync(area.ToTopic(Topic.json_state), area.ToJsonState(), MqttQualityOfServiceLevel.AtMostOnce, true);
}
private void PublishZoneState(clsZone zone)

View file

@ -77,6 +77,7 @@
<Compile Include="CoreServer.cs" />
<Compile Include="Modules\TimeSyncModule.cs" />
<Compile Include="MQTT\Alarm.cs" />
<Compile Include="MQTT\AreaState.cs" />
<Compile Include="MQTT\BinarySensor.cs" />
<Compile Include="MQTT\Device.cs" />
<Compile Include="MQTT\Climate.cs" />