homebridge-easy-mqtt 1.4.0-beta.15 → 1.4.0-beta.16

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.
package/CHANGELOG.md CHANGED
@@ -2,11 +2,10 @@
2
2
 
3
3
  All notable changes to homebridge-dummy will be documented in this file.
4
4
 
5
- ## 1.4.0-beta.15 (2025-09-25)
5
+ ## 1.4.0-beta.16 (2025-09-26)
6
6
 
7
7
  ### Added
8
- - Support for Air Purifier, Fan (v2) GarageDoorOpener, HeaterCooler, LightSensor, and Valve
9
- - MQTT options JSON can now also include publish options, such as `retain`
8
+ - `Air Purifier`, `Air Quality Sensor`, `Fanv2`, `GarageDoorOpener`, `HeaterCooler`, `LightSensor`, and `Valve`
10
9
  - Broker, username, and password can be set via environment variables ([documentation](https://github.com/mpatfield/homebridge-easy-mqtt#environment-variables))
11
10
  - Publish arbitrary MQTT messages on connect ([documentation] (https://github.com/mpatfield/homebridge-easy-mqtt#mqtt-onconnect))
12
11
  - Traduceri în limba română. Mulțumesc, [@rursache](https://github.com/sponsors/rursache)!
@@ -14,13 +13,11 @@ All notable changes to homebridge-dummy will be documented in this file.
14
13
  ### Changed
15
14
  - ⚠️ All accessory states are now saved across plugin/Homebridge restarts
16
15
  - If you want to keep the old behavior, select the `Reset on Restart` option for each accessory you want to reset
16
+ - MQTT `options` JSON can now also include publish options, such as `retain`, in addition to client options
17
17
  - Optimized MQTT connections by sharing across multiple accessories when possible
18
- - Previously, every accessory had its own connection
18
+ - Previously, every accessory always had its own connection
19
19
  - Better field validation in config UI (Thank you, [@justjam2013](https://github.com/sponsors/justjam2013) for teaching me this!)
20
20
 
21
- ### Fixed
22
- - Config UI rendering issue when migrating deprecated fields
23
-
24
21
  ### Notes
25
22
  Would you like to see Homebridge Easy MQTT in your language? Please consider [getting involved](https://github.com/mpatfield/homebridge-easy-mqtt/issues/4). No coding experience required!
26
23
 
package/README.md CHANGED
@@ -26,6 +26,7 @@ This plugin is designed to be a simple replacement for the fantastic [homebridge
26
26
  **HomebridgeEasyMQTT** currently supports the following accessory types but will be expanded over time as more use cases are requested. If there is an accessory type you'd like to see supported, please [create an issue in GitHub](https://github.com/mpatfield/homebridge-easy-mqtt/issues/new/choose).
27
27
 
28
28
  - `AirPurifier`
29
+ - `AirQualitySensor`
29
30
  - `CarbonDioxideSensor`
30
31
  - `CarbonMonoxideSensor`
31
32
  - `ContactSensor`
@@ -176,6 +177,25 @@ These values are used for both determining current state and, where appropriate,
176
177
 
177
178
  ### Sensors
178
179
 
180
+ #### AirQualitySensor
181
+ - `topicGetAirQuality*` - Get air quality
182
+ - `topicGetNitrogenDioxideDensity` - Get nitrogen dioxide density in µg/m³
183
+ - `topicGetOzoneDensity` - Get ozone density in µg/m³
184
+ - `topicGetPM2_5Density` - Get PM2.5 density in µg/m³
185
+ - `topicGetPM10Density` - Get PM10 density in µg/m³
186
+ - `topicGetSulphurDioxideDensity` - Get sulphur dioxide density in µg/m³
187
+ - `topicGetVOCDensity` - Get VOC density in µg/m³
188
+ - `topicGetStatusFault` - Whether or not the sensor has a generic fault
189
+ - `topicGetStatusTampered` - Whether or not the sensor has been tampered with
190
+ - `valueAQExcellent` - Air quality excellent
191
+ - `valueAQGood` - Air quality good
192
+ - `valueAQFair` - Air quality fair
193
+ - `valueAQInferior` - Air quality inferior
194
+ - `valueAQPoor` - Air quality poor
195
+ - `valueAQUnknown` - Air quality unknown
196
+ - `valueFault` - Accessory has a fault
197
+ - `valueTampered` - Accessory has been tampered with
198
+
179
199
  #### CarbonDioxideSensor
180
200
  - `topicGetCarbonDioxideDetected*` - Whether or not the sensor has detected carbon dioxide
181
201
  - `topicGetCarbonDioxideLevel` - The current carbon dioxide level
@@ -21,8 +21,8 @@
21
21
  "type": {
22
22
  "type": "string",
23
23
  "title": "${config.title.type}",
24
- "enum": [ "AirPurifier", "CarbonMonoxideSensor", "CarbonDioxideSensor", "ContactSensor", "Fanv2", "GarageDoorOpener", "HeaterCooler", "HumiditySensor", "LeakSensor", "Lightbulb", "LightSensor", "LockMechanism", "MotionSensor", "OccupancySensor", "Outlet", "SecuritySystem", "SmokeSensor", "Switch", "TemperatureSensor", "Thermostat", "Valve"],
25
- "enumNames": ["${config.enumNames.airPurifier}", "${config.enumNames.carbonMonoxideSensor}", "${config.enumNames.carbonDioxideSensor}", "${config.enumNames.contactSensor}", "${config.enumNames.fan}", "${config.enumNames.garageDoorOpener}", "${config.enumNames.heaterCooler}", "${config.enumNames.humiditySensor}", "${config.enumNames.leakSensor}", "${config.enumNames.lightbulb}", "${config.enumNames.lightSensor}", "${config.enumNames.lockMechanism}", "${config.enumNames.motionSensor}", "${config.enumNames.occupancySensor}", "${config.enumNames.outlet}", "${config.enumNames.securitySystem}", "${config.enumNames.smokeSensor}", "${config.enumNames.switch}", "${config.enumNames.temperatureSensor}", "${config.enumNames.thermostat}", "${config.enumNames.valve}"],
24
+ "enum": [ "AirPurifier", "AirQualitySensor", "CarbonMonoxideSensor", "CarbonDioxideSensor", "ContactSensor", "Fanv2", "GarageDoorOpener", "HeaterCooler", "HumiditySensor", "LeakSensor", "Lightbulb", "LightSensor", "LockMechanism", "MotionSensor", "OccupancySensor", "Outlet", "SecuritySystem", "SmokeSensor", "Switch", "TemperatureSensor", "Thermostat", "Valve"],
25
+ "enumNames": ["${config.enumNames.airPurifier}", "${config.enumNames.airQualitySensor}", "${config.enumNames.carbonMonoxideSensor}", "${config.enumNames.carbonDioxideSensor}", "${config.enumNames.contactSensor}", "${config.enumNames.fanv2}", "${config.enumNames.garageDoorOpener}", "${config.enumNames.heaterCooler}", "${config.enumNames.humiditySensor}", "${config.enumNames.leakSensor}", "${config.enumNames.lightbulb}", "${config.enumNames.lightSensor}", "${config.enumNames.lockMechanism}", "${config.enumNames.motionSensor}", "${config.enumNames.occupancySensor}", "${config.enumNames.outlet}", "${config.enumNames.securitySystem}", "${config.enumNames.smokeSensor}", "${config.enumNames.switch}", "${config.enumNames.temperatureSensor}", "${config.enumNames.thermostat}", "${config.enumNames.valve}"],
26
26
  "required": true
27
27
  },
28
28
  "group": {
@@ -458,6 +458,34 @@
458
458
  "type": "string",
459
459
  "title": "${config.title.topicSetTargetFanState}"
460
460
  },
461
+ "topicGetAirQuality": {
462
+ "type": "string",
463
+ "title": "${config.title.topicGetAirQuality}"
464
+ },
465
+ "topicGetNitrogenDioxideDensity": {
466
+ "type": "string",
467
+ "title": "${config.title.topicGetNitrogenDioxideDensity}"
468
+ },
469
+ "topicGetOzoneDensity": {
470
+ "type": "string",
471
+ "title": "${config.title.topicGetOzoneDensity}"
472
+ },
473
+ "topicGetPM10Density": {
474
+ "type": "string",
475
+ "title": "${config.title.topicGetPM10Density}"
476
+ },
477
+ "topicGetPM2_5Density": {
478
+ "type": "string",
479
+ "title": "${config.title.topicGetPM2_5Density}"
480
+ },
481
+ "topicGetSulphurDioxideDensity": {
482
+ "type": "string",
483
+ "title": "${config.title.topicGetSulphurDioxideDensity}"
484
+ },
485
+ "topicGetVOCDensity": {
486
+ "type": "string",
487
+ "title": "${config.title.topicGetVOCDensity}"
488
+ },
461
489
  "valueBatteryLow": {
462
490
  "type": "string",
463
491
  "title": "${config.title.valueBatteryLow}"
@@ -666,6 +694,30 @@
666
694
  "type": "string",
667
695
  "title": "${config.title.valueModeBlowing}"
668
696
  },
697
+ "valueAQExcellent": {
698
+ "type": "string",
699
+ "title": "${config.title.valueAQExcellent}"
700
+ },
701
+ "valueAQFair": {
702
+ "type": "string",
703
+ "title": "${config.title.valueAQFair}"
704
+ },
705
+ "valueAQGood": {
706
+ "type": "string",
707
+ "title": "${config.title.valueAQGood}"
708
+ },
709
+ "valueAQInferior": {
710
+ "type": "string",
711
+ "title": "${config.title.valueAQInferior}"
712
+ },
713
+ "valueAQPoor": {
714
+ "type": "string",
715
+ "title": "${config.title.valueAQPoor}"
716
+ },
717
+ "valueAQUnknown": {
718
+ "type": "string",
719
+ "title": "${config.title.valueAQUnknown}"
720
+ },
669
721
  "resetOnRestart": {
670
722
  "type": "boolean",
671
723
  "title": "${config.title.resetOnRestart}"
@@ -692,6 +744,29 @@
692
744
  "required": ["topicGetOn", "topicSetOn", "valueOn", "valueOff"]
693
745
  }
694
746
  },
747
+ {
748
+ "if": {
749
+ "properties": {
750
+ "info": {
751
+ "properties": {
752
+ "type" : {
753
+ "const": "AirQualitySensor"
754
+ }
755
+ }
756
+ }
757
+ }
758
+ },
759
+ "then": {
760
+ "required": ["topicGetAirQuality"],
761
+ "anyOf": [
762
+ { "required": ["valueAQExcellent"] },
763
+ { "required": ["valueAQFair"] },
764
+ { "required": ["valueAQGood"] },
765
+ { "required": ["valueAQInferior"] },
766
+ { "required": ["valueAQPoor"] }
767
+ ]
768
+ }
769
+ },
695
770
  {
696
771
  "if": {
697
772
  "properties": {
@@ -1792,6 +1867,71 @@
1792
1867
  }
1793
1868
  ]
1794
1869
  },
1870
+ {
1871
+ "type": "fieldset",
1872
+ "notitle": true,
1873
+ "condition": {
1874
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'AirQualitySensor';"
1875
+ },
1876
+ "items": [
1877
+ {
1878
+ "type": "div",
1879
+ "displayFlex": true,
1880
+ "flex-direction": "row",
1881
+ "items": [
1882
+ {
1883
+ "key": "accessories[].topicGetAirQuality",
1884
+ "flex": "0 0 50%"
1885
+ }
1886
+ ]
1887
+ },
1888
+ {
1889
+ "type": "div",
1890
+ "displayFlex": true,
1891
+ "flex-direction": "row",
1892
+ "items": [
1893
+ {
1894
+ "key": "accessories[].topicGetNitrogenDioxideDensity",
1895
+ "flex": "0 0 50%"
1896
+ },
1897
+ {
1898
+ "key": "accessories[].topicGetOzoneDensity",
1899
+ "flex": "0 0 50%"
1900
+ }
1901
+ ]
1902
+ },
1903
+ {
1904
+ "type": "div",
1905
+ "displayFlex": true,
1906
+ "flex-direction": "row",
1907
+ "items": [
1908
+ {
1909
+ "key": "accessories[].topicGetPM2_5Density",
1910
+ "flex": "0 0 50%"
1911
+ },
1912
+ {
1913
+ "key": "accessories[].topicGetPM10Density",
1914
+ "flex": "0 0 50%"
1915
+ }
1916
+ ]
1917
+ },
1918
+ {
1919
+ "type": "div",
1920
+ "displayFlex": true,
1921
+ "flex-direction": "row",
1922
+ "items": [
1923
+ {
1924
+ "key": "accessories[].topicGetSulphurDioxideDensity",
1925
+ "flex": "0 0 50%"
1926
+ },
1927
+ {
1928
+ "key": "accessories[].topicGetVOCDensity",
1929
+ "flex": "0 0 50%"
1930
+ }
1931
+ ]
1932
+ }
1933
+ ]
1934
+ },
1795
1935
  {
1796
1936
  "type": "fieldset",
1797
1937
  "notitle": true,
@@ -2415,7 +2555,7 @@
2415
2555
  "type": "fieldset",
2416
2556
  "notitle": true,
2417
2557
  "condition": {
2418
- "functionBody": "return ['AirPurifier', 'Fanv2, 'HeaterCooler'].includes(model.accessories?.[arguments[1]]?.info?.type);"
2558
+ "functionBody": "return ['AirPurifier', 'Fanv2', 'HeaterCooler'].includes(model.accessories?.[arguments[1]]?.info?.type);"
2419
2559
  },
2420
2560
  "items": [
2421
2561
  {
@@ -2562,7 +2702,7 @@
2562
2702
  "type": "fieldset",
2563
2703
  "notitle": true,
2564
2704
  "condition": {
2565
- "functionBody": "return ['AirPurifier', 'Fanv2, 'HeaterCooler'].includes(model.accessories?.[arguments[1]]?.info?.type);"
2705
+ "functionBody": "return ['AirPurifier', 'Fanv2', 'HeaterCooler'].includes(model.accessories?.[arguments[1]]?.info?.type);"
2566
2706
  },
2567
2707
  "items": [
2568
2708
  {
@@ -2860,6 +3000,53 @@
2860
3000
  }
2861
3001
  ]
2862
3002
  },
3003
+ {
3004
+ "type": "fieldset",
3005
+ "notitle": true,
3006
+ "condition": {
3007
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'AirQualitySensor';"
3008
+ },
3009
+ "items": [
3010
+ {
3011
+ "type": "div",
3012
+ "displayFlex": true,
3013
+ "flex-direction": "row",
3014
+ "items": [
3015
+ {
3016
+ "key": "accessories[].valueAQExcellent",
3017
+ "flex": "0 0 25%"
3018
+ },
3019
+ {
3020
+ "key": "accessories[].valueAQGood",
3021
+ "flex": "0 0 25%"
3022
+ },
3023
+ {
3024
+ "key": "accessories[].valueAQFair",
3025
+ "flex": "0 0 25%"
3026
+ }
3027
+ ]
3028
+ },
3029
+ {
3030
+ "type": "div",
3031
+ "displayFlex": true,
3032
+ "flex-direction": "row",
3033
+ "items": [
3034
+ {
3035
+ "key": "accessories[].valueAQInferior",
3036
+ "flex": "0 0 25%"
3037
+ },
3038
+ {
3039
+ "key": "accessories[].valueAQPoor",
3040
+ "flex": "0 0 25%"
3041
+ },
3042
+ {
3043
+ "key": "accessories[].valueAQUnknown",
3044
+ "flex": "0 0 25%"
3045
+ }
3046
+ ]
3047
+ }
3048
+ ]
3049
+ },
2863
3050
  {
2864
3051
  "type": "div",
2865
3052
  "displayFlex": true,
@@ -3,12 +3,14 @@ import { AccessoryType } from '../../model/enums.js';
3
3
  import { GarageDoorAccessory } from '../garage.js';
4
4
  import { LockMechanismAccessory } from '../lock.js';
5
5
  import { SecuritySystemAccessory } from '../security.js';
6
+ import { FanV2Accessory } from '../climate/fan2.js';
6
7
  import { HeaterCoolerAccessory } from '../climate/heaterCooler.js';
7
8
  import { PurifierAccessory } from '../climate/purifier.js';
8
9
  import { ThermostatAccessory } from '../climate/thermostat.js';
9
10
  import { LightbulbAccessory } from '../onoff/lightbulb.js';
10
11
  import { OutletAccessory } from '../onoff/outlet.js';
11
12
  import { SwitchAccessory } from '../onoff/switch.js';
13
+ import { AirSensorAccessory } from '../sensor/air.js';
12
14
  import { CO2SensorAccessory } from '../sensor/carbonDioxide.js';
13
15
  import { COSensorAccessory } from '../sensor/carbonMonoxide.js';
14
16
  import { ContactSensorAccessory } from '../sensor/contact.js';
@@ -21,7 +23,6 @@ import { SmokeSensorAccessory } from '../sensor/smoke.js';
21
23
  import { TemperatureSensorAccessory } from '../sensor/temperature.js';
22
24
  import { ValveAccessory } from '../valve.js';
23
25
  import { PLUGIN_NAME } from '../../homebridge/settings.js';
24
- import { FanAccessory } from '../climate/fan.js';
25
26
  export function createIdentifier(info) {
26
27
  return info.id ?? `${PLUGIN_NAME}:${info.type}:${info.name}`;
27
28
  }
@@ -29,6 +30,8 @@ export function createAccessory(Service, Characteristic, platformAccessory, acce
29
30
  switch (accessoryConfig.info.type) {
30
31
  case AccessoryType.AirPurifier:
31
32
  return new PurifierAccessory(Service, Characteristic, platformAccessory, accessoryConfig, log, isGrouped);
33
+ case AccessoryType.AirQualitySensor:
34
+ return new AirSensorAccessory(Service, Characteristic, platformAccessory, accessoryConfig, log, isGrouped);
32
35
  case AccessoryType.CarbonDioxideSensor:
33
36
  return new CO2SensorAccessory(Service, Characteristic, platformAccessory, accessoryConfig, log, isGrouped);
34
37
  case AccessoryType.CarbonMonoxideSensor:
@@ -36,7 +39,7 @@ export function createAccessory(Service, Characteristic, platformAccessory, acce
36
39
  case AccessoryType.ContactSensor:
37
40
  return new ContactSensorAccessory(Service, Characteristic, platformAccessory, accessoryConfig, log, isGrouped);
38
41
  case AccessoryType.Fanv2:
39
- return new FanAccessory(Service, Characteristic, platformAccessory, accessoryConfig, log, isGrouped);
42
+ return new FanV2Accessory(Service, Characteristic, platformAccessory, accessoryConfig, log, isGrouped);
40
43
  case AccessoryType.GarageDoorOpener:
41
44
  return new GarageDoorAccessory(Service, Characteristic, platformAccessory, accessoryConfig, log, isGrouped);
42
45
  case AccessoryType.HeaterCooler:
@@ -1 +1 @@
1
- {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/accessory/abstract/helper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/accessory/abstract/helper.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAI3D,MAAM,UAAU,gBAAgB,CAAC,IAAwB;IACvD,OAAO,IAAI,CAAC,EAAE,IAAI,GAAG,WAAW,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAA4B,EAC5B,cAA0C,EAC1C,iBAAoC,EACpC,eAA4C,EAC5C,GAAQ,EACR,YAAqB,KAAK;IAG1B,QAAO,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,KAAK,aAAa,CAAC,WAAW;YAC5B,OAAO,IAAI,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAyC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACtI,KAAK,aAAa,CAAC,gBAAgB;YACjC,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA0C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACxI,KAAK,aAAa,CAAC,mBAAmB;YACpC,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA0C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACxI,KAAK,aAAa,CAAC,oBAAoB;YACrC,OAAO,IAAI,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAyC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACtI,KAAK,aAAa,CAAC,aAAa;YAC9B,OAAO,IAAI,sBAAsB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA8C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAChJ,KAAK,aAAa,CAAC,KAAK;YACtB,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAsC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAChI,KAAK,aAAa,CAAC,gBAAgB;YACjC,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA2C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAC1I,KAAK,aAAa,CAAC,YAAY;YAC7B,OAAO,IAAI,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA6C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAC9I,KAAK,aAAa,CAAC,cAAc;YAC/B,OAAO,IAAI,uBAAuB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA+C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAClJ,KAAK,aAAa,CAAC,UAAU;YAC3B,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA2C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAC1I,KAAK,aAAa,CAAC,SAAS;YAC1B,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA0C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACxI,KAAK,aAAa,CAAC,WAAW;YAC5B,OAAO,IAAI,oBAAoB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA4C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5I,KAAK,aAAa,CAAC,aAAa;YAC9B,OAAO,IAAI,sBAAsB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAqC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACvI,KAAK,aAAa,CAAC,YAAY;YAC7B,OAAO,IAAI,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA6C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAC9I,KAAK,aAAa,CAAC,eAAe;YAChC,OAAO,IAAI,wBAAwB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAgD,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACpJ,KAAK,aAAa,CAAC,MAAM;YACvB,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAuC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAClI,KAAK,aAAa,CAAC,cAAc;YAC/B,OAAO,IAAI,uBAAuB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAyC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5I,KAAK,aAAa,CAAC,WAAW;YAC5B,OAAO,IAAI,oBAAoB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA4C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5I,KAAK,aAAa,CAAC,MAAM;YACvB,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAuC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAClI,KAAK,aAAa,CAAC,iBAAiB;YAClC,OAAO,IAAI,0BAA0B,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAkD,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACxJ,KAAK,aAAa,CAAC,UAAU;YAC3B,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAA2C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAC1I,KAAK,aAAa,CAAC,KAAK;YACtB,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAsC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAChI,CAAC;IAED,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import { PlatformAccessory } from 'homebridge';
2
2
  import { ActiveClimateAccessory } from './active.js';
3
3
  import { AccessoryType } from '../../model/enums.js';
4
- import { CharacteristicType, ServiceType, FanConfig } from '../../model/types.js';
4
+ import { CharacteristicType, ServiceType, FanV2Config } from '../../model/types.js';
5
5
  import { Log } from '../../tools/log.js';
6
- export declare class FanAccessory extends ActiveClimateAccessory<FanConfig> {
6
+ export declare class FanV2Accessory extends ActiveClimateAccessory<FanV2Config> {
7
7
  private readonly CURRENT_STATE_MAP;
8
8
  private readonly TARGET_STATE_MAP;
9
- constructor(Service: ServiceType, Characteristic: CharacteristicType, accessory: PlatformAccessory, config: FanConfig, log: Log, isGrouped: boolean);
9
+ constructor(Service: ServiceType, Characteristic: CharacteristicType, accessory: PlatformAccessory, config: FanV2Config, log: Log, isGrouped: boolean);
10
10
  protected getAccessoryType(): AccessoryType;
11
11
  private onCurrentStateUpdate;
12
12
  private onTargetStateUpdate;
@@ -1,7 +1,7 @@
1
1
  import { ActiveClimateAccessory } from './active.js';
2
2
  import { strings } from '../../i18n/i18n.js';
3
3
  import { AccessoryType, CharacteristicKey } from '../../model/enums.js';
4
- export class FanAccessory extends ActiveClimateAccessory {
4
+ export class FanV2Accessory extends ActiveClimateAccessory {
5
5
  CURRENT_STATE_MAP;
6
6
  TARGET_STATE_MAP;
7
7
  constructor(Service, Characteristic, accessory, config, log, isGrouped) {
@@ -16,20 +16,20 @@ export class FanAccessory extends ActiveClimateAccessory {
16
16
  ['valueModeManual', Characteristic.TargetFanState.MANUAL],
17
17
  ]);
18
18
  const validCurrentStates = Array.from(this.CURRENT_STATE_MAP.keys()).filter((key) => this.getRawValue(key, false) !== undefined);
19
- if (validCurrentStates.length === 0) {
20
- this.log.error(strings.fan.noCurrentStateValues, this.name);
19
+ if (config.topicGetCurrentFanState !== undefined && validCurrentStates.length === 0) {
20
+ this.log.error(strings.fanv2.noCurrentStateValues, this.name);
21
21
  return;
22
22
  }
23
23
  this.setupCharacteristic(CharacteristicKey.CurrentFanState, this.CURRENT_STATE_MAP.get(validCurrentStates[0]), 'topicGetCurrentFanState', this.onCurrentStateUpdate.bind(this), false)
24
24
  ?.setProps({ validValues: validCurrentStates.map((key) => this.CURRENT_STATE_MAP.get(key)) });
25
25
  const validTargetStates = Array.from(this.TARGET_STATE_MAP.keys()).filter((key) => this.getRawValue(key, false) !== undefined);
26
- if (validTargetStates.length === 0) {
27
- this.log.error(strings.fan.noTargetStateValues, this.name);
26
+ if (config.topicGetTargetFanState !== undefined && validTargetStates.length === 0) {
27
+ this.log.error(strings.fanv2.noTargetStateValues, this.name);
28
28
  return;
29
29
  }
30
30
  this.setupCharacteristic(CharacteristicKey.TargetFanState, this.TARGET_STATE_MAP.get(validTargetStates[0]), 'topicGetTargetFanState', this.onTargetStateUpdate.bind(this), false, 'topicSetTargetFanState', this.onSetTargetState.bind(this))
31
31
  ?.setProps({ validValues: validTargetStates.map((key) => this.TARGET_STATE_MAP.get(key)) });
32
- this.setupCharacteristic(CharacteristicKey.RotationDirection, Characteristic.RotationDirection.CLOCKWISE, 'topicGetRotationDirection', this.bindOnUpdateNumericBoolean(CharacteristicKey.RotationDirection, 'valueDirectionCounterClockwise', strings.fan.clockwise, strings.fan.counterClockwise), false, 'topicSetRotationDirection', this.onSetDirection.bind(this));
32
+ this.setupCharacteristic(CharacteristicKey.RotationDirection, Characteristic.RotationDirection.CLOCKWISE, 'topicGetRotationDirection', this.bindOnUpdateNumericBoolean(CharacteristicKey.RotationDirection, 'valueDirectionCounterClockwise', strings.fanv2.clockwise, strings.fanv2.counterClockwise), false, 'topicSetRotationDirection', this.onSetDirection.bind(this));
33
33
  }
34
34
  getAccessoryType() {
35
35
  return AccessoryType.Fanv2;
@@ -60,7 +60,7 @@ export class FanAccessory extends ActiveClimateAccessory {
60
60
  return;
61
61
  }
62
62
  const clockwise = value === this.Characteristic.RotationDirection.CLOCKWISE;
63
- const logString = clockwise ? strings.fan.setDirectionClockwise : strings.fan.setDirectionCounterClockwise;
63
+ const logString = clockwise ? strings.fanv2.setDirectionClockwise : strings.fanv2.setDirectionCounterClockwise;
64
64
  const publish = clockwise ? this.config.valueDirectionClockwise : this.config.valueDirectionCounterClockwise;
65
65
  this.onSet(CharacteristicKey.RotationDirection, value, publish, 'topicSetRotationDirection', logString);
66
66
  }
@@ -72,7 +72,7 @@ export class FanAccessory extends ActiveClimateAccessory {
72
72
  }
73
73
  });
74
74
  if (primative === undefined) {
75
- this.log.error(strings.fan.badValue, this.name, `'${value}'`);
75
+ this.log.error(strings.fanv2.badValue, this.name, `'${value}'`);
76
76
  }
77
77
  return primative;
78
78
  }
@@ -85,7 +85,7 @@ export class FanAccessory extends ActiveClimateAccessory {
85
85
  case this.getPrimitiveValue('valueModeBlowing', false):
86
86
  return this.CURRENT_STATE_MAP.get('valueModeBlowing');
87
87
  }
88
- this.logIfDesired(strings.fan.unknownValue, `'${value}'`);
88
+ this.logIfDesired(strings.fanv2.unknownValue, `'${value}'`);
89
89
  }
90
90
  toTargetCVState(value) {
91
91
  switch (value) {
@@ -94,29 +94,29 @@ export class FanAccessory extends ActiveClimateAccessory {
94
94
  case this.getPrimitiveValue('valueModeManual', false):
95
95
  return this.TARGET_STATE_MAP.get('valueModeManual');
96
96
  }
97
- this.logIfDesired(strings.fan.unknownValue, `'${value}'`);
97
+ this.logIfDesired(strings.fanv2.unknownValue, `'${value}'`);
98
98
  }
99
99
  stateStringForCurrentCV(state) {
100
100
  switch (state) {
101
101
  case this.Characteristic.CurrentFanState.INACTIVE:
102
- return strings.fan.stateInactive;
102
+ return strings.fanv2.stateInactive;
103
103
  case this.Characteristic.CurrentFanState.IDLE:
104
- return strings.fan.stateIdle;
104
+ return strings.fanv2.stateIdle;
105
105
  case this.Characteristic.CurrentFanState.BLOWING_AIR:
106
- return strings.fan.stateBlowing;
106
+ return strings.fanv2.stateBlowing;
107
107
  default:
108
- return strings.fan.stateUnknown;
108
+ return strings.fanv2.stateUnknown;
109
109
  }
110
110
  }
111
111
  stateStringForTargetCV(state) {
112
112
  switch (state) {
113
113
  case this.Characteristic.TargetFanState.AUTO:
114
- return strings.fan.stateAuto;
114
+ return strings.fanv2.stateAuto;
115
115
  case this.Characteristic.TargetFanState.MANUAL:
116
- return strings.fan.stateManual;
116
+ return strings.fanv2.stateManual;
117
117
  default:
118
- return strings.fan.stateUnknown;
118
+ return strings.fanv2.stateUnknown;
119
119
  }
120
120
  }
121
121
  }
122
- //# sourceMappingURL=fan.js.map
122
+ //# sourceMappingURL=fan2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fan2.js","sourceRoot":"","sources":["../../../src/accessory/climate/fan2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { PlatformAccessory } from 'homebridge';
2
+ import { SensorAccessory } from './sensor.js';
3
+ import { AccessoryType } from '../../model/enums.js';
4
+ import { CharacteristicType, AirSensorConfig, ServiceType } from '../../model/types.js';
5
+ import { Log } from '../../tools/log.js';
6
+ export declare class AirSensorAccessory extends SensorAccessory<AirSensorConfig> {
7
+ private readonly STATE_MAP;
8
+ constructor(Service: ServiceType, Characteristic: CharacteristicType, accessory: PlatformAccessory, config: AirSensorConfig, log: Log, isGrouped: boolean);
9
+ protected getAccessoryType(): AccessoryType;
10
+ private onAirQualityUpdate;
11
+ private toCVState;
12
+ private qualityStringForCV;
13
+ private logTemplateForDensityKey;
14
+ }
@@ -0,0 +1,94 @@
1
+ import { SensorAccessory } from './sensor.js';
2
+ import { strings } from '../../i18n/i18n.js';
3
+ import { AccessoryType, CharacteristicKey } from '../../model/enums.js';
4
+ export class AirSensorAccessory extends SensorAccessory {
5
+ STATE_MAP;
6
+ constructor(Service, Characteristic, accessory, config, log, isGrouped) {
7
+ super(Service, Characteristic, accessory, config, log, isGrouped);
8
+ this.STATE_MAP = new Map([
9
+ ['valueAQExcellent', Characteristic.AirQuality.EXCELLENT],
10
+ ['valueAQGood', Characteristic.AirQuality.GOOD],
11
+ ['valueAQFair', Characteristic.AirQuality.FAIR],
12
+ ['valueAQInferior', Characteristic.AirQuality.INFERIOR],
13
+ ['valueAQPoor', Characteristic.AirQuality.POOR],
14
+ ]);
15
+ const validStates = Array.from(this.STATE_MAP.keys()).filter((key) => this.getRawValue(key, false) !== undefined);
16
+ if (validStates.length === 0) {
17
+ this.log.error(strings.sensor.air.noStateValues, this.name);
18
+ return;
19
+ }
20
+ this.STATE_MAP.set('valueAQUnknown', Characteristic.AirQuality.UNKNOWN);
21
+ this.setupCharacteristic(CharacteristicKey.AirQuality, Characteristic.AirQuality.UNKNOWN, 'topicGetAirQuality', this.onAirQualityUpdate.bind(this), true)?.setProps({ validValues: validStates.map((key) => this.STATE_MAP.get(key)) });
22
+ const densityMap = new Map([
23
+ ['topicGetNitrogenDioxideDensity', CharacteristicKey.NitrogenDioxideDensity],
24
+ ['topicGetOzoneDensity', CharacteristicKey.OzoneDensity],
25
+ ['topicGetPM10Density', CharacteristicKey.PM10Density],
26
+ ['topicGetPM2_5Density', CharacteristicKey.PM2_5Density],
27
+ ['topicGetSulphurDioxideDensity', CharacteristicKey.SulphurDioxideDensity],
28
+ ['topicGetVOCDensity', CharacteristicKey.VOCDensity],
29
+ ]);
30
+ densityMap.forEach((key, topic) => {
31
+ this.setupCharacteristic(key, 0, topic, this.bindOnUpdateNumeric(key, this.logTemplateForDensityKey(key)), false);
32
+ });
33
+ }
34
+ getAccessoryType() {
35
+ return AccessoryType.AirQualitySensor;
36
+ }
37
+ async onAirQualityUpdate(topic, value) {
38
+ const current = this.toCVState(value);
39
+ this.onUpdate(CharacteristicKey.AirQuality, current, this.qualityStringForCV(current));
40
+ }
41
+ toCVState(value) {
42
+ switch (value) {
43
+ case this.getPrimitiveValue('valueAQUnknown', false):
44
+ return this.STATE_MAP.get('valueAQUnknown');
45
+ case this.getPrimitiveValue('valueAQExcellent', false):
46
+ return this.STATE_MAP.get('valueAQExcellent');
47
+ case this.getPrimitiveValue('valueAQGood', false):
48
+ return this.STATE_MAP.get('valueAQGood');
49
+ case this.getPrimitiveValue('valueAQFair', false):
50
+ return this.STATE_MAP.get('valueAQFair');
51
+ case this.getPrimitiveValue('valueAQInferior', false):
52
+ return this.STATE_MAP.get('valueAQInferior');
53
+ case this.getPrimitiveValue('valueAQPoor', false):
54
+ return this.STATE_MAP.get('valueAQPoor');
55
+ }
56
+ this.logIfDesired(strings.sensor.air.unknownValue, `'${value}'`);
57
+ return this.STATE_MAP.get('valueAQUnknown');
58
+ }
59
+ qualityStringForCV(state) {
60
+ switch (state) {
61
+ case this.Characteristic.AirQuality.EXCELLENT:
62
+ return strings.sensor.air.qualityExcellent;
63
+ case this.Characteristic.AirQuality.GOOD:
64
+ return strings.sensor.air.qualityGood;
65
+ case this.Characteristic.AirQuality.FAIR:
66
+ return strings.sensor.air.qualityFair;
67
+ case this.Characteristic.AirQuality.INFERIOR:
68
+ return strings.sensor.air.qualityInferior;
69
+ case this.Characteristic.AirQuality.POOR:
70
+ return strings.sensor.air.qualityPoor;
71
+ case this.Characteristic.AirQuality.UNKNOWN:
72
+ default:
73
+ return strings.sensor.air.qualityUnknown;
74
+ }
75
+ }
76
+ logTemplateForDensityKey(key) {
77
+ switch (key) {
78
+ case CharacteristicKey.NitrogenDioxideDensity:
79
+ return strings.sensor.air.densityNitrogen;
80
+ case CharacteristicKey.OzoneDensity:
81
+ return strings.sensor.air.densityOzone;
82
+ case CharacteristicKey.PM10Density:
83
+ return strings.sensor.air.densityPM10;
84
+ case CharacteristicKey.PM2_5Density:
85
+ return strings.sensor.air.densityPM2_5;
86
+ case CharacteristicKey.SulphurDioxideDensity:
87
+ return strings.sensor.air.densitySulphur;
88
+ case CharacteristicKey.VOCDensity:
89
+ return strings.sensor.air.densityVOC;
90
+ }
91
+ throw new Error(`Missing log template for density key '${key}'`);
92
+ }
93
+ }
94
+ //# sourceMappingURL=air.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"air.js","sourceRoot":"","sources":["../../../src/accessory/sensor/air.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKxE,MAAM,OAAO,kBAAmB,SAAQ,eAAgC;IAErD,SAAS,CAAqC;IAE/D,YAAY,OAAoB,EAAE,cAAkC,EAAE,SAA4B,EAAE,MAAuB,EAAE,GAAQ,EAAE,SAAkB;QACvJ,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAElE,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC;YACvB,CAAC,kBAAkB,EAAE,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC;YACzD,CAAC,aAAa,EAAE,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC;YAC/C,CAAC,aAAa,EAAE,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC;YAC/C,CAAC,iBAAiB,EAAE,cAAc,CAAC,UAAU,CAAC,QAAQ,CAAC;YACvD,CAAC,aAAa,EAAE,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC;SAChD,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC;QAClH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAExE,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,OAAO,EACtF,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAC/D,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,EAAE,CAAC,CAAC;QAEjF,MAAM,UAAU,GAAG,IAAI,GAAG,CAA2C;YACnE,CAAC,gCAAgC,EAAE,iBAAiB,CAAC,sBAAsB,CAAC;YAC5E,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,YAAY,CAAC;YACxD,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,WAAW,CAAC;YACtD,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,YAAY,CAAC;YACxD,CAAC,+BAA+B,EAAE,iBAAiB,CAAC,qBAAqB,CAAC;YAC1E,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,UAAU,CAAC;SACrD,CAAC,CAAC;QAEH,UAAU,CAAC,OAAO,CAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACjC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACpH,CAAC,CAAC,CAAC;IACL,CAAC;IAES,gBAAgB;QACxB,OAAO,aAAa,CAAC,gBAAgB,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,KAAa,EAAE,KAAqB;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IACzF,CAAC;IAEO,SAAS,CAAC,KAAqB;QACrC,QAAQ,KAAK,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,KAAK,CAAC;gBAClD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAE,CAAC;YAC/C,KAAK,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,KAAK,CAAC;gBACpD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAE,CAAC;YACjD,KAAK,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,KAAK,CAAC;gBAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAE,CAAC;YAC5C,KAAK,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,KAAK,CAAC;gBAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAE,CAAC;YAC5C,KAAK,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,KAAK,CAAC;gBACnD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAE,CAAC;YAChD,KAAK,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,KAAK,CAAC;gBAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAE,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAE,CAAC;IAC/C,CAAC;IAEO,kBAAkB,CAAC,KAA0B;QACnD,QAAO,KAAK,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS;gBAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC7C,KAAK,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI;gBACtC,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;YACxC,KAAK,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI;gBACtC,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;YACxC,KAAK,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,QAAQ;gBAC1C,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;YAC5C,KAAK,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI;gBACtC,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;YACxC,KAAK,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC;YAC5C;gBACE,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;QAC3C,CAAC;IACH,CAAC;IAEO,wBAAwB,CAAC,GAAsB;QACrD,QAAO,GAAG,EAAE,CAAC;YACb,KAAK,iBAAiB,CAAC,sBAAsB;gBAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;YAC5C,KAAK,iBAAiB,CAAC,YAAY;gBACjC,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;YACzC,KAAK,iBAAiB,CAAC,WAAW;gBAChC,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;YACxC,KAAK,iBAAiB,CAAC,YAAY;gBACjC,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;YACzC,KAAK,iBAAiB,CAAC,qBAAqB;gBAC1C,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;YAC3C,KAAK,iBAAiB,CAAC,UAAU;gBAC/B,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QACvC,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,GAAG,CAAC,CAAC;IACnE,CAAC;CACF"}
@@ -24,4 +24,4 @@
24
24
 
25
25
  <footer id="footer" class="text-center" style="display: none; font-style: italic; font-size: 0.9em;" i18n="required"></footer>
26
26
 
27
- <script src="ui.js?v=1.4.0-beta.15"></script>
27
+ <script src="ui.js?v=1.4.0-beta.16"></script>