homebridge-easy-mqtt 1.4.0-beta.0 → 1.4.0-beta.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.
- package/CHANGELOG.md +14 -2
- package/README.md +170 -25
- package/config.schema.json +989 -38
- package/dist/accessory/abstract/base.js +1 -1
- package/dist/accessory/abstract/base.js.map +1 -1
- package/dist/accessory/abstract/common.d.ts +38 -0
- package/dist/accessory/abstract/common.js +159 -0
- package/dist/accessory/abstract/common.js.map +1 -0
- package/dist/accessory/abstract/helper.js +9 -0
- package/dist/accessory/abstract/helper.js.map +1 -1
- package/dist/accessory/abstract/mqtt.d.ts +6 -24
- package/dist/accessory/abstract/mqtt.js +14 -150
- package/dist/accessory/abstract/mqtt.js.map +1 -1
- package/dist/accessory/addons/addon.d.ts +12 -0
- package/dist/accessory/addons/addon.js +23 -0
- package/dist/accessory/addons/addon.js.map +1 -0
- package/dist/accessory/addons/filter.d.ts +11 -0
- package/dist/accessory/addons/filter.js +36 -0
- package/dist/accessory/addons/filter.js.map +1 -0
- package/dist/accessory/climate/active.d.ts +11 -0
- package/dist/accessory/climate/active.js +44 -0
- package/dist/accessory/climate/active.js.map +1 -0
- package/dist/accessory/climate/heaterCooler.d.ts +2 -6
- package/dist/accessory/climate/heaterCooler.js +5 -37
- package/dist/accessory/climate/heaterCooler.js.map +1 -1
- package/dist/accessory/climate/purifier.d.ts +19 -0
- package/dist/accessory/climate/purifier.js +114 -0
- package/dist/accessory/climate/purifier.js.map +1 -0
- package/dist/accessory/climate/{climate.d.ts → temperatureControl.d.ts} +3 -2
- package/dist/accessory/climate/{climate.js → temperatureControl.js} +7 -5
- package/dist/accessory/climate/temperatureControl.js.map +1 -0
- package/dist/accessory/climate/thermostat.d.ts +2 -2
- package/dist/accessory/climate/thermostat.js +5 -2
- package/dist/accessory/climate/thermostat.js.map +1 -1
- package/dist/accessory/sensor/light.d.ts +9 -0
- package/dist/accessory/sensor/light.js +13 -0
- package/dist/accessory/sensor/light.js.map +1 -0
- package/dist/accessory/sensor/sensor.js +2 -2
- package/dist/accessory/sensor/sensor.js.map +1 -1
- package/dist/accessory/valve.d.ts +14 -0
- package/dist/accessory/valve.js +71 -0
- package/dist/accessory/valve.js.map +1 -0
- package/dist/homebridge/platform.js +1 -1
- package/dist/homebridge/platform.js.map +1 -1
- package/dist/homebridge-ui/public/index.html +1 -1
- package/dist/homebridge-ui/public/ui.js +1 -1
- package/dist/i18n/en.d.ts +78 -5
- package/dist/i18n/en.js +86 -13
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/fr.d.ts +78 -19
- package/dist/i18n/fr.js +0 -14
- package/dist/i18n/fr.js.map +1 -1
- package/dist/i18n/i18n.d.ts +80 -6
- package/dist/i18n/i18n.js +6 -0
- package/dist/i18n/i18n.js.map +1 -1
- package/dist/i18n/ro.d.ts +758 -0
- package/dist/i18n/ro.js +381 -0
- package/dist/i18n/ro.js.map +1 -0
- package/dist/i18n/template.d.ts +78 -5
- package/dist/model/enums.d.ts +25 -2
- package/dist/model/enums.js +25 -0
- package/dist/model/enums.js.map +1 -1
- package/dist/model/mqtt.d.ts +11 -6
- package/dist/model/mqtt.js +100 -44
- package/dist/model/mqtt.js.map +1 -1
- package/dist/model/types.d.ts +69 -23
- package/package.json +1 -1
- package/dist/accessory/climate/climate.js.map +0 -1
package/dist/model/enums.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare enum AccessoryType {
|
|
2
|
+
AirPurifier = "AirPurifier",
|
|
2
3
|
CarbonDioxideSensor = "CarbonDioxideSensor",
|
|
3
4
|
CarbonMonoxideSensor = "CarbonMonoxideSensor",
|
|
4
5
|
ContactSensor = "ContactSensor",
|
|
@@ -6,6 +7,7 @@ export declare enum AccessoryType {
|
|
|
6
7
|
HumiditySensor = "HumiditySensor",
|
|
7
8
|
LeakSensor = "LeakSensor",
|
|
8
9
|
Lightbulb = "Lightbulb",
|
|
10
|
+
LightSensor = "LightSensor",
|
|
9
11
|
LockMechanism = "LockMechanism",
|
|
10
12
|
MotionSensor = "MotionSensor",
|
|
11
13
|
OccupancySensor = "OccupancySensor",
|
|
@@ -14,7 +16,11 @@ export declare enum AccessoryType {
|
|
|
14
16
|
SmokeSensor = "SmokeSensor",
|
|
15
17
|
Switch = "Switch",
|
|
16
18
|
TemperatureSensor = "TemperatureSensor",
|
|
17
|
-
Thermostat = "Thermostat"
|
|
19
|
+
Thermostat = "Thermostat",
|
|
20
|
+
Valve = "Valve"
|
|
21
|
+
}
|
|
22
|
+
export declare enum AddonType {
|
|
23
|
+
FilterMaintenance = "FilterMaintenance"
|
|
18
24
|
}
|
|
19
25
|
export declare enum CharacteristicKey {
|
|
20
26
|
Active = "Active",
|
|
@@ -29,12 +35,18 @@ export declare enum CharacteristicKey {
|
|
|
29
35
|
ColorTemperature = "ColorTemperature",
|
|
30
36
|
ContactSensorState = "ContactSensorState",
|
|
31
37
|
CoolingThresholdTemperature = "CoolingThresholdTemperature",
|
|
38
|
+
CurrentAmbientLightLevel = "CurrentAmbientLightLevel",
|
|
39
|
+
CurrentAirPurifierState = "CurrentAirPurifierState",
|
|
32
40
|
CurrentHeaterCoolerState = "CurrentHeaterCoolerState",
|
|
33
41
|
CurrentHeatingCoolingState = "CurrentHeatingCoolingState",
|
|
34
42
|
CurrentRelativeHumidity = "CurrentRelativeHumidity",
|
|
35
43
|
CurrentTemperature = "CurrentTemperature",
|
|
44
|
+
FilterChangeIndication = "FilterChangeIndication",
|
|
45
|
+
FilterLifeLevel = "FilterLifeLevel",
|
|
36
46
|
HeatingThresholdTemperature = "HeatingThresholdTemperature",
|
|
37
47
|
Hue = "Hue",
|
|
48
|
+
InUse = "InUse",
|
|
49
|
+
IsConfigured = "IsConfigured",
|
|
38
50
|
LeakDetected = "LeakDetected",
|
|
39
51
|
LockCurrentState = "LockCurrentState",
|
|
40
52
|
LockPhysicalControls = "LockPhysicalControls",
|
|
@@ -43,23 +55,34 @@ export declare enum CharacteristicKey {
|
|
|
43
55
|
OccupancyDetected = "OccupancyDetected",
|
|
44
56
|
On = "On",
|
|
45
57
|
OutletInUse = "OutletInUse",
|
|
58
|
+
RemainingDuration = "RemainingDuration",
|
|
59
|
+
ResetFilterIndication = "ResetFilterIndication",
|
|
46
60
|
RotationSpeed = "RotationSpeed",
|
|
47
61
|
Saturation = "Saturation",
|
|
48
62
|
SecuritySystemCurrentState = "SecuritySystemCurrentState",
|
|
49
63
|
SecuritySystemTargetState = "SecuritySystemTargetState",
|
|
64
|
+
SetDuration = "SetDuration",
|
|
50
65
|
SmokeDetected = "SmokeDetected",
|
|
51
66
|
StatusActive = "StatusActive",
|
|
52
67
|
StatusFault = "StatusFault",
|
|
53
68
|
StatusLowBattery = "StatusLowBattery",
|
|
54
69
|
StatusTampered = "StatusTampered",
|
|
55
70
|
SwingMode = "SwingMode",
|
|
71
|
+
TargetAirPurifierState = "TargetAirPurifierState",
|
|
56
72
|
TargetHeaterCoolerState = "TargetHeaterCoolerState",
|
|
57
73
|
TargetHeatingCoolingState = "TargetHeatingCoolingState",
|
|
58
74
|
TargetRelativeHumidity = "TargetRelativeHumidity",
|
|
59
75
|
TargetTemperature = "TargetTemperature",
|
|
60
|
-
TemperatureDisplayUnits = "TemperatureDisplayUnits"
|
|
76
|
+
TemperatureDisplayUnits = "TemperatureDisplayUnits",
|
|
77
|
+
ValveType = "ValveType"
|
|
61
78
|
}
|
|
62
79
|
export declare enum TemperatureUnits {
|
|
63
80
|
CELSIUS = "C",
|
|
64
81
|
FAHRENHEIT = "F"
|
|
65
82
|
}
|
|
83
|
+
export declare enum ValveType {
|
|
84
|
+
GENERIC_VALVE = "GENERIC_VALVE",
|
|
85
|
+
IRRIGATION = "IRRIGATION",
|
|
86
|
+
SHOWER_HEAD = "SHOWER_HEAD",
|
|
87
|
+
WATER_FAUCET = "WATER_FAUCET"
|
|
88
|
+
}
|
package/dist/model/enums.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export var AccessoryType;
|
|
2
2
|
(function (AccessoryType) {
|
|
3
|
+
AccessoryType["AirPurifier"] = "AirPurifier";
|
|
3
4
|
AccessoryType["CarbonDioxideSensor"] = "CarbonDioxideSensor";
|
|
4
5
|
AccessoryType["CarbonMonoxideSensor"] = "CarbonMonoxideSensor";
|
|
5
6
|
AccessoryType["ContactSensor"] = "ContactSensor";
|
|
@@ -7,6 +8,7 @@ export var AccessoryType;
|
|
|
7
8
|
AccessoryType["HumiditySensor"] = "HumiditySensor";
|
|
8
9
|
AccessoryType["LeakSensor"] = "LeakSensor";
|
|
9
10
|
AccessoryType["Lightbulb"] = "Lightbulb";
|
|
11
|
+
AccessoryType["LightSensor"] = "LightSensor";
|
|
10
12
|
AccessoryType["LockMechanism"] = "LockMechanism";
|
|
11
13
|
AccessoryType["MotionSensor"] = "MotionSensor";
|
|
12
14
|
AccessoryType["OccupancySensor"] = "OccupancySensor";
|
|
@@ -16,7 +18,12 @@ export var AccessoryType;
|
|
|
16
18
|
AccessoryType["Switch"] = "Switch";
|
|
17
19
|
AccessoryType["TemperatureSensor"] = "TemperatureSensor";
|
|
18
20
|
AccessoryType["Thermostat"] = "Thermostat";
|
|
21
|
+
AccessoryType["Valve"] = "Valve";
|
|
19
22
|
})(AccessoryType || (AccessoryType = {}));
|
|
23
|
+
export var AddonType;
|
|
24
|
+
(function (AddonType) {
|
|
25
|
+
AddonType["FilterMaintenance"] = "FilterMaintenance";
|
|
26
|
+
})(AddonType || (AddonType = {}));
|
|
20
27
|
export var CharacteristicKey;
|
|
21
28
|
(function (CharacteristicKey) {
|
|
22
29
|
CharacteristicKey["Active"] = "Active";
|
|
@@ -31,12 +38,18 @@ export var CharacteristicKey;
|
|
|
31
38
|
CharacteristicKey["ColorTemperature"] = "ColorTemperature";
|
|
32
39
|
CharacteristicKey["ContactSensorState"] = "ContactSensorState";
|
|
33
40
|
CharacteristicKey["CoolingThresholdTemperature"] = "CoolingThresholdTemperature";
|
|
41
|
+
CharacteristicKey["CurrentAmbientLightLevel"] = "CurrentAmbientLightLevel";
|
|
42
|
+
CharacteristicKey["CurrentAirPurifierState"] = "CurrentAirPurifierState";
|
|
34
43
|
CharacteristicKey["CurrentHeaterCoolerState"] = "CurrentHeaterCoolerState";
|
|
35
44
|
CharacteristicKey["CurrentHeatingCoolingState"] = "CurrentHeatingCoolingState";
|
|
36
45
|
CharacteristicKey["CurrentRelativeHumidity"] = "CurrentRelativeHumidity";
|
|
37
46
|
CharacteristicKey["CurrentTemperature"] = "CurrentTemperature";
|
|
47
|
+
CharacteristicKey["FilterChangeIndication"] = "FilterChangeIndication";
|
|
48
|
+
CharacteristicKey["FilterLifeLevel"] = "FilterLifeLevel";
|
|
38
49
|
CharacteristicKey["HeatingThresholdTemperature"] = "HeatingThresholdTemperature";
|
|
39
50
|
CharacteristicKey["Hue"] = "Hue";
|
|
51
|
+
CharacteristicKey["InUse"] = "InUse";
|
|
52
|
+
CharacteristicKey["IsConfigured"] = "IsConfigured";
|
|
40
53
|
CharacteristicKey["LeakDetected"] = "LeakDetected";
|
|
41
54
|
CharacteristicKey["LockCurrentState"] = "LockCurrentState";
|
|
42
55
|
CharacteristicKey["LockPhysicalControls"] = "LockPhysicalControls";
|
|
@@ -45,25 +58,37 @@ export var CharacteristicKey;
|
|
|
45
58
|
CharacteristicKey["OccupancyDetected"] = "OccupancyDetected";
|
|
46
59
|
CharacteristicKey["On"] = "On";
|
|
47
60
|
CharacteristicKey["OutletInUse"] = "OutletInUse";
|
|
61
|
+
CharacteristicKey["RemainingDuration"] = "RemainingDuration";
|
|
62
|
+
CharacteristicKey["ResetFilterIndication"] = "ResetFilterIndication";
|
|
48
63
|
CharacteristicKey["RotationSpeed"] = "RotationSpeed";
|
|
49
64
|
CharacteristicKey["Saturation"] = "Saturation";
|
|
50
65
|
CharacteristicKey["SecuritySystemCurrentState"] = "SecuritySystemCurrentState";
|
|
51
66
|
CharacteristicKey["SecuritySystemTargetState"] = "SecuritySystemTargetState";
|
|
67
|
+
CharacteristicKey["SetDuration"] = "SetDuration";
|
|
52
68
|
CharacteristicKey["SmokeDetected"] = "SmokeDetected";
|
|
53
69
|
CharacteristicKey["StatusActive"] = "StatusActive";
|
|
54
70
|
CharacteristicKey["StatusFault"] = "StatusFault";
|
|
55
71
|
CharacteristicKey["StatusLowBattery"] = "StatusLowBattery";
|
|
56
72
|
CharacteristicKey["StatusTampered"] = "StatusTampered";
|
|
57
73
|
CharacteristicKey["SwingMode"] = "SwingMode";
|
|
74
|
+
CharacteristicKey["TargetAirPurifierState"] = "TargetAirPurifierState";
|
|
58
75
|
CharacteristicKey["TargetHeaterCoolerState"] = "TargetHeaterCoolerState";
|
|
59
76
|
CharacteristicKey["TargetHeatingCoolingState"] = "TargetHeatingCoolingState";
|
|
60
77
|
CharacteristicKey["TargetRelativeHumidity"] = "TargetRelativeHumidity";
|
|
61
78
|
CharacteristicKey["TargetTemperature"] = "TargetTemperature";
|
|
62
79
|
CharacteristicKey["TemperatureDisplayUnits"] = "TemperatureDisplayUnits";
|
|
80
|
+
CharacteristicKey["ValveType"] = "ValveType";
|
|
63
81
|
})(CharacteristicKey || (CharacteristicKey = {}));
|
|
64
82
|
export var TemperatureUnits;
|
|
65
83
|
(function (TemperatureUnits) {
|
|
66
84
|
TemperatureUnits["CELSIUS"] = "C";
|
|
67
85
|
TemperatureUnits["FAHRENHEIT"] = "F";
|
|
68
86
|
})(TemperatureUnits || (TemperatureUnits = {}));
|
|
87
|
+
export var ValveType;
|
|
88
|
+
(function (ValveType) {
|
|
89
|
+
ValveType["GENERIC_VALVE"] = "GENERIC_VALVE";
|
|
90
|
+
ValveType["IRRIGATION"] = "IRRIGATION";
|
|
91
|
+
ValveType["SHOWER_HEAD"] = "SHOWER_HEAD";
|
|
92
|
+
ValveType["WATER_FAUCET"] = "WATER_FAUCET";
|
|
93
|
+
})(ValveType || (ValveType = {}));
|
|
69
94
|
//# sourceMappingURL=enums.js.map
|
package/dist/model/enums.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enums.js","sourceRoot":"","sources":["../../src/model/enums.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"enums.js","sourceRoot":"","sources":["../../src/model/enums.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,aAoBX;AApBD,WAAY,aAAa;IACvB,4CAA2B,CAAA;IAC3B,4DAA2C,CAAA;IAC3C,8DAA6C,CAAA;IAC7C,gDAA+B,CAAA;IAC/B,8CAA6B,CAAA;IAC7B,kDAAiC,CAAA;IACjC,0CAAyB,CAAA;IACzB,wCAAuB,CAAA;IACvB,4CAA2B,CAAA;IAC3B,gDAA+B,CAAA;IAC/B,8CAA6B,CAAA;IAC7B,oDAAmC,CAAA;IACnC,kCAAiB,CAAA;IACjB,kDAAiC,CAAA;IACjC,4CAA2B,CAAA;IAC3B,kCAAiB,CAAA;IACjB,wDAAuC,CAAA;IACvC,0CAAyB,CAAA;IACzB,gCAAe,CAAA;AACjB,CAAC,EApBW,aAAa,KAAb,aAAa,QAoBxB;AAED,MAAM,CAAN,IAAY,SAEX;AAFD,WAAY,SAAS;IACnB,oDAAuC,CAAA;AACzC,CAAC,EAFW,SAAS,KAAT,SAAS,QAEpB;AAED,MAAM,CAAN,IAAY,iBAqDX;AArDD,WAAY,iBAAiB;IAC3B,sCAAiB,CAAA;IACjB,kDAA6B,CAAA;IAC7B,8CAAyB,CAAA;IACzB,oEAA+C,CAAA;IAC/C,8DAAyC,CAAA;IACzC,sEAAiD,CAAA;IACjD,sEAAiD,CAAA;IACjD,gEAA2C,CAAA;IAC3C,wEAAmD,CAAA;IACnD,0DAAqC,CAAA;IACrC,8DAAyC,CAAA;IACzC,gFAA2D,CAAA;IAC3D,0EAAqD,CAAA;IACrD,wEAAmD,CAAA;IACnD,0EAAqD,CAAA;IACrD,8EAAyD,CAAA;IACzD,wEAAmD,CAAA;IACnD,8DAAyC,CAAA;IACzC,sEAAiD,CAAA;IACjD,wDAAmC,CAAA;IACnC,gFAA2D,CAAA;IAC3D,gCAAW,CAAA;IACX,oCAAe,CAAA;IACf,kDAA6B,CAAA;IAC7B,kDAA6B,CAAA;IAC7B,0DAAqC,CAAA;IACrC,kEAA6C,CAAA;IAC7C,wDAAmC,CAAA;IACnC,sDAAiC,CAAA;IACjC,4DAAuC,CAAA;IACvC,8BAAS,CAAA;IACT,gDAA2B,CAAA;IAC3B,4DAAuC,CAAA;IACvC,oEAA+C,CAAA;IAC/C,oDAA+B,CAAA;IAC/B,8CAAyB,CAAA;IACzB,8EAAyD,CAAA;IACzD,4EAAuD,CAAA;IACvD,gDAA2B,CAAA;IAC3B,oDAA+B,CAAA;IAC/B,kDAA6B,CAAA;IAC7B,gDAA2B,CAAA;IAC3B,0DAAqC,CAAA;IACrC,sDAAiC,CAAA;IACjC,4CAAuB,CAAA;IACvB,sEAAiD,CAAA;IACjD,wEAAmD,CAAA;IACnD,4EAAuD,CAAA;IACvD,sEAAiD,CAAA;IACjD,4DAAuC,CAAA;IACvC,wEAAmD,CAAA;IACnD,4CAAuB,CAAA;AACzB,CAAC,EArDW,iBAAiB,KAAjB,iBAAiB,QAqD5B;AAED,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,iCAAa,CAAA;IACb,oCAAgB,CAAA;AAClB,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B;AAED,MAAM,CAAN,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,4CAA+B,CAAA;IAC/B,sCAAyB,CAAA;IACzB,wCAA2B,CAAA;IAC3B,0CAA6B,CAAA;AAC/B,CAAC,EALW,SAAS,KAAT,SAAS,QAKpB"}
|
package/dist/model/mqtt.d.ts
CHANGED
|
@@ -2,19 +2,24 @@ import { PrimitiveTypes } from 'homebridge';
|
|
|
2
2
|
import { MQTTConfig } from './types.js';
|
|
3
3
|
import { Log } from '../tools/log.js';
|
|
4
4
|
type MQTTMessageHandler = (topic: string, value: PrimitiveTypes) => void;
|
|
5
|
+
type OnConnectCallback = ((client: MQTT) => (void));
|
|
5
6
|
export declare class MQTT {
|
|
6
7
|
private readonly log;
|
|
7
|
-
private readonly
|
|
8
|
-
private readonly
|
|
9
|
-
private readonly
|
|
8
|
+
private readonly broker;
|
|
9
|
+
private readonly options;
|
|
10
|
+
private static readonly INSTANCES;
|
|
11
|
+
private readonly onConnectCallbacks;
|
|
12
|
+
private readonly onConnectMessages;
|
|
10
13
|
private client;
|
|
11
14
|
private shouldReconnect;
|
|
12
15
|
private isReconnecting;
|
|
13
16
|
private reconnectCount;
|
|
14
|
-
private listeners;
|
|
15
|
-
|
|
17
|
+
private readonly listeners;
|
|
18
|
+
static connect(log: Log, config: MQTTConfig | undefined, caller: string, onConnect: OnConnectCallback): MQTT | undefined;
|
|
19
|
+
private constructor();
|
|
20
|
+
private get host();
|
|
21
|
+
private connect;
|
|
16
22
|
teardown(): void;
|
|
17
|
-
connect(): void;
|
|
18
23
|
subscribe(topic: string, handler: MQTTMessageHandler): void;
|
|
19
24
|
publish(rawTopic: string, value: PrimitiveTypes): void;
|
|
20
25
|
private messageReceived;
|
package/dist/model/mqtt.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
1
2
|
import mqtt from 'mqtt';
|
|
2
3
|
import { strings } from '../i18n/i18n.js';
|
|
3
4
|
import { LogType } from '../tools/log.js';
|
|
4
5
|
import { toPrimitive } from '../tools/primitive.js';
|
|
5
6
|
import { SECOND, MINUTE } from '../tools/time.js';
|
|
6
|
-
import { assert } from '../tools/validation.js';
|
|
7
7
|
const DELAYS = [5 * SECOND, 10 * SECOND, 30 * SECOND, 2 * MINUTE, 5 * MINUTE];
|
|
8
|
+
const DEFAULT_BROKER = 'mqtt://127.0.0.1/';
|
|
8
9
|
function toTopicObject(rawTopic) {
|
|
9
10
|
let base;
|
|
10
11
|
let jsonPath;
|
|
@@ -29,61 +30,116 @@ class MQTTListener {
|
|
|
29
30
|
}
|
|
30
31
|
export class MQTT {
|
|
31
32
|
log;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
broker;
|
|
34
|
+
options;
|
|
35
|
+
static INSTANCES = new Map();
|
|
36
|
+
onConnectCallbacks = [];
|
|
37
|
+
onConnectMessages = new Map();
|
|
38
|
+
client = undefined;
|
|
36
39
|
shouldReconnect = false;
|
|
37
40
|
isReconnecting = false;
|
|
38
41
|
reconnectCount = 0;
|
|
39
42
|
listeners = new Map();
|
|
40
|
-
|
|
41
|
-
this.log = log;
|
|
42
|
-
this.config = config;
|
|
43
|
-
this.onConnect = onConnect;
|
|
44
|
-
this.caller = caller;
|
|
45
|
-
}
|
|
46
|
-
teardown() {
|
|
47
|
-
this.shouldReconnect = false;
|
|
48
|
-
if (this.client) {
|
|
49
|
-
this.client.end(true);
|
|
50
|
-
this.client = null;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
connect() {
|
|
54
|
-
if (!assert(this.log, this.caller, this.config, 'broker')) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
this.shouldReconnect = true;
|
|
43
|
+
static connect(log, config = undefined, caller, onConnect) {
|
|
58
44
|
let additionalOptions = {};
|
|
45
|
+
const configOptions = config?.options ?? '{}';
|
|
59
46
|
try {
|
|
60
|
-
|
|
61
|
-
additionalOptions = JSON.parse(this.config.options);
|
|
62
|
-
}
|
|
47
|
+
additionalOptions = JSON.parse(configOptions);
|
|
63
48
|
}
|
|
64
49
|
catch (err) {
|
|
65
|
-
|
|
50
|
+
log.error(`${strings.mqttClient.badOptions}:\n"${configOptions}"`, this.caller);
|
|
51
|
+
return;
|
|
66
52
|
}
|
|
67
53
|
const options = {
|
|
68
54
|
reconnectPeriod: 0,
|
|
69
|
-
username:
|
|
70
|
-
password:
|
|
55
|
+
username: config?.username ?? process.env.EASYMQTT_USERNAME,
|
|
56
|
+
password: config?.password ?? process.env.EASYMQTT_PASSWORD,
|
|
71
57
|
...additionalOptions,
|
|
72
58
|
};
|
|
73
|
-
|
|
59
|
+
let seed = DEFAULT_BROKER;
|
|
60
|
+
const broker = config?.broker ?? process.env.EASYMQTT_BROKER ?? DEFAULT_BROKER;
|
|
61
|
+
try {
|
|
62
|
+
const url = new URL(broker);
|
|
63
|
+
url.port = url.port.length ? url.port : '1883';
|
|
64
|
+
seed = `${url.protocol}//${url.host}|${JSON.stringify(options)}`;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
seed = broker;
|
|
68
|
+
}
|
|
69
|
+
const id = createHash('md5').update(seed).digest('hex').slice(0, 4);
|
|
70
|
+
let instance = MQTT.INSTANCES.get(id);
|
|
71
|
+
if (instance !== undefined) {
|
|
72
|
+
log.ifVerbose(strings.mqttClient.reuse, caller, id);
|
|
73
|
+
if (instance.client?.connected) {
|
|
74
|
+
onConnect(instance);
|
|
75
|
+
}
|
|
76
|
+
instance.onConnectCallbacks.push(onConnect);
|
|
77
|
+
const onConnectMessages = config?.onConnect;
|
|
78
|
+
if (onConnectMessages !== undefined) {
|
|
79
|
+
const errorLog = '\n[ { "topic": "example/topic", "message": "example message" } ]';
|
|
80
|
+
if (!Array.isArray(onConnectMessages)) {
|
|
81
|
+
log.error(strings.mqttClient.badMessages, errorLog);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
for (const message of onConnectMessages) {
|
|
85
|
+
if (message.topic === undefined || message.message === undefined) {
|
|
86
|
+
log.error(strings.mqttClient.badMessages, errorLog);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const key = `${message.topic}|${message.message}`;
|
|
90
|
+
instance?.onConnectMessages.set(key, message);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return instance;
|
|
95
|
+
}
|
|
96
|
+
log.ifVerbose(strings.mqttClient.new, caller, id);
|
|
97
|
+
instance = new MQTT(log, broker, options);
|
|
98
|
+
MQTT.INSTANCES.set(id, instance);
|
|
99
|
+
instance.onConnectCallbacks.push(onConnect);
|
|
100
|
+
instance.connect();
|
|
101
|
+
return instance;
|
|
102
|
+
}
|
|
103
|
+
constructor(log, broker, options) {
|
|
104
|
+
this.log = log;
|
|
105
|
+
this.broker = broker;
|
|
106
|
+
this.options = options;
|
|
107
|
+
}
|
|
108
|
+
get host() {
|
|
109
|
+
try {
|
|
110
|
+
const url = new URL(this.broker);
|
|
111
|
+
return url.host;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return this.broker;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
connect() {
|
|
118
|
+
this.shouldReconnect = true;
|
|
119
|
+
this.client = mqtt.connect(this.broker, this.options);
|
|
74
120
|
this.client.on('connect', () => {
|
|
75
|
-
this.log.ifVerbose(strings.
|
|
76
|
-
this.
|
|
121
|
+
this.log.ifVerbose(strings.mqttClient.connected, this.host);
|
|
122
|
+
this.onConnectCallbacks.forEach(callback => {
|
|
123
|
+
callback(this);
|
|
124
|
+
});
|
|
125
|
+
this.onConnectMessages.forEach(message => {
|
|
126
|
+
this.publish(message.topic, message.message);
|
|
127
|
+
});
|
|
77
128
|
});
|
|
78
129
|
this.client.on('message', (topic, message) => this.messageReceived(topic, message.toString()));
|
|
79
130
|
this.client.on('close', () => this.connectionClosed());
|
|
80
131
|
this.client.on('error', (error) => {
|
|
81
|
-
this.log.ifVerbose(LogType.WARNING, strings.
|
|
132
|
+
this.log.ifVerbose(LogType.WARNING, `${strings.mqttClient.error}: ${error}`, this.host);
|
|
82
133
|
});
|
|
83
134
|
}
|
|
135
|
+
teardown() {
|
|
136
|
+
this.shouldReconnect = false;
|
|
137
|
+
this.client?.end(true);
|
|
138
|
+
this.client = undefined;
|
|
139
|
+
}
|
|
84
140
|
subscribe(topic, handler) {
|
|
85
|
-
if (!this.client) {
|
|
86
|
-
this.log.error(strings.
|
|
141
|
+
if (!this.client || !this.client.connected) {
|
|
142
|
+
this.log.error(strings.mqttClient.notConnected, this.host);
|
|
87
143
|
return;
|
|
88
144
|
}
|
|
89
145
|
const mqttListener = new MQTTListener(topic, handler);
|
|
@@ -94,7 +150,7 @@ export class MQTT {
|
|
|
94
150
|
}
|
|
95
151
|
publish(rawTopic, value) {
|
|
96
152
|
if (!this.client || !this.client.connected) {
|
|
97
|
-
this.log.error(strings.
|
|
153
|
+
this.log.error(strings.mqttClient.notConnected, this.host);
|
|
98
154
|
return;
|
|
99
155
|
}
|
|
100
156
|
const topic = toTopicObject(rawTopic);
|
|
@@ -117,16 +173,16 @@ export class MQTT {
|
|
|
117
173
|
message = value.toString();
|
|
118
174
|
}
|
|
119
175
|
this.client.publish(topic.base, message);
|
|
120
|
-
this.log.ifVerbose(strings.
|
|
176
|
+
this.log.ifVerbose(`${strings.mqttClient.publish} — ${topic.base} ${message}`, this.host);
|
|
121
177
|
}
|
|
122
178
|
messageReceived(topic, message) {
|
|
123
179
|
this.reconnectCount = 0;
|
|
124
180
|
try {
|
|
125
181
|
message = message.trim();
|
|
126
|
-
this.log.ifVerbose(strings.
|
|
182
|
+
this.log.ifVerbose(strings.mqttClient.receivedMessage, this.host, topic, `\n${message}`);
|
|
127
183
|
const listeners = this.listeners.get(topic);
|
|
128
184
|
if (!listeners || listeners.length === 0) {
|
|
129
|
-
this.log.ifVerbose(strings.
|
|
185
|
+
this.log.ifVerbose(strings.mqttClient.noListeners, this.host, topic);
|
|
130
186
|
return;
|
|
131
187
|
}
|
|
132
188
|
for (const listener of listeners) {
|
|
@@ -151,11 +207,11 @@ export class MQTT {
|
|
|
151
207
|
}
|
|
152
208
|
}
|
|
153
209
|
catch (e) {
|
|
154
|
-
this.log.error(strings.
|
|
210
|
+
this.log.error(strings.mqttClient.parseFailed, this.host, `\n${message}`);
|
|
155
211
|
}
|
|
156
212
|
}
|
|
157
213
|
connectionClosed() {
|
|
158
|
-
this.log.ifVerbose(strings.
|
|
214
|
+
this.log.ifVerbose(strings.mqttClient.connectionClosed, this.host);
|
|
159
215
|
this.reconnect();
|
|
160
216
|
}
|
|
161
217
|
async reconnect() {
|
|
@@ -165,14 +221,14 @@ export class MQTT {
|
|
|
165
221
|
this.isReconnecting = true;
|
|
166
222
|
if (this.client) {
|
|
167
223
|
this.client.end(true);
|
|
168
|
-
this.client =
|
|
224
|
+
this.client = undefined;
|
|
169
225
|
}
|
|
170
226
|
const reconnectDelay = DELAYS[Math.min(this.reconnectCount, DELAYS.length - 1)];
|
|
171
227
|
if (reconnectDelay < MINUTE) {
|
|
172
|
-
this.log.ifVerbose(strings.
|
|
228
|
+
this.log.ifVerbose(strings.mqttClient.reconnectSeconds, this.host, reconnectDelay / SECOND);
|
|
173
229
|
}
|
|
174
230
|
else {
|
|
175
|
-
this.log.ifVerbose(strings.
|
|
231
|
+
this.log.ifVerbose(strings.mqttClient.reconnectMinutes, this.host, reconnectDelay / MINUTE);
|
|
176
232
|
}
|
|
177
233
|
this.reconnectCount++;
|
|
178
234
|
setTimeout(() => {
|
package/dist/model/mqtt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mqtt.js","sourceRoot":"","sources":["../../src/model/mqtt.ts"],"names":[],"mappings":"AAEA,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAO,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"mqtt.js","sourceRoot":"","sources":["../../src/model/mqtt.ts"],"names":[],"mappings":"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"}
|
package/dist/model/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PlatformConfig as HBPlatformConfig } from 'homebridge';
|
|
2
2
|
export type ServiceType = typeof import('homebridge').Service;
|
|
3
3
|
export type CharacteristicType = typeof import('homebridge').Characteristic;
|
|
4
|
-
import { AccessoryType, TemperatureUnits } from './enums.js';
|
|
4
|
+
import { AccessoryType, TemperatureUnits, ValveType } from './enums.js';
|
|
5
5
|
import { Assertable } from '../tools/validation.js';
|
|
6
6
|
export type PlatformConfig = HBPlatformConfig & {
|
|
7
7
|
accessories?: BaseAccessoryConfig[];
|
|
@@ -9,6 +9,14 @@ export type PlatformConfig = HBPlatformConfig & {
|
|
|
9
9
|
export type TemperatureConfig = {
|
|
10
10
|
temperatureUnits?: TemperatureUnits;
|
|
11
11
|
};
|
|
12
|
+
export type AddonConfig = Assertable & {};
|
|
13
|
+
export type FilterMaintenanceConfig = AddonConfig & {
|
|
14
|
+
topicGetFilterChangeIndication: string;
|
|
15
|
+
topicGetFilterLifeLevel?: string;
|
|
16
|
+
topicResetFilterIndication?: string;
|
|
17
|
+
valueFilterChange: string;
|
|
18
|
+
valueFilterReset: string;
|
|
19
|
+
};
|
|
12
20
|
type ErrorStatusConfig = {
|
|
13
21
|
topicGetStatusFault?: string;
|
|
14
22
|
topicGetStatusTampered?: string;
|
|
@@ -27,15 +35,20 @@ type AdditionalInfoConfig = InfoConfig & {
|
|
|
27
35
|
serialNumber?: string;
|
|
28
36
|
version?: string;
|
|
29
37
|
};
|
|
38
|
+
export type MQTTMessage = Assertable & {
|
|
39
|
+
topic: string;
|
|
40
|
+
message: string;
|
|
41
|
+
};
|
|
30
42
|
export type MQTTConfig = Assertable & {
|
|
31
|
-
broker
|
|
43
|
+
broker?: string;
|
|
32
44
|
username?: string;
|
|
33
45
|
password?: string;
|
|
34
46
|
options?: string;
|
|
47
|
+
onConnect?: MQTTMessage[];
|
|
35
48
|
};
|
|
36
49
|
export type MQTTAccessoryConfig = Assertable & {
|
|
37
|
-
mqtt: MQTTConfig;
|
|
38
50
|
info: InfoConfig;
|
|
51
|
+
mqtt?: MQTTConfig;
|
|
39
52
|
customCharacteristics?: CustomCharacteristicConfig[];
|
|
40
53
|
disableLogging: boolean;
|
|
41
54
|
};
|
|
@@ -98,6 +111,9 @@ export type LeakSensorConfig = SensorConfig & {
|
|
|
98
111
|
topicGetLeakDetected: string;
|
|
99
112
|
valueLeakDetected: string;
|
|
100
113
|
};
|
|
114
|
+
export type LightSensorConfig = SensorConfig & {
|
|
115
|
+
topicGetCurrentAmbientLightLevel: string;
|
|
116
|
+
};
|
|
101
117
|
export type MotionSensorConfig = SensorConfig & {
|
|
102
118
|
topicGetMotionDetected: string;
|
|
103
119
|
valueMotionDetected: string;
|
|
@@ -113,50 +129,62 @@ export type SmokeSensorConfig = SensorConfig & {
|
|
|
113
129
|
export type TemperatureSensorConfig = SensorConfig & TemperatureConfig & {
|
|
114
130
|
topicGetCurrentTemperature: string;
|
|
115
131
|
};
|
|
116
|
-
export type
|
|
132
|
+
export type TemperatureControlConfig = BaseAccessoryConfig & TemperatureConfig & {
|
|
117
133
|
topicGetCoolingThresholdTemperature?: string;
|
|
118
134
|
topicGetCurrentTemperature: string;
|
|
119
135
|
topicGetHeatingThresholdTemperature?: string;
|
|
120
136
|
topicSetCoolingThresholdTemperature?: string;
|
|
121
137
|
topicSetHeatingThresholdTemperature?: string;
|
|
122
138
|
};
|
|
123
|
-
export type
|
|
139
|
+
export type ThermostatConfig = TemperatureControlConfig & FilterMaintenanceConfig & {
|
|
140
|
+
topicGetCurrentHeatingCoolingState: string;
|
|
141
|
+
topicGetCurrentRelativeHumidity?: string;
|
|
142
|
+
topicGetTargetHeatingCoolingState: string;
|
|
143
|
+
topicGetTargetRelativeHumidity?: string;
|
|
144
|
+
topicGetTargetTemperature: string;
|
|
145
|
+
topicSetTargetHeatingCoolingState: string;
|
|
146
|
+
topicSetTargetRelativeHumidity?: string;
|
|
147
|
+
topicSetTargetTemperature: string;
|
|
148
|
+
valueModeAuto?: string;
|
|
149
|
+
valueModeCool?: string;
|
|
150
|
+
valueModeHeat?: string;
|
|
151
|
+
valueModeOff?: string;
|
|
152
|
+
};
|
|
153
|
+
export type ActiveClimateConfig = TemperatureControlConfig & {
|
|
124
154
|
topicGetActive: string;
|
|
125
|
-
topicGetCurrentHeaterCoolerState: string;
|
|
126
155
|
topicGetLockPhysicalControls?: string;
|
|
127
156
|
topicGetRotationSpeed?: string;
|
|
128
157
|
topicGetSwingMode?: string;
|
|
129
|
-
topicGetTargetHeaterCoolerState: string;
|
|
130
158
|
topicSetActive: string;
|
|
131
159
|
topicSetLockPhysicalControls?: string;
|
|
132
160
|
topicSetRotationSpeed?: string;
|
|
133
161
|
topicSetSwingMode?: string;
|
|
134
|
-
topicSetTargetHeaterCoolerState: string;
|
|
135
162
|
valueControlLock?: string;
|
|
136
163
|
valueControlUnlock?: string;
|
|
137
|
-
valueModeAuto?: string;
|
|
138
|
-
valueModeCool?: string;
|
|
139
|
-
valueModeHeat?: string;
|
|
140
|
-
valueModeIdle?: string;
|
|
141
|
-
valueModeInactive?: string;
|
|
142
164
|
valueStateActive: string;
|
|
143
165
|
valueStateInactive: string;
|
|
144
166
|
valueSwingEnabled?: string;
|
|
145
167
|
valueSwingDisabled?: string;
|
|
146
168
|
};
|
|
147
|
-
export type
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
topicGetTargetRelativeHumidity?: string;
|
|
152
|
-
topicGetTargetTemperature: string;
|
|
153
|
-
topicSetTargetHeatingCoolingState: string;
|
|
154
|
-
topicSetTargetRelativeHumidity?: string;
|
|
155
|
-
topicSetTargetTemperature: string;
|
|
169
|
+
export type HeaterCoolerConfig = ActiveClimateConfig & FilterMaintenanceConfig & {
|
|
170
|
+
topicGetCurrentHeaterCoolerState: string;
|
|
171
|
+
topicGetTargetHeaterCoolerState: string;
|
|
172
|
+
topicSetTargetHeaterCoolerState: string;
|
|
156
173
|
valueModeAuto?: string;
|
|
157
174
|
valueModeCool?: string;
|
|
158
175
|
valueModeHeat?: string;
|
|
159
|
-
|
|
176
|
+
valueModeIdle?: string;
|
|
177
|
+
valueModeInactive?: string;
|
|
178
|
+
};
|
|
179
|
+
export type PurifierConfig = ActiveClimateConfig & FilterMaintenanceConfig & {
|
|
180
|
+
topicGetCurrentPurifierState: string;
|
|
181
|
+
topicGetTargetPurifierState: string;
|
|
182
|
+
topicSetTargetPurifierState: string;
|
|
183
|
+
valueModeAuto?: string;
|
|
184
|
+
valueModeIdle?: string;
|
|
185
|
+
valueModeInactive?: string;
|
|
186
|
+
valueModeManual?: string;
|
|
187
|
+
valueModePurifying?: string;
|
|
160
188
|
};
|
|
161
189
|
export type LockConfig = BaseAccessoryConfig & {
|
|
162
190
|
topicGetCurrentLockState: string;
|
|
@@ -179,4 +207,22 @@ export type SecurityConfig = BaseAccessoryConfig & ErrorStatusConfig & {
|
|
|
179
207
|
valueDisarm?: string;
|
|
180
208
|
valueAlarmTriggered?: string;
|
|
181
209
|
};
|
|
210
|
+
export type ValveConfig = BaseAccessoryConfig & {
|
|
211
|
+
valveType?: ValveType;
|
|
212
|
+
topicGetStatusFault?: string;
|
|
213
|
+
topicGetValveActive: string;
|
|
214
|
+
topicGetValveInUse: string;
|
|
215
|
+
topicGetValveIsConfigured?: string;
|
|
216
|
+
topicGetValveRemainingDuration?: string;
|
|
217
|
+
topicGetValveSetDuration?: string;
|
|
218
|
+
topicSetValveActive: string;
|
|
219
|
+
topicSetValveIsConfigured?: string;
|
|
220
|
+
topicSetValveSetDuration?: string;
|
|
221
|
+
valueActive: string;
|
|
222
|
+
valueConfigured?: string;
|
|
223
|
+
valueFault?: string;
|
|
224
|
+
valueInactive: string;
|
|
225
|
+
valueInUse: string;
|
|
226
|
+
valueNotConfigured?: string;
|
|
227
|
+
};
|
|
182
228
|
export {};
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"displayName": "Homebridge Easy MQTT",
|
|
5
5
|
"description": "Homebridge plugin for easy control of MQTT devices",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"version": "1.4.0-beta.
|
|
7
|
+
"version": "1.4.0-beta.10",
|
|
8
8
|
"homepage": "https://github.com/mpatfield/homebridge-easy-mqtt#readme",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"climate.js","sourceRoot":"","sources":["../../../src/accessory/climate/climate.ts"],"names":[],"mappings":"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"}
|