TriggerJsonConverter.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System;
  2. using HAServer.Core;
  3. using HAServer.Interfaces.Core;
  4. using Newtonsoft.Json;
  5. using Newtonsoft.Json.Linq;
  6. namespace HAServer.Serialisation {
  7. public class TriggerJsonConverter:JsonConverter<Trigger> {
  8. private readonly IMessageBus _messageBus;
  9. private readonly DeviceConfig _deviceConfig;
  10. private readonly ILogProvider _logProvider;
  11. public TriggerJsonConverter(IMessageBus messageBus, DeviceConfig deviceConfig, ILogProvider logProvider) {
  12. _messageBus = messageBus;
  13. _deviceConfig = deviceConfig;
  14. _logProvider = logProvider;
  15. }
  16. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
  17. throw new NotImplementedException();
  18. }
  19. public override bool CanWrite => false;
  20. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
  21. var jsonObject = JObject.Load(reader);
  22. var name = jsonObject["Name"].Value<string>();
  23. var triggerType = jsonObject["TriggerType"].Value<int>();
  24. var enabled = jsonObject["Enabled"]?.Value<bool>() ?? true;
  25. var conditions = serializer.Deserialize<Condition[]>(jsonObject["Conditions"].CreateReader());
  26. var actions = jsonObject["Actions"] != null
  27. ? serializer.Deserialize<TriggerAction[]>(jsonObject["Actions"].CreateReader())
  28. : new[] {GetLegacyAction(jsonObject)};
  29. return new Trigger(_messageBus, name, (TriggerType)triggerType, actions, conditions, _logProvider) {
  30. Enabled = enabled
  31. };
  32. }
  33. private TriggerAction GetLegacyAction(JObject jsonObject) {
  34. var actionTopic = jsonObject["DeviceTopic"].Value<string>();
  35. var actionMethod = jsonObject["DeviceMethod"].Value<string>();
  36. if (!_deviceConfig.Devices.ContainsKey(actionTopic))
  37. return null;
  38. var device = _deviceConfig.Devices[actionTopic];
  39. var method = device.GetType().GetMethod(actionMethod);
  40. var action = (Action)Delegate.CreateDelegate(typeof(Action), device, method);
  41. return new TriggerAction(TriggerActionType.Device, device.Topic, action);
  42. }
  43. }
  44. }