mirror of
https://github.com/excaliburpartners/OmniLinkBridge
synced 2025-05-07 09:23:11 +00:00
- Add option to change MQTT prefix to support multiple instances
This commit is contained in:
parent
d690d6a830
commit
b716b9ee35
|
@ -48,6 +48,7 @@ namespace OmniLinkBridge
|
||||||
public static int mqtt_port;
|
public static int mqtt_port;
|
||||||
public static string mqtt_username;
|
public static string mqtt_username;
|
||||||
public static string mqtt_password;
|
public static string mqtt_password;
|
||||||
|
public static string mqtt_prefix;
|
||||||
public static string mqtt_discovery_prefix;
|
public static string mqtt_discovery_prefix;
|
||||||
public static HashSet<int> mqtt_discovery_ignore_zones;
|
public static HashSet<int> mqtt_discovery_ignore_zones;
|
||||||
public static HashSet<int> mqtt_discovery_ignore_units;
|
public static HashSet<int> mqtt_discovery_ignore_units;
|
||||||
|
|
|
@ -12,6 +12,6 @@ namespace OmniLinkBridge.MQTT
|
||||||
|
|
||||||
public string state_topic { get; set; }
|
public string state_topic { get; set; }
|
||||||
|
|
||||||
public string availability_topic { get; set; } = "omnilink/status";
|
public string availability_topic { get; set; } = $"{Global.mqtt_prefix}/status";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace OmniLinkBridge.MQTT
|
||||||
{
|
{
|
||||||
public static string ToTopic(this clsArea area, Topic topic)
|
public static string ToTopic(this clsArea area, Topic topic)
|
||||||
{
|
{
|
||||||
return $"omnilink/area{area.Number.ToString()}/{topic.ToString()}";
|
return $"{Global.mqtt_prefix}/area{area.Number.ToString()}/{topic.ToString()}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Alarm ToConfig(this clsArea area)
|
public static Alarm ToConfig(this clsArea area)
|
||||||
|
@ -76,7 +76,7 @@ namespace OmniLinkBridge.MQTT
|
||||||
|
|
||||||
public static string ToTopic(this clsZone zone, Topic topic)
|
public static string ToTopic(this clsZone zone, Topic topic)
|
||||||
{
|
{
|
||||||
return $"omnilink/zone{zone.Number.ToString()}/{topic.ToString()}";
|
return $"{Global.mqtt_prefix}/zone{zone.Number.ToString()}/{topic.ToString()}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Sensor ToConfigTemp(this clsZone zone)
|
public static Sensor ToConfigTemp(this clsZone zone)
|
||||||
|
@ -168,7 +168,7 @@ namespace OmniLinkBridge.MQTT
|
||||||
|
|
||||||
public static string ToTopic(this clsUnit unit, Topic topic)
|
public static string ToTopic(this clsUnit unit, Topic topic)
|
||||||
{
|
{
|
||||||
return $"omnilink/unit{unit.Number.ToString()}/{topic.ToString()}";
|
return $"{Global.mqtt_prefix}/unit{unit.Number.ToString()}/{topic.ToString()}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Light ToConfig(this clsUnit unit)
|
public static Light ToConfig(this clsUnit unit)
|
||||||
|
@ -208,7 +208,7 @@ namespace OmniLinkBridge.MQTT
|
||||||
|
|
||||||
public static string ToTopic(this clsThermostat thermostat, Topic topic)
|
public static string ToTopic(this clsThermostat thermostat, Topic topic)
|
||||||
{
|
{
|
||||||
return $"omnilink/thermostat{thermostat.Number.ToString()}/{topic.ToString()}";
|
return $"{Global.mqtt_prefix}/thermostat{thermostat.Number.ToString()}/{topic.ToString()}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Climate ToConfig(this clsThermostat thermostat)
|
public static Climate ToConfig(this clsThermostat thermostat)
|
||||||
|
@ -248,7 +248,7 @@ namespace OmniLinkBridge.MQTT
|
||||||
|
|
||||||
public static string ToTopic(this clsButton button, Topic topic)
|
public static string ToTopic(this clsButton button, Topic topic)
|
||||||
{
|
{
|
||||||
return $"omnilink/button{button.Number.ToString()}/{topic.ToString()}";
|
return $"{Global.mqtt_prefix}/button{button.Number.ToString()}/{topic.ToString()}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Switch ToConfig(this clsButton button)
|
public static Switch ToConfig(this clsButton button)
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace OmniLinkBridge.Modules
|
||||||
private OmniLinkII OmniLink { get; set; }
|
private OmniLinkII OmniLink { get; set; }
|
||||||
private IManagedMqttClient MqttClient { get; set; }
|
private IManagedMqttClient MqttClient { get; set; }
|
||||||
|
|
||||||
private Regex regexTopic = new Regex("omnilink/([A-Za-z]+)([0-9]+)/(.*)", RegexOptions.Compiled);
|
private Regex regexTopic = new Regex(Global.mqtt_prefix + "/([A-Za-z]+)([0-9]+)/(.*)", RegexOptions.Compiled);
|
||||||
|
|
||||||
private readonly AutoResetEvent trigger = new AutoResetEvent(false);
|
private readonly AutoResetEvent trigger = new AutoResetEvent(false);
|
||||||
|
|
||||||
|
@ -59,20 +59,20 @@ namespace OmniLinkBridge.Modules
|
||||||
|
|
||||||
MqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived;
|
MqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived;
|
||||||
|
|
||||||
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("omnilink/+/" + Topic.command).Build());
|
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic($"{Global.mqtt_prefix}/+/{Topic.command}").Build());
|
||||||
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("omnilink/+/" + Topic.brightness_command).Build());
|
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic($"{Global.mqtt_prefix}/+/{Topic.brightness_command}").Build());
|
||||||
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("omnilink/+/" + Topic.temperature_heat_command).Build());
|
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic($"{Global.mqtt_prefix}/+/{Topic.temperature_heat_command}").Build());
|
||||||
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("omnilink/+/" + Topic.temperature_cool_command).Build());
|
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic($"{Global.mqtt_prefix}/+/{Topic.temperature_cool_command}").Build());
|
||||||
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("omnilink/+/" + Topic.humidify_command).Build());
|
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic($"{Global.mqtt_prefix}/+/{Topic.humidify_command}").Build());
|
||||||
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("omnilink/+/" + Topic.dehumidify_command).Build());
|
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic($"{Global.mqtt_prefix}/+/{Topic.dehumidify_command}").Build());
|
||||||
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("omnilink/+/" + Topic.mode_command).Build());
|
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic($"{Global.mqtt_prefix}/+/{Topic.mode_command}").Build());
|
||||||
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("omnilink/+/" + Topic.fan_mode_command).Build());
|
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic($"{Global.mqtt_prefix}/+/{Topic.fan_mode_command}").Build());
|
||||||
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("omnilink/+/" + Topic.hold_command).Build());
|
MqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic($"{Global.mqtt_prefix}/+/{Topic.hold_command}").Build());
|
||||||
|
|
||||||
// Wait until shutdown
|
// Wait until shutdown
|
||||||
trigger.WaitOne();
|
trigger.WaitOne();
|
||||||
|
|
||||||
MqttClient.PublishAsync("omnilink/status", "offline", MqttQualityOfServiceLevel.AtMostOnce, true);
|
MqttClient.PublishAsync($"{Global.mqtt_prefix}/status", "offline", MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MqttClient_ApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)
|
private void MqttClient_ApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)
|
||||||
|
@ -256,7 +256,7 @@ namespace OmniLinkBridge.Modules
|
||||||
{
|
{
|
||||||
PublishConfig();
|
PublishConfig();
|
||||||
|
|
||||||
MqttClient.PublishAsync("omnilink/status", "online", MqttQualityOfServiceLevel.AtMostOnce, true);
|
MqttClient.PublishAsync($"{Global.mqtt_prefix}/status", "online", MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PublishConfig()
|
private void PublishConfig()
|
||||||
|
@ -278,13 +278,13 @@ namespace OmniLinkBridge.Modules
|
||||||
|
|
||||||
if (area.DefaultProperties == true)
|
if (area.DefaultProperties == true)
|
||||||
{
|
{
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/alarm_control_panel/omnilink/area{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
|
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/alarm_control_panel/{Global.mqtt_prefix}/area{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
PublishAreaState(area);
|
PublishAreaState(area);
|
||||||
|
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/alarm_control_panel/omnilink/area{i.ToString()}/config",
|
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/alarm_control_panel/{Global.mqtt_prefix}/area{i.ToString()}/config",
|
||||||
JsonConvert.SerializeObject(area.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
JsonConvert.SerializeObject(area.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -299,21 +299,21 @@ namespace OmniLinkBridge.Modules
|
||||||
|
|
||||||
if (zone.DefaultProperties == true || Global.mqtt_discovery_ignore_zones.Contains(zone.Number))
|
if (zone.DefaultProperties == true || Global.mqtt_discovery_ignore_zones.Contains(zone.Number))
|
||||||
{
|
{
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/omnilink/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}/binary_sensor/omnilink/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);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
PublishZoneState(zone);
|
PublishZoneState(zone);
|
||||||
|
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/omnilink/zone{i.ToString()}/config",
|
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/binary_sensor/{Global.mqtt_prefix}/zone{i.ToString()}/config",
|
||||||
JsonConvert.SerializeObject(zone.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
JsonConvert.SerializeObject(zone.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
|
|
||||||
if (zone.IsTemperatureZone())
|
if (zone.IsTemperatureZone())
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/omnilink/zone{i.ToString()}/config",
|
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/zone{i.ToString()}/config",
|
||||||
JsonConvert.SerializeObject(zone.ToConfigTemp()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
JsonConvert.SerializeObject(zone.ToConfigTemp()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
else if (zone.IsHumidityZone())
|
else if (zone.IsHumidityZone())
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/omnilink/zone{i.ToString()}/config",
|
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/sensor/{Global.mqtt_prefix}/zone{i.ToString()}/config",
|
||||||
JsonConvert.SerializeObject(zone.ToConfigHumidity()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
JsonConvert.SerializeObject(zone.ToConfigHumidity()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -330,13 +330,13 @@ namespace OmniLinkBridge.Modules
|
||||||
|
|
||||||
if (unit.DefaultProperties == true || Global.mqtt_discovery_ignore_units.Contains(unit.Number))
|
if (unit.DefaultProperties == true || Global.mqtt_discovery_ignore_units.Contains(unit.Number))
|
||||||
{
|
{
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/{type}/omnilink/unit{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
|
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/{type}/{Global.mqtt_prefix}/unit{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
PublishUnitState(unit);
|
PublishUnitState(unit);
|
||||||
|
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/{type}/omnilink/unit{i.ToString()}/config",
|
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/{type}/{Global.mqtt_prefix}/unit{i.ToString()}/config",
|
||||||
JsonConvert.SerializeObject(unit.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
JsonConvert.SerializeObject(unit.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -351,13 +351,13 @@ namespace OmniLinkBridge.Modules
|
||||||
|
|
||||||
if (thermostat.DefaultProperties == true)
|
if (thermostat.DefaultProperties == true)
|
||||||
{
|
{
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/climate/omnilink/thermostat{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
|
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/climate/{Global.mqtt_prefix}/thermostat{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
PublishThermostatState(thermostat);
|
PublishThermostatState(thermostat);
|
||||||
|
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/climate/omnilink/thermostat{i.ToString()}/config",
|
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/climate/{Global.mqtt_prefix}/thermostat{i.ToString()}/config",
|
||||||
JsonConvert.SerializeObject(thermostat.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
JsonConvert.SerializeObject(thermostat.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -372,14 +372,14 @@ namespace OmniLinkBridge.Modules
|
||||||
|
|
||||||
if (button.DefaultProperties == true)
|
if (button.DefaultProperties == true)
|
||||||
{
|
{
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/switch/omnilink/button{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
|
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/switch/{Global.mqtt_prefix}/button{i.ToString()}/config", null, MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Buttons are always off
|
// Buttons are always off
|
||||||
MqttClient.PublishAsync(button.ToTopic(Topic.state), "OFF", MqttQualityOfServiceLevel.AtMostOnce, true);
|
MqttClient.PublishAsync(button.ToTopic(Topic.state), "OFF", MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
|
|
||||||
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/switch/omnilink/button{i.ToString()}/config",
|
MqttClient.PublishAsync($"{Global.mqtt_discovery_prefix}/switch/{Global.mqtt_prefix}/button{i.ToString()}/config",
|
||||||
JsonConvert.SerializeObject(button.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
JsonConvert.SerializeObject(button.ToConfig()), MqttQualityOfServiceLevel.AtMostOnce, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ mqtt_server =
|
||||||
mqtt_port = 1883
|
mqtt_port = 1883
|
||||||
mqtt_username =
|
mqtt_username =
|
||||||
mqtt_password =
|
mqtt_password =
|
||||||
|
mqtt_prefix = omnilink
|
||||||
mqtt_discovery_prefix = homeassistant
|
mqtt_discovery_prefix = homeassistant
|
||||||
# specify a range of numbers like 1,2,3,5-10
|
# specify a range of numbers like 1,2,3,5-10
|
||||||
mqtt_discovery_ignore_zones =
|
mqtt_discovery_ignore_zones =
|
||||||
|
|
|
@ -55,7 +55,8 @@ namespace OmniLinkBridge
|
||||||
Global.mqtt_port = ValidatePort(settings, "mqtt_port");
|
Global.mqtt_port = ValidatePort(settings, "mqtt_port");
|
||||||
Global.mqtt_username = settings["mqtt_username"];
|
Global.mqtt_username = settings["mqtt_username"];
|
||||||
Global.mqtt_password = settings["mqtt_password"];
|
Global.mqtt_password = settings["mqtt_password"];
|
||||||
Global.mqtt_discovery_prefix = settings["mqtt_discovery_prefix"];
|
Global.mqtt_prefix = settings["mqtt_prefix"] ?? "omnilink";
|
||||||
|
Global.mqtt_discovery_prefix = settings["mqtt_discovery_prefix"] ?? "homeassistant";
|
||||||
Global.mqtt_discovery_ignore_zones = ValidateRange(settings, "mqtt_discovery_ignore_zones");
|
Global.mqtt_discovery_ignore_zones = ValidateRange(settings, "mqtt_discovery_ignore_zones");
|
||||||
Global.mqtt_discovery_ignore_units = ValidateRange(settings, "mqtt_discovery_ignore_units");
|
Global.mqtt_discovery_ignore_units = ValidateRange(settings, "mqtt_discovery_ignore_units");
|
||||||
Global.mqtt_discovery_override_zone = LoadOverrideZone(settings, "mqtt_discovery_override_zone");
|
Global.mqtt_discovery_override_zone = LoadOverrideZone(settings, "mqtt_discovery_override_zone");
|
||||||
|
|
Loading…
Reference in a new issue