1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- using System;
- using HAServer.Core;
- using HAServer.Interfaces.Core;
- using Newtonsoft.Json;
- using Newtonsoft.Json.Linq;
- namespace HAServer.Serialisation {
- public class TriggerJsonConverter:JsonConverter<Trigger> {
- private readonly IMessageBus _messageBus;
- private readonly DeviceConfig _deviceConfig;
- private readonly ILogProvider _logProvider;
- public TriggerJsonConverter(IMessageBus messageBus, DeviceConfig deviceConfig, ILogProvider logProvider) {
- _messageBus = messageBus;
- _deviceConfig = deviceConfig;
- _logProvider = logProvider;
- }
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
- throw new NotImplementedException();
- }
- public override bool CanWrite => false;
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
- var jsonObject = JObject.Load(reader);
- var name = jsonObject["Name"].Value<string>();
- var triggerType = jsonObject["TriggerType"].Value<int>();
- var enabled = jsonObject["Enabled"]?.Value<bool>() ?? true;
- var conditions = serializer.Deserialize<Condition[]>(jsonObject["Conditions"].CreateReader());
- var actions = jsonObject["Actions"] != null
- ? serializer.Deserialize<TriggerAction[]>(jsonObject["Actions"].CreateReader())
- : new[] {GetLegacyAction(jsonObject)};
- return new Trigger(_messageBus, name, (TriggerType)triggerType, actions, conditions, _logProvider) {
- Enabled = enabled
- };
- }
- private TriggerAction GetLegacyAction(JObject jsonObject) {
- var actionTopic = jsonObject["DeviceTopic"].Value<string>();
- var actionMethod = jsonObject["DeviceMethod"].Value<string>();
- if (!_deviceConfig.Devices.ContainsKey(actionTopic))
- return null;
- var device = _deviceConfig.Devices[actionTopic];
- var method = device.GetType().GetMethod(actionMethod);
- var action = (Action)Delegate.CreateDelegate(typeof(Action), device, method);
- return new TriggerAction(TriggerActionType.Device, device.Topic, action);
- }
- }
- }
|