@homebridge-plugins/homebridge-matter 0.1.3 → 0.1.4
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 +7 -0
- package/MATTER_API.md +1189 -182
- package/README.md +1 -1
- package/dist/devices/section-12-robotic/robotic-vacuum-cleaner.d.ts +9 -53
- package/dist/devices/section-12-robotic/robotic-vacuum-cleaner.js +12 -62
- package/dist/devices/section-12-robotic/robotic-vacuum-cleaner.js.map +1 -1
- package/dist/devices/section-4-lighting/color-temperature-light.d.ts +8 -1
- package/dist/devices/section-4-lighting/color-temperature-light.js +27 -23
- package/dist/devices/section-4-lighting/color-temperature-light.js.map +1 -1
- package/dist/devices/section-4-lighting/dimmable-light.d.ts +5 -22
- package/dist/devices/section-4-lighting/dimmable-light.js +40 -319
- package/dist/devices/section-4-lighting/dimmable-light.js.map +1 -1
- package/dist/devices/section-4-lighting/extended-color-light.d.ts +6 -25
- package/dist/devices/section-4-lighting/extended-color-light.js +33 -399
- package/dist/devices/section-4-lighting/extended-color-light.js.map +1 -1
- package/dist/devices/section-4-lighting/on-off-light.d.ts +8 -28
- package/dist/devices/section-4-lighting/on-off-light.js +64 -434
- package/dist/devices/section-4-lighting/on-off-light.js.map +1 -1
- package/dist/devices/section-5-smart-plugs/dimmable-plug-in-unit.d.ts +6 -0
- package/dist/devices/section-5-smart-plugs/dimmable-plug-in-unit.js +13 -3
- package/dist/devices/section-5-smart-plugs/dimmable-plug-in-unit.js.map +1 -1
- package/dist/devices/section-5-smart-plugs/on-off-plug-in-unit.d.ts +5 -0
- package/dist/devices/section-5-smart-plugs/on-off-plug-in-unit.js +9 -2
- package/dist/devices/section-5-smart-plugs/on-off-plug-in-unit.js.map +1 -1
- package/dist/devices/section-6-switches/on-off-light-switch.d.ts +5 -0
- package/dist/devices/section-6-switches/on-off-light-switch.js +19 -5
- package/dist/devices/section-6-switches/on-off-light-switch.js.map +1 -1
- package/dist/devices/section-7-sensors/contact-sensor.d.ts +5 -0
- package/dist/devices/section-7-sensors/contact-sensor.js +5 -0
- package/dist/devices/section-7-sensors/contact-sensor.js.map +1 -1
- package/dist/devices/section-7-sensors/humidity-sensor.d.ts +5 -0
- package/dist/devices/section-7-sensors/humidity-sensor.js +5 -0
- package/dist/devices/section-7-sensors/humidity-sensor.js.map +1 -1
- package/dist/devices/section-7-sensors/light-sensor.d.ts +5 -0
- package/dist/devices/section-7-sensors/light-sensor.js +5 -0
- package/dist/devices/section-7-sensors/light-sensor.js.map +1 -1
- package/dist/devices/section-7-sensors/occupancy-sensor.d.ts +6 -0
- package/dist/devices/section-7-sensors/occupancy-sensor.js +6 -0
- package/dist/devices/section-7-sensors/occupancy-sensor.js.map +1 -1
- package/dist/devices/section-7-sensors/smoke-co-alarm.d.ts +6 -0
- package/dist/devices/section-7-sensors/smoke-co-alarm.js +6 -0
- package/dist/devices/section-7-sensors/smoke-co-alarm.js.map +1 -1
- package/dist/devices/section-7-sensors/temperature-sensor.d.ts +5 -0
- package/dist/devices/section-7-sensors/temperature-sensor.js +5 -0
- package/dist/devices/section-7-sensors/temperature-sensor.js.map +1 -1
- package/dist/devices/section-7-sensors/water-leak-detector.d.ts +5 -0
- package/dist/devices/section-7-sensors/water-leak-detector.js +5 -0
- package/dist/devices/section-7-sensors/water-leak-detector.js.map +1 -1
- package/dist/devices/section-8-closure/door-lock.d.ts +6 -0
- package/dist/devices/section-8-closure/door-lock.js +12 -27
- package/dist/devices/section-8-closure/door-lock.js.map +1 -1
- package/dist/devices/section-8-closure/window-covering.d.ts +7 -0
- package/dist/devices/section-8-closure/window-covering.js +27 -43
- package/dist/devices/section-8-closure/window-covering.js.map +1 -1
- package/dist/devices/section-9-hvac/fan.d.ts +7 -0
- package/dist/devices/section-9-hvac/fan.js +17 -23
- package/dist/devices/section-9-hvac/fan.js.map +1 -1
- package/dist/devices/section-9-hvac/thermostat.d.ts +7 -0
- package/dist/devices/section-9-hvac/thermostat.js +21 -25
- package/dist/devices/section-9-hvac/thermostat.js.map +1 -1
- package/package.json +3 -3
|
@@ -4,16 +4,21 @@
|
|
|
4
4
|
* Handles multiple variants:
|
|
5
5
|
* - Window Blind: Standard lift-only window covering
|
|
6
6
|
* - Venetian Blind: Window covering with both lift and tilt control
|
|
7
|
+
*
|
|
8
|
+
* For comprehensive documentation, see: ../../../MATTER_API.md
|
|
9
|
+
*
|
|
10
|
+
* This example demonstrates:
|
|
11
|
+
* - WindowCovering cluster for motorized blinds/shades
|
|
12
|
+
* - Multiple control commands (lift, tilt, stop)
|
|
13
|
+
* - Position tracking in hundredths of percent
|
|
7
14
|
*/
|
|
8
15
|
export function registerWindowCovering(context) {
|
|
9
16
|
const { api, log, config } = context;
|
|
10
17
|
const accessories = [];
|
|
11
18
|
// Variant 1: Window Blind (lift only)
|
|
12
19
|
if (config.enableWindowBlind) {
|
|
13
|
-
// Generate UUID once and reuse in handlers
|
|
14
|
-
const windowBlindUuid = api.matter.uuid.generate('matter-window-blind');
|
|
15
20
|
accessories.push({
|
|
16
|
-
uuid:
|
|
21
|
+
uuid: api.matter.uuid.generate('matter-window-blind'),
|
|
17
22
|
displayName: 'Window Blind',
|
|
18
23
|
deviceType: api.matter.deviceTypes.WindowCovering,
|
|
19
24
|
serialNumber: 'BLIND-001',
|
|
@@ -48,28 +53,20 @@ export function registerWindowCovering(context) {
|
|
|
48
53
|
windowCovering: {
|
|
49
54
|
goToLiftPercentage: async (request) => {
|
|
50
55
|
const percent = (request.targetPercent / 100).toFixed(0);
|
|
51
|
-
log.info(`[Window Blind]
|
|
52
|
-
|
|
53
|
-
currentPositionLiftPercent100ths: request.targetPercent,
|
|
54
|
-
targetPositionLiftPercent100ths: request.targetPercent,
|
|
55
|
-
});
|
|
56
|
+
log.info(`[Window Blind] Moving to ${percent}% open`);
|
|
57
|
+
// TODO: await myBlindAPI.setPosition(percent)
|
|
56
58
|
},
|
|
57
59
|
upOrOpen: async () => {
|
|
58
|
-
log.info('[Window Blind]
|
|
59
|
-
|
|
60
|
-
currentPositionLiftPercent100ths: 10000, // Fully open
|
|
61
|
-
targetPositionLiftPercent100ths: 10000,
|
|
62
|
-
});
|
|
60
|
+
log.info('[Window Blind] Opening blind');
|
|
61
|
+
// TODO: await myBlindAPI.open()
|
|
63
62
|
},
|
|
64
63
|
downOrClose: async () => {
|
|
65
|
-
log.info('[Window Blind]
|
|
66
|
-
|
|
67
|
-
currentPositionLiftPercent100ths: 0, // Fully closed
|
|
68
|
-
targetPositionLiftPercent100ths: 0,
|
|
69
|
-
});
|
|
64
|
+
log.info('[Window Blind] Closing blind');
|
|
65
|
+
// TODO: await myBlindAPI.close()
|
|
70
66
|
},
|
|
71
67
|
stopMotion: async () => {
|
|
72
|
-
log.info('[Window Blind]
|
|
68
|
+
log.info('[Window Blind] Stopping blind');
|
|
69
|
+
// TODO: await myBlindAPI.stop()
|
|
73
70
|
},
|
|
74
71
|
},
|
|
75
72
|
},
|
|
@@ -77,10 +74,8 @@ export function registerWindowCovering(context) {
|
|
|
77
74
|
}
|
|
78
75
|
// Variant 2: Venetian Blind (lift + tilt)
|
|
79
76
|
if (config.enableVenetianBlind) {
|
|
80
|
-
// Generate UUID once and reuse in handlers
|
|
81
|
-
const venetianBlindUuid = api.matter.uuid.generate('matter-venetian-blind');
|
|
82
77
|
accessories.push({
|
|
83
|
-
uuid:
|
|
78
|
+
uuid: api.matter.uuid.generate('matter-venetian-blind'),
|
|
84
79
|
displayName: 'Venetian Blind (Tilt)',
|
|
85
80
|
deviceType: api.matter.deviceTypes.WindowCovering,
|
|
86
81
|
serialNumber: 'BLIND-002',
|
|
@@ -118,36 +113,25 @@ export function registerWindowCovering(context) {
|
|
|
118
113
|
windowCovering: {
|
|
119
114
|
goToLiftPercentage: async (request) => {
|
|
120
115
|
const percent = (request.targetPercent / 100).toFixed(0);
|
|
121
|
-
log.info(`[Venetian Blind]
|
|
122
|
-
|
|
123
|
-
currentPositionLiftPercent100ths: request.targetPercent,
|
|
124
|
-
targetPositionLiftPercent100ths: request.targetPercent,
|
|
125
|
-
});
|
|
116
|
+
log.info(`[Venetian Blind] Moving to ${percent}% open`);
|
|
117
|
+
// TODO: await myBlindAPI.setLiftPosition(percent)
|
|
126
118
|
},
|
|
127
119
|
goToTiltPercentage: async (request) => {
|
|
128
120
|
const percent = (request.targetPercent / 100).toFixed(0);
|
|
129
|
-
log.info(`[Venetian Blind]
|
|
130
|
-
|
|
131
|
-
currentPositionTiltPercent100ths: request.targetPercent,
|
|
132
|
-
targetPositionTiltPercent100ths: request.targetPercent,
|
|
133
|
-
});
|
|
121
|
+
log.info(`[Venetian Blind] Tilting to ${percent}%`);
|
|
122
|
+
// TODO: await myBlindAPI.setTiltAngle(percent)
|
|
134
123
|
},
|
|
135
124
|
upOrOpen: async () => {
|
|
136
|
-
log.info('[Venetian Blind]
|
|
137
|
-
|
|
138
|
-
currentPositionLiftPercent100ths: 10000, // Fully open
|
|
139
|
-
targetPositionLiftPercent100ths: 10000,
|
|
140
|
-
});
|
|
125
|
+
log.info('[Venetian Blind] Opening blind');
|
|
126
|
+
// TODO: await myBlindAPI.open()
|
|
141
127
|
},
|
|
142
128
|
downOrClose: async () => {
|
|
143
|
-
log.info('[Venetian Blind]
|
|
144
|
-
|
|
145
|
-
currentPositionLiftPercent100ths: 0, // Fully closed
|
|
146
|
-
targetPositionLiftPercent100ths: 0,
|
|
147
|
-
});
|
|
129
|
+
log.info('[Venetian Blind] Closing blind');
|
|
130
|
+
// TODO: await myBlindAPI.close()
|
|
148
131
|
},
|
|
149
132
|
stopMotion: async () => {
|
|
150
|
-
log.info('[Venetian Blind]
|
|
133
|
+
log.info('[Venetian Blind] Stopping blind');
|
|
134
|
+
// TODO: await myBlindAPI.stop()
|
|
151
135
|
},
|
|
152
136
|
},
|
|
153
137
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"window-covering.js","sourceRoot":"","sources":["../../../src/devices/section-8-closure/window-covering.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"window-covering.js","sourceRoot":"","sources":["../../../src/devices/section-8-closure/window-covering.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
* Fan Device (Matter Spec § 9.2)
|
|
3
3
|
*
|
|
4
4
|
* A fan with speed control and mode selection.
|
|
5
|
+
*
|
|
6
|
+
* For comprehensive documentation, see: ../../../MATTER_API.md
|
|
7
|
+
*
|
|
8
|
+
* This example demonstrates:
|
|
9
|
+
* - FanControl cluster with multiple control methods
|
|
10
|
+
* - Using api.matter.types for fan modes and sequences
|
|
11
|
+
* - Speed percentage and mode-based control
|
|
5
12
|
*/
|
|
6
13
|
import type { DeviceContext } from '../types.js';
|
|
7
14
|
export declare function registerFan(context: DeviceContext): any[];
|
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
* Fan Device (Matter Spec § 9.2)
|
|
3
3
|
*
|
|
4
4
|
* A fan with speed control and mode selection.
|
|
5
|
+
*
|
|
6
|
+
* For comprehensive documentation, see: ../../../MATTER_API.md
|
|
7
|
+
*
|
|
8
|
+
* This example demonstrates:
|
|
9
|
+
* - FanControl cluster with multiple control methods
|
|
10
|
+
* - Using api.matter.types for fan modes and sequences
|
|
11
|
+
* - Speed percentage and mode-based control
|
|
5
12
|
*/
|
|
6
13
|
export function registerFan(context) {
|
|
7
14
|
const { api, log, config } = context;
|
|
@@ -18,43 +25,30 @@ export function registerFan(context) {
|
|
|
18
25
|
model: 'Fan v1',
|
|
19
26
|
clusters: {
|
|
20
27
|
fanControl: {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
fanModeSequence: api.matter.types.FanControl.FanModeSequence.OffLowMedHigh, // Supports: Off, Low, Medium, High
|
|
26
|
-
// Percent-based speed control (0-100)
|
|
27
|
-
percentSetting: 0, // Target speed percentage
|
|
28
|
-
percentCurrent: 0, // Current speed percentage
|
|
29
|
-
// Alternative speed setting (0-100, some fans use this instead)
|
|
28
|
+
fanMode: api.matter.types.FanControl.FanMode.Off,
|
|
29
|
+
fanModeSequence: api.matter.types.FanControl.FanModeSequence.OffLowMedHigh,
|
|
30
|
+
percentSetting: 0,
|
|
31
|
+
percentCurrent: 0,
|
|
30
32
|
speedSetting: 0,
|
|
31
33
|
speedCurrent: 0,
|
|
32
34
|
},
|
|
33
35
|
},
|
|
34
36
|
handlers: {
|
|
35
37
|
fanControl: {
|
|
36
|
-
// Called when user adjusts the speed slider
|
|
37
38
|
setPercentSetting: async (request) => {
|
|
38
|
-
log.info(`[Fan]
|
|
39
|
-
// TODO:
|
|
40
|
-
// Example: await myFanAPI.setSpeed(request.percentSetting)
|
|
39
|
+
log.info(`[Fan] Setting speed to ${request.percentSetting}%`);
|
|
40
|
+
// TODO: await myFanAPI.setSpeed(request.percentSetting)
|
|
41
41
|
},
|
|
42
|
-
// Called when user selects a specific mode (Off, Low, Medium, High, Auto, etc.)
|
|
43
42
|
setFanMode: async (request) => {
|
|
44
43
|
const modes = ['Off', 'Low', 'Medium', 'High', 'On', 'Auto', 'Smart'];
|
|
45
44
|
const modeName = modes[request.fanMode] || `Unknown (${request.fanMode})`;
|
|
46
|
-
log.info(`[Fan]
|
|
47
|
-
// TODO:
|
|
48
|
-
// Example: await myFanAPI.setMode(modeName.toLowerCase())
|
|
45
|
+
log.info(`[Fan] Setting mode to ${modeName}`);
|
|
46
|
+
// TODO: await myFanAPI.setMode(modeName.toLowerCase())
|
|
49
47
|
},
|
|
50
|
-
// Called when user uses up/down buttons to increment/decrement speed
|
|
51
48
|
step: async (request) => {
|
|
52
49
|
const dir = request.direction === 0 ? 'Up' : 'Down';
|
|
53
|
-
log.info(`[Fan]
|
|
54
|
-
// TODO:
|
|
55
|
-
// direction: 0 = increase speed, 1 = decrease speed
|
|
56
|
-
// wrap: whether to wrap around from max to min (or vice versa)
|
|
57
|
-
// lowestOff: whether the lowest speed setting should turn the fan off
|
|
50
|
+
log.info(`[Fan] Step ${dir}`);
|
|
51
|
+
// TODO: await myFanAPI.step(request.direction, request.wrap, request.lowestOff)
|
|
58
52
|
},
|
|
59
53
|
},
|
|
60
54
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fan.js","sourceRoot":"","sources":["../../../src/devices/section-9-hvac/fan.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"fan.js","sourceRoot":"","sources":["../../../src/devices/section-9-hvac/fan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,UAAU,WAAW,CAAC,OAAsB;IAChD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IACpC,MAAM,WAAW,GAAU,EAAE,CAAA;IAE7B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,WAAW,CAAC,IAAI,CAAC;QACf,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC5C,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG;QACtC,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,iBAAiB;QAC/B,KAAK,EAAE,QAAQ;QAEf,QAAQ,EAAE;YACR,UAAU,EAAE;gBACV,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG;gBAChD,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,aAAa;gBAC1E,cAAc,EAAE,CAAC;gBACjB,cAAc,EAAE,CAAC;gBACjB,YAAY,EAAE,CAAC;gBACf,YAAY,EAAE,CAAC;aAChB;SACF;QAED,QAAQ,EAAE;YACR,UAAU,EAAE;gBACV,iBAAiB,EAAE,KAAK,EAAE,OAAmC,EAAE,EAAE;oBAC/D,GAAG,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,cAAc,GAAG,CAAC,CAAA;oBAC7D,wDAAwD;gBAC1D,CAAC;gBAED,UAAU,EAAE,KAAK,EAAE,OAA4B,EAAE,EAAE;oBACjD,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;oBACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,YAAY,OAAO,CAAC,OAAO,GAAG,CAAA;oBACzE,GAAG,CAAC,IAAI,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAA;oBAC7C,uDAAuD;gBACzD,CAAC;gBAED,IAAI,EAAE,KAAK,EAAE,OAAiE,EAAE,EAAE;oBAChF,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;oBACnD,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,CAAA;oBAC7B,gFAAgF;gBAClF,CAAC;aACF;SACF;KACF,CAAC,CAAA;IAEF,OAAO,WAAW,CAAA;AACpB,CAAC"}
|
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
* Thermostat Device (Matter Spec § 9.1)
|
|
3
3
|
*
|
|
4
4
|
* A device for controlling heating and cooling systems.
|
|
5
|
+
*
|
|
6
|
+
* For comprehensive documentation, see: ../../../MATTER_API.md
|
|
7
|
+
*
|
|
8
|
+
* This example demonstrates:
|
|
9
|
+
* - Thermostat cluster with heating/cooling setpoints
|
|
10
|
+
* - Using api.matter.types for system modes
|
|
11
|
+
* - Temperature in hundredths of degrees Celsius
|
|
5
12
|
*/
|
|
6
13
|
import type { DeviceContext } from '../types.js';
|
|
7
14
|
export declare function registerThermostat(context: DeviceContext): any[];
|
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
* Thermostat Device (Matter Spec § 9.1)
|
|
3
3
|
*
|
|
4
4
|
* A device for controlling heating and cooling systems.
|
|
5
|
+
*
|
|
6
|
+
* For comprehensive documentation, see: ../../../MATTER_API.md
|
|
7
|
+
*
|
|
8
|
+
* This example demonstrates:
|
|
9
|
+
* - Thermostat cluster with heating/cooling setpoints
|
|
10
|
+
* - Using api.matter.types for system modes
|
|
11
|
+
* - Temperature in hundredths of degrees Celsius
|
|
5
12
|
*/
|
|
6
13
|
export function registerThermostat(context) {
|
|
7
14
|
const { api, log, config } = context;
|
|
@@ -18,45 +25,34 @@ export function registerThermostat(context) {
|
|
|
18
25
|
model: 'Thermostat v1',
|
|
19
26
|
clusters: {
|
|
20
27
|
thermostat: {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
minCoolSetpointLimit: 1600, // Minimum: 16°C
|
|
30
|
-
maxCoolSetpointLimit: 3200, // Maximum: 32°C
|
|
31
|
-
// System mode using MatterTypes enum for type safety
|
|
32
|
-
systemMode: api.matter.types.Thermostat.SystemMode.Heat, // Currently in Heat mode
|
|
33
|
-
// Control sequence: defines what modes are available (mandatory)
|
|
28
|
+
localTemperature: 2100, // 21.00°C
|
|
29
|
+
occupiedHeatingSetpoint: 2000, // 20.00°C
|
|
30
|
+
minHeatSetpointLimit: 700,
|
|
31
|
+
maxHeatSetpointLimit: 3000,
|
|
32
|
+
occupiedCoolingSetpoint: 2400, // 24.00°C
|
|
33
|
+
minCoolSetpointLimit: 1600,
|
|
34
|
+
maxCoolSetpointLimit: 3200,
|
|
35
|
+
systemMode: api.matter.types.Thermostat.SystemMode.Heat,
|
|
34
36
|
controlSequenceOfOperation: api.matter.types.Thermostat.ControlSequenceOfOperation.CoolingAndHeating,
|
|
35
37
|
},
|
|
36
38
|
},
|
|
37
39
|
handlers: {
|
|
38
40
|
thermostat: {
|
|
39
|
-
// Called when user changes the heating target temperature
|
|
40
41
|
setOccupiedHeatingSetpoint: async (request) => {
|
|
41
42
|
const tempC = (request.targetSetpoint / 100).toFixed(1);
|
|
42
|
-
log.info(`[Thermostat]
|
|
43
|
-
// TODO:
|
|
44
|
-
// Example: await myThermostatAPI.setHeatingTarget(parseFloat(tempC))
|
|
43
|
+
log.info(`[Thermostat] Setting heating target to ${tempC}°C`);
|
|
44
|
+
// TODO: await myThermostatAPI.setHeatingTarget(parseFloat(tempC))
|
|
45
45
|
},
|
|
46
|
-
// Called when user changes the cooling target temperature
|
|
47
46
|
setOccupiedCoolingSetpoint: async (request) => {
|
|
48
47
|
const tempC = (request.targetSetpoint / 100).toFixed(1);
|
|
49
|
-
log.info(`[Thermostat]
|
|
50
|
-
// TODO:
|
|
51
|
-
// Example: await myThermostatAPI.setCoolingTarget(parseFloat(tempC))
|
|
48
|
+
log.info(`[Thermostat] Setting cooling target to ${tempC}°C`);
|
|
49
|
+
// TODO: await myThermostatAPI.setCoolingTarget(parseFloat(tempC))
|
|
52
50
|
},
|
|
53
|
-
// Called when user changes the system mode (Off, Auto, Cool, Heat, etc.)
|
|
54
51
|
setSystemMode: async (request) => {
|
|
55
52
|
const modes = ['Off', 'Auto', 'Reserved', 'Cool', 'Heat', 'Emergency Heating', 'Precooling', 'Fan Only'];
|
|
56
53
|
const modeName = modes[request.systemMode] || `Unknown (${request.systemMode})`;
|
|
57
|
-
log.info(`[Thermostat]
|
|
58
|
-
// TODO:
|
|
59
|
-
// Example: await myThermostatAPI.setMode(modeName.toLowerCase())
|
|
54
|
+
log.info(`[Thermostat] Setting mode to ${modeName}`);
|
|
55
|
+
// TODO: await myThermostatAPI.setMode(modeName.toLowerCase())
|
|
60
56
|
},
|
|
61
57
|
},
|
|
62
58
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thermostat.js","sourceRoot":"","sources":["../../../src/devices/section-9-hvac/thermostat.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"thermostat.js","sourceRoot":"","sources":["../../../src/devices/section-9-hvac/thermostat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,UAAU,kBAAkB,CAAC,OAAsB;IACvD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IACpC,MAAM,WAAW,GAAU,EAAE,CAAA;IAE7B,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,WAAW,CAAC,IAAI,CAAC;QACf,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACnD,WAAW,EAAE,YAAY;QACzB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU;QAC7C,YAAY,EAAE,YAAY;QAC1B,YAAY,EAAE,iBAAiB;QAC/B,KAAK,EAAE,eAAe;QAEtB,QAAQ,EAAE;YACR,UAAU,EAAE;gBACV,gBAAgB,EAAE,IAAI,EAAE,UAAU;gBAClC,uBAAuB,EAAE,IAAI,EAAE,UAAU;gBACzC,oBAAoB,EAAE,GAAG;gBACzB,oBAAoB,EAAE,IAAI;gBAC1B,uBAAuB,EAAE,IAAI,EAAE,UAAU;gBACzC,oBAAoB,EAAE,IAAI;gBAC1B,oBAAoB,EAAE,IAAI;gBAC1B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI;gBACvD,0BAA0B,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,0BAA0B,CAAC,iBAAiB;aACrG;SACF;QAED,QAAQ,EAAE;YACR,UAAU,EAAE;gBACV,0BAA0B,EAAE,KAAK,EAAE,OAAmC,EAAE,EAAE;oBACxE,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;oBACvD,GAAG,CAAC,IAAI,CAAC,0CAA0C,KAAK,IAAI,CAAC,CAAA;oBAC7D,kEAAkE;gBACpE,CAAC;gBAED,0BAA0B,EAAE,KAAK,EAAE,OAAmC,EAAE,EAAE;oBACxE,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;oBACvD,GAAG,CAAC,IAAI,CAAC,0CAA0C,KAAK,IAAI,CAAC,CAAA;oBAC7D,kEAAkE;gBACpE,CAAC;gBAED,aAAa,EAAE,KAAK,EAAE,OAA+B,EAAE,EAAE;oBACvD,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;oBACxG,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,YAAY,OAAO,CAAC,UAAU,GAAG,CAAA;oBAC/E,GAAG,CAAC,IAAI,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAA;oBACpD,8DAA8D;gBAChE,CAAC;aACF;SACF;KACF,CAAC,CAAA;IAEF,OAAO,WAAW,CAAA;AACpB,CAAC"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"displayName": "Homebridge Matter",
|
|
4
4
|
"alias": "Matter",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"version": "0.1.
|
|
6
|
+
"version": "0.1.4",
|
|
7
7
|
"description": "Homebridge plugin to showcase examples of Matter devices in Homebridge.",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "bwp91",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"main": "dist/index.js",
|
|
50
50
|
"engines": {
|
|
51
51
|
"node": "^20.18.0 || ^22.10.0 || ^24.0.0",
|
|
52
|
-
"homebridge": ">=2.0.0-alpha.
|
|
52
|
+
"homebridge": ">=2.0.0-alpha.64 <2.0.0-beta.0"
|
|
53
53
|
},
|
|
54
54
|
"scripts": {
|
|
55
55
|
"build": "rimraf ./dist && tsc && npm run plugin-ui",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@antfu/eslint-config": "^6.0.0",
|
|
67
67
|
"@types/node": "^24.9.1",
|
|
68
|
-
"homebridge": "2.0.0-alpha.
|
|
68
|
+
"homebridge": "2.0.0-alpha.64",
|
|
69
69
|
"rimraf": "^6.0.1",
|
|
70
70
|
"ts-node": "^10.9.2",
|
|
71
71
|
"typescript": "^5.9.3"
|