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 +4 -7
- package/README.md +20 -0
- package/config.schema.json +191 -4
- package/dist/accessory/abstract/helper.js +5 -2
- package/dist/accessory/abstract/helper.js.map +1 -1
- package/dist/accessory/climate/{fan.d.ts → fan2.d.ts} +3 -3
- package/dist/accessory/climate/{fan.js → fan2.js} +18 -18
- package/dist/accessory/climate/fan2.js.map +1 -0
- package/dist/accessory/sensor/air.d.ts +14 -0
- package/dist/accessory/sensor/air.js +94 -0
- package/dist/accessory/sensor/air.js.map +1 -0
- package/dist/homebridge-ui/public/index.html +1 -1
- package/dist/i18n/en.d.ts +32 -2
- package/dist/i18n/en.js +32 -2
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/fr.d.ts +32 -2
- package/dist/i18n/i18n.d.ts +32 -2
- package/dist/i18n/ro.d.ts +32 -2
- package/dist/i18n/template.d.ts +32 -2
- package/dist/model/enums.d.ts +9 -1
- package/dist/model/enums.js +8 -0
- package/dist/model/enums.js.map +1 -1
- package/dist/model/types.d.ts +16 -1
- package/package.json +1 -1
- package/dist/accessory/climate/fan.js.map +0 -1
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.
|
|
5
|
+
## 1.4.0-beta.16 (2025-09-26)
|
|
6
6
|
|
|
7
7
|
### Added
|
|
8
|
-
-
|
|
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
|
package/config.schema.json
CHANGED
|
@@ -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.
|
|
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
|
|
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":"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,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,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;
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/accessory/abstract/helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
4
|
+
import { CharacteristicType, ServiceType, FanV2Config } from '../../model/types.js';
|
|
5
5
|
import { Log } from '../../tools/log.js';
|
|
6
|
-
export declare class
|
|
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:
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
102
|
+
return strings.fanv2.stateInactive;
|
|
103
103
|
case this.Characteristic.CurrentFanState.IDLE:
|
|
104
|
-
return strings.
|
|
104
|
+
return strings.fanv2.stateIdle;
|
|
105
105
|
case this.Characteristic.CurrentFanState.BLOWING_AIR:
|
|
106
|
-
return strings.
|
|
106
|
+
return strings.fanv2.stateBlowing;
|
|
107
107
|
default:
|
|
108
|
-
return strings.
|
|
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.
|
|
114
|
+
return strings.fanv2.stateAuto;
|
|
115
115
|
case this.Characteristic.TargetFanState.MANUAL:
|
|
116
|
-
return strings.
|
|
116
|
+
return strings.fanv2.stateManual;
|
|
117
117
|
default:
|
|
118
|
-
return strings.
|
|
118
|
+
return strings.fanv2.stateUnknown;
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
-
//# sourceMappingURL=
|
|
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":"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"}
|