mirror of
https://github.com/excaliburpartners/OmniLinkBridge
synced 2024-12-22 10:42:24 +00:00
- Add override zone type for web service
This commit is contained in:
parent
c9e5063ddd
commit
cda76b6930
|
@ -1,4 +1,3 @@
|
|||
using OmniLinkBridge.MQTT;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Mail;
|
||||
|
@ -40,6 +39,7 @@ namespace OmniLinkBridge
|
|||
// Web Service
|
||||
public static bool webapi_enabled;
|
||||
public static int webapi_port;
|
||||
public static ConcurrentDictionary<int, WebAPI.OverrideZone> webapi_override_zone;
|
||||
public static string webapi_subscriptions_file;
|
||||
|
||||
// MQTT
|
||||
|
@ -53,7 +53,7 @@ namespace OmniLinkBridge
|
|||
public static string mqtt_discovery_name_prefix;
|
||||
public static HashSet<int> mqtt_discovery_ignore_zones;
|
||||
public static HashSet<int> mqtt_discovery_ignore_units;
|
||||
public static ConcurrentDictionary<int, OverrideZone> mqtt_discovery_override_zone;
|
||||
public static ConcurrentDictionary<int, MQTT.OverrideZone> mqtt_discovery_override_zone;
|
||||
|
||||
// Notifications
|
||||
public static bool notify_area;
|
||||
|
|
|
@ -79,30 +79,7 @@ namespace OmniLinkBridge
|
|||
return;
|
||||
}
|
||||
|
||||
switch (e.Zone.ZoneType)
|
||||
{
|
||||
case enuZoneType.EntryExit:
|
||||
case enuZoneType.X2EntryDelay:
|
||||
case enuZoneType.X4EntryDelay:
|
||||
case enuZoneType.Perimeter:
|
||||
case enuZoneType.Tamper:
|
||||
case enuZoneType.Auxiliary:
|
||||
WebNotification.Send("contact", JsonConvert.SerializeObject(e.Zone.ToContract()));
|
||||
break;
|
||||
case enuZoneType.AwayInt:
|
||||
case enuZoneType.NightInt:
|
||||
WebNotification.Send("motion", JsonConvert.SerializeObject(e.Zone.ToContract()));
|
||||
break;
|
||||
case enuZoneType.Water:
|
||||
WebNotification.Send("water", JsonConvert.SerializeObject(e.Zone.ToContract()));
|
||||
break;
|
||||
case enuZoneType.Fire:
|
||||
WebNotification.Send("smoke", JsonConvert.SerializeObject(e.Zone.ToContract()));
|
||||
break;
|
||||
case enuZoneType.Gas:
|
||||
WebNotification.Send("co", JsonConvert.SerializeObject(e.Zone.ToContract()));
|
||||
break;
|
||||
}
|
||||
WebNotification.Send(Enum.GetName(typeof(DeviceType), e.Zone.ToDeviceType()), JsonConvert.SerializeObject(e.Zone.ToContract()));
|
||||
}
|
||||
|
||||
private void Omnilink_OnUnitStatus(object sender, UnitStatusEventArgs e)
|
||||
|
|
|
@ -123,6 +123,7 @@
|
|||
</Compile>
|
||||
<Compile Include="Settings.cs" />
|
||||
<Compile Include="WebService\MappingExtensions.cs" />
|
||||
<Compile Include="WebService\OverrideZone.cs" />
|
||||
<Compile Include="WebService\SubscribeContract.cs" />
|
||||
<Compile Include="WebService\ThermostatContract.cs" />
|
||||
<Compile Include="WebService\NameContract.cs" />
|
||||
|
@ -131,6 +132,7 @@
|
|||
<Compile Include="WebService\UnitContract.cs" />
|
||||
<Compile Include="WebService\WebNotification.cs" />
|
||||
<Compile Include="Modules\WebServiceModule.cs" />
|
||||
<Compile Include="WebService\DeviceType.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config">
|
||||
|
|
|
@ -28,6 +28,8 @@ mysql_connection =
|
|||
# Can be used for integration with Samsung SmartThings
|
||||
webapi_enabled = yes
|
||||
webapi_port = 8000
|
||||
# device_type must be contact, motion, water, smoke, or co
|
||||
#webapi_override_zone = id=20;device_type=motion
|
||||
|
||||
# MQTT
|
||||
# Can be used for integration with Home Assistant
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
using log4net;
|
||||
using OmniLinkBridge.MQTT;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
|
@ -48,6 +47,7 @@ namespace OmniLinkBridge
|
|||
// Web Service
|
||||
Global.webapi_enabled = ValidateYesNo(settings, "webapi_enabled");
|
||||
Global.webapi_port = ValidatePort(settings, "webapi_port");
|
||||
Global.webapi_override_zone = LoadOverrideZone<WebAPI.OverrideZone>(settings, "webapi_override_zone");
|
||||
|
||||
// MQTT
|
||||
Global.mqtt_enabled = ValidateYesNo(settings, "mqtt_enabled");
|
||||
|
@ -64,7 +64,7 @@ namespace OmniLinkBridge
|
|||
|
||||
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_override_zone = LoadOverrideZone(settings, "mqtt_discovery_override_zone");
|
||||
Global.mqtt_discovery_override_zone = LoadOverrideZone<MQTT.OverrideZone>(settings, "mqtt_discovery_override_zone");
|
||||
|
||||
// Notifications
|
||||
Global.notify_area = ValidateYesNo(settings, "notify_area");
|
||||
|
@ -86,11 +86,11 @@ namespace OmniLinkBridge
|
|||
Global.pushover_user = ValidateMultipleStrings(settings, "pushover_user");
|
||||
}
|
||||
|
||||
private static ConcurrentDictionary<int, OverrideZone> LoadOverrideZone(NameValueCollection settings, string section)
|
||||
private static ConcurrentDictionary<int, T> LoadOverrideZone<T>(NameValueCollection settings, string section) where T : new()
|
||||
{
|
||||
try
|
||||
{
|
||||
ConcurrentDictionary<int, OverrideZone> ret = new ConcurrentDictionary<int, OverrideZone>();
|
||||
ConcurrentDictionary<int, T> ret = new ConcurrentDictionary<int, T>();
|
||||
|
||||
if (settings[section] == null)
|
||||
return ret;
|
||||
|
@ -106,13 +106,24 @@ namespace OmniLinkBridge
|
|||
if (!attributes.ContainsKey("id") || !Int32.TryParse(attributes["id"], out int attrib_id))
|
||||
throw new Exception("Missing or invalid id attribute");
|
||||
|
||||
if (!attributes.ContainsKey("device_class") || !Enum.TryParse(attributes["device_class"], out BinarySensor.DeviceClass attrib_device_class))
|
||||
T override_zone = new T();
|
||||
|
||||
if (((object)override_zone) is WebAPI.OverrideZone webapi_zone)
|
||||
{
|
||||
if (!attributes.ContainsKey("device_type") || !Enum.TryParse(attributes["device_type"], out WebAPI.DeviceType attrib_device_type))
|
||||
throw new Exception("Missing or invalid device_type attribute");
|
||||
|
||||
webapi_zone.device_type = attrib_device_type;
|
||||
}
|
||||
else if (((object)override_zone) is MQTT.OverrideZone mqtt_zone)
|
||||
{
|
||||
if (!attributes.ContainsKey("device_class") || !Enum.TryParse(attributes["device_class"], out MQTT.BinarySensor.DeviceClass attrib_device_class))
|
||||
throw new Exception("Missing or invalid device_class attribute");
|
||||
|
||||
ret.TryAdd(attrib_id, new OverrideZone()
|
||||
{
|
||||
device_class = attrib_device_class,
|
||||
});
|
||||
mqtt_zone.device_class = attrib_device_class;
|
||||
}
|
||||
|
||||
ret.TryAdd(attrib_id, override_zone);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
18
OmniLinkBridge/WebService/DeviceType.cs
Normal file
18
OmniLinkBridge/WebService/DeviceType.cs
Normal file
|
@ -0,0 +1,18 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OmniLinkBridge.WebAPI
|
||||
{
|
||||
public enum DeviceType
|
||||
{
|
||||
unknown,
|
||||
contact,
|
||||
motion,
|
||||
water,
|
||||
smoke,
|
||||
co
|
||||
}
|
||||
}
|
|
@ -98,5 +98,35 @@ namespace OmniLinkBridge.WebAPI
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static DeviceType ToDeviceType(this clsZone zone)
|
||||
{
|
||||
Global.webapi_override_zone.TryGetValue(zone.Number, out OverrideZone override_zone);
|
||||
|
||||
if (override_zone != null)
|
||||
return override_zone.device_type;
|
||||
|
||||
switch (zone.ZoneType)
|
||||
{
|
||||
case enuZoneType.EntryExit:
|
||||
case enuZoneType.X2EntryDelay:
|
||||
case enuZoneType.X4EntryDelay:
|
||||
case enuZoneType.Perimeter:
|
||||
case enuZoneType.Tamper:
|
||||
case enuZoneType.Auxiliary:
|
||||
return DeviceType.contact;
|
||||
case enuZoneType.AwayInt:
|
||||
case enuZoneType.NightInt:
|
||||
return DeviceType.motion;
|
||||
case enuZoneType.Water:
|
||||
return DeviceType.water;
|
||||
case enuZoneType.Fire:
|
||||
return DeviceType.smoke;
|
||||
case enuZoneType.Gas:
|
||||
return DeviceType.co;
|
||||
default:
|
||||
return DeviceType.unknown;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using HAI_Shared;
|
||||
using log4net;
|
||||
using OmniLinkBridge.WebAPI;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
|
@ -53,12 +54,7 @@ namespace OmniLinkBridge.WebAPI
|
|||
{
|
||||
clsZone zone = WebServiceModule.OmniLink.Controller.Zones[i];
|
||||
|
||||
if ((zone.ZoneType == enuZoneType.EntryExit ||
|
||||
zone.ZoneType == enuZoneType.X2EntryDelay ||
|
||||
zone.ZoneType == enuZoneType.X4EntryDelay ||
|
||||
zone.ZoneType == enuZoneType.Perimeter ||
|
||||
zone.ZoneType == enuZoneType.Tamper ||
|
||||
zone.ZoneType == enuZoneType.Auxiliary) && zone.DefaultProperties == false)
|
||||
if (zone.DefaultProperties == false && zone.ToDeviceType() == DeviceType.contact)
|
||||
names.Add(new NameContract() { id = i, name = zone.Name });
|
||||
}
|
||||
return names;
|
||||
|
@ -73,8 +69,7 @@ namespace OmniLinkBridge.WebAPI
|
|||
{
|
||||
clsZone zone = WebServiceModule.OmniLink.Controller.Zones[i];
|
||||
|
||||
if ((zone.ZoneType == enuZoneType.AwayInt ||
|
||||
zone.ZoneType == enuZoneType.NightInt) && zone.DefaultProperties == false)
|
||||
if (zone.DefaultProperties == false && zone.ToDeviceType() == DeviceType.motion)
|
||||
names.Add(new NameContract() { id = i, name = zone.Name });
|
||||
}
|
||||
return names;
|
||||
|
@ -89,7 +84,7 @@ namespace OmniLinkBridge.WebAPI
|
|||
{
|
||||
clsZone zone = WebServiceModule.OmniLink.Controller.Zones[i];
|
||||
|
||||
if (zone.ZoneType == enuZoneType.Water && zone.DefaultProperties == false)
|
||||
if (zone.DefaultProperties == false && zone.ToDeviceType() == DeviceType.water)
|
||||
names.Add(new NameContract() { id = i, name = zone.Name });
|
||||
}
|
||||
return names;
|
||||
|
@ -104,7 +99,7 @@ namespace OmniLinkBridge.WebAPI
|
|||
{
|
||||
clsZone zone = WebServiceModule.OmniLink.Controller.Zones[i];
|
||||
|
||||
if (zone.ZoneType == enuZoneType.Fire && zone.DefaultProperties == false)
|
||||
if (zone.DefaultProperties == false && zone.ToDeviceType() == DeviceType.smoke)
|
||||
names.Add(new NameContract() { id = i, name = zone.Name });
|
||||
}
|
||||
return names;
|
||||
|
@ -119,7 +114,7 @@ namespace OmniLinkBridge.WebAPI
|
|||
{
|
||||
clsZone zone = WebServiceModule.OmniLink.Controller.Zones[i];
|
||||
|
||||
if (zone.ZoneType == enuZoneType.Gas && zone.DefaultProperties == false)
|
||||
if (zone.DefaultProperties == false && zone.ToDeviceType() == DeviceType.co)
|
||||
names.Add(new NameContract() { id = i, name = zone.Name });
|
||||
}
|
||||
return names;
|
||||
|
@ -134,7 +129,7 @@ namespace OmniLinkBridge.WebAPI
|
|||
{
|
||||
clsZone zone = WebServiceModule.OmniLink.Controller.Zones[i];
|
||||
|
||||
if (zone.IsTemperatureZone() && zone.DefaultProperties == false)
|
||||
if (zone.DefaultProperties == false && zone.IsTemperatureZone())
|
||||
names.Add(new NameContract() { id = i, name = zone.Name });
|
||||
}
|
||||
return names;
|
||||
|
@ -152,33 +147,8 @@ namespace OmniLinkBridge.WebAPI
|
|||
}
|
||||
else
|
||||
{
|
||||
switch (WebServiceModule.OmniLink.Controller.Zones[id].ZoneType)
|
||||
{
|
||||
case enuZoneType.EntryExit:
|
||||
case enuZoneType.X2EntryDelay:
|
||||
case enuZoneType.X4EntryDelay:
|
||||
case enuZoneType.Perimeter:
|
||||
case enuZoneType.Tamper:
|
||||
case enuZoneType.Auxiliary:
|
||||
ctx.OutgoingResponse.Headers.Add("type", "contact");
|
||||
break;
|
||||
case enuZoneType.AwayInt:
|
||||
case enuZoneType.NightInt:
|
||||
ctx.OutgoingResponse.Headers.Add("type", "motion");
|
||||
break;
|
||||
case enuZoneType.Water:
|
||||
ctx.OutgoingResponse.Headers.Add("type", "water");
|
||||
break;
|
||||
case enuZoneType.Fire:
|
||||
ctx.OutgoingResponse.Headers.Add("type", "smoke");
|
||||
break;
|
||||
case enuZoneType.Gas:
|
||||
ctx.OutgoingResponse.Headers.Add("type", "co");
|
||||
break;
|
||||
default:
|
||||
ctx.OutgoingResponse.Headers.Add("type", "unknown");
|
||||
break;
|
||||
}
|
||||
ctx.OutgoingResponse.Headers.Add("type", Enum.GetName(typeof(DeviceType),
|
||||
WebServiceModule.OmniLink.Controller.Zones[id].ToDeviceType()));
|
||||
}
|
||||
|
||||
return WebServiceModule.OmniLink.Controller.Zones[id].ToContract();
|
||||
|
|
13
OmniLinkBridge/WebService/OverrideZone.cs
Normal file
13
OmniLinkBridge/WebService/OverrideZone.cs
Normal file
|
@ -0,0 +1,13 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OmniLinkBridge.WebAPI
|
||||
{
|
||||
public class OverrideZone
|
||||
{
|
||||
public DeviceType device_type { get; set; }
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue