matterbridge-dyson-robot 0.1.0

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 (261) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +14 -0
  3. package/README.md +365 -0
  4. package/dist/async-eventemitter.d.ts +9 -0
  5. package/dist/async-eventemitter.d.ts.map +1 -0
  6. package/dist/async-eventemitter.js +35 -0
  7. package/dist/async-eventemitter.js.map +1 -0
  8. package/dist/check-configuration.d.ts +5 -0
  9. package/dist/check-configuration.d.ts.map +1 -0
  10. package/dist/check-configuration.js +35 -0
  11. package/dist/check-configuration.js.map +1 -0
  12. package/dist/check-versions.d.ts +3 -0
  13. package/dist/check-versions.d.ts.map +1 -0
  14. package/dist/check-versions.js +31 -0
  15. package/dist/check-versions.js.map +1 -0
  16. package/dist/config-types.d.ts +48 -0
  17. package/dist/config-types.d.ts.map +1 -0
  18. package/dist/config-types.js +4 -0
  19. package/dist/config-types.js.map +1 -0
  20. package/dist/decorator-changed.d.ts +16 -0
  21. package/dist/decorator-changed.d.ts.map +1 -0
  22. package/dist/decorator-changed.js +62 -0
  23. package/dist/decorator-changed.js.map +1 -0
  24. package/dist/dyson-360-msg-types.d.ts +113 -0
  25. package/dist/dyson-360-msg-types.d.ts.map +1 -0
  26. package/dist/dyson-360-msg-types.js +4 -0
  27. package/dist/dyson-360-msg-types.js.map +1 -0
  28. package/dist/dyson-360-types.d.ts +76 -0
  29. package/dist/dyson-360-types.d.ts.map +1 -0
  30. package/dist/dyson-360-types.js +72 -0
  31. package/dist/dyson-360-types.js.map +1 -0
  32. package/dist/dyson-air-msg-types.d.ts +99 -0
  33. package/dist/dyson-air-msg-types.d.ts.map +1 -0
  34. package/dist/dyson-air-msg-types.js +4 -0
  35. package/dist/dyson-air-msg-types.js.map +1 -0
  36. package/dist/dyson-air-sensor-types.d.ts +59 -0
  37. package/dist/dyson-air-sensor-types.d.ts.map +1 -0
  38. package/dist/dyson-air-sensor-types.js +4 -0
  39. package/dist/dyson-air-sensor-types.js.map +1 -0
  40. package/dist/dyson-air-state-types.d.ts +96 -0
  41. package/dist/dyson-air-state-types.d.ts.map +1 -0
  42. package/dist/dyson-air-state-types.js +4 -0
  43. package/dist/dyson-air-state-types.js.map +1 -0
  44. package/dist/dyson-air-types.d.ts +325 -0
  45. package/dist/dyson-air-types.d.ts.map +1 -0
  46. package/dist/dyson-air-types.js +382 -0
  47. package/dist/dyson-air-types.js.map +1 -0
  48. package/dist/dyson-device-360-base.d.ts +35 -0
  49. package/dist/dyson-device-360-base.d.ts.map +1 -0
  50. package/dist/dyson-device-360-base.js +233 -0
  51. package/dist/dyson-device-360-base.js.map +1 -0
  52. package/dist/dyson-device-360-commands.d.ts +7 -0
  53. package/dist/dyson-device-360-commands.d.ts.map +1 -0
  54. package/dist/dyson-device-360-commands.js +129 -0
  55. package/dist/dyson-device-360-commands.js.map +1 -0
  56. package/dist/dyson-device-360-faults-table.d.ts +20 -0
  57. package/dist/dyson-device-360-faults-table.d.ts.map +1 -0
  58. package/dist/dyson-device-360-faults-table.js +161 -0
  59. package/dist/dyson-device-360-faults-table.js.map +1 -0
  60. package/dist/dyson-device-360-faults.d.ts +10 -0
  61. package/dist/dyson-device-360-faults.d.ts.map +1 -0
  62. package/dist/dyson-device-360-faults.js +123 -0
  63. package/dist/dyson-device-360-faults.js.map +1 -0
  64. package/dist/dyson-device-360.d.ts +38 -0
  65. package/dist/dyson-device-360.d.ts.map +1 -0
  66. package/dist/dyson-device-360.js +45 -0
  67. package/dist/dyson-device-360.js.map +1 -0
  68. package/dist/dyson-device-air-base.d.ts +41 -0
  69. package/dist/dyson-device-air-base.d.ts.map +1 -0
  70. package/dist/dyson-device-air-base.js +446 -0
  71. package/dist/dyson-device-air-base.js.map +1 -0
  72. package/dist/dyson-device-air-heat.d.ts +52 -0
  73. package/dist/dyson-device-air-heat.d.ts.map +1 -0
  74. package/dist/dyson-device-air-heat.js +71 -0
  75. package/dist/dyson-device-air-heat.js.map +1 -0
  76. package/dist/dyson-device-air-quality.d.ts +7 -0
  77. package/dist/dyson-device-air-quality.d.ts.map +1 -0
  78. package/dist/dyson-device-air-quality.js +101 -0
  79. package/dist/dyson-device-air-quality.js.map +1 -0
  80. package/dist/dyson-device-air.d.ts +216 -0
  81. package/dist/dyson-device-air.d.ts.map +1 -0
  82. package/dist/dyson-device-air.js +80 -0
  83. package/dist/dyson-device-air.js.map +1 -0
  84. package/dist/dyson-device-base.d.ts +49 -0
  85. package/dist/dyson-device-base.d.ts.map +1 -0
  86. package/dist/dyson-device-base.js +46 -0
  87. package/dist/dyson-device-base.js.map +1 -0
  88. package/dist/dyson-device.d.ts +5 -0
  89. package/dist/dyson-device.d.ts.map +1 -0
  90. package/dist/dyson-device.js +43 -0
  91. package/dist/dyson-device.js.map +1 -0
  92. package/dist/dyson-mqtt-360.d.ts +16 -0
  93. package/dist/dyson-mqtt-360.d.ts.map +1 -0
  94. package/dist/dyson-mqtt-360.js +83 -0
  95. package/dist/dyson-mqtt-360.js.map +1 -0
  96. package/dist/dyson-mqtt-air.d.ts +48 -0
  97. package/dist/dyson-mqtt-air.d.ts.map +1 -0
  98. package/dist/dyson-mqtt-air.js +216 -0
  99. package/dist/dyson-mqtt-air.js.map +1 -0
  100. package/dist/dyson-mqtt-config.d.ts +6 -0
  101. package/dist/dyson-mqtt-config.d.ts.map +1 -0
  102. package/dist/dyson-mqtt-config.js +47 -0
  103. package/dist/dyson-mqtt-config.js.map +1 -0
  104. package/dist/dyson-mqtt-connect.d.ts +22 -0
  105. package/dist/dyson-mqtt-connect.d.ts.map +1 -0
  106. package/dist/dyson-mqtt-connect.js +145 -0
  107. package/dist/dyson-mqtt-connect.js.map +1 -0
  108. package/dist/dyson-mqtt-filter.d.ts +10 -0
  109. package/dist/dyson-mqtt-filter.d.ts.map +1 -0
  110. package/dist/dyson-mqtt-filter.js +25 -0
  111. package/dist/dyson-mqtt-filter.js.map +1 -0
  112. package/dist/dyson-mqtt-parse.d.ts +16 -0
  113. package/dist/dyson-mqtt-parse.d.ts.map +1 -0
  114. package/dist/dyson-mqtt-parse.js +100 -0
  115. package/dist/dyson-mqtt-parse.js.map +1 -0
  116. package/dist/dyson-mqtt-subscribe.d.ts +28 -0
  117. package/dist/dyson-mqtt-subscribe.d.ts.map +1 -0
  118. package/dist/dyson-mqtt-subscribe.js +85 -0
  119. package/dist/dyson-mqtt-subscribe.js.map +1 -0
  120. package/dist/dyson-mqtt.d.ts +51 -0
  121. package/dist/dyson-mqtt.d.ts.map +1 -0
  122. package/dist/dyson-mqtt.js +138 -0
  123. package/dist/dyson-mqtt.js.map +1 -0
  124. package/dist/dyson-types.d.ts +18 -0
  125. package/dist/dyson-types.d.ts.map +1 -0
  126. package/dist/dyson-types.js +20 -0
  127. package/dist/dyson-types.js.map +1 -0
  128. package/dist/endpoint-360-behavior.d.ts +55 -0
  129. package/dist/endpoint-360-behavior.d.ts.map +1 -0
  130. package/dist/endpoint-360-behavior.js +156 -0
  131. package/dist/endpoint-360-behavior.js.map +1 -0
  132. package/dist/endpoint-360-rvc.d.ts +14 -0
  133. package/dist/endpoint-360-rvc.d.ts.map +1 -0
  134. package/dist/endpoint-360-rvc.js +149 -0
  135. package/dist/endpoint-360-rvc.js.map +1 -0
  136. package/dist/endpoint-360.d.ts +35 -0
  137. package/dist/endpoint-360.d.ts.map +1 -0
  138. package/dist/endpoint-360.js +197 -0
  139. package/dist/endpoint-360.js.map +1 -0
  140. package/dist/endpoint-air-purifier.d.ts +24 -0
  141. package/dist/endpoint-air-purifier.d.ts.map +1 -0
  142. package/dist/endpoint-air-purifier.js +97 -0
  143. package/dist/endpoint-air-purifier.js.map +1 -0
  144. package/dist/endpoint-air-quality.d.ts +11 -0
  145. package/dist/endpoint-air-quality.d.ts.map +1 -0
  146. package/dist/endpoint-air-quality.js +104 -0
  147. package/dist/endpoint-air-quality.js.map +1 -0
  148. package/dist/endpoint-air-thermostat.d.ts +358 -0
  149. package/dist/endpoint-air-thermostat.d.ts.map +1 -0
  150. package/dist/endpoint-air-thermostat.js +67 -0
  151. package/dist/endpoint-air-thermostat.js.map +1 -0
  152. package/dist/endpoint-air.d.ts +125 -0
  153. package/dist/endpoint-air.d.ts.map +1 -0
  154. package/dist/endpoint-air.js +459 -0
  155. package/dist/endpoint-air.js.map +1 -0
  156. package/dist/endpoint-base.d.ts +36 -0
  157. package/dist/endpoint-base.d.ts.map +1 -0
  158. package/dist/endpoint-base.js +137 -0
  159. package/dist/endpoint-base.js.map +1 -0
  160. package/dist/error-360.d.ts +35 -0
  161. package/dist/error-360.d.ts.map +1 -0
  162. package/dist/error-360.js +105 -0
  163. package/dist/error-360.js.map +1 -0
  164. package/dist/index.d.ts +5 -0
  165. package/dist/index.d.ts.map +1 -0
  166. package/dist/index.js +8 -0
  167. package/dist/index.js.map +1 -0
  168. package/dist/logger-filter.d.ts +23 -0
  169. package/dist/logger-filter.d.ts.map +1 -0
  170. package/dist/logger-filter.js +104 -0
  171. package/dist/logger-filter.js.map +1 -0
  172. package/dist/logger-options.d.ts +18 -0
  173. package/dist/logger-options.d.ts.map +1 -0
  174. package/dist/logger-options.js +41 -0
  175. package/dist/logger-options.js.map +1 -0
  176. package/dist/logger-prefix.d.ts +12 -0
  177. package/dist/logger-prefix.d.ts.map +1 -0
  178. package/dist/logger-prefix.js +37 -0
  179. package/dist/logger-prefix.js.map +1 -0
  180. package/dist/periodic.d.ts +31 -0
  181. package/dist/periodic.d.ts.map +1 -0
  182. package/dist/periodic.js +102 -0
  183. package/dist/periodic.js.map +1 -0
  184. package/dist/platform.d.ts +18 -0
  185. package/dist/platform.d.ts.map +1 -0
  186. package/dist/platform.js +138 -0
  187. package/dist/platform.js.map +1 -0
  188. package/dist/settings.d.ts +9 -0
  189. package/dist/settings.d.ts.map +1 -0
  190. package/dist/settings.js +28 -0
  191. package/dist/settings.js.map +1 -0
  192. package/dist/ti/config-types-ti.d.ts +16 -0
  193. package/dist/ti/config-types-ti.d.ts.map +1 -0
  194. package/dist/ti/config-types-ti.js +65 -0
  195. package/dist/ti/config-types-ti.js.map +1 -0
  196. package/dist/ti/config-types.d.ts +37 -0
  197. package/dist/ti/config-types.d.ts.map +1 -0
  198. package/dist/ti/config-types.js +11 -0
  199. package/dist/ti/config-types.js.map +1 -0
  200. package/dist/ti/dyson-360-msg-types-ti.d.ts +22 -0
  201. package/dist/ti/dyson-360-msg-types-ti.d.ts.map +1 -0
  202. package/dist/ti/dyson-360-msg-types-ti.js +134 -0
  203. package/dist/ti/dyson-360-msg-types-ti.js.map +1 -0
  204. package/dist/ti/dyson-360-msg-types.d.ts +55 -0
  205. package/dist/ti/dyson-360-msg-types.d.ts.map +1 -0
  206. package/dist/ti/dyson-360-msg-types.js +13 -0
  207. package/dist/ti/dyson-360-msg-types.js.map +1 -0
  208. package/dist/ti/dyson-360-types-ti.d.ts +17 -0
  209. package/dist/ti/dyson-360-types-ti.d.ts.map +1 -0
  210. package/dist/ti/dyson-360-types-ti.js +94 -0
  211. package/dist/ti/dyson-360-types-ti.js.map +1 -0
  212. package/dist/ti/dyson-360-types.d.ts +40 -0
  213. package/dist/ti/dyson-360-types.d.ts.map +1 -0
  214. package/dist/ti/dyson-360-types.js +11 -0
  215. package/dist/ti/dyson-360-types.js.map +1 -0
  216. package/dist/ti/dyson-air-msg-types-ti.d.ts +19 -0
  217. package/dist/ti/dyson-air-msg-types-ti.d.ts.map +1 -0
  218. package/dist/ti/dyson-air-msg-types-ti.js +115 -0
  219. package/dist/ti/dyson-air-msg-types-ti.js.map +1 -0
  220. package/dist/ti/dyson-air-msg-types.d.ts +46 -0
  221. package/dist/ti/dyson-air-msg-types.d.ts.map +1 -0
  222. package/dist/ti/dyson-air-msg-types.js +15 -0
  223. package/dist/ti/dyson-air-msg-types.js.map +1 -0
  224. package/dist/ti/dyson-air-sensor-types-ti.d.ts +9 -0
  225. package/dist/ti/dyson-air-sensor-types-ti.d.ts.map +1 -0
  226. package/dist/ti/dyson-air-sensor-types-ti.js +68 -0
  227. package/dist/ti/dyson-air-sensor-types-ti.js.map +1 -0
  228. package/dist/ti/dyson-air-sensor-types.d.ts +16 -0
  229. package/dist/ti/dyson-air-sensor-types.d.ts.map +1 -0
  230. package/dist/ti/dyson-air-sensor-types.js +12 -0
  231. package/dist/ti/dyson-air-sensor-types.js.map +1 -0
  232. package/dist/ti/dyson-air-state-types-ti.d.ts +9 -0
  233. package/dist/ti/dyson-air-state-types-ti.d.ts.map +1 -0
  234. package/dist/ti/dyson-air-state-types-ti.js +105 -0
  235. package/dist/ti/dyson-air-state-types-ti.js.map +1 -0
  236. package/dist/ti/dyson-air-state-types.d.ts +16 -0
  237. package/dist/ti/dyson-air-state-types.d.ts.map +1 -0
  238. package/dist/ti/dyson-air-state-types.js +12 -0
  239. package/dist/ti/dyson-air-state-types.js.map +1 -0
  240. package/dist/ti/dyson-air-types-ti.d.ts +59 -0
  241. package/dist/ti/dyson-air-types-ti.d.ts.map +1 -0
  242. package/dist/ti/dyson-air-types-ti.js +385 -0
  243. package/dist/ti/dyson-air-types-ti.js.map +1 -0
  244. package/dist/ti/dyson-air-types.d.ts +166 -0
  245. package/dist/ti/dyson-air-types.d.ts.map +1 -0
  246. package/dist/ti/dyson-air-types.js +11 -0
  247. package/dist/ti/dyson-air-types.js.map +1 -0
  248. package/dist/ti/dyson-types-ti.d.ts +10 -0
  249. package/dist/ti/dyson-types-ti.d.ts.map +1 -0
  250. package/dist/ti/dyson-types-ti.js +29 -0
  251. package/dist/ti/dyson-types-ti.js.map +1 -0
  252. package/dist/ti/dyson-types.d.ts +19 -0
  253. package/dist/ti/dyson-types.d.ts.map +1 -0
  254. package/dist/ti/dyson-types.js +11 -0
  255. package/dist/ti/dyson-types.js.map +1 -0
  256. package/dist/utils.d.ts +24 -0
  257. package/dist/utils.d.ts.map +1 -0
  258. package/dist/utils.js +150 -0
  259. package/dist/utils.js.map +1 -0
  260. package/matterbridge-dyson-robot.schema.json +359 -0
  261. package/package.json +93 -0
@@ -0,0 +1,101 @@
1
+ // Matterbridge plugin for Dyson robot vacuum and air treatment devices
2
+ // Copyright © 2025 Alexander Thoukydides
3
+ import { AirQuality, ConcentrationMeasurement } from 'matterbridge/matter/clusters';
4
+ import { assertIsDefined, formatList } from './utils.js';
5
+ // Thresholds to map different pollutants to Air Quality levels:
6
+ // co2r CO2 Common indoor air quality guidelines
7
+ // hcho Formaldehyde WHO guidelines and typical concern levels
8
+ // pm25 PM2.5 US EPA 24-hour AQI breakpoints *
9
+ // pm10 PM10 US EPA 24-hour AQI breakpoints *
10
+ // vact VOC Arbitrary mapping of unknown index values
11
+ // noxl NOx Arbitrary mapping of unknown index values
12
+ // pact Dust Arbitrary mapping of unknown index values
13
+ // * = https://aqs.epa.gov/aqsweb/documents/codetables/aqi_breakpoints.html
14
+ const AQI_COLUMNS = ['co2r', 'hcho', 'pm25', 'pm10', 'vact', 'noxl', 'pact'
15
+ ];
16
+ const AQI_THRESHOLDS = [
17
+ // ppm µg/m³ µg/m³ µg/m³ 0~99 0~99 0~9
18
+ [AirQuality.AirQualityEnum.Good, [800, 10, 9.0, 54, 10, 10, 0]],
19
+ [AirQuality.AirQualityEnum.Fair, [1000, 30, 35.4, 154, 25, 25, 1]],
20
+ [AirQuality.AirQualityEnum.Moderate, [1500, 60, 55.4, 254, 50, 50, 3]],
21
+ [AirQuality.AirQualityEnum.Poor, [2500, 100, 125.4, 354, 75, 75, 5]],
22
+ [AirQuality.AirQualityEnum.VeryPoor, [5000, 200, 225.4, 424, 90, 90, 7]]
23
+ // (AirQuality.AirQualityEnum.ExtremelyPoor for anything higher)
24
+ ];
25
+ // Mapping from Air Quality to Concentration Measurement levels
26
+ const LEVEL_MAP = {
27
+ [AirQuality.AirQualityEnum.Unknown]: ConcentrationMeasurement.LevelValue.Unknown,
28
+ [AirQuality.AirQualityEnum.Good]: ConcentrationMeasurement.LevelValue.Low,
29
+ [AirQuality.AirQualityEnum.Fair]: ConcentrationMeasurement.LevelValue.Low,
30
+ [AirQuality.AirQualityEnum.Moderate]: ConcentrationMeasurement.LevelValue.Medium,
31
+ [AirQuality.AirQualityEnum.Poor]: ConcentrationMeasurement.LevelValue.High,
32
+ [AirQuality.AirQualityEnum.VeryPoor]: ConcentrationMeasurement.LevelValue.High,
33
+ [AirQuality.AirQualityEnum.ExtremelyPoor]: ConcentrationMeasurement.LevelValue.Critical
34
+ };
35
+ // Map numeric sensor values to Air Quality Sensor enum values
36
+ function mapToAirQualitySensorEnum(sensors) {
37
+ const aqiValues = new Map();
38
+ AQI_COLUMNS.forEach((key, index) => {
39
+ const value = sensors[key];
40
+ if (value === undefined)
41
+ return;
42
+ if (typeof value === 'number') {
43
+ const aqiRow = AQI_THRESHOLDS.find(([, thresholds]) => value <= (thresholds[index] ?? Infinity));
44
+ const aqi = aqiRow ? aqiRow[0] : AirQuality.AirQualityEnum.ExtremelyPoor;
45
+ aqiValues.set(key, aqi);
46
+ }
47
+ else {
48
+ aqiValues.set(key, AirQuality.AirQualityEnum.Unknown);
49
+ }
50
+ });
51
+ return aqiValues;
52
+ }
53
+ // Determine the overall air quality as the worst of the available data
54
+ function worstAirQuality(log, aqiValues) {
55
+ const values = [];
56
+ let aqi = AirQuality.AirQualityEnum.Unknown;
57
+ aqiValues.forEach((aqiValue, key) => {
58
+ if (aqiValue > aqi)
59
+ aqi = aqiValue;
60
+ values.push(`${key}:${AirQuality.AirQualityEnum[aqiValue]}`);
61
+ });
62
+ log.debug(`Air quality is ${AirQuality.AirQualityEnum[aqi]} (${formatList(values)})`);
63
+ return aqi;
64
+ }
65
+ // Map Air Quality Sensor values to Concentration Measurement levels
66
+ function mapToAirQualityLevelEnum(aqiValues) {
67
+ const levelValues = new Map();
68
+ aqiValues.forEach((aqi, key) => {
69
+ levelValues.set(key, LEVEL_MAP[aqi]);
70
+ });
71
+ return levelValues;
72
+ }
73
+ export function numeric(value, factor = 1) {
74
+ if (value === undefined)
75
+ return undefined;
76
+ if (typeof value === 'string')
77
+ return null;
78
+ return Math.round(value * factor);
79
+ }
80
+ // Map the Dyson sensor data to Matter attribute values
81
+ export function mapDysonAirSensorStatus(log, status) {
82
+ const { tact, hact, co2r, hcho, pm25, pm10 } = status;
83
+ assertIsDefined(tact);
84
+ assertIsDefined(hact);
85
+ // Map the available measurements to Air Quality
86
+ const aqiValues = mapToAirQualitySensorEnum(status);
87
+ const levelValues = mapToAirQualityLevelEnum(aqiValues);
88
+ // Return the mapped sensor readings
89
+ return {
90
+ airQuality: worstAirQuality(log, aqiValues),
91
+ temperature: numeric(tact, 100), // centi-°C
92
+ humidity: numeric(hact, 100), // centi-%
93
+ voc: levelValues.get('vact'),
94
+ co2: numeric(co2r), // ppm
95
+ nox: levelValues.get('noxl'),
96
+ hcho: numeric(hcho), // µg/m³
97
+ pm25: numeric(pm25), // µg/m³
98
+ pm10: numeric(pm10) // µg/m³
99
+ };
100
+ }
101
+ //# sourceMappingURL=dyson-device-air-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dyson-device-air-quality.js","sourceRoot":"","sources":["../src/dyson-device-air-quality.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,216 @@
1
+ import { DysonDeviceAirBase } from './dyson-device-air-base.js';
2
+ export declare class DysonDeviceAirCoolLink extends DysonDeviceAirBase {
3
+ static readonly model: {
4
+ type: string;
5
+ number: string;
6
+ name: string;
7
+ };
8
+ static readonly filters: {
9
+ hepa: string[];
10
+ };
11
+ }
12
+ export declare class DysonDeviceAirCoolLinkDesk extends DysonDeviceAirCoolLink {
13
+ static readonly model: {
14
+ type: string;
15
+ number: string;
16
+ name: string;
17
+ };
18
+ static readonly filters: {
19
+ hepa: string[];
20
+ };
21
+ }
22
+ declare const DysonDeviceAirHotCoolLink_base: (abstract new (...args: any[]) => {
23
+ installHandlers(endpoints: import("./endpoint-air.js").EndpointsAir): Promise<void>;
24
+ setTargetTemperature(celsius: number): Promise<void>;
25
+ setHeating(heat: boolean): Promise<void>;
26
+ getEntities(): {
27
+ name: import("./config-types.js").EntityName;
28
+ description: string;
29
+ }[];
30
+ updateClusterAttributes(status: import("./dyson-mqtt.js").DysonMqttStatus<import("./dyson-mqtt-air.js").DysonMqttStatusAir>): Promise<void>;
31
+ mqttListener: () => void;
32
+ endpoints?: import("./endpoint-air.js").EndpointsAir;
33
+ hasBreeze: boolean;
34
+ hasCarbonFilter: boolean;
35
+ hasDirection: boolean;
36
+ hasLeftRight: boolean;
37
+ hasUpDown: boolean;
38
+ useFanModeOff: boolean;
39
+ makeEndpoints(validatedNames: import("./config-types.js").EntityName[]): import("./endpoint-air.js").EndpointsAir;
40
+ readonly sensorSupport: import("./endpoint-air.js").EndpointOptionsAirSensors;
41
+ getEndpoints(validatedNames: import("./config-types.js").EntityName[]): import("matterbridge").MatterbridgeEndpoint[];
42
+ start(): Promise<void>;
43
+ stop(): Promise<void>;
44
+ setPower(powerOn: boolean): Promise<void>;
45
+ setFanAuto(): Promise<void>;
46
+ setDirection(forward: boolean): Promise<void>;
47
+ setFanSpeed(speed: number): Promise<void>;
48
+ setNightMode(night: boolean): Promise<void>;
49
+ setOscillateLeftRight(oscillate: boolean): Promise<void>;
50
+ setOscillateUpDown(oscillate: boolean): Promise<void>;
51
+ setOscillateBreeze(breeze: boolean): Promise<void>;
52
+ setState(productState: import("./dyson-mqtt-air.js").DysonMqttProductState): Promise<void>;
53
+ mapDysonFanControlStatus(status: import("./dyson-mqtt.js").DysonMqttStatus<import("./dyson-mqtt-air.js").DysonMqttStatusAir>): import("./endpoint-air.js").UpdateAirFan;
54
+ mapDysonFilterStatus(status: import("./dyson-mqtt.js").DysonMqttStatus<import("./dyson-mqtt-air.js").DysonMqttStatusAir>): import("./endpoint-air.js").UpdateAirFilterMonitoring;
55
+ changed: import("./decorator-changed.js").Changed;
56
+ readonly log: import("matterbridge/logger").AnsiLogger;
57
+ readonly config: import("./config-types.js").Config;
58
+ readonly device: import("./config-types.js").DeviceConfig;
59
+ readonly mqtt: import("./dyson-mqtt-air.js").DysonMqttAir;
60
+ readonly uniqueId: string;
61
+ readonly classStatic: typeof import("./dyson-device-base.js").DysonDevice;
62
+ readonly modelName: string;
63
+ readonly modelNumber: string;
64
+ readonly deviceName: string;
65
+ readonly serialNumber: string;
66
+ }) & typeof DysonDeviceAirCoolLink;
67
+ export declare class DysonDeviceAirHotCoolLink extends DysonDeviceAirHotCoolLink_base {
68
+ static readonly model: {
69
+ type: string;
70
+ number: string;
71
+ name: string;
72
+ };
73
+ static readonly filters: {
74
+ hepa: string[];
75
+ };
76
+ }
77
+ export declare class DysonDeviceAirHotCoolLinkA extends DysonDeviceAirHotCoolLink {
78
+ static readonly model: {
79
+ type: string;
80
+ number: string;
81
+ name: string;
82
+ };
83
+ }
84
+ export declare abstract class DysonDeviceAirCoolBase extends DysonDeviceAirBase {
85
+ static readonly filters: {
86
+ hepa: string[];
87
+ };
88
+ }
89
+ export declare class DysonDeviceAirCool extends DysonDeviceAirCoolBase {
90
+ static readonly model: {
91
+ type: string;
92
+ number: string;
93
+ name: string;
94
+ };
95
+ }
96
+ export declare class DysonDeviceAirCoolE extends DysonDeviceAirCool {
97
+ static readonly model: {
98
+ type: string;
99
+ number: string;
100
+ name: string;
101
+ };
102
+ }
103
+ export declare class DysonDeviceAirCoolK extends DysonDeviceAirCool {
104
+ static readonly model: {
105
+ type: string;
106
+ number: string;
107
+ name: string;
108
+ };
109
+ }
110
+ export declare class DysonDeviceAirCoolDesk extends DysonDeviceAirCool {
111
+ static readonly model: {
112
+ type: string;
113
+ number: string;
114
+ name: string;
115
+ };
116
+ }
117
+ export declare class DysonDeviceAirHumidifyCool extends DysonDeviceAirCoolBase {
118
+ static readonly model: {
119
+ type: string;
120
+ number: string;
121
+ name: string;
122
+ };
123
+ }
124
+ export declare class DysonDeviceAirHumidifyCoolE extends DysonDeviceAirHumidifyCool {
125
+ static readonly model: {
126
+ type: string;
127
+ number: string;
128
+ name: string;
129
+ };
130
+ }
131
+ export declare class DysonDeviceAirHumidifyCoolK extends DysonDeviceAirHumidifyCool {
132
+ static readonly model: {
133
+ type: string;
134
+ number: string;
135
+ name: string;
136
+ };
137
+ }
138
+ declare const DysonDeviceAirHotCool_base: (abstract new (...args: any[]) => {
139
+ installHandlers(endpoints: import("./endpoint-air.js").EndpointsAir): Promise<void>;
140
+ setTargetTemperature(celsius: number): Promise<void>;
141
+ setHeating(heat: boolean): Promise<void>;
142
+ getEntities(): {
143
+ name: import("./config-types.js").EntityName;
144
+ description: string;
145
+ }[];
146
+ updateClusterAttributes(status: import("./dyson-mqtt.js").DysonMqttStatus<import("./dyson-mqtt-air.js").DysonMqttStatusAir>): Promise<void>;
147
+ mqttListener: () => void;
148
+ endpoints?: import("./endpoint-air.js").EndpointsAir;
149
+ hasBreeze: boolean;
150
+ hasCarbonFilter: boolean;
151
+ hasDirection: boolean;
152
+ hasLeftRight: boolean;
153
+ hasUpDown: boolean;
154
+ useFanModeOff: boolean;
155
+ makeEndpoints(validatedNames: import("./config-types.js").EntityName[]): import("./endpoint-air.js").EndpointsAir;
156
+ readonly sensorSupport: import("./endpoint-air.js").EndpointOptionsAirSensors;
157
+ getEndpoints(validatedNames: import("./config-types.js").EntityName[]): import("matterbridge").MatterbridgeEndpoint[];
158
+ start(): Promise<void>;
159
+ stop(): Promise<void>;
160
+ setPower(powerOn: boolean): Promise<void>;
161
+ setFanAuto(): Promise<void>;
162
+ setDirection(forward: boolean): Promise<void>;
163
+ setFanSpeed(speed: number): Promise<void>;
164
+ setNightMode(night: boolean): Promise<void>;
165
+ setOscillateLeftRight(oscillate: boolean): Promise<void>;
166
+ setOscillateUpDown(oscillate: boolean): Promise<void>;
167
+ setOscillateBreeze(breeze: boolean): Promise<void>;
168
+ setState(productState: import("./dyson-mqtt-air.js").DysonMqttProductState): Promise<void>;
169
+ mapDysonFanControlStatus(status: import("./dyson-mqtt.js").DysonMqttStatus<import("./dyson-mqtt-air.js").DysonMqttStatusAir>): import("./endpoint-air.js").UpdateAirFan;
170
+ mapDysonFilterStatus(status: import("./dyson-mqtt.js").DysonMqttStatus<import("./dyson-mqtt-air.js").DysonMqttStatusAir>): import("./endpoint-air.js").UpdateAirFilterMonitoring;
171
+ changed: import("./decorator-changed.js").Changed;
172
+ readonly log: import("matterbridge/logger").AnsiLogger;
173
+ readonly config: import("./config-types.js").Config;
174
+ readonly device: import("./config-types.js").DeviceConfig;
175
+ readonly mqtt: import("./dyson-mqtt-air.js").DysonMqttAir;
176
+ readonly uniqueId: string;
177
+ readonly classStatic: typeof import("./dyson-device-base.js").DysonDevice;
178
+ readonly modelName: string;
179
+ readonly modelNumber: string;
180
+ readonly deviceName: string;
181
+ readonly serialNumber: string;
182
+ }) & typeof DysonDeviceAirCool;
183
+ export declare class DysonDeviceAirHotCool extends DysonDeviceAirHotCool_base {
184
+ static readonly model: {
185
+ type: string;
186
+ number: string;
187
+ name: string;
188
+ };
189
+ }
190
+ export declare class DysonDeviceAirHotCoolE extends DysonDeviceAirHotCool {
191
+ static readonly model: {
192
+ type: string;
193
+ number: string;
194
+ name: string;
195
+ };
196
+ }
197
+ export declare class DysonDeviceAirHotCoolK extends DysonDeviceAirHotCool {
198
+ static readonly model: {
199
+ type: string;
200
+ number: string;
201
+ name: string;
202
+ };
203
+ }
204
+ export declare class DysonDeviceAirBigQuiet extends DysonDeviceAirBase {
205
+ static readonly model: {
206
+ type: string;
207
+ number: string;
208
+ name: string;
209
+ };
210
+ static readonly filters: {
211
+ hepa: string[];
212
+ carbon: string[];
213
+ };
214
+ }
215
+ export {};
216
+ //# sourceMappingURL=dyson-device-air.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dyson-device-air.d.ts","sourceRoot":"","sources":["../src/dyson-device-air.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAOhE,qBAAa,sBAAuB,SAAQ,kBAAkB;IAC1D,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAA2D;IAChF,MAAM,CAAC,QAAQ,CAAC,OAAO;;MAA2B;CACrD;AAGD,qBAAa,0BAA2B,SAAQ,sBAAsB;IAClE,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAAgE;IACrF,MAAM,CAAC,QAAQ,CAAC,OAAO;;MAA2B;CACrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKD,qBAAa,yBAA0B,SAAQ,8BAA+C;IAC1F,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAA+D;IACpF,MAAM,CAAC,QAAQ,CAAC,OAAO;;MAA2B;CACrD;AAGD,qBAAa,0BAA2B,SAAQ,yBAAyB;IACrE,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAAgE;CACxF;AAMD,8BAAsB,sBAAuB,SAAQ,kBAAkB;IACnE,MAAM,CAAC,QAAQ,CAAC,OAAO;;MAA2B;CACrD;AAKD,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC1D,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAA2D;CACnF;AAGD,qBAAa,mBAAoB,SAAQ,kBAAkB;IACvD,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAAyE;CACjG;AACD,qBAAa,mBAAoB,SAAQ,kBAAkB;IACvD,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAAyE;CACjG;AACD,qBAAa,sBAAuB,SAAQ,kBAAkB;IAC1D,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAA2D;CACnF;AAKD,qBAAa,0BAA2B,SAAQ,sBAAsB;IAClE,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAA+D;CACvF;AAGD,qBAAa,2BAA4B,SAAQ,0BAA0B;IACvE,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAAgE;CACxF;AACD,qBAAa,2BAA4B,SAAQ,0BAA0B;IACvE,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAA6E;CACrG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKD,qBAAa,qBAAsB,SAAQ,0BAA2C;IAClF,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAA+D;CACvF;AAGD,qBAAa,sBAAuB,SAAQ,qBAAqB;IAC7D,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAA+D;CACvF;AACD,qBAAa,sBAAuB,SAAQ,qBAAqB;IAC7D,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAA4E;CACpG;AAMD,qBAAa,sBAAuB,SAAQ,kBAAkB;IAC1D,MAAM,CAAC,QAAQ,CAAC,KAAK;;;;MAAqF;IAC1G,MAAM,CAAC,QAAQ,CAAC,OAAO;;;MAAkD;CAC5E"}
@@ -0,0 +1,80 @@
1
+ // Matterbridge plugin for Dyson robot vacuum and air treatment devices
2
+ // Copyright © 2025 Alexander Thoukydides
3
+ import { DysonDeviceAirBase } from './dyson-device-air-base.js';
4
+ import { DysonDeviceAirWithHeat as DysonDeviceAirHeatMixin } from './dyson-device-air-heat.js';
5
+ // =============================================================================
6
+ // Dyson Pure (Hot)+Cool Link family...
7
+ // Dyson Pure Cool Link
8
+ export class DysonDeviceAirCoolLink extends DysonDeviceAirBase {
9
+ static model = { type: '475', number: 'TP02', name: 'Pure Cool Link' };
10
+ static filters = { hepa: ['972426-01'] };
11
+ }
12
+ // Dyson Pure Cool Link alias without significant functional differences
13
+ export class DysonDeviceAirCoolLinkDesk extends DysonDeviceAirCoolLink {
14
+ static model = { type: '469', number: 'DP01', name: 'Pure Cool Link Desk' };
15
+ static filters = { hepa: ['972425-01'] };
16
+ }
17
+ // -----------------------------------------------------------------------------
18
+ // Dyson Pure Hot+Cool Link
19
+ export class DysonDeviceAirHotCoolLink extends DysonDeviceAirHeatMixin(DysonDeviceAirCoolLink) {
20
+ static model = { type: '455', number: 'HP02', name: 'Pure Hot+Cool Link' };
21
+ static filters = { hepa: ['972425-01'] };
22
+ }
23
+ // Dyson Pure Hot+Cool Link alias without significant functional differences
24
+ export class DysonDeviceAirHotCoolLinkA extends DysonDeviceAirHotCoolLink {
25
+ static model = { type: '455A', number: 'HP02', name: 'Pure Hot+Cool Link' };
26
+ }
27
+ // =============================================================================
28
+ // Dyson Pure Cool family...
29
+ // Common base class for Dyson Pure (Humidify|Hot+)Cool family devices
30
+ export class DysonDeviceAirCoolBase extends DysonDeviceAirBase {
31
+ static filters = { hepa: ['965432-01'] };
32
+ }
33
+ // -----------------------------------------------------------------------------
34
+ // Dyson Pure Cool
35
+ export class DysonDeviceAirCool extends DysonDeviceAirCoolBase {
36
+ static model = { type: '438', number: 'TP04/TP06', name: 'Pure Cool' };
37
+ }
38
+ // Dyson Pure Cool aliases without significant functional differences
39
+ export class DysonDeviceAirCoolE extends DysonDeviceAirCool {
40
+ static model = { type: '438E', number: 'TP07/TP09', name: 'Pure Cool Formaldehyde' };
41
+ }
42
+ export class DysonDeviceAirCoolK extends DysonDeviceAirCool {
43
+ static model = { type: '438K', number: 'TP07/TP09', name: 'Pure Cool Formaldehyde' };
44
+ }
45
+ export class DysonDeviceAirCoolDesk extends DysonDeviceAirCool {
46
+ static model = { type: '520', number: 'DP04', name: 'Pure Cool Desk' };
47
+ }
48
+ // -----------------------------------------------------------------------------
49
+ // Dyson Pure Humidify+Cool
50
+ export class DysonDeviceAirHumidifyCool extends DysonDeviceAirCoolBase {
51
+ static model = { type: '358', number: 'PH01', name: 'Pure Humidify+Cool' };
52
+ }
53
+ // Dyson Pure Humidify+Cool aliases without significant functional differences
54
+ export class DysonDeviceAirHumidifyCoolE extends DysonDeviceAirHumidifyCool {
55
+ static model = { type: '358E', number: 'PH03', name: 'Pure Humidify+Cool' };
56
+ }
57
+ export class DysonDeviceAirHumidifyCoolK extends DysonDeviceAirHumidifyCool {
58
+ static model = { type: '358K', number: 'PH04', name: 'Pure Humidify+Cool Formaldehyde' };
59
+ }
60
+ // -----------------------------------------------------------------------------
61
+ // Dyson Pure Hot+Cool
62
+ export class DysonDeviceAirHotCool extends DysonDeviceAirHeatMixin(DysonDeviceAirCool) {
63
+ static model = { type: '527', number: 'HP04/HP06', name: 'Pure Hot+Cool' };
64
+ }
65
+ // Dyson Pure Hot+Cool aliases without significant functional differences
66
+ export class DysonDeviceAirHotCoolE extends DysonDeviceAirHotCool {
67
+ static model = { type: '527E', number: 'HP07', name: 'Purifier Hot+Cool' };
68
+ }
69
+ export class DysonDeviceAirHotCoolK extends DysonDeviceAirHotCool {
70
+ static model = { type: '527K', number: 'HP09', name: 'Purifier Hot+Cool Formaldehyde' };
71
+ }
72
+ // =============================================================================
73
+ // Dyson Big+Quiet family...
74
+ // All Dyson Big+Quiet devices share the same type code
75
+ export class DysonDeviceAirBigQuiet extends DysonDeviceAirBase {
76
+ static model = { type: '664', number: 'BP02/BP03/BP04/BP06', name: 'Purifier Big+Quiet Series' };
77
+ static filters = { hepa: ['972132-01'], carbon: ['972133-03'] };
78
+ }
79
+ // =============================================================================
80
+ //# sourceMappingURL=dyson-device-air.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dyson-device-air.js","sourceRoot":"","sources":["../src/dyson-device-air.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { AnsiLogger } from 'matterbridge/logger';
2
+ import { Config, DeviceConfig, EntityName } from './config-types.js';
3
+ import { DysonMqttLike } from './dyson-mqtt.js';
4
+ import { MatterbridgeEndpoint } from 'matterbridge';
5
+ import { Constructor } from './utils.js';
6
+ import { Changed } from './decorator-changed.js';
7
+ export interface DysonDeviceModel {
8
+ type: string;
9
+ number: string;
10
+ name: string;
11
+ }
12
+ export type DysonDeviceConstructorParams<MQTT extends DysonMqttLike = DysonMqttLike> = [
13
+ log: AnsiLogger,
14
+ config: Config,
15
+ device: DeviceConfig,
16
+ mqtt: MQTT
17
+ ];
18
+ export interface DysonDeviceConstructor<MQTT extends DysonMqttLike = DysonMqttLike, Device extends DysonDevice<MQTT> = DysonDevice<MQTT>> {
19
+ new (...args: DysonDeviceConstructorParams<MQTT>): Device;
20
+ readonly mqttConstructor: Constructor<MQTT>;
21
+ }
22
+ export declare abstract class DysonDevice<MQTT extends DysonMqttLike = DysonMqttLike> {
23
+ readonly log: AnsiLogger;
24
+ readonly config: Config;
25
+ readonly device: DeviceConfig;
26
+ readonly mqtt: MQTT;
27
+ static readonly model: DysonDeviceModel;
28
+ static readonly filters: {
29
+ hepa: string[];
30
+ carbon?: string[];
31
+ };
32
+ static readonly mqttConstructor: Constructor<DysonMqttLike>;
33
+ changed: Changed;
34
+ constructor(log: AnsiLogger, config: Config, device: DeviceConfig, mqtt: MQTT);
35
+ abstract getEntities(): {
36
+ name: EntityName;
37
+ description: string;
38
+ }[];
39
+ abstract getEndpoints(validatedNames: EntityName[]): MatterbridgeEndpoint[];
40
+ abstract start(): Promise<void>;
41
+ stop(): Promise<void>;
42
+ get uniqueId(): string;
43
+ get classStatic(): typeof DysonDevice;
44
+ get modelName(): string;
45
+ get modelNumber(): string;
46
+ get deviceName(): string;
47
+ get serialNumber(): string;
48
+ }
49
+ //# sourceMappingURL=dyson-device-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dyson-device-base.d.ts","sourceRoot":"","sources":["../src/dyson-device-base.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAIjD,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAI,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAI,MAAM,CAAC;CAClB;AAGD,MAAM,MAAM,4BAA4B,CAAC,IAAI,SAAS,aAAa,GAAG,aAAa,IAAI;IACnF,GAAG,EAAK,UAAU;IAClB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,YAAY;IACpB,IAAI,EAAI,IAAI;CACf,CAAC;AAGF,MAAM,WAAW,sBAAsB,CACnC,IAAI,SAAY,aAAa,GAAS,aAAa,EACnD,MAAM,SAAU,WAAW,CAAC,IAAI,CAAC,GAAK,WAAW,CAAC,IAAI,CAAC;IAEvD,KAAK,GAAG,IAAI,EAAE,4BAA4B,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IAC1D,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;CAC/C;AAGD,8BAAsB,WAAW,CAAC,IAAI,SAAS,aAAa,GAAG,aAAa;IAcpE,QAAQ,CAAC,GAAG,EAAQ,UAAU;IAC9B,QAAQ,CAAC,MAAM,EAAK,MAAM;IAC1B,QAAQ,CAAC,MAAM,EAAK,YAAY;IAChC,QAAQ,CAAC,IAAI,EAAO,IAAI;IAd5B,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACxC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAG/D,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IAG5D,OAAO,EAAS,OAAO,CAAC;gBAIX,GAAG,EAAQ,UAAU,EACrB,MAAM,EAAK,MAAM,EACjB,MAAM,EAAK,YAAY,EACvB,IAAI,EAAO,IAAI;IAO5B,QAAQ,CAAC,WAAW,IAAI;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE;IAGnE,QAAQ,CAAC,YAAY,CAAC,cAAc,EAAE,UAAU,EAAE,GAAG,oBAAoB,EAAE;IAG3E,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAGzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,IAAI,QAAQ,IAAI,MAAM,CAIrB;IAGD,IAAI,WAAW,IAAI,OAAO,WAAW,CAAmD;IACxF,IAAI,SAAS,IAAO,MAAM,CAAwC;IAClE,IAAI,WAAW,IAAK,MAAM,CAA0C;IAGpE,IAAI,UAAU,IAAM,MAAM,CAA6B;IACvD,IAAI,YAAY,IAAI,MAAM,CAAiC;CAC9D"}
@@ -0,0 +1,46 @@
1
+ // Matterbridge plugin for Dyson robot vacuum and air treatment devices
2
+ // Copyright © 2025 Alexander Thoukydides
3
+ import { Changed } from './decorator-changed.js';
4
+ import { createHash } from 'crypto';
5
+ // A Dyson robot vacuum or air treatment device
6
+ export class DysonDevice {
7
+ log;
8
+ config;
9
+ device;
10
+ mqtt;
11
+ // Details of the device model
12
+ static model;
13
+ static filters;
14
+ // MQTT client constructor
15
+ static mqttConstructor;
16
+ // Decorator support
17
+ changed;
18
+ // Construct a new Dyson device instance
19
+ constructor(log, config, device, mqtt) {
20
+ this.log = log;
21
+ this.config = config;
22
+ this.device = device;
23
+ this.mqtt = mqtt;
24
+ // Prepare the decorator support
25
+ this.changed = new Changed(log);
26
+ }
27
+ // Stop the device when Matterbridge is shutting down
28
+ async stop() {
29
+ await this.mqtt.stop();
30
+ }
31
+ // Use the serial number to generate a 32-character opaque unique ID
32
+ get uniqueId() {
33
+ const hash = createHash('sha256').update(this.serialNumber).digest('hex');
34
+ const model = this.modelNumber.replace(/.*\//, '').toLowerCase();
35
+ return `dyson-${model}-${hash}`.substring(0, 32);
36
+ }
37
+ // Retrieve the static data for an instance
38
+ get classStatic() { return this.constructor; }
39
+ get modelName() { return this.classStatic.model.name; }
40
+ get modelNumber() { return this.classStatic.model.number; }
41
+ // Retrieve common per-device data
42
+ get deviceName() { return this.device.name; }
43
+ get serialNumber() { return this.device.username; }
44
+ }
45
+ ;
46
+ //# sourceMappingURL=dyson-device-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dyson-device-base.js","sourceRoot":"","sources":["../src/dyson-device-base.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yCAAyC;AAOzC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AA0BpC,+CAA+C;AAC/C,MAAM,OAAgB,WAAW;IAchB;IACA;IACA;IACA;IAfb,8BAA8B;IAC9B,MAAM,CAAU,KAAK,CAAmB;IACxC,MAAM,CAAU,OAAO,CAAwC;IAE/D,0BAA0B;IAC1B,MAAM,CAAU,eAAe,CAA6B;IAE5D,oBAAoB;IACpB,OAAO,CAAiB;IAExB,wCAAwC;IACxC,YACa,GAAqB,EACrB,MAAiB,EACjB,MAAuB,EACvB,IAAe;QAHf,QAAG,GAAH,GAAG,CAAkB;QACrB,WAAM,GAAN,MAAM,CAAW;QACjB,WAAM,GAAN,MAAM,CAAiB;QACvB,SAAI,GAAJ,IAAI,CAAW;QAExB,gCAAgC;QAChC,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAWD,qDAAqD;IACrD,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,oEAAoE;IACpE,IAAI,QAAQ;QACR,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACjE,OAAO,SAAS,KAAK,IAAI,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,2CAA2C;IAC3C,IAAI,WAAW,KAAyB,OAAO,IAAI,CAAC,WAAiC,CAAC,CAAC,CAAC;IACxF,IAAI,SAAS,KAAgB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,IAAI,WAAW,KAAc,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpE,kCAAkC;IAClC,IAAI,UAAU,KAAe,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,IAAI,YAAY,KAAa,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;CAC9D;AAAA,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { DysonDevice } from './dyson-device-base.js';
2
+ import { Config, DeviceConfig } from './config-types.js';
3
+ import { AnsiLogger } from 'matterbridge/logger';
4
+ export declare function createDysonDevice(log: AnsiLogger, config: Config, device: DeviceConfig): Promise<DysonDevice>;
5
+ //# sourceMappingURL=dyson-device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dyson-device.d.ts","sourceRoot":"","sources":["../src/dyson-device.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAuBrD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AA4BjD,wBAAsB,iBAAiB,CACnC,GAAG,EAAS,UAAU,EACtB,MAAM,EAAM,MAAM,EAClB,MAAM,EAAM,YAAY,GACzB,OAAO,CAAC,WAAW,CAAC,CAatB"}
@@ -0,0 +1,43 @@
1
+ // Matterbridge plugin for Dyson robot vacuum and air treatment devices
2
+ // Copyright © 2025 Alexander Thoukydides
3
+ import { DysonDevice360Eye, DysonDevice360Heurist, DysonDevice360VisNav } from './dyson-device-360.js';
4
+ import { DysonDeviceAirCool, DysonDeviceAirCoolDesk, DysonDeviceAirCoolE, DysonDeviceAirCoolK, DysonDeviceAirCoolLink, DysonDeviceAirCoolLinkDesk, DysonDeviceAirHotCool, DysonDeviceAirHotCoolE, DysonDeviceAirHotCoolK, DysonDeviceAirHotCoolLink, DysonDeviceAirHotCoolLinkA, DysonDeviceAirHumidifyCool, DysonDeviceAirHumidifyCoolE, DysonDeviceAirHumidifyCoolK, DysonDeviceAirBigQuiet } from './dyson-device-air.js';
5
+ import { logError } from './utils.js';
6
+ // List of constructors for Dyson devices
7
+ const DYSON_DEVICE_TYPES = [
8
+ // Dyson robot vacuum device types
9
+ DysonDevice360Eye,
10
+ DysonDevice360Heurist,
11
+ DysonDevice360VisNav,
12
+ // Dyson air treatment device types
13
+ DysonDeviceAirCool,
14
+ DysonDeviceAirCoolDesk,
15
+ DysonDeviceAirCoolE,
16
+ DysonDeviceAirCoolK,
17
+ DysonDeviceAirCoolLink,
18
+ DysonDeviceAirCoolLinkDesk,
19
+ DysonDeviceAirHotCool,
20
+ DysonDeviceAirHotCoolE,
21
+ DysonDeviceAirHotCoolK,
22
+ DysonDeviceAirHotCoolLink,
23
+ DysonDeviceAirHotCoolLinkA,
24
+ DysonDeviceAirHumidifyCool,
25
+ DysonDeviceAirHumidifyCoolE,
26
+ DysonDeviceAirHumidifyCoolK,
27
+ DysonDeviceAirBigQuiet
28
+ ];
29
+ // Dyson device factory
30
+ export async function createDysonDevice(log, config, device) {
31
+ // Select the appropriate class for this device
32
+ const { root_topic } = device;
33
+ const deviceClass = DYSON_DEVICE_TYPES.find((device) => device.model.type === root_topic);
34
+ if (!deviceClass)
35
+ throw new Error(`Unknown Dyson device type: ${root_topic}`);
36
+ // Create the MQTT client and wait for it to finish initialising
37
+ const mqtt = new deviceClass.mqttConstructor(log, config, device);
38
+ mqtt.on('error', err => { logError(log, 'MQTT Event', err); });
39
+ await mqtt.waitUntilInitialised();
40
+ // Create the Dyson device itself
41
+ return new deviceClass(log, config, device, mqtt);
42
+ }
43
+ //# sourceMappingURL=dyson-device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dyson-device.js","sourceRoot":"","sources":["../src/dyson-device.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yCAAyC;AAGzC,OAAO,EACH,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACH,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,2BAA2B,EAC3B,sBAAsB,EACzB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,QAAQ,EAAuB,MAAM,YAAY,CAAC;AAE3D,yCAAyC;AACzC,MAAM,kBAAkB,GAAG;IACvB,kCAAkC;IAClC,iBAAiB;IACjB,qBAAqB;IACrB,oBAAoB;IACpB,mCAAmC;IACnC,kBAAkB;IAClB,sBAAsB;IACtB,mBAAmB;IACnB,mBAAmB;IACnB,sBAAsB;IACtB,0BAA0B;IAC1B,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;IACtB,yBAAyB;IACzB,0BAA0B;IAC1B,0BAA0B;IAC1B,2BAA2B;IAC3B,2BAA2B;IAC3B,sBAAsB;CAChB,CAAC;AAEX,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,GAAsB,EACtB,MAAkB,EAClB,MAAwB;IAExB,+CAA+C;IAC/C,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAC9B,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAC1F,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAE9E,gEAAgE;IAChE,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAElC,iCAAiC;IACjC,OAAO,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAwC,CAAC,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { AnsiLogger } from 'matterbridge/logger';
2
+ import { Config, DeviceConfig } from './config-types.js';
3
+ import { DysonMqtt } from './dyson-mqtt.js';
4
+ import { TypeMap as DysonMsgMap360 } from './ti/dyson-360-msg-types.js';
5
+ import { Dyson360MsgCurrentState, Dyson360MsgStateChange } from './dyson-360-msg-types.js';
6
+ import { Dyson360PowerMode } from './dyson-360-types.js';
7
+ export type DysonMqttStatus360 = Omit<Dyson360MsgCurrentState, 'msg' | 'time'>;
8
+ export type DysonMqtt360Action = 'START' | 'PAUSE' | 'RESUME' | 'ABORT';
9
+ export declare class DysonMqtt360 extends DysonMqtt<DysonMsgMap360, DysonMqttStatus360> {
10
+ constructor(log: AnsiLogger, config: Config, device: DeviceConfig);
11
+ convertStateChange(msg: Dyson360MsgStateChange): Dyson360MsgCurrentState;
12
+ updateState(msg: Dyson360MsgCurrentState): void;
13
+ commandAction(msg: DysonMqtt360Action): Promise<void>;
14
+ commandPower(defaultVacuumPowerMode: Dyson360PowerMode): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=dyson-mqtt-360.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dyson-mqtt-360.d.ts","sourceRoot":"","sources":["../src/dyson-mqtt-360.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAmB,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAEH,OAAO,IAAI,cAAc,EAC5B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACH,uBAAuB,EACvB,sBAAsB,EACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGH,iBAAiB,EACpB,MAAM,sBAAsB,CAAC;AAkB9B,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,uBAAuB,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAG/E,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAGxE,qBAAa,YAAa,SAAQ,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC;gBAG/D,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;IAqBjE,kBAAkB,CAAC,GAAG,EAAE,sBAAsB,GAAG,uBAAuB;IAMxE,WAAW,CAAC,GAAG,EAAE,uBAAuB,GAAG,IAAI;IAc/C,aAAa,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBrD,YAAY,CAAC,sBAAsB,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAMzE"}