forked from nanowebcoder/NanoVeraHuesBridge
-
Notifications
You must be signed in to change notification settings - Fork 3
/
HgHelper.cs
138 lines (123 loc) · 5 KB
/
HgHelper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.Collections.Generic;
using System.Linq;
using HGEchoBridge;
using MIG.Interfaces.HomeAutomation.Api;
using NLog;
namespace MIG.Interfaces.HomeAutomation
{
static class HgHelper
{
private static Logger Log = LogManager.GetCurrentClassLogger();
public static List<Device> GetDevicesFromHg(string hgEndpoint)
{
try
{
var api = new HgApiHelper(hgEndpoint);
var modules = api.GetModules();
var filteredModules = FilterModules(modules); // TODO: Add filter here with enum..
return GenerateDevicesFromModules(filteredModules, hgEndpoint);
}
catch (Exception e)
{
Log.Error(e);
throw;
}
}
private static List<Module> FilterModules(IEnumerable<Module> modules)
{
var validDeviceTypes = new List<string> {"Switch", "Dimmer", "Light"};
return modules.Where(x => x.Name.Length > 0 &&
validDeviceTypes.Contains(x.DeviceType,
StringComparer.InvariantCultureIgnoreCase))
.ToList();
}
private static List<Device> GenerateDevicesFromModules(IEnumerable<Module> modules, string hgEndpoint)
{
Log.Info("Dynamically generating objects from Homegenie api");
var deviceList = new List<Device>();
foreach (var module in modules)
{
var device = CreateDevice(module, hgEndpoint);
deviceList.Add(device);
}
return deviceList;
}
private static Device CreateDevice(Module module, string hgEndpoint)
{
var device = new Device
{
name = module.Name,
offUrl = $"http://{hgEndpoint}/api/{module.Domain}/{module.Address}/Control.Off",
onUrl = $"http://{hgEndpoint}/api/{module.Domain}/{module.Address}/Control.On",
DimUrl = module.DeviceType == "Dimmer"
? $"http://{hgEndpoint}/api/{module.Domain}/{module.Address}/Control.Level/{Device.INTENSITY_PERCENT}"
: null,
deviceType = "switch"
};
var guidProperty = module.Properties.SingleOrDefault(x => x.Name == "Module.GUID");
if (guidProperty == null)
{
Log.Warn(
"Existing GUID Property not Found, Creating new guid and adding property to the module {0}",
module.Name);
var newGuid = Guid.NewGuid().ToString();
//new property
guidProperty = new ModuleProperties
{
Name = "Module.GUID",
Value = newGuid,
NeedsUpdate = true,
UpdateTime = DateTime.UtcNow.ToString()
};
// Convert existing properties to a list so we can append it with the new GUID
var newProperties = module.Properties.ToList();
newProperties.Add(guidProperty);
// Copy module and add the new properties
var newModule = module;
newModule.Properties = newProperties.ToArray();
UpdateModule(newModule, hgEndpoint);
}
else
{
if (IsGuidValid(guidProperty.Value))
{
Log.Info("Valid Guid found for module {0}", module.Name);
}
else // invalid guid
{
// Copy module and properties and reset the GUID to something valid
var newGuid = Guid.NewGuid().ToString();
Log.Warn(
"GUID Property found with invalid data, Creating new guid {0} and updating property on module {1}",
newGuid, module.Name);
guidProperty.Value = newGuid;
guidProperty.NeedsUpdate = true;
guidProperty.UpdateTime = DateTime.UtcNow.ToString();
var newModule = module;
UpdateModule(newModule, hgEndpoint);
}
}
device.id = guidProperty.Value;
return device;
}
private static void UpdateModule(Module newModule, string hgEndpoint)
{
var apiHelper = new HgApiHelper(hgEndpoint);
if (apiHelper.UpdateModule(newModule))
{
Log.Debug("Updated module {0} via Homegenie API", newModule.Name);
}
else
{
Log.Error("Failed to update module {0} via Homegenie API", newModule.Name);
}
}
private static bool IsGuidValid(string myGuid)
{
Guid guidOutput;
var isValid = Guid.TryParse(myGuid, out guidOutput);
return isValid;
}
}
}