@fastybird/smart-panel-backend 0.1.0-alpha.6 → 0.1.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/dist/app.module.js +5 -0
  2. package/dist/app.module.js.map +1 -1
  3. package/dist/migrations/1000000000000-InitialSetup.js +23 -13
  4. package/dist/migrations/1000000000000-InitialSetup.js.map +1 -1
  5. package/dist/migrations/1000000000001-AddSceneIcon.d.ts +6 -0
  6. package/dist/migrations/1000000000001-AddSceneIcon.js +22 -0
  7. package/dist/migrations/1000000000001-AddSceneIcon.js.map +1 -0
  8. package/dist/modules/auth/auth.module.js +1 -1
  9. package/dist/modules/auth/auth.module.js.map +1 -1
  10. package/dist/modules/dashboard/dashboard.module.js +1 -1
  11. package/dist/modules/dashboard/dashboard.module.js.map +1 -1
  12. package/dist/modules/devices/services/devices-type-mapper.service.d.ts +1 -1
  13. package/dist/modules/devices/services/devices.service.d.ts +1 -0
  14. package/dist/modules/devices/services/devices.service.js +22 -23
  15. package/dist/modules/devices/services/devices.service.js.map +1 -1
  16. package/dist/modules/scenes/dto/create-scene.dto.d.ts +1 -0
  17. package/dist/modules/scenes/dto/create-scene.dto.js +13 -0
  18. package/dist/modules/scenes/dto/create-scene.dto.js.map +1 -1
  19. package/dist/modules/scenes/dto/update-scene.dto.d.ts +1 -0
  20. package/dist/modules/scenes/dto/update-scene.dto.js +13 -0
  21. package/dist/modules/scenes/dto/update-scene.dto.js.map +1 -1
  22. package/dist/modules/scenes/entities/scenes.entity.d.ts +1 -0
  23. package/dist/modules/scenes/entities/scenes.entity.js +13 -0
  24. package/dist/modules/scenes/entities/scenes.entity.js.map +1 -1
  25. package/dist/modules/storage/models/config.model.js +2 -4
  26. package/dist/modules/storage/models/config.model.js.map +1 -1
  27. package/dist/modules/storage/storage.constants.d.ts +2 -0
  28. package/dist/modules/storage/storage.constants.js +3 -1
  29. package/dist/modules/storage/storage.constants.js.map +1 -1
  30. package/dist/modules/storage/storage.module.js +1 -3
  31. package/dist/modules/storage/storage.module.js.map +1 -1
  32. package/dist/modules/system/commands/update-panel.command.js +7 -12
  33. package/dist/modules/system/commands/update-panel.command.js.map +1 -1
  34. package/dist/modules/system/services/update.service.d.ts +2 -0
  35. package/dist/modules/system/services/update.service.js +37 -17
  36. package/dist/modules/system/services/update.service.js.map +1 -1
  37. package/dist/plugins/data-sources-device-channel/data-sources-device-channel.plugin.js +1 -1
  38. package/dist/plugins/data-sources-device-channel/data-sources-device-channel.plugin.js.map +1 -1
  39. package/dist/plugins/data-sources-weather/data-sources-weather.plugin.js +1 -1
  40. package/dist/plugins/data-sources-weather/data-sources-weather.plugin.js.map +1 -1
  41. package/dist/plugins/devices-home-assistant/devices-home-assistant.openapi.d.ts +2 -2
  42. package/dist/plugins/devices-home-assistant/devices-home-assistant.plugin.js +3 -1
  43. package/dist/plugins/devices-home-assistant/devices-home-assistant.plugin.js.map +1 -1
  44. package/dist/plugins/devices-home-assistant/dto/helper-mapping-preview.dto.d.ts +1 -0
  45. package/dist/plugins/devices-home-assistant/dto/helper-mapping-preview.dto.js +14 -0
  46. package/dist/plugins/devices-home-assistant/dto/helper-mapping-preview.dto.js.map +1 -1
  47. package/dist/plugins/devices-home-assistant/models/config.model.d.ts +1 -0
  48. package/dist/plugins/devices-home-assistant/models/config.model.js +12 -0
  49. package/dist/plugins/devices-home-assistant/models/config.model.js.map +1 -1
  50. package/dist/plugins/devices-home-assistant/platforms/home-assistant.device.platform.d.ts +3 -1
  51. package/dist/plugins/devices-home-assistant/platforms/home-assistant.device.platform.js +14 -2
  52. package/dist/plugins/devices-home-assistant/platforms/home-assistant.device.platform.js.map +1 -1
  53. package/dist/plugins/devices-home-assistant/services/device-adoption.service.js +2 -2
  54. package/dist/plugins/devices-home-assistant/services/device-adoption.service.js.map +1 -1
  55. package/dist/plugins/devices-home-assistant/services/ha-supervisor.service.d.ts +10 -0
  56. package/dist/plugins/devices-home-assistant/services/ha-supervisor.service.js +47 -0
  57. package/dist/plugins/devices-home-assistant/services/ha-supervisor.service.js.map +1 -0
  58. package/dist/plugins/devices-home-assistant/services/helper-adoption.service.js +1 -7
  59. package/dist/plugins/devices-home-assistant/services/helper-adoption.service.js.map +1 -1
  60. package/dist/plugins/devices-home-assistant/services/home-assistant-config-validator.service.d.ts +3 -1
  61. package/dist/plugins/devices-home-assistant/services/home-assistant-config-validator.service.js +9 -3
  62. package/dist/plugins/devices-home-assistant/services/home-assistant-config-validator.service.js.map +1 -1
  63. package/dist/plugins/devices-home-assistant/services/home-assistant.http.service.d.ts +3 -1
  64. package/dist/plugins/devices-home-assistant/services/home-assistant.http.service.js +19 -7
  65. package/dist/plugins/devices-home-assistant/services/home-assistant.http.service.js.map +1 -1
  66. package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.d.ts +3 -1
  67. package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.js +23 -4
  68. package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.js.map +1 -1
  69. package/dist/plugins/devices-reterminal/devices-reterminal.plugin.js +1 -1
  70. package/dist/plugins/devices-reterminal/devices-reterminal.plugin.js.map +1 -1
  71. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.d.ts +11 -1
  72. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js +226 -49
  73. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js.map +1 -1
  74. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.d.ts +5 -0
  75. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js +10 -1
  76. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js.map +1 -1
  77. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.d.ts +5 -1
  78. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.js +23 -4
  79. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.js.map +1 -1
  80. package/dist/plugins/devices-shelly-ng/dto/create-device.dto.d.ts +1 -1
  81. package/dist/plugins/devices-shelly-ng/dto/create-device.dto.js +11 -12
  82. package/dist/plugins/devices-shelly-ng/dto/create-device.dto.js.map +1 -1
  83. package/dist/plugins/devices-shelly-ng/dto/update-device.dto.d.ts +2 -1
  84. package/dist/plugins/devices-shelly-ng/dto/update-device.dto.js +19 -4
  85. package/dist/plugins/devices-shelly-ng/dto/update-device.dto.js.map +1 -1
  86. package/dist/plugins/devices-shelly-ng/entities/devices-shelly-ng.entity.d.ts +6 -1
  87. package/dist/plugins/devices-shelly-ng/entities/devices-shelly-ng.entity.js +38 -6
  88. package/dist/plugins/devices-shelly-ng/entities/devices-shelly-ng.entity.js.map +1 -1
  89. package/dist/plugins/devices-shelly-ng/entities/shelly-ng-device-address.entity.d.ts +10 -0
  90. package/dist/plugins/devices-shelly-ng/entities/shelly-ng-device-address.entity.js +69 -0
  91. package/dist/plugins/devices-shelly-ng/entities/shelly-ng-device-address.entity.js.map +1 -0
  92. package/dist/plugins/devices-shelly-ng/services/database-discoverer.service.d.ts +3 -1
  93. package/dist/plugins/devices-shelly-ng/services/database-discoverer.service.js +19 -7
  94. package/dist/plugins/devices-shelly-ng/services/database-discoverer.service.js.map +1 -1
  95. package/dist/plugins/devices-shelly-ng/services/device-address.service.d.ts +22 -0
  96. package/dist/plugins/devices-shelly-ng/services/device-address.service.js +149 -0
  97. package/dist/plugins/devices-shelly-ng/services/device-address.service.js.map +1 -0
  98. package/dist/plugins/devices-shelly-ng/services/device-manager.service.d.ts +3 -1
  99. package/dist/plugins/devices-shelly-ng/services/device-manager.service.js +20 -7
  100. package/dist/plugins/devices-shelly-ng/services/device-manager.service.js.map +1 -1
  101. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js +18 -3
  102. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js.map +1 -1
  103. package/dist/plugins/devices-shelly-ng/subscribers/device-entity.subscriber.d.ts +6 -2
  104. package/dist/plugins/devices-shelly-ng/subscribers/device-entity.subscriber.js +75 -6
  105. package/dist/plugins/devices-shelly-ng/subscribers/device-entity.subscriber.js.map +1 -1
  106. package/dist/plugins/devices-shelly-v1/devices-shelly-v1.plugin.js +1 -1
  107. package/dist/plugins/devices-shelly-v1/devices-shelly-v1.plugin.js.map +1 -1
  108. package/dist/plugins/devices-third-party/devices-third-party.plugin.js +1 -1
  109. package/dist/plugins/devices-third-party/devices-third-party.plugin.js.map +1 -1
  110. package/dist/plugins/devices-wled/devices-wled.plugin.js +1 -1
  111. package/dist/plugins/devices-wled/devices-wled.plugin.js.map +1 -1
  112. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.d.ts +4 -0
  113. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.js +5 -1
  114. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.js.map +1 -1
  115. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.openapi.d.ts +2 -2
  116. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.openapi.js +2 -0
  117. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.openapi.js.map +1 -1
  118. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.plugin.js +12 -7
  119. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.plugin.js.map +1 -1
  120. package/dist/plugins/devices-zigbee2mqtt/dto/update-config.dto.d.ts +10 -0
  121. package/dist/plugins/devices-zigbee2mqtt/dto/update-config.dto.js +117 -3
  122. package/dist/plugins/devices-zigbee2mqtt/dto/update-config.dto.js.map +1 -1
  123. package/dist/plugins/devices-zigbee2mqtt/interfaces/zigbee2mqtt.interface.d.ts +8 -0
  124. package/dist/plugins/devices-zigbee2mqtt/mappings/definitions/covers.yaml +5 -4
  125. package/dist/plugins/devices-zigbee2mqtt/models/config.model.d.ts +10 -0
  126. package/dist/plugins/devices-zigbee2mqtt/models/config.model.js +108 -3
  127. package/dist/plugins/devices-zigbee2mqtt/models/config.model.js.map +1 -1
  128. package/dist/plugins/devices-zigbee2mqtt/platforms/zigbee2mqtt.device.platform.d.ts +3 -4
  129. package/dist/plugins/devices-zigbee2mqtt/platforms/zigbee2mqtt.device.platform.js +11 -22
  130. package/dist/plugins/devices-zigbee2mqtt/platforms/zigbee2mqtt.device.platform.js.map +1 -1
  131. package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.d.ts +35 -0
  132. package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.js +265 -0
  133. package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.js.map +1 -0
  134. package/dist/plugins/devices-zigbee2mqtt/services/device-mapper.service.js +6 -5
  135. package/dist/plugins/devices-zigbee2mqtt/services/device-mapper.service.js.map +1 -1
  136. package/dist/plugins/devices-zigbee2mqtt/services/mqtt-client-adapter.service.d.ts +4 -26
  137. package/dist/plugins/devices-zigbee2mqtt/services/mqtt-client-adapter.service.js +16 -265
  138. package/dist/plugins/devices-zigbee2mqtt/services/mqtt-client-adapter.service.js.map +1 -1
  139. package/dist/plugins/devices-zigbee2mqtt/services/virtual-property.types.js +0 -16
  140. package/dist/plugins/devices-zigbee2mqtt/services/virtual-property.types.js.map +1 -1
  141. package/dist/plugins/devices-zigbee2mqtt/services/ws-client-adapter.service.d.ts +14 -0
  142. package/dist/plugins/devices-zigbee2mqtt/services/ws-client-adapter.service.js +199 -0
  143. package/dist/plugins/devices-zigbee2mqtt/services/ws-client-adapter.service.js.map +1 -0
  144. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.d.ts +2 -0
  145. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.js +69 -0
  146. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.js.map +1 -1
  147. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.d.ts +8 -1
  148. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.js +86 -32
  149. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.js.map +1 -1
  150. package/dist/{modules/storage/plugins/influx-v1/influx-v1.update-config.dto.d.ts → plugins/influx-v1/dto/update-config.dto.d.ts} +1 -1
  151. package/dist/{modules/storage/plugins/influx-v1/influx-v1.update-config.dto.js → plugins/influx-v1/dto/update-config.dto.js} +3 -3
  152. package/dist/plugins/influx-v1/dto/update-config.dto.js.map +1 -0
  153. package/dist/plugins/influx-v1/influx-v1.constants.js.map +1 -0
  154. package/dist/{modules/storage/plugins → plugins}/influx-v1/influx-v1.openapi.d.ts +1 -1
  155. package/dist/plugins/influx-v1/influx-v1.openapi.js +7 -0
  156. package/dist/plugins/influx-v1/influx-v1.openapi.js.map +1 -0
  157. package/dist/{modules/storage/plugins/influx-v1/influx-v1.module.d.ts → plugins/influx-v1/influx-v1.plugin.d.ts} +6 -6
  158. package/dist/{modules/storage/plugins/influx-v1/influx-v1.module.js → plugins/influx-v1/influx-v1.plugin.js} +22 -22
  159. package/dist/plugins/influx-v1/influx-v1.plugin.js.map +1 -0
  160. package/dist/{modules/storage/plugins/influx-v1/influx-v1.config.model.d.ts → plugins/influx-v1/models/config.model.d.ts} +1 -1
  161. package/dist/{modules/storage/plugins/influx-v1/influx-v1.config.model.js → plugins/influx-v1/models/config.model.js} +3 -3
  162. package/dist/plugins/influx-v1/models/config.model.js.map +1 -0
  163. package/dist/{modules/storage/plugins/influx-v1/influx-v1.plugin.d.ts → plugins/influx-v1/services/influx-v1.storage.d.ts} +3 -3
  164. package/dist/{modules/storage/plugins/influx-v1/influx-v1.plugin.js → plugins/influx-v1/services/influx-v1.storage.js} +9 -9
  165. package/dist/plugins/influx-v1/services/influx-v1.storage.js.map +1 -0
  166. package/dist/{modules/storage/plugins/memory/memory.update-config.dto.d.ts → plugins/memory-storage/dto/update-config.dto.d.ts} +1 -1
  167. package/dist/{modules/storage/plugins/memory/memory.update-config.dto.js → plugins/memory-storage/dto/update-config.dto.js} +5 -5
  168. package/dist/plugins/memory-storage/dto/update-config.dto.js.map +1 -0
  169. package/dist/{modules/storage/plugins/memory/memory.constants.js → plugins/memory-storage/memory-storage.constants.js} +1 -1
  170. package/dist/plugins/memory-storage/memory-storage.constants.js.map +1 -0
  171. package/dist/{modules/storage/plugins/memory/memory.openapi.d.ts → plugins/memory-storage/memory-storage.openapi.d.ts} +1 -1
  172. package/dist/plugins/memory-storage/memory-storage.openapi.js +7 -0
  173. package/dist/plugins/memory-storage/memory-storage.openapi.js.map +1 -0
  174. package/dist/plugins/memory-storage/memory-storage.plugin.d.ts +13 -0
  175. package/dist/{modules/storage/plugins/memory/memory.module.js → plugins/memory-storage/memory-storage.plugin.js} +24 -24
  176. package/dist/plugins/memory-storage/memory-storage.plugin.js.map +1 -0
  177. package/dist/{modules/storage/plugins/memory/memory.config.model.d.ts → plugins/memory-storage/models/config.model.d.ts} +1 -1
  178. package/dist/{modules/storage/plugins/memory/memory.config.model.js → plugins/memory-storage/models/config.model.js} +5 -5
  179. package/dist/plugins/memory-storage/models/config.model.js.map +1 -0
  180. package/dist/{modules/storage/plugins/memory → plugins/memory-storage/services}/in-memory-timeseries.store.d.ts +1 -1
  181. package/dist/{modules/storage/plugins/memory → plugins/memory-storage/services}/in-memory-timeseries.store.js +3 -3
  182. package/dist/plugins/memory-storage/services/in-memory-timeseries.store.js.map +1 -0
  183. package/dist/plugins/memory-storage/services/influxql-parser.js.map +1 -0
  184. package/dist/{modules/storage/plugins/memory/memory.plugin.d.ts → plugins/memory-storage/services/memory-storage.storage.d.ts} +3 -3
  185. package/dist/{modules/storage/plugins/memory/memory.plugin.js → plugins/memory-storage/services/memory-storage.storage.js} +8 -8
  186. package/dist/plugins/memory-storage/services/memory-storage.storage.js.map +1 -0
  187. package/dist/plugins/simulator/simulator.plugin.js +4 -4
  188. package/dist/plugins/simulator/simulator.plugin.js.map +1 -1
  189. package/dist/plugins/tiles-device-preview/tiles-device-preview.plugin.js +1 -1
  190. package/dist/plugins/tiles-device-preview/tiles-device-preview.plugin.js.map +1 -1
  191. package/dist/plugins/tiles-scene/tiles-scene.plugin.js +1 -1
  192. package/dist/plugins/tiles-scene/tiles-scene.plugin.js.map +1 -1
  193. package/dist/plugins/tiles-time/tiles-time.plugin.js +1 -1
  194. package/dist/plugins/weather-openweathermap-onecall/weather-openweathermap-onecall.plugin.js +1 -1
  195. package/dist/plugins/weather-openweathermap-onecall/weather-openweathermap-onecall.plugin.js.map +1 -1
  196. package/dist/tsconfig.build.tsbuildinfo +1 -1
  197. package/package.json +2 -2
  198. package/dist/modules/storage/plugins/influx-v1/influx-v1.config.model.js.map +0 -1
  199. package/dist/modules/storage/plugins/influx-v1/influx-v1.constants.js.map +0 -1
  200. package/dist/modules/storage/plugins/influx-v1/influx-v1.module.js.map +0 -1
  201. package/dist/modules/storage/plugins/influx-v1/influx-v1.openapi.js +0 -7
  202. package/dist/modules/storage/plugins/influx-v1/influx-v1.openapi.js.map +0 -1
  203. package/dist/modules/storage/plugins/influx-v1/influx-v1.plugin.js.map +0 -1
  204. package/dist/modules/storage/plugins/influx-v1/influx-v1.update-config.dto.js.map +0 -1
  205. package/dist/modules/storage/plugins/memory/in-memory-timeseries.store.js.map +0 -1
  206. package/dist/modules/storage/plugins/memory/influxql-parser.js.map +0 -1
  207. package/dist/modules/storage/plugins/memory/memory.config.model.js.map +0 -1
  208. package/dist/modules/storage/plugins/memory/memory.constants.js.map +0 -1
  209. package/dist/modules/storage/plugins/memory/memory.module.d.ts +0 -13
  210. package/dist/modules/storage/plugins/memory/memory.module.js.map +0 -1
  211. package/dist/modules/storage/plugins/memory/memory.openapi.js +0 -7
  212. package/dist/modules/storage/plugins/memory/memory.openapi.js.map +0 -1
  213. package/dist/modules/storage/plugins/memory/memory.plugin.js.map +0 -1
  214. package/dist/modules/storage/plugins/memory/memory.update-config.dto.js.map +0 -1
  215. /package/dist/{modules/storage/plugins → plugins}/influx-v1/influx-v1.constants.d.ts +0 -0
  216. /package/dist/{modules/storage/plugins → plugins}/influx-v1/influx-v1.constants.js +0 -0
  217. /package/dist/{modules/storage/plugins/memory/memory.constants.d.ts → plugins/memory-storage/memory-storage.constants.d.ts} +0 -0
  218. /package/dist/{modules/storage/plugins/memory → plugins/memory-storage/services}/influxql-parser.d.ts +0 -0
  219. /package/dist/{modules/storage/plugins/memory → plugins/memory-storage/services}/influxql-parser.js +0 -0
@@ -24,16 +24,18 @@ const devices_shelly_ng_exceptions_1 = require("../devices-shelly-ng.exceptions"
24
24
  const update_channel_property_dto_1 = require("../dto/update-channel-property.dto");
25
25
  const mappings_1 = require("../mappings");
26
26
  const transformers_1 = require("../mappings/transformers/transformers");
27
+ const device_address_service_1 = require("../services/device-address.service");
27
28
  const device_manager_service_1 = require("../services/device-manager.service");
28
29
  const transform_utils_2 = require("../utils/transform.utils");
29
30
  const shelly_device_delegate_1 = require("./shelly-device.delegate");
30
31
  let DelegatesManagerService = class DelegatesManagerService {
31
- constructor(devicesService, channelsService, channelsPropertiesService, deviceConnectivityService, deviceManagerService, propertyMappingStorage, transformerRegistry) {
32
+ constructor(devicesService, channelsService, channelsPropertiesService, deviceConnectivityService, deviceManagerService, deviceAddressService, propertyMappingStorage, transformerRegistry) {
32
33
  this.devicesService = devicesService;
33
34
  this.channelsService = channelsService;
34
35
  this.channelsPropertiesService = channelsPropertiesService;
35
36
  this.deviceConnectivityService = deviceConnectivityService;
36
37
  this.deviceManagerService = deviceManagerService;
38
+ this.deviceAddressService = deviceAddressService;
37
39
  this.propertyMappingStorage = propertyMappingStorage;
38
40
  this.transformerRegistry = transformerRegistry;
39
41
  this.logger = (0, logger_1.createExtensionLogger)(devices_shelly_ng_constants_1.DEVICES_SHELLY_NG_PLUGIN_NAME, 'DelegatesManagerService');
@@ -46,8 +48,13 @@ let DelegatesManagerService = class DelegatesManagerService {
46
48
  this.pendingWrites = new Map();
47
49
  this.propertiesMap = new Map();
48
50
  this.delegateDeviceIds = new Map();
51
+ this.delegateToIdentifier = new Map();
52
+ this.identifierToDelegates = new Map();
53
+ this.delegateConnectedState = new Map();
49
54
  this.insertGeneration = new Map();
50
55
  this.deviceLocks = new Map();
56
+ this.canonicalMacLocks = new Map();
57
+ this.connectedDelegatesPerDevice = new Map();
51
58
  }
52
59
  get(id) {
53
60
  return this.delegates.get(id);
@@ -68,34 +75,57 @@ let DelegatesManagerService = class DelegatesManagerService {
68
75
  this.insertGeneration.set(shelly.id, generation);
69
76
  const delegate = new shelly_device_delegate_1.ShellyDeviceDelegate(shelly);
70
77
  this.delegates.set(shelly.id, delegate);
71
- const hostname = shelly.wifi?.sta_ip ?? shelly.ethernet?.ip ?? null;
72
- if (hostname === null) {
78
+ const wifiIp = shelly.wifi?.sta_ip ?? null;
79
+ const ethernetIp = shelly.ethernet?.ip ?? null;
80
+ if (ethernetIp === null && wifiIp === null) {
73
81
  throw new devices_shelly_ng_exceptions_1.DevicesShellyNgException('Missing device hostname or IP address');
74
82
  }
75
- let device = await this.devicesService.findOneBy('identifier', shelly.id, devices_shelly_ng_constants_1.DEVICES_SHELLY_NG_TYPE);
76
- let isNewDevice = false;
77
- if (device === null) {
78
- try {
79
- device = await this.devicesService.create({
80
- type: devices_shelly_ng_constants_1.DEVICES_SHELLY_NG_TYPE,
81
- category: this.determineCategory(delegate),
82
- identifier: shelly.id,
83
- hostname,
84
- name: shelly.system.config.device.name ?? shelly.modelName,
85
- });
86
- isNewDevice = true;
83
+ const canonicalMac = shelly.system?.config?.device?.mac ?? null;
84
+ const { device: resolvedDevice, isNewDevice } = await this.withCanonicalMacLock(canonicalMac, async () => {
85
+ let dev = await this.devicesService.findOneBy('identifier', shelly.id, devices_shelly_ng_constants_1.DEVICES_SHELLY_NG_TYPE);
86
+ if (!dev && canonicalMac) {
87
+ dev = (await this.deviceAddressService.findDeviceByCanonicalMac(canonicalMac)) ?? null;
88
+ if (dev) {
89
+ this.logger.log(`Device=${shelly.id} matched existing device=${dev.identifier} by canonical MAC=${canonicalMac} (multi-interface merge)`, { resource: dev.id });
90
+ }
87
91
  }
88
- catch (error) {
89
- device = await this.devicesService.findOneBy('identifier', shelly.id, devices_shelly_ng_constants_1.DEVICES_SHELLY_NG_TYPE);
90
- if (device === null) {
91
- throw error;
92
+ let created = false;
93
+ if (dev === null) {
94
+ try {
95
+ dev = await this.devicesService.create({
96
+ type: devices_shelly_ng_constants_1.DEVICES_SHELLY_NG_TYPE,
97
+ category: this.determineCategory(delegate),
98
+ identifier: shelly.id,
99
+ name: shelly.system.config.device.name ?? shelly.modelName,
100
+ });
101
+ created = true;
102
+ }
103
+ catch (error) {
104
+ dev = await this.devicesService.findOneBy('identifier', shelly.id, devices_shelly_ng_constants_1.DEVICES_SHELLY_NG_TYPE);
105
+ if (!dev && canonicalMac) {
106
+ dev = (await this.deviceAddressService.findDeviceByCanonicalMac(canonicalMac)) ?? null;
107
+ }
108
+ if (dev === null) {
109
+ throw error;
110
+ }
92
111
  }
93
112
  }
94
- }
113
+ if (canonicalMac && dev.canonicalMac !== (0, device_address_service_1.normalizeMac)(canonicalMac)) {
114
+ await this.deviceAddressService.setCanonicalMac(dev.id, canonicalMac);
115
+ }
116
+ return { device: dev, isNewDevice: created };
117
+ });
118
+ let device = resolvedDevice;
95
119
  this.delegateDeviceIds.set(delegate.id, device.id);
96
- if (isNewDevice) {
120
+ this.delegateToIdentifier.set(delegate.id, device.identifier);
121
+ const delegateSet = this.identifierToDelegates.get(device.identifier) ?? new Set();
122
+ delegateSet.add(delegate.id);
123
+ this.identifierToDelegates.set(device.identifier, delegateSet);
124
+ await this.deviceAddressService.syncAddresses(device.id, wifiIp, ethernetIp);
125
+ const existingChannel = await this.channelsService.findOneBy('category', devices_constants_1.ChannelCategory.DEVICE_INFORMATION, device.id, devices_shelly_ng_constants_1.DEVICES_SHELLY_NG_TYPE);
126
+ if (isNewDevice || existingChannel === null) {
97
127
  await this.deviceManagerService.createOrUpdate(device.id);
98
- device = await this.devicesService.findOneBy('identifier', shelly.id, devices_shelly_ng_constants_1.DEVICES_SHELLY_NG_TYPE);
128
+ device = await this.devicesService.findOne(device.id, devices_shelly_ng_constants_1.DEVICES_SHELLY_NG_TYPE);
99
129
  if (device === null) {
100
130
  throw new devices_shelly_ng_exceptions_1.DevicesShellyNgException('Device not found after provisioning');
101
131
  }
@@ -839,27 +869,84 @@ let DelegatesManagerService = class DelegatesManagerService {
839
869
  delegate.on('value', valueHandler);
840
870
  this.delegateValueHandlers.set(delegate.id, valueHandler);
841
871
  const connectionHandler = (state) => {
842
- this.deviceConnectivityService
843
- .setConnectionState(device.id, {
844
- state: state === null ? devices_constants_1.ConnectionState.UNKNOWN : state ? devices_constants_1.ConnectionState.CONNECTED : devices_constants_1.ConnectionState.DISCONNECTED,
845
- })
846
- .then(() => {
847
- if (state) {
872
+ const deviceDbId = this.delegateDeviceIds.get(delegate.id) ?? device.id;
873
+ const wasConnected = this.delegateConnectedState.get(delegate.id) ?? false;
874
+ if (state === true) {
875
+ if (wasConnected)
876
+ return;
877
+ this.delegateConnectedState.set(delegate.id, true);
878
+ const count = (this.connectedDelegatesPerDevice.get(deviceDbId) ?? 0) + 1;
879
+ this.connectedDelegatesPerDevice.set(deviceDbId, count);
880
+ this.deviceConnectivityService
881
+ .setConnectionState(deviceDbId, { state: devices_constants_1.ConnectionState.CONNECTED })
882
+ .catch((err) => {
883
+ this.logger.error(`Failed to set state=${devices_constants_1.ConnectionState.CONNECTED} for device=${delegate.id}`, {
884
+ resource: deviceDbId,
885
+ message: err.message,
886
+ stack: err.stack,
887
+ });
888
+ });
889
+ }
890
+ else if (state === false) {
891
+ if (!wasConnected)
892
+ return;
893
+ this.delegateConnectedState.set(delegate.id, false);
894
+ const count = Math.max(0, (this.connectedDelegatesPerDevice.get(deviceDbId) ?? 1) - 1);
895
+ this.connectedDelegatesPerDevice.set(deviceDbId, count);
896
+ if (count === 0) {
897
+ this.deviceConnectivityService
898
+ .setConnectionState(deviceDbId, { state: devices_constants_1.ConnectionState.DISCONNECTED })
899
+ .catch((err) => {
900
+ this.logger.error(`Failed to set state=DISCONNECTED for device=${delegate.id}`, {
901
+ resource: deviceDbId,
902
+ message: err.message,
903
+ stack: err.stack,
904
+ });
905
+ });
848
906
  }
849
907
  else {
908
+ this.logger.debug(`Device=${delegate.id} disconnected but ${count} other delegate(s) still connected`, {
909
+ resource: deviceDbId,
910
+ });
850
911
  }
851
- })
852
- .catch((err) => {
853
- this.logger.error(`Failed to set state=${state ? devices_constants_1.ConnectionState.CONNECTED : devices_constants_1.ConnectionState.DISCONNECTED} for device=${delegate.id}`, {
854
- resource: device.id,
855
- message: err.message,
856
- stack: err.stack,
857
- });
858
- });
912
+ }
913
+ else {
914
+ const identifier = this.delegateToIdentifier.get(delegate.id);
915
+ const siblingDelegates = identifier ? this.identifierToDelegates.get(identifier) : undefined;
916
+ const otherDelegatesRemain = siblingDelegates ? siblingDelegates.size > 1 : false;
917
+ const targetState = otherDelegatesRemain ? devices_constants_1.ConnectionState.DISCONNECTED : devices_constants_1.ConnectionState.UNKNOWN;
918
+ if (wasConnected) {
919
+ const count = Math.max(0, (this.connectedDelegatesPerDevice.get(deviceDbId) ?? 1) - 1);
920
+ this.connectedDelegatesPerDevice.set(deviceDbId, count);
921
+ if (count === 0) {
922
+ this.deviceConnectivityService
923
+ .setConnectionState(deviceDbId, { state: targetState })
924
+ .catch((err) => {
925
+ this.logger.error(`Failed to set state=${targetState} for device=${delegate.id}`, {
926
+ resource: deviceDbId,
927
+ message: err.message,
928
+ stack: err.stack,
929
+ });
930
+ });
931
+ }
932
+ }
933
+ else if ((this.connectedDelegatesPerDevice.get(deviceDbId) ?? 0) === 0) {
934
+ this.deviceConnectivityService.setConnectionState(deviceDbId, { state: targetState }).catch((err) => {
935
+ this.logger.error(`Failed to set state=${targetState} for device=${delegate.id}`, {
936
+ resource: deviceDbId,
937
+ message: err.message,
938
+ stack: err.stack,
939
+ });
940
+ });
941
+ }
942
+ this.delegateConnectedState.delete(delegate.id);
943
+ }
859
944
  };
860
945
  delegate.on('connected', connectionHandler);
861
946
  this.delegateConnectionHandlers.set(delegate.id, connectionHandler);
862
- connectionHandler(true);
947
+ if (delegate.connected) {
948
+ connectionHandler(true);
949
+ }
863
950
  this.logger.log(`Attached Shelly device=${delegate.id}`, { resource: device.id });
864
951
  return delegate;
865
952
  }
@@ -881,15 +968,21 @@ let DelegatesManagerService = class DelegatesManagerService {
881
968
  }
882
969
  else {
883
970
  const deviceDbId = this.delegateDeviceIds.get(deviceId) ?? deviceId;
884
- void this.deviceConnectivityService
885
- .setConnectionState(deviceDbId, { state: devices_constants_1.ConnectionState.UNKNOWN })
886
- .catch((err) => {
887
- this.logger.warn(`Failed to mark device=${delegate.id} as disconnected while removing delegate`, {
888
- resource: delegate.id,
889
- message: err.message,
890
- stack: err.stack,
971
+ if ((this.connectedDelegatesPerDevice.get(deviceDbId) ?? 0) === 0) {
972
+ const identifier = this.delegateToIdentifier.get(deviceId);
973
+ const siblingDelegates = identifier ? this.identifierToDelegates.get(identifier) : undefined;
974
+ const otherDelegatesRemain = siblingDelegates ? siblingDelegates.size > 1 : false;
975
+ const targetState = otherDelegatesRemain ? devices_constants_1.ConnectionState.DISCONNECTED : devices_constants_1.ConnectionState.UNKNOWN;
976
+ void this.deviceConnectivityService
977
+ .setConnectionState(deviceDbId, { state: targetState })
978
+ .catch((err) => {
979
+ this.logger.warn(`Failed to mark device=${delegate.id} as ${targetState} while removing delegate`, {
980
+ resource: delegate.id,
981
+ message: err.message,
982
+ stack: err.stack,
983
+ });
891
984
  });
892
- });
985
+ }
893
986
  }
894
987
  if (valueHandler) {
895
988
  delegate.off('value', valueHandler);
@@ -914,6 +1007,20 @@ let DelegatesManagerService = class DelegatesManagerService {
914
1007
  this.setChannelsHandlers.delete(key);
915
1008
  }
916
1009
  }
1010
+ const identifier = this.delegateToIdentifier.get(deviceId);
1011
+ if (identifier) {
1012
+ const delegateSet = this.identifierToDelegates.get(identifier);
1013
+ if (delegateSet) {
1014
+ delegateSet.delete(deviceId);
1015
+ if (delegateSet.size === 0) {
1016
+ this.identifierToDelegates.delete(identifier);
1017
+ const deviceDbId = this.delegateDeviceIds.get(deviceId);
1018
+ if (deviceDbId) {
1019
+ this.connectedDelegatesPerDevice.delete(deviceDbId);
1020
+ }
1021
+ }
1022
+ }
1023
+ }
917
1024
  const ids = this.propertiesMap.get(deviceId);
918
1025
  if (ids) {
919
1026
  for (const pid of ids) {
@@ -923,12 +1030,13 @@ let DelegatesManagerService = class DelegatesManagerService {
923
1030
  this.propertiesMap.delete(deviceId);
924
1031
  }
925
1032
  this.delegateDeviceIds.delete(deviceId);
1033
+ this.delegateToIdentifier.delete(deviceId);
926
1034
  this.insertGeneration.delete(deviceId);
927
1035
  this.delegates.delete(deviceId);
928
1036
  this.logger.log(`Detached Shelly device=${deviceId}`, { resource: deviceId });
929
1037
  }
930
1038
  async setChannelValue(device, channel, updates) {
931
- const handler = this.setChannelsHandlers.get(`${device.identifier}|${channel.id}`);
1039
+ const handler = this.resolveChannelHandler(device.identifier, channel.id);
932
1040
  if (!handler) {
933
1041
  return Promise.reject(new devices_shelly_ng_exceptions_1.DevicesShellyNgNotImplementedException('Multiple property writes are not supported by the component.'));
934
1042
  }
@@ -946,7 +1054,7 @@ let DelegatesManagerService = class DelegatesManagerService {
946
1054
  return handler(transformedUpdates);
947
1055
  }
948
1056
  async setPropertyValue(device, property, value) {
949
- const handler = this.setPropertiesHandlers.get(`${device.identifier}|${property.id}`);
1057
+ const handler = this.resolvePropertyHandler(device.identifier, property.id);
950
1058
  if (!handler) {
951
1059
  this.logger.warn(`Trying to write to device=${device.identifier} to not writable property=${property.id} value=${value}`, { resource: device.id });
952
1060
  return Promise.resolve(false);
@@ -1067,10 +1175,51 @@ let DelegatesManagerService = class DelegatesManagerService {
1067
1175
  value,
1068
1176
  }));
1069
1177
  }
1178
+ resolvePropertyHandler(deviceIdentifier, propertyId) {
1179
+ const delegateIds = this.identifierToDelegates.get(deviceIdentifier);
1180
+ if (!delegateIds)
1181
+ return undefined;
1182
+ let fallback;
1183
+ for (const delegateId of delegateIds) {
1184
+ const handler = this.setPropertiesHandlers.get(`${delegateId}|${propertyId}`);
1185
+ if (!handler)
1186
+ continue;
1187
+ if (this.delegateConnectedState.get(delegateId))
1188
+ return handler;
1189
+ fallback ??= handler;
1190
+ }
1191
+ return fallback;
1192
+ }
1193
+ resolveChannelHandler(deviceIdentifier, channelId) {
1194
+ const delegateIds = this.identifierToDelegates.get(deviceIdentifier);
1195
+ if (!delegateIds)
1196
+ return undefined;
1197
+ let fallback;
1198
+ for (const delegateId of delegateIds) {
1199
+ const handler = this.setChannelsHandlers.get(`${delegateId}|${channelId}`);
1200
+ if (!handler)
1201
+ continue;
1202
+ if (this.delegateConnectedState.get(delegateId))
1203
+ return handler;
1204
+ fallback ??= handler;
1205
+ }
1206
+ return fallback;
1207
+ }
1070
1208
  detach() {
1071
- for (const [deviceId] of this.delegates.entries()) {
1072
- this.performRemove(deviceId);
1209
+ for (const [, delegate] of this.delegates.entries()) {
1210
+ const valueHandler = this.delegateValueHandlers.get(delegate.id);
1211
+ const connectionHandler = this.delegateConnectionHandlers.get(delegate.id);
1212
+ if (valueHandler) {
1213
+ delegate.off('value', valueHandler);
1214
+ }
1215
+ if (connectionHandler) {
1216
+ delegate.off('connected', connectionHandler);
1217
+ }
1073
1218
  }
1219
+ this.delegates.clear();
1220
+ this.delegateValueHandlers.clear();
1221
+ this.delegateConnectionHandlers.clear();
1222
+ this.delegateDeviceIds.clear();
1074
1223
  this.changeHandlers.clear();
1075
1224
  this.setPropertiesHandlers.clear();
1076
1225
  this.setChannelsHandlers.clear();
@@ -1080,10 +1229,37 @@ let DelegatesManagerService = class DelegatesManagerService {
1080
1229
  }
1081
1230
  this.pendingWrites.clear();
1082
1231
  this.deviceLocks.clear();
1232
+ this.canonicalMacLocks.clear();
1233
+ this.connectedDelegatesPerDevice.clear();
1234
+ this.delegateToIdentifier.clear();
1235
+ this.identifierToDelegates.clear();
1236
+ this.delegateConnectedState.clear();
1237
+ this.insertGeneration.clear();
1083
1238
  }
1084
1239
  destroy() {
1085
1240
  this.detach();
1086
1241
  }
1242
+ async withCanonicalMacLock(canonicalMac, fn) {
1243
+ if (!canonicalMac) {
1244
+ return fn();
1245
+ }
1246
+ const pending = this.canonicalMacLocks.get(canonicalMac) ?? Promise.resolve();
1247
+ let resolveLock;
1248
+ const lock = new Promise((r) => {
1249
+ resolveLock = r;
1250
+ });
1251
+ this.canonicalMacLocks.set(canonicalMac, lock);
1252
+ await pending.catch(() => { });
1253
+ try {
1254
+ return await fn();
1255
+ }
1256
+ finally {
1257
+ resolveLock();
1258
+ if (this.canonicalMacLocks.get(canonicalMac) === lock) {
1259
+ this.canonicalMacLocks.delete(canonicalMac);
1260
+ }
1261
+ }
1262
+ }
1087
1263
  async withDeviceLock(deviceId, fn) {
1088
1264
  const pending = this.deviceLocks.get(deviceId) ?? Promise.resolve();
1089
1265
  let resolveLock;
@@ -1111,6 +1287,7 @@ exports.DelegatesManagerService = DelegatesManagerService = __decorate([
1111
1287
  channels_properties_service_1.ChannelsPropertiesService,
1112
1288
  device_connectivity_service_1.DeviceConnectivityService,
1113
1289
  device_manager_service_1.DeviceManagerService,
1290
+ device_address_service_1.DeviceAddressService,
1114
1291
  mappings_1.PropertyMappingStorageService,
1115
1292
  mappings_1.TransformerRegistry])
1116
1293
  ], DelegatesManagerService);