@marcel2215/homebridge-supla-plugin 2.1.8 → 2.1.10

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 (87) hide show
  1. package/config.schema.json +88 -0
  2. package/dist/Accesories/ActionTriggerAccessory.d.ts.map +1 -1
  3. package/dist/Accesories/ActionTriggerAccessory.js +6 -11
  4. package/dist/Accesories/ActionTriggerAccessory.js.map +1 -1
  5. package/dist/Accesories/AirQualityAccessory.d.ts.map +1 -1
  6. package/dist/Accesories/AirQualityAccessory.js +10 -14
  7. package/dist/Accesories/AirQualityAccessory.js.map +1 -1
  8. package/dist/Accesories/ContactSensorAccessory.d.ts.map +1 -1
  9. package/dist/Accesories/ContactSensorAccessory.js +11 -15
  10. package/dist/Accesories/ContactSensorAccessory.js.map +1 -1
  11. package/dist/Accesories/DimmerAccessory.d.ts +2 -0
  12. package/dist/Accesories/DimmerAccessory.d.ts.map +1 -1
  13. package/dist/Accesories/DimmerAccessory.js +30 -26
  14. package/dist/Accesories/DimmerAccessory.js.map +1 -1
  15. package/dist/Accesories/DimmerRgbLightAccessory.d.ts.map +1 -1
  16. package/dist/Accesories/DimmerRgbLightAccessory.js +33 -43
  17. package/dist/Accesories/DimmerRgbLightAccessory.js.map +1 -1
  18. package/dist/Accesories/DoorAccessory.d.ts.map +1 -1
  19. package/dist/Accesories/DoorAccessory.js +13 -18
  20. package/dist/Accesories/DoorAccessory.js.map +1 -1
  21. package/dist/Accesories/ElectricityMeterAccessory.js +16 -24
  22. package/dist/Accesories/ElectricityMeterAccessory.js.map +1 -1
  23. package/dist/Accesories/FacadeBlindAccessory.d.ts +15 -0
  24. package/dist/Accesories/FacadeBlindAccessory.d.ts.map +1 -1
  25. package/dist/Accesories/FacadeBlindAccessory.js +235 -57
  26. package/dist/Accesories/FacadeBlindAccessory.js.map +1 -1
  27. package/dist/Accesories/GarageDoorOpenerAccesory.d.ts +2 -0
  28. package/dist/Accesories/GarageDoorOpenerAccesory.d.ts.map +1 -1
  29. package/dist/Accesories/GarageDoorOpenerAccesory.js +23 -16
  30. package/dist/Accesories/GarageDoorOpenerAccesory.js.map +1 -1
  31. package/dist/Accesories/GateAccessory.d.ts +21 -0
  32. package/dist/Accesories/GateAccessory.d.ts.map +1 -0
  33. package/dist/Accesories/GateAccessory.js +98 -0
  34. package/dist/Accesories/GateAccessory.js.map +1 -0
  35. package/dist/Accesories/GateLockAccessory.d.ts +19 -0
  36. package/dist/Accesories/GateLockAccessory.d.ts.map +1 -0
  37. package/dist/Accesories/GateLockAccessory.js +101 -0
  38. package/dist/Accesories/GateLockAccessory.js.map +1 -0
  39. package/dist/Accesories/LeakSensorAccessory.d.ts.map +1 -1
  40. package/dist/Accesories/LeakSensorAccessory.js +11 -15
  41. package/dist/Accesories/LeakSensorAccessory.js.map +1 -1
  42. package/dist/Accesories/LightBulbAccesory.d.ts +2 -0
  43. package/dist/Accesories/LightBulbAccesory.d.ts.map +1 -1
  44. package/dist/Accesories/LightBulbAccesory.js +24 -19
  45. package/dist/Accesories/LightBulbAccesory.js.map +1 -1
  46. package/dist/Accesories/PressureAccessory.d.ts.map +1 -1
  47. package/dist/Accesories/PressureAccessory.js +10 -14
  48. package/dist/Accesories/PressureAccessory.js.map +1 -1
  49. package/dist/Accesories/RGBLightBulbAccesory.d.ts.map +1 -1
  50. package/dist/Accesories/RGBLightBulbAccesory.js +21 -29
  51. package/dist/Accesories/RGBLightBulbAccesory.js.map +1 -1
  52. package/dist/Accesories/RollerShutterAccessory.d.ts +10 -0
  53. package/dist/Accesories/RollerShutterAccessory.d.ts.map +1 -1
  54. package/dist/Accesories/RollerShutterAccessory.js +203 -50
  55. package/dist/Accesories/RollerShutterAccessory.js.map +1 -1
  56. package/dist/Accesories/SwitchAccessory.d.ts +2 -0
  57. package/dist/Accesories/SwitchAccessory.d.ts.map +1 -1
  58. package/dist/Accesories/SwitchAccessory.js +23 -18
  59. package/dist/Accesories/SwitchAccessory.js.map +1 -1
  60. package/dist/Accesories/TemperatureAccessory.d.ts.map +1 -1
  61. package/dist/Accesories/TemperatureAccessory.js +10 -14
  62. package/dist/Accesories/TemperatureAccessory.js.map +1 -1
  63. package/dist/Accesories/TemperatureHumidityAccessory.d.ts.map +1 -1
  64. package/dist/Accesories/TemperatureHumidityAccessory.js +18 -23
  65. package/dist/Accesories/TemperatureHumidityAccessory.js.map +1 -1
  66. package/dist/Accesories/ThermostatAccessory.d.ts.map +1 -1
  67. package/dist/Accesories/ThermostatAccessory.js +40 -48
  68. package/dist/Accesories/ThermostatAccessory.js.map +1 -1
  69. package/dist/Accesories/ValveAccessory.d.ts.map +1 -1
  70. package/dist/Accesories/ValveAccessory.js +20 -25
  71. package/dist/Accesories/ValveAccessory.js.map +1 -1
  72. package/dist/Accesories/WicketAccesory.d.ts.map +1 -1
  73. package/dist/Accesories/WicketAccesory.js +5 -8
  74. package/dist/Accesories/WicketAccesory.js.map +1 -1
  75. package/dist/Heplers/SuplaMqttClient.d.ts +7 -1
  76. package/dist/Heplers/SuplaMqttClient.d.ts.map +1 -1
  77. package/dist/Heplers/SuplaMqttClient.js +148 -49
  78. package/dist/Heplers/SuplaMqttClient.js.map +1 -1
  79. package/dist/Heplers/SuplaMqttClientContext.d.ts +4 -1
  80. package/dist/Heplers/SuplaMqttClientContext.d.ts.map +1 -1
  81. package/dist/Heplers/SuplaMqttClientContext.js +4 -1
  82. package/dist/Heplers/SuplaMqttClientContext.js.map +1 -1
  83. package/dist/platform.d.ts +58 -0
  84. package/dist/platform.d.ts.map +1 -1
  85. package/dist/platform.js +523 -10
  86. package/dist/platform.js.map +1 -1
  87. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PressureAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/PressureAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,SAAS,CAAQ;gBAGN,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,mBAAmB;IAqCzC,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIpD,OAAO,CAAC,KAAK;CAGd"}
1
+ {"version":3,"file":"PressureAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/PressureAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,SAAS,CAAQ;gBAGN,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,mBAAmB;IAyCzC,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIpD,OAAO,CAAC,KAAK;CAGd"}
@@ -16,21 +16,17 @@ class PressureAccessory {
16
16
  this.service.setCharacteristic(this.platform.Characteristic.Name, accessory.displayName);
17
17
  this.service.getCharacteristic(this.platform.Characteristic.CurrentAmbientLightLevel)
18
18
  .onGet(this.handleValueGet.bind(this));
19
- this.platform.MqttClient.client.subscribe(`${this.context.topic}/state/value`);
20
- this.platform.MqttClient.client.subscribe(`${this.context.topic}/state/connected`);
21
- this.platform.MqttClient.client.on('message', (topic, message) => {
22
- if (topic === `${this.context.topic}/state/value`) {
23
- const value = parseFloat(message.toString());
24
- if (!Number.isNaN(value)) {
25
- this.value = this.clamp(value, 0.0001, 100000);
26
- this.service.updateCharacteristic(this.platform.Characteristic.CurrentAmbientLightLevel, this.value);
27
- }
19
+ this.platform.registerMqttHandler(`${this.context.topic}/state/value`, (message) => {
20
+ const value = parseFloat(message.toString());
21
+ if (!Number.isNaN(value)) {
22
+ this.value = this.clamp(value, 0.0001, 100000);
23
+ this.service.updateCharacteristic(this.platform.Characteristic.CurrentAmbientLightLevel, this.value);
28
24
  }
29
- if (topic === `${this.context.topic}/state/connected`) {
30
- this.connected = message.toString() === 'true';
31
- this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, this.connected ? 0 : 1);
32
- }
33
- });
25
+ }, this.accessory.UUID);
26
+ this.platform.registerMqttHandler(`${this.context.topic}/state/connected`, (message) => {
27
+ this.connected = this.platform.parseBoolean(message.toString());
28
+ this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, this.connected ? 0 : 1);
29
+ }, this.accessory.UUID);
34
30
  }
35
31
  async handleValueGet() {
36
32
  return this.value;
@@ -1 +1 @@
1
- {"version":3,"file":"PressureAccessory.js","sourceRoot":"","sources":["../../src/Accesories/PressureAccessory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PressureAccessory.js","sourceRoot":"","sources":["../../src/Accesories/PressureAccessory.ts"],"names":[],"mappings":";;;AAIA,MAAa,iBAAiB;IAK5B,YACmB,QAAuB,EACvB,SAA4B,EAC5B,OAA4B;QAF5B,aAAQ,GAAR,QAAQ,CAAe;QACvB,cAAS,GAAT,SAAS,CAAmB;QAC5B,YAAO,GAAP,OAAO,CAAqB;QANvC,UAAK,GAAG,MAAM,CAAC;QACf,cAAS,GAAG,IAAI,CAAC;QAOvB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAE;aACnE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC;aACrE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAE3E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;eACtE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAElE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;QAEzF,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,wBAAwB,CAAC;aAClF,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEzC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAC/B,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,cAAc,EACnC,CAAC,OAAO,EAAE,EAAE;YACV,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC/C,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC/B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,wBAAwB,EACrD,IAAI,CAAC,KAAK,CACX,CAAC;aACH;QACH,CAAC,EACD,IAAI,CAAC,SAAS,CAAC,IAAI,CACpB,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAC/B,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,kBAAkB,EACvC,CAAC,OAAO,EAAE,EAAE;YACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC/B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,EACxC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACvB,CAAC;QACJ,CAAC,EACD,IAAI,CAAC,SAAS,CAAC,IAAI,CACpB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;CACF;AAxDD,8CAwDC"}
@@ -1 +1 @@
1
- {"version":3,"file":"RGBLightBulbAccesory.d.ts","sourceRoot":"","sources":["../../src/Accesories/RGBLightBulbAccesory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AAEnE,qBAAa,gBAAgB;IASzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAV1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,SAAS,CAAQ;gBAIN,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,mBAAmB;IA0DzC,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI3C,WAAW,CAAC,KAAK,EAAE,mBAAmB;IAStC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAInD,mBAAmB,CAAC,KAAK,EAAE,mBAAmB;IAS9C,YAAY,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI5C,YAAY,CAAC,KAAK,EAAE,mBAAmB;IAWvC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAInD,mBAAmB,CAAC,KAAK,EAAE,mBAAmB;IAWpD,OAAO,CAAC,WAAW;CAKpB"}
1
+ {"version":3,"file":"RGBLightBulbAccesory.d.ts","sourceRoot":"","sources":["../../src/Accesories/RGBLightBulbAccesory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AAEnE,qBAAa,gBAAgB;IASzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAV1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,SAAS,CAAQ;gBAIN,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,mBAAmB;IAiEzC,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI3C,WAAW,CAAC,KAAK,EAAE,mBAAmB;IAStC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAInD,mBAAmB,CAAC,KAAK,EAAE,mBAAmB;IAS9C,YAAY,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI5C,YAAY,CAAC,KAAK,EAAE,mBAAmB;IAWvC,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAInD,mBAAmB,CAAC,KAAK,EAAE,mBAAmB;IAWpD,OAAO,CAAC,WAAW;CAKpB"}
@@ -29,45 +29,37 @@ class RGBLightAccesory {
29
29
  this.service.getCharacteristic(this.platform.Characteristic.Saturation)
30
30
  .onGet(this.handleSaturationGet.bind(this))
31
31
  .onSet(this.handleSaturationSet.bind(this));
32
- this.platform.MqttClient.client.subscribe(`${this.context.topic}/state/on`);
33
- this.platform.MqttClient.client.subscribe(`${this.context.topic}/state/color`);
34
- this.platform.MqttClient.client.subscribe(`${this.context.topic}/state/color_brightness`);
35
- this.platform.MqttClient.client.subscribe(`${this.context.topic}/state/connected`);
36
- this.platform.MqttClient.client.on('message', (topic, message) => {
37
- switch (topic) {
38
- case `${this.context.topic}/state/on`:
39
- this.state = message.toString() === 'true';
40
- this.service.updateCharacteristic(this.platform.Characteristic.On, this.state);
41
- break;
42
- case `${this.context.topic}/state/color`:
43
- this.rgb = (0, ColorConverters_1.HexToRGB)(message.toString());
44
- this.hsv = (0, ColorConverters_1.RGBtoHSV)(this.rgb.r, this.rgb.g, this.rgb.b);
45
- this.updateColor();
46
- break;
47
- case `${this.context.topic}/state/color_brightness`:
48
- this.hsv.v = parseInt(message.toString(), 10);
49
- this.updateColor();
50
- break;
51
- case `${this.context.topic}/state/connected`:
52
- this.connected = message.toString() === 'true';
53
- this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, this.connected ? 0 : 1);
54
- break;
55
- }
56
- });
32
+ this.platform.registerMqttHandler(`${this.context.topic}/state/on`, (message) => {
33
+ this.state = this.platform.parseBoolean(message.toString());
34
+ this.service.updateCharacteristic(this.platform.Characteristic.On, this.state);
35
+ }, this.accessory.UUID);
36
+ this.platform.registerMqttHandler(`${this.context.topic}/state/color`, (message) => {
37
+ this.rgb = (0, ColorConverters_1.HexToRGB)(message.toString());
38
+ this.hsv = (0, ColorConverters_1.RGBtoHSV)(this.rgb.r, this.rgb.g, this.rgb.b);
39
+ this.updateColor();
40
+ }, this.accessory.UUID);
41
+ this.platform.registerMqttHandler(`${this.context.topic}/state/color_brightness`, (message) => {
42
+ this.hsv.v = parseInt(message.toString(), 10);
43
+ this.updateColor();
44
+ }, this.accessory.UUID);
45
+ this.platform.registerMqttHandler(`${this.context.topic}/state/connected`, (message) => {
46
+ this.connected = this.platform.parseBoolean(message.toString());
47
+ this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, this.connected ? 0 : 1);
48
+ }, this.accessory.UUID);
57
49
  }
58
50
  async handleOnGet() {
59
51
  return this.state;
60
52
  }
61
53
  async handleOnSet(value) {
62
54
  this.platform.log.debug(`Publishing ${this.context.topic}/set/on = ${value.toString()}`);
63
- this.platform.MqttClient.client.publish(`${this.context.topic}/set/on`, value.toString());
55
+ this.platform.publishCommand(`${this.context.topic}/set/on`, value.toString());
64
56
  }
65
57
  async handleBrightnessGet() {
66
58
  return this.hsv.v;
67
59
  }
68
60
  async handleBrightnessSet(value) {
69
61
  this.platform.log.debug(`Publishing ${this.context.topic}/set/color_brightness = ${value.toString()}`);
70
- this.platform.MqttClient.client.publish(`${this.context.topic}/set/color_brightness`, value.toString());
62
+ this.platform.publishCommand(`${this.context.topic}/set/color_brightness`, value.toString());
71
63
  }
72
64
  async handleHueGet() {
73
65
  return this.hsv.h;
@@ -76,7 +68,7 @@ class RGBLightAccesory {
76
68
  this.hsv.h = value;
77
69
  this.rgb = (0, ColorConverters_1.HSVtoRGB)(this.hsv.h, this.hsv.s, this.hsv.v);
78
70
  this.platform.log.debug(`Publishing ${this.context.topic}/set/color = ${(0, ColorConverters_1.RGBToHex)(this.rgb.r, this.rgb.g, this.rgb.b)}`);
79
- this.platform.MqttClient.client.publish(`${this.context.topic}/set/color`, (0, ColorConverters_1.RGBToHex)(this.rgb.r, this.rgb.g, this.rgb.b));
71
+ this.platform.publishCommand(`${this.context.topic}/set/color`, (0, ColorConverters_1.RGBToHex)(this.rgb.r, this.rgb.g, this.rgb.b));
80
72
  }
81
73
  async handleSaturationGet() {
82
74
  return this.hsv.s;
@@ -85,7 +77,7 @@ class RGBLightAccesory {
85
77
  this.hsv.s = value;
86
78
  this.rgb = (0, ColorConverters_1.HSVtoRGB)(this.hsv.h, this.hsv.s, this.hsv.v);
87
79
  this.platform.log.debug(`Publishing ${this.context.topic}/set/color = ${(0, ColorConverters_1.RGBToHex)(this.rgb.r, this.rgb.g, this.rgb.b)}`);
88
- this.platform.MqttClient.client.publish(`${this.context.topic}/set/color`, (0, ColorConverters_1.RGBToHex)(this.rgb.r, this.rgb.g, this.rgb.b));
80
+ this.platform.publishCommand(`${this.context.topic}/set/color`, (0, ColorConverters_1.RGBToHex)(this.rgb.r, this.rgb.g, this.rgb.b));
89
81
  }
90
82
  updateColor() {
91
83
  this.service.updateCharacteristic(this.platform.Characteristic.Hue, this.hsv.h);
@@ -1 +1 @@
1
- {"version":3,"file":"RGBLightBulbAccesory.js","sourceRoot":"","sources":["../../src/Accesories/RGBLightBulbAccesory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RGBLightBulbAccesory.js","sourceRoot":"","sources":["../../src/Accesories/RGBLightBulbAccesory.ts"],"names":[],"mappings":"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"}
@@ -16,10 +16,14 @@ export declare class RollerShutterAccessory {
16
16
  private pendingTargetPosition?;
17
17
  private pendingTargetExpiresAt;
18
18
  private pendingTargetTimer?;
19
+ private motionStopTimer?;
20
+ private lastRawPosition?;
21
+ private jammed;
19
22
  constructor(platform: SuplaPlatform, accessory: PlatformAccessory, context: SuplaChannelContext);
20
23
  handleCurrentPositionGet(): Promise<CharacteristicValue>;
21
24
  handleTargetPositionGet(): Promise<CharacteristicValue>;
22
25
  handleTargetPositionSet(value: CharacteristicValue): Promise<void>;
26
+ handleHoldPositionSet(value: CharacteristicValue): Promise<void>;
23
27
  private applyShutUpdate;
24
28
  private updateConnection;
25
29
  private parseLegacyPayload;
@@ -30,7 +34,13 @@ export declare class RollerShutterAccessory {
30
34
  private getLegacyChannelId;
31
35
  private schedulePendingTimeout;
32
36
  private clearPendingTarget;
37
+ private clearStopTimer;
38
+ private scheduleMotionStopTimer;
39
+ private clearMotionStopTimer;
40
+ private disposeTimers;
41
+ private setJammed;
33
42
  handlePositionStateGet(): Promise<CharacteristicValue>;
43
+ private assertPositionAvailable;
34
44
  private toPosition;
35
45
  private toShut;
36
46
  private clamp;
@@ -1 +1 @@
1
- {"version":3,"file":"RollerShutterAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/RollerShutterAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,qBAAa,sBAAsB;IAc/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAf1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAsD;IAC3E,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,kBAAkB,CAAC,CAAiB;gBAGzB,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,mBAAmB;IAsDzC,wBAAwB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIxD,uBAAuB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIvD,uBAAuB,CAAC,KAAK,EAAE,mBAAmB;IAqDxD,OAAO,CAAC,eAAe;IAkCvB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,kBAAkB;IAyB1B,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,sBAAsB;IA4B9B,OAAO,CAAC,kBAAkB;IAapB,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI5D,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,oBAAoB;CAyB7B"}
1
+ {"version":3,"file":"RollerShutterAccessory.d.ts","sourceRoot":"","sources":["../../src/Accesories/RollerShutterAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,qBAAa,sBAAsB;IAiB/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAlB1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAsD;IAC3E,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,kBAAkB,CAAC,CAAiB;IAC5C,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,MAAM,CAAS;gBAGJ,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,mBAAmB;IAkEzC,wBAAwB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAKxD,uBAAuB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAKvD,uBAAuB,CAAC,KAAK,EAAE,mBAAmB;IA8DlD,qBAAqB,CAAC,KAAK,EAAE,mBAAmB;IAuCtD,OAAO,CAAC,eAAe;IA0EvB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,sBAAsB;IA8B9B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,SAAS;IAWX,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAK5D,OAAO,CAAC,uBAAuB;IAQ/B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,oBAAoB;CAyB7B"}
@@ -13,6 +13,7 @@ class RollerShutterAccessory {
13
13
  this.legacyMode = false;
14
14
  this.hasReceivedPosition = false;
15
15
  this.pendingTargetExpiresAt = 0;
16
+ this.jammed = false;
16
17
  this.accessory.getService(this.platform.Service.AccessoryInformation)
17
18
  .setCharacteristic(this.platform.Characteristic.Manufacturer, 'Supla')
18
19
  .setCharacteristic(this.platform.Characteristic.Model, 'RollerShutter');
@@ -22,10 +23,17 @@ class RollerShutterAccessory {
22
23
  this.service.getCharacteristic(this.platform.Characteristic.CurrentPosition)
23
24
  .onGet(this.handleCurrentPositionGet.bind(this));
24
25
  this.service.getCharacteristic(this.platform.Characteristic.TargetPosition)
26
+ .setProps({ minValue: 0, maxValue: 100, minStep: 1 })
25
27
  .onGet(this.handleTargetPositionGet.bind(this))
26
28
  .onSet(this.handleTargetPositionSet.bind(this));
27
29
  this.service.getCharacteristic(this.platform.Characteristic.PositionState)
28
30
  .onGet(this.handlePositionStateGet.bind(this));
31
+ this.service.getCharacteristic(this.platform.Characteristic.HoldPosition)
32
+ .onSet(this.handleHoldPositionSet.bind(this));
33
+ this.service.setCharacteristic(this.platform.Characteristic.StatusJammed, 0);
34
+ this.platform.registerOwnerCleanup(this.accessory.UUID, () => {
35
+ this.disposeTimers();
36
+ });
29
37
  this.legacyMode = this.isLegacyTopic();
30
38
  const statusTopic = this.legacyMode
31
39
  ? this.getLegacyStatusTopic()
@@ -33,42 +41,41 @@ class RollerShutterAccessory {
33
41
  const connectedTopic = this.legacyMode
34
42
  ? undefined
35
43
  : `${this.context.topic}/state/connected`;
36
- this.platform.MqttClient.client.subscribe(statusTopic);
37
- if (connectedTopic) {
38
- this.platform.MqttClient.client.subscribe(connectedTopic);
39
- }
40
- this.platform.MqttClient.client.on('message', (topic, message) => {
41
- if (topic === statusTopic) {
42
- if (this.legacyMode) {
43
- const parsed = this.parseLegacyPayload(message.toString());
44
- if ((parsed === null || parsed === void 0 ? void 0 : parsed.shut) !== undefined) {
45
- this.applyShutUpdate(parsed.shut);
46
- }
47
- if ((parsed === null || parsed === void 0 ? void 0 : parsed.online) !== undefined) {
48
- this.updateConnection(parsed.online);
49
- }
44
+ this.platform.registerMqttHandler(statusTopic, (message) => {
45
+ if (this.legacyMode) {
46
+ const parsed = this.parseLegacyPayload(message.toString());
47
+ if ((parsed === null || parsed === void 0 ? void 0 : parsed.shut) !== undefined) {
48
+ this.applyShutUpdate(parsed.shut);
50
49
  }
51
- else {
52
- const value = parseFloat(message.toString());
53
- if (!Number.isNaN(value)) {
54
- this.applyShutUpdate(value);
55
- }
50
+ if ((parsed === null || parsed === void 0 ? void 0 : parsed.online) !== undefined) {
51
+ this.updateConnection(parsed.online);
56
52
  }
53
+ return;
57
54
  }
58
- if (!this.legacyMode && connectedTopic && topic === connectedTopic) {
59
- this.updateConnection(message.toString() === 'true');
55
+ const value = parseFloat(message.toString());
56
+ if (!Number.isNaN(value)) {
57
+ this.applyShutUpdate(value);
60
58
  }
61
- });
59
+ }, this.accessory.UUID);
60
+ if (connectedTopic) {
61
+ this.platform.registerMqttHandler(connectedTopic, (message) => {
62
+ this.updateConnection(this.platform.parseBoolean(message.toString()));
63
+ }, this.accessory.UUID);
64
+ }
62
65
  }
63
66
  async handleCurrentPositionGet() {
67
+ this.assertPositionAvailable();
64
68
  return this.currentPosition;
65
69
  }
66
70
  async handleTargetPositionGet() {
71
+ this.assertPositionAvailable();
67
72
  return this.targetPosition;
68
73
  }
69
74
  async handleTargetPositionSet(value) {
70
75
  const target = value;
71
- this.targetPosition = this.clamp(target, 0, 100);
76
+ this.setJammed(false);
77
+ this.clearMotionStopTimer();
78
+ this.targetPosition = Math.round(this.clamp(target, 0, 100));
72
79
  if (this.targetPosition > this.currentPosition) {
73
80
  this.positionState = this.platform.Characteristic.PositionState.INCREASING;
74
81
  }
@@ -80,6 +87,11 @@ class RollerShutterAccessory {
80
87
  }
81
88
  this.service.updateCharacteristic(this.platform.Characteristic.TargetPosition, this.targetPosition);
82
89
  this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.positionState);
90
+ if (this.hasReceivedPosition && this.targetPosition === this.currentPosition) {
91
+ this.clearPendingTarget(false);
92
+ this.clearStopTimer();
93
+ return;
94
+ }
83
95
  if (this.targetPosition !== this.currentPosition) {
84
96
  this.pendingTargetPosition = this.targetPosition;
85
97
  this.schedulePendingTimeout(this.targetPosition, this.currentPosition);
@@ -92,11 +104,13 @@ class RollerShutterAccessory {
92
104
  return;
93
105
  }
94
106
  const controlMode = this.platform.getCoveringControlMode();
95
- const shutValue = this.toShut(this.targetPosition).toString();
96
- if (controlMode === 'set' || controlMode === 'hybrid') {
107
+ const shutValue = Math.round(this.toShut(this.targetPosition)).toString();
108
+ const isEndpoint = this.targetPosition === 0 || this.targetPosition === 100;
109
+ if ((controlMode === 'set' || controlMode === 'hybrid')
110
+ && !(controlMode === 'hybrid' && isEndpoint)) {
97
111
  const topic = `${this.context.topic}/${this.platform.getCoveringSetTopicSuffix()}`;
98
112
  this.platform.log.debug(`Publishing ${topic} = ${shutValue}`);
99
- this.platform.MqttClient.client.publish(topic, shutValue, (error) => {
113
+ this.platform.publishCommand(topic, shutValue, (error) => {
100
114
  if (error) {
101
115
  this.platform.log.error(`Publish failed for ${topic}: ${error.message}`);
102
116
  }
@@ -110,7 +124,7 @@ class RollerShutterAccessory {
110
124
  const action = this.resolveAction(this.targetPosition, this.currentPosition);
111
125
  if (action) {
112
126
  this.platform.log.debug(`Publishing ${actionTopic} = ${action}`);
113
- this.platform.MqttClient.client.publish(actionTopic, action, (error) => {
127
+ this.platform.publishCommand(actionTopic, action, (error) => {
114
128
  if (error) {
115
129
  this.platform.log.error(`Publish failed for ${actionTopic}: ${error.message}`);
116
130
  }
@@ -121,36 +135,128 @@ class RollerShutterAccessory {
121
135
  }
122
136
  }
123
137
  }
138
+ async handleHoldPositionSet(value) {
139
+ if (!value) {
140
+ return;
141
+ }
142
+ if (this.legacyMode) {
143
+ this.platform.log.debug(`HoldPosition ignored for legacy rollershutter ${this.accessory.displayName}`);
144
+ this.service.updateCharacteristic(this.platform.Characteristic.HoldPosition, 0);
145
+ return;
146
+ }
147
+ const controlMode = this.platform.getCoveringControlMode();
148
+ if (controlMode === 'set') {
149
+ this.platform.log.debug(`HoldPosition ignored (set mode) for ${this.accessory.displayName}`);
150
+ this.service.updateCharacteristic(this.platform.Characteristic.HoldPosition, 0);
151
+ return;
152
+ }
153
+ const stopAction = this.platform.getCoveringExecuteActionStop();
154
+ if (!stopAction) {
155
+ this.platform.log.debug(`HoldPosition ignored (no stop action) for ${this.accessory.displayName}`);
156
+ this.service.updateCharacteristic(this.platform.Characteristic.HoldPosition, 0);
157
+ return;
158
+ }
159
+ const actionTopic = `${this.context.topic}/execute_action`;
160
+ this.platform.log.debug(`Publishing ${actionTopic} = ${stopAction} (hold)`);
161
+ this.platform.publishCommand(actionTopic, stopAction, (error) => {
162
+ if (error) {
163
+ this.platform.log.error(`Publish failed for ${actionTopic}: ${error.message}`);
164
+ }
165
+ });
166
+ this.service.updateCharacteristic(this.platform.Characteristic.HoldPosition, 0);
167
+ this.clearPendingTarget(true);
168
+ this.clearStopTimer();
169
+ this.clearMotionStopTimer();
170
+ this.setJammed(false);
171
+ if (this.positionState !== this.platform.Characteristic.PositionState.STOPPED) {
172
+ this.positionState = this.platform.Characteristic.PositionState.STOPPED;
173
+ this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.positionState);
174
+ }
175
+ }
124
176
  applyShutUpdate(shutValue) {
125
- this.currentPosition = this.toPosition(shutValue);
126
- this.positionState = this.platform.Characteristic.PositionState.STOPPED;
177
+ var _a;
178
+ const previousTarget = this.targetPosition;
179
+ const previousState = this.positionState;
180
+ const rawPosition = this.toPosition(shutValue);
181
+ const previousRaw = (_a = this.lastRawPosition) !== null && _a !== void 0 ? _a : rawPosition;
182
+ const rawDelta = rawPosition - previousRaw;
183
+ const rawMovement = Math.abs(rawDelta) >= 0.05;
184
+ this.lastRawPosition = rawPosition;
185
+ const previousPosition = this.currentPosition;
186
+ this.currentPosition = Math.round(rawPosition);
187
+ let nextPositionState = this.platform.Characteristic.PositionState.STOPPED;
127
188
  const now = Date.now();
128
- if (!this.hasReceivedPosition) {
189
+ const firstUpdate = !this.hasReceivedPosition;
190
+ if (firstUpdate) {
129
191
  this.hasReceivedPosition = true;
130
- this.clearPendingTarget(false);
131
- this.targetPosition = this.currentPosition;
132
192
  }
133
- else if (this.pendingTargetPosition !== undefined) {
193
+ if (rawMovement || this.currentPosition !== previousPosition) {
194
+ this.setJammed(false);
195
+ }
196
+ if (this.pendingTargetPosition !== undefined) {
197
+ this.clearMotionStopTimer();
134
198
  const reached = Math.abs(this.pendingTargetPosition - this.currentPosition) <= 1;
135
199
  const expired = this.pendingTargetExpiresAt > 0 && now > this.pendingTargetExpiresAt;
136
200
  if (reached || expired) {
201
+ this.clearStopTimer();
137
202
  this.clearPendingTarget(false);
138
203
  this.targetPosition = this.currentPosition;
204
+ if (expired) {
205
+ this.setJammed(true);
206
+ }
139
207
  }
140
208
  else {
141
- this.schedulePendingTimeout(this.pendingTargetPosition, this.currentPosition);
209
+ if (rawMovement || firstUpdate) {
210
+ this.schedulePendingTimeout(this.pendingTargetPosition, this.currentPosition);
211
+ }
212
+ if (this.pendingTargetPosition > this.currentPosition) {
213
+ nextPositionState = this.platform.Characteristic.PositionState.INCREASING;
214
+ }
215
+ else if (this.pendingTargetPosition < this.currentPosition) {
216
+ nextPositionState = this.platform.Characteristic.PositionState.DECREASING;
217
+ }
142
218
  }
143
219
  }
144
220
  else {
221
+ this.clearPendingTarget(false);
222
+ this.clearStopTimer();
145
223
  this.targetPosition = this.currentPosition;
224
+ if (rawMovement) {
225
+ nextPositionState = rawDelta > 0
226
+ ? this.platform.Characteristic.PositionState.INCREASING
227
+ : this.platform.Characteristic.PositionState.DECREASING;
228
+ this.scheduleMotionStopTimer();
229
+ }
230
+ else {
231
+ this.clearMotionStopTimer();
232
+ }
233
+ }
234
+ this.positionState = nextPositionState;
235
+ if (this.currentPosition !== previousPosition) {
236
+ this.service.updateCharacteristic(this.platform.Characteristic.CurrentPosition, this.currentPosition);
237
+ }
238
+ if (this.targetPosition !== previousTarget) {
239
+ this.service.updateCharacteristic(this.platform.Characteristic.TargetPosition, this.targetPosition);
240
+ }
241
+ if (this.positionState !== previousState) {
242
+ this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.positionState);
146
243
  }
147
- this.service.updateCharacteristic(this.platform.Characteristic.CurrentPosition, this.currentPosition);
148
- this.service.updateCharacteristic(this.platform.Characteristic.TargetPosition, this.targetPosition);
149
- this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.positionState);
150
244
  }
151
245
  updateConnection(isConnected) {
152
246
  this.connected = isConnected;
153
247
  this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, this.connected ? 0 : 1);
248
+ if (!this.connected) {
249
+ this.setJammed(false);
250
+ this.hasReceivedPosition = false;
251
+ this.lastRawPosition = undefined;
252
+ this.clearPendingTarget(true);
253
+ this.clearStopTimer();
254
+ this.clearMotionStopTimer();
255
+ if (this.positionState !== this.platform.Characteristic.PositionState.STOPPED) {
256
+ this.positionState = this.platform.Characteristic.PositionState.STOPPED;
257
+ this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.positionState);
258
+ }
259
+ }
154
260
  }
155
261
  parseLegacyPayload(payload) {
156
262
  let data;
@@ -165,15 +271,14 @@ class RollerShutterAccessory {
165
271
  }
166
272
  const record = data;
167
273
  const result = {};
168
- const shutValue = Number(record.shut);
169
- if (!Number.isNaN(shutValue)) {
170
- result.shut = shutValue;
274
+ if (record.shut !== null && typeof record.shut !== 'undefined') {
275
+ const shutValue = Number(record.shut);
276
+ if (!Number.isNaN(shutValue)) {
277
+ result.shut = shutValue;
278
+ }
171
279
  }
172
280
  if (typeof record.online !== 'undefined') {
173
- result.online = record.online === true
174
- || record.online === 1
175
- || record.online === '1'
176
- || record.online === 'true';
281
+ result.online = this.platform.parseBoolean(record.online);
177
282
  }
178
283
  return result;
179
284
  }
@@ -187,7 +292,7 @@ class RollerShutterAccessory {
187
292
  const topic = this.getLegacyCommandTopic();
188
293
  const payload = JSON.stringify({ id: channelId, shut: shutValue });
189
294
  this.platform.log.debug(`Publishing ${topic} = ${payload}`);
190
- this.platform.MqttClient.client.publish(topic, payload, (error) => {
295
+ this.platform.publishCommand(topic, payload, (error) => {
191
296
  if (error) {
192
297
  this.platform.log.error(`Publish failed for ${topic}: ${error.message}`);
193
298
  }
@@ -226,7 +331,8 @@ class RollerShutterAccessory {
226
331
  const delta = Math.abs(target - current);
227
332
  let timeoutMs = 15000;
228
333
  if (travelTimeSeconds > 0 && delta > 0) {
229
- timeoutMs = Math.round((delta / 100) * travelTimeSeconds * 1000) + 1000;
334
+ const computed = Math.round((delta / 100) * travelTimeSeconds * 1000) + 1000;
335
+ timeoutMs = Math.max(5000, computed);
230
336
  }
231
337
  if (timeoutMs <= 0) {
232
338
  return;
@@ -237,12 +343,13 @@ class RollerShutterAccessory {
237
343
  }
238
344
  this.pendingTargetTimer = setTimeout(() => {
239
345
  this.pendingTargetTimer = undefined;
240
- this.pendingTargetPosition = undefined;
241
- this.pendingTargetExpiresAt = 0;
346
+ this.setJammed(true);
347
+ this.clearPendingTarget(true);
242
348
  if (this.positionState !== this.platform.Characteristic.PositionState.STOPPED) {
243
349
  this.positionState = this.platform.Characteristic.PositionState.STOPPED;
244
350
  this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.positionState);
245
351
  }
352
+ this.clearStopTimer();
246
353
  this.platform.log.debug(`No state updates for ${this.accessory.displayName} within ${timeoutMs}ms; marking STOPPED.`);
247
354
  }, timeoutMs);
248
355
  }
@@ -253,14 +360,60 @@ class RollerShutterAccessory {
253
360
  }
254
361
  this.pendingTargetPosition = undefined;
255
362
  this.pendingTargetExpiresAt = 0;
256
- if (syncTarget) {
363
+ if (syncTarget && this.targetPosition !== this.currentPosition) {
257
364
  this.targetPosition = this.currentPosition;
258
365
  this.service.updateCharacteristic(this.platform.Characteristic.TargetPosition, this.targetPosition);
259
366
  }
260
367
  }
368
+ clearStopTimer() {
369
+ if (this.stopTimer) {
370
+ clearTimeout(this.stopTimer);
371
+ this.stopTimer = undefined;
372
+ }
373
+ }
374
+ scheduleMotionStopTimer() {
375
+ const quietMs = 2500;
376
+ if (this.motionStopTimer) {
377
+ clearTimeout(this.motionStopTimer);
378
+ }
379
+ this.motionStopTimer = setTimeout(() => {
380
+ this.motionStopTimer = undefined;
381
+ if (this.pendingTargetPosition !== undefined) {
382
+ return;
383
+ }
384
+ if (this.positionState !== this.platform.Characteristic.PositionState.STOPPED) {
385
+ this.positionState = this.platform.Characteristic.PositionState.STOPPED;
386
+ this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.positionState);
387
+ }
388
+ }, quietMs);
389
+ }
390
+ clearMotionStopTimer() {
391
+ if (this.motionStopTimer) {
392
+ clearTimeout(this.motionStopTimer);
393
+ this.motionStopTimer = undefined;
394
+ }
395
+ }
396
+ disposeTimers() {
397
+ this.clearPendingTarget(false);
398
+ this.clearStopTimer();
399
+ this.clearMotionStopTimer();
400
+ }
401
+ setJammed(isJammed) {
402
+ if (this.jammed === isJammed) {
403
+ return;
404
+ }
405
+ this.jammed = isJammed;
406
+ this.service.updateCharacteristic(this.platform.Characteristic.StatusJammed, this.jammed ? 1 : 0);
407
+ }
261
408
  async handlePositionStateGet() {
409
+ this.assertPositionAvailable();
262
410
  return this.positionState;
263
411
  }
412
+ assertPositionAvailable() {
413
+ if (!this.connected || !this.hasReceivedPosition) {
414
+ throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
415
+ }
416
+ }
264
417
  toPosition(shutValue) {
265
418
  return this.clamp(100 - shutValue, 0, 100);
266
419
  }
@@ -298,7 +451,7 @@ class RollerShutterAccessory {
298
451
  this.stopTimer = setTimeout(() => {
299
452
  const actionTopic = `${this.context.topic}/execute_action`;
300
453
  this.platform.log.debug(`Publishing ${actionTopic} = ${stopAction} (auto-stop)`);
301
- this.platform.MqttClient.client.publish(actionTopic, stopAction, (error) => {
454
+ this.platform.publishCommand(actionTopic, stopAction, (error) => {
302
455
  if (error) {
303
456
  this.platform.log.error(`Publish failed for ${actionTopic}: ${error.message}`);
304
457
  }