homebridge-dummy 1.4.0-beta.1 → 1.4.0-beta.2
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 -3
- package/README.md +22 -22
- package/config.schema.json +1 -1
- package/dist/homebridge-ui/public/index.html +1 -1
- package/dist/model/webhook.js +23 -19
- package/dist/model/webhook.js.map +1 -1
- package/dist/tools/primitive.d.ts +3 -0
- package/dist/tools/primitive.js +24 -0
- package/dist/tools/primitive.js.map +1 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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.2 (2025-10-26)
|
|
6
6
|
|
|
7
7
|
### ‼️ WARNING ‼️ — If upgrading from v0.9.2 or earlier, [READ THIS FIRST](https://github.com/mpatfield/homebridge-dummy?tab=readme-ov-file#v10-migration)
|
|
8
8
|
|
|
@@ -11,9 +11,10 @@ All notable changes to homebridge-dummy will be documented in this file.
|
|
|
11
11
|
I plan to remove `Thermostat` as a supported accessory type from a future version. If you use `Thermostat`, please add your use case to [this ticket](https://github.com/mpatfield/homebridge-dummy/issues/207) and I will help you find an alternative.
|
|
12
12
|
|
|
13
13
|
### Added
|
|
14
|
-
- Trigger Conditions
|
|
14
|
+
- [Trigger Conditions](https://github.com/mpatfield/homebridge-dummy?tab=readme-ov-file#trigger-conditions) to change the state of an accessory based on state changes of other Homebridge Dummy accessories
|
|
15
15
|
- ⚠️ Config UI for conditions is highly experimental. Please [open a ticket](https://github.com/mpatfield/homebridge-dummy/issues/new/choose) if you see any unusal behavior.
|
|
16
|
-
-
|
|
16
|
+
- `GET` requests for [Webhooks](https://github.com/mpatfield/homebridge-dummy#webhooks) (previously only `POST`)
|
|
17
|
+
- Fade Out option for `Lightbulb` brightness to emulate a simple "count-down"
|
|
17
18
|
|
|
18
19
|
### Changed
|
|
19
20
|
- `defaultOn` has been deprecated in favor of `defaultState` for `Lightbulb`, `Outlet`, and `Switch`
|
package/README.md
CHANGED
|
@@ -275,23 +275,7 @@ You can optionally enable webhooks on an accessory by choosing `Enable Webhooks`
|
|
|
275
275
|
|
|
276
276
|
If at least one accessory has webhooks enabled, then Homebridge Dummy will start a webhook server on startup. The default port is `63743`, e.g. `http://localhost:63743/`. To change the port, add `webhookPort` to the top level Homebridge Dummy config (see above).
|
|
277
277
|
|
|
278
|
-
Incoming requests must
|
|
279
|
-
|
|
280
|
-
For example, to turn a switch on the JSON request should look like this:
|
|
281
|
-
|
|
282
|
-
```json
|
|
283
|
-
{
|
|
284
|
-
"id": "17a62a7b",
|
|
285
|
-
"command": "On",
|
|
286
|
-
"value": true
|
|
287
|
-
}
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
Here's how you would call it from the command line.
|
|
291
|
-
|
|
292
|
-
```
|
|
293
|
-
curl -X POST http://localhost:63743/ -H "Content-Type: application/json" -d '{"id": "17a62a7b", "command": "On", "value": true}
|
|
294
|
-
```
|
|
278
|
+
Incoming requests must include the `id` of the accessory, the desired `command`, and the `value` to set.
|
|
295
279
|
|
|
296
280
|
The accessory `id` can be found in the plugin JSON config.
|
|
297
281
|
|
|
@@ -303,18 +287,34 @@ Here are the possible values for `command` and their respective valid `value`
|
|
|
303
287
|
- `TargetHeatingCoolingState` - 0 (OFF), 1 (HEAT), 2 (COOL), 3 (AUTO)
|
|
304
288
|
- `TargetPosition` - number from 0-100
|
|
305
289
|
- `TargetTemperature` - number between 10°C and 38°C
|
|
290
|
+
- For `TargetTemperature` you may optionally supply a `unit` (either 'F' or 'C') to allow you to pass in Fahrenheit or Celsius units.
|
|
306
291
|
|
|
307
|
-
|
|
292
|
+
#### GET Example
|
|
293
|
+
|
|
294
|
+
```
|
|
295
|
+
http://localhost:63743/?id=ACCESSORY_ID&command=On&value=true
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### POST Example
|
|
299
|
+
|
|
300
|
+
POST requrests must be valid JSON.
|
|
301
|
+
|
|
302
|
+
For example, to turn a switch on the JSON request should look like this:
|
|
308
303
|
|
|
309
304
|
```json
|
|
310
305
|
{
|
|
311
|
-
"id": "
|
|
312
|
-
"command": "
|
|
313
|
-
"value":
|
|
314
|
-
"unit": "F"
|
|
306
|
+
"id": "ACCESSORY_ID",
|
|
307
|
+
"command": "On",
|
|
308
|
+
"value": true
|
|
315
309
|
}
|
|
316
310
|
```
|
|
317
311
|
|
|
312
|
+
Here's how you would call it from the command line.
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
curl -X POST http://localhost:63743/ -H "Content-Type: application/json" -d '{"id": "ACCESSORY_ID", "command": "On", "value": true}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
318
|
## Credits
|
|
319
319
|
|
|
320
320
|
[@jotzet79](https://github.com/sponsors/jotzet79) for German translations
|
package/config.schema.json
CHANGED
|
@@ -560,7 +560,7 @@
|
|
|
560
560
|
"key": "accessories[].schedule.units",
|
|
561
561
|
"flex": "0 0 33%",
|
|
562
562
|
"condition": {
|
|
563
|
-
"functionBody": "return model.accessories?.[arguments[1]]?.schedule?.
|
|
563
|
+
"functionBody": "return model.accessories?.[arguments[1]]?.schedule?.interval !== undefined;"
|
|
564
564
|
}
|
|
565
565
|
}
|
|
566
566
|
]
|
package/dist/model/webhook.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import escape from 'escape-html';
|
|
2
2
|
import express from 'express';
|
|
3
3
|
import { isValidTemperatureUnits, printableValues, TemperatureUnits, WebhookCommand } from './enums.js';
|
|
4
|
-
import { assert } from '../tools/validation.js';
|
|
5
4
|
import { strings } from '../i18n/i18n.js';
|
|
5
|
+
import { toPrimitive } from '../tools/primitive.js';
|
|
6
6
|
import { fromCelsius, toCelsius } from '../tools/temperature.js';
|
|
7
|
+
import { assert } from '../tools/validation.js';
|
|
7
8
|
const DEFAULT_PORT = 63743;
|
|
8
9
|
const MINIMUM_TEMPERATURE = 10;
|
|
9
10
|
const MAXIMUM_TEMPERATURE = 38;
|
|
@@ -54,6 +55,9 @@ export class WebhookManager {
|
|
|
54
55
|
const exp = express();
|
|
55
56
|
exp.use(express.urlencoded({ extended: true }));
|
|
56
57
|
exp.use(express.json());
|
|
58
|
+
exp.get('/', (request, response) => {
|
|
59
|
+
this.requestHandler(request, response);
|
|
60
|
+
});
|
|
57
61
|
exp.post('/', (request, response) => {
|
|
58
62
|
this.requestHandler(request, response);
|
|
59
63
|
});
|
|
@@ -69,33 +73,33 @@ export class WebhookManager {
|
|
|
69
73
|
}
|
|
70
74
|
;
|
|
71
75
|
requestHandler(request, response) {
|
|
72
|
-
const
|
|
73
|
-
this.log.ifVerbose(`${strings.webhook.received}\n${JSON.stringify(
|
|
74
|
-
if (!assert(this.log, 'Webhook',
|
|
75
|
-
const missingValues = ['id', 'command', 'value'].filter((key) =>
|
|
76
|
+
const data = { ...request.query, ...request.body };
|
|
77
|
+
this.log.ifVerbose(`${strings.webhook.received}\n${JSON.stringify(data)}`);
|
|
78
|
+
if (!assert(this.log, 'Webhook', data, 'id', 'command', 'value')) {
|
|
79
|
+
const missingValues = ['id', 'command', 'value'].filter((key) => data[key] === undefined);
|
|
76
80
|
this.onBadRequest(response, `${strings.webhook.missing} ${missingValues.join(', ')}`, false);
|
|
77
81
|
return;
|
|
78
82
|
}
|
|
79
|
-
const id =
|
|
80
|
-
const command =
|
|
81
|
-
let value =
|
|
83
|
+
const id = data.id;
|
|
84
|
+
const command = data.command;
|
|
85
|
+
let value = toPrimitive(data.value);
|
|
82
86
|
let validRequest;
|
|
83
87
|
let requirements;
|
|
84
88
|
switch (command) {
|
|
85
89
|
case WebhookCommand.Brightness: {
|
|
86
90
|
validRequest = this.isValueWithinRange(value, 0, 100);
|
|
87
|
-
requirements = strings.webhook.validRange.replace('%s',
|
|
91
|
+
requirements = strings.webhook.validRange.replace('%s', command).replace('%s', '0').replace('%s', '100');
|
|
88
92
|
break;
|
|
89
93
|
}
|
|
90
94
|
case WebhookCommand.LockTargetState: {
|
|
91
95
|
validRequest = this.isValidValue(value, [this.Characteristic.LockTargetState.UNSECURED, this.Characteristic.LockTargetState.SECURED]);
|
|
92
96
|
const validValues = '0 (UNSECURED), 1 (SECURED)';
|
|
93
|
-
requirements = `${strings.webhook.validValues.replace('%s',
|
|
97
|
+
requirements = `${strings.webhook.validValues.replace('%s', command)} ${validValues}`;
|
|
94
98
|
break;
|
|
95
99
|
}
|
|
96
100
|
case WebhookCommand.On: {
|
|
97
101
|
validRequest = this.isValidValue(value, [true, false]);
|
|
98
|
-
requirements = `${strings.webhook.validValues.replace('%s',
|
|
102
|
+
requirements = `${strings.webhook.validValues.replace('%s', command)} true, false`;
|
|
99
103
|
break;
|
|
100
104
|
}
|
|
101
105
|
case WebhookCommand.TargetHeatingCoolingState: {
|
|
@@ -106,32 +110,32 @@ export class WebhookManager {
|
|
|
106
110
|
this.Characteristic.TargetHeatingCoolingState.AUTO,
|
|
107
111
|
]);
|
|
108
112
|
const validValues = '0 (OFF), 1 (HEAT), 2 (COOL), 3 (AUTO)';
|
|
109
|
-
requirements = `${strings.webhook.validValues.replace('%s',
|
|
113
|
+
requirements = `${strings.webhook.validValues.replace('%s', command)} ${validValues}`;
|
|
110
114
|
break;
|
|
111
115
|
}
|
|
112
116
|
case WebhookCommand.TargetPosition: {
|
|
113
117
|
validRequest = this.isValueWithinRange(value, 0, 100);
|
|
114
|
-
requirements = strings.webhook.validRange.replace('%s',
|
|
118
|
+
requirements = strings.webhook.validRange.replace('%s', command).replace('%s', '0').replace('%s', '100');
|
|
115
119
|
break;
|
|
116
120
|
}
|
|
117
121
|
case WebhookCommand.TargetTemperature: {
|
|
118
|
-
if (!isValidTemperatureUnits(
|
|
122
|
+
if (!isValidTemperatureUnits(data.units)) {
|
|
119
123
|
validRequest = false;
|
|
120
|
-
requirements = `${strings.webhook.badUnits.replace('%s',
|
|
124
|
+
requirements = `${strings.webhook.badUnits.replace('%s', command).replace('%s', `'${data.units}'`)} ${printableValues(TemperatureUnits)}`;
|
|
121
125
|
break;
|
|
122
126
|
}
|
|
123
|
-
const units =
|
|
127
|
+
const units = data.units ?? TemperatureUnits.CELSIUS;
|
|
124
128
|
const minTemp = fromCelsius(MINIMUM_TEMPERATURE, units);
|
|
125
129
|
const maxTemp = fromCelsius(MAXIMUM_TEMPERATURE, units);
|
|
126
130
|
validRequest = this.isValueWithinRange(value, minTemp, maxTemp);
|
|
127
|
-
requirements = strings.webhook.validRange.replace('%s',
|
|
131
|
+
requirements = strings.webhook.validRange.replace('%s', command).replace('%s', `${minTemp}`).replace('%s', `${maxTemp}`);
|
|
128
132
|
if (validRequest) {
|
|
129
133
|
value = toCelsius(value, units);
|
|
130
134
|
}
|
|
131
135
|
break;
|
|
132
136
|
}
|
|
133
137
|
default:
|
|
134
|
-
this.onBadRequest(response, strings.webhook.unsupportedCommand.replace('%s',
|
|
138
|
+
this.onBadRequest(response, strings.webhook.unsupportedCommand.replace('%s', command));
|
|
135
139
|
return;
|
|
136
140
|
}
|
|
137
141
|
if (!validRequest) {
|
|
@@ -140,7 +144,7 @@ export class WebhookManager {
|
|
|
140
144
|
}
|
|
141
145
|
const callbacks = this.webhooks.get(command);
|
|
142
146
|
if (callbacks === undefined) {
|
|
143
|
-
this.onBadRequest(response, strings.webhook.unregisteredCommand.replace('%s',
|
|
147
|
+
this.onBadRequest(response, strings.webhook.unregisteredCommand.replace('%s', command));
|
|
144
148
|
return;
|
|
145
149
|
}
|
|
146
150
|
const callback = callbacks.get(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/model/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,OAA8B,MAAM,SAAS,CAAC;AAIrD,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/model/webhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2
|
+
export function toPrimitive(value) {
|
|
3
|
+
if (typeof value === 'boolean' || typeof value === 'number') {
|
|
4
|
+
return value;
|
|
5
|
+
}
|
|
6
|
+
if (value === 'true') {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
if (value === 'false') {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const num = Number(value);
|
|
13
|
+
if (!isNaN(num) && value.trim() !== '') {
|
|
14
|
+
return num;
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
export function toNumber(primitive) {
|
|
19
|
+
if (typeof primitive === 'number') {
|
|
20
|
+
return primitive;
|
|
21
|
+
}
|
|
22
|
+
return Number(primitive);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=primitive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitive.js","sourceRoot":"","sources":["../../src/tools/primitive.ts"],"names":[],"mappings":"AAEA,8DAA8D;AAC9D,MAAM,UAAU,WAAW,CAAC,KAAU;IAEpC,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,SAAyB;IAChD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC"}
|
package/package.json
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"name": "homebridge-dummy",
|
|
3
3
|
"platform": "HomebridgeDummy",
|
|
4
4
|
"displayName": "Homebridge Dummy",
|
|
5
|
-
"description": "Create
|
|
5
|
+
"description": "Create accessories to help with HomeKit automation and control — scheduling, delays, sensors, commands, conditions, webhooks, and more",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"version": "1.4.0-beta.
|
|
7
|
+
"version": "1.4.0-beta.2",
|
|
8
8
|
"homepage": "https://github.com/mpatfield/homebridge-dummy#readme",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|