homebridge-multiple-switch 1.6.0-beta.3 → 1.6.0-beta.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 +10 -0
- package/homebridge-ui/public/i18n/ar.json +2 -1
- package/homebridge-ui/public/i18n/de.json +2 -1
- package/homebridge-ui/public/i18n/en.json +2 -1
- package/homebridge-ui/public/i18n/es.json +2 -1
- package/homebridge-ui/public/i18n/fr.json +2 -1
- package/homebridge-ui/public/i18n/it.json +2 -1
- package/homebridge-ui/public/i18n/ja.json +2 -1
- package/homebridge-ui/public/i18n/ko.json +2 -1
- package/homebridge-ui/public/i18n/nl.json +2 -1
- package/homebridge-ui/public/i18n/pl.json +2 -1
- package/homebridge-ui/public/i18n/pt.json +2 -1
- package/homebridge-ui/public/i18n/ru.json +2 -1
- package/homebridge-ui/public/i18n/tr.json +2 -1
- package/homebridge-ui/public/i18n/zh-CN.json +2 -1
- package/homebridge-ui/public/index.html +24 -7
- package/index.js +11 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.6.0-beta.4] - 2026-03-21
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- Master switch type selection (Switch or Outlet) — appears when master switch is enabled
|
|
7
|
+
- `masterSwitchType` config option
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- All devices and switches now start collapsed when config UI is opened
|
|
11
|
+
- New devices/switches still open expanded when freshly added
|
|
12
|
+
|
|
3
13
|
## [1.6.0-beta.3] - 2026-03-21
|
|
4
14
|
|
|
5
15
|
### Fixed
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "يمكن تشغيل مفتاح واحد فقط في نفس الوقت. تشغيل واحد يقوم بإيقاف جميع الآخرين تلقائياً.",
|
|
34
34
|
"masterSwitch": "المفتاح الرئيسي",
|
|
35
35
|
"masterSwitchDesc": "يضيف مفتاحاً رئيسياً يقوم بتشغيل أو إيقاف جميع المفاتيح دفعة واحدة.",
|
|
36
|
-
"switchSingular": "مفتاح"
|
|
36
|
+
"switchSingular": "مفتاح",
|
|
37
|
+
"masterSwitchType": "نوع المفتاح الرئيسي"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "Es kann nur ein Schalter gleichzeitig eingeschaltet sein. Das Einschalten eines Schalters schaltet alle anderen automatisch aus.",
|
|
34
34
|
"masterSwitch": "Hauptschalter",
|
|
35
35
|
"masterSwitchDesc": "Fügt einen Hauptschalter hinzu, der alle Schalter auf einmal ein- oder ausschaltet.",
|
|
36
|
-
"switchSingular": "Schalter"
|
|
36
|
+
"switchSingular": "Schalter",
|
|
37
|
+
"masterSwitchType": "Hauptschaltertyp"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "Only one switch can be on at a time. Turning one on automatically turns off all others.",
|
|
34
34
|
"masterSwitch": "Master Switch",
|
|
35
35
|
"masterSwitchDesc": "Adds a master switch that turns all switches on or off at once.",
|
|
36
|
-
"switchSingular": "switch"
|
|
36
|
+
"switchSingular": "switch",
|
|
37
|
+
"masterSwitchType": "Master Switch Type"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "Solo un interruptor puede estar encendido a la vez. Encender uno apaga automáticamente todos los demás.",
|
|
34
34
|
"masterSwitch": "Interruptor maestro",
|
|
35
35
|
"masterSwitchDesc": "Agrega un interruptor maestro que enciende o apaga todos los interruptores a la vez.",
|
|
36
|
-
"switchSingular": "interruptor"
|
|
36
|
+
"switchSingular": "interruptor",
|
|
37
|
+
"masterSwitchType": "Tipo de interruptor maestro"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "Un seul interrupteur peut être activé à la fois. En activer un désactive automatiquement tous les autres.",
|
|
34
34
|
"masterSwitch": "Interrupteur principal",
|
|
35
35
|
"masterSwitchDesc": "Ajoute un interrupteur principal qui active ou désactive tous les interrupteurs en une seule fois.",
|
|
36
|
-
"switchSingular": "interrupteur"
|
|
36
|
+
"switchSingular": "interrupteur",
|
|
37
|
+
"masterSwitchType": "Type d'interrupteur principal"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "Solo un interruttore può essere acceso alla volta. Accenderne uno spegne automaticamente tutti gli altri.",
|
|
34
34
|
"masterSwitch": "Interruttore principale",
|
|
35
35
|
"masterSwitchDesc": "Aggiunge un interruttore principale che accende o spegne tutti gli interruttori contemporaneamente.",
|
|
36
|
-
"switchSingular": "interruttore"
|
|
36
|
+
"switchSingular": "interruttore",
|
|
37
|
+
"masterSwitchType": "Tipo di interruttore principale"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "同時に1つのスイッチのみオンにできます。1つをオンにすると他はすべて自動的にオフになります。",
|
|
34
34
|
"masterSwitch": "マスタースイッチ",
|
|
35
35
|
"masterSwitchDesc": "すべてのスイッチを一度にオン/オフするマスタースイッチを追加します。",
|
|
36
|
-
"switchSingular": "スイッチ"
|
|
36
|
+
"switchSingular": "スイッチ",
|
|
37
|
+
"masterSwitchType": "マスタースイッチタイプ"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "한 번에 하나의 스위치만 켤 수 있습니다. 하나를 켜면 다른 모든 것이 자동으로 꺼집니다.",
|
|
34
34
|
"masterSwitch": "마스터 스위치",
|
|
35
35
|
"masterSwitchDesc": "모든 스위치를 한 번에 켜거나 끄는 마스터 스위치를 추가합니다.",
|
|
36
|
-
"switchSingular": "스위치"
|
|
36
|
+
"switchSingular": "스위치",
|
|
37
|
+
"masterSwitchType": "마스터 스위치 유형"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "Er kan slechts één schakelaar tegelijk aan staan. Het inschakelen van één schakelaar schakelt alle andere automatisch uit.",
|
|
34
34
|
"masterSwitch": "Hoofdschakelaar",
|
|
35
35
|
"masterSwitchDesc": "Voegt een hoofdschakelaar toe die alle schakelaars in één keer in- of uitschakelt.",
|
|
36
|
-
"switchSingular": "schakelaar"
|
|
36
|
+
"switchSingular": "schakelaar",
|
|
37
|
+
"masterSwitchType": "Type hoofdschakelaar"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "Tylko jeden przełącznik może być włączony jednocześnie. Włączenie jednego automatycznie wyłącza wszystkie pozostałe.",
|
|
34
34
|
"masterSwitch": "Przełącznik główny",
|
|
35
35
|
"masterSwitchDesc": "Dodaje przełącznik główny, który włącza lub wyłącza wszystkie przełączniki jednocześnie.",
|
|
36
|
-
"switchSingular": "przełącznik"
|
|
36
|
+
"switchSingular": "przełącznik",
|
|
37
|
+
"masterSwitchType": "Typ przełącznika głównego"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "Apenas um interruptor pode estar ligado por vez. Ligar um desliga automaticamente todos os outros.",
|
|
34
34
|
"masterSwitch": "Interruptor principal",
|
|
35
35
|
"masterSwitchDesc": "Adiciona um interruptor principal que liga ou desliga todos os interruptores de uma só vez.",
|
|
36
|
-
"switchSingular": "interruptor"
|
|
36
|
+
"switchSingular": "interruptor",
|
|
37
|
+
"masterSwitchType": "Tipo de interruptor principal"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "Одновременно может быть включён только один переключатель. Включение одного автоматически выключает все остальные.",
|
|
34
34
|
"masterSwitch": "Главный переключатель",
|
|
35
35
|
"masterSwitchDesc": "Добавляет главный переключатель, который включает или выключает все переключатели одновременно.",
|
|
36
|
-
"switchSingular": "переключатель"
|
|
36
|
+
"switchSingular": "переключатель",
|
|
37
|
+
"masterSwitchType": "Тип главного переключателя"
|
|
37
38
|
}
|
|
@@ -33,5 +33,6 @@
|
|
|
33
33
|
"behaviorSingleDesc": "Aynı anda yalnızca bir anahtar açık olabilir. Birini açmak diğerlerini otomatik kapatır.",
|
|
34
34
|
"masterSwitch": "Ana Anahtar",
|
|
35
35
|
"masterSwitchDesc": "Tüm anahtarları tek seferde açan veya kapatan bir ana anahtar ekler.",
|
|
36
|
-
"switchSingular": "anahtar"
|
|
36
|
+
"switchSingular": "anahtar",
|
|
37
|
+
"masterSwitchType": "Ana Anahtar Tipi"
|
|
37
38
|
}
|
|
@@ -185,14 +185,9 @@
|
|
|
185
185
|
config.devices = [];
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
-
// Track expand/collapse state
|
|
189
|
-
const expandedDevices = new Set(
|
|
188
|
+
// Track expand/collapse state — all collapsed by default
|
|
189
|
+
const expandedDevices = new Set();
|
|
190
190
|
const expandedSwitches = new Set();
|
|
191
|
-
config.devices.forEach((dev, di) => {
|
|
192
|
-
(dev.switches || []).forEach((_, si) => {
|
|
193
|
-
expandedSwitches.add(`${di}_${si}`);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
191
|
|
|
197
192
|
const app = document.getElementById('app');
|
|
198
193
|
|
|
@@ -282,6 +277,19 @@
|
|
|
282
277
|
input.addEventListener('change', () => {
|
|
283
278
|
const di = parseInt(input.dataset.dev);
|
|
284
279
|
config.devices[di].masterSwitch = input.checked;
|
|
280
|
+
if (!input.checked) {
|
|
281
|
+
delete config.devices[di].masterSwitchType;
|
|
282
|
+
}
|
|
283
|
+
render();
|
|
284
|
+
save();
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
// Master switch type
|
|
289
|
+
document.querySelectorAll('.master-type-field').forEach(input => {
|
|
290
|
+
input.addEventListener('change', () => {
|
|
291
|
+
const di = parseInt(input.dataset.dev);
|
|
292
|
+
config.devices[di].masterSwitchType = input.value;
|
|
285
293
|
save();
|
|
286
294
|
});
|
|
287
295
|
});
|
|
@@ -403,6 +411,15 @@
|
|
|
403
411
|
<div class="desc" style="margin-bottom:0">${t.masterSwitchDesc || ''}</div>
|
|
404
412
|
</div>
|
|
405
413
|
</div>
|
|
414
|
+
${dev.masterSwitch ? `
|
|
415
|
+
<div style="margin-top:12px">
|
|
416
|
+
<label>${t.masterSwitchType || 'Master Switch Type'}</label>
|
|
417
|
+
<select class="master-type-field" data-dev="${di}">
|
|
418
|
+
<option value="switch" ${dev.masterSwitchType === 'switch' ? 'selected' : ''}>${t.typeSwitch || 'Switch'}</option>
|
|
419
|
+
<option value="outlet" ${dev.masterSwitchType === 'outlet' || !dev.masterSwitchType ? 'selected' : ''}>${t.typeOutlet || 'Outlet'}</option>
|
|
420
|
+
</select>
|
|
421
|
+
</div>
|
|
422
|
+
` : ''}
|
|
406
423
|
</div>
|
|
407
424
|
` : ''}
|
|
408
425
|
|
package/index.js
CHANGED
|
@@ -92,7 +92,7 @@ class MultipleSwitchPlatform {
|
|
|
92
92
|
const services = new Map();
|
|
93
93
|
this.deviceServices.set(uuid, services);
|
|
94
94
|
|
|
95
|
-
this.reconcileServices(accessory, switches, services, hasMaster);
|
|
95
|
+
this.reconcileServices(accessory, device, switches, services, hasMaster);
|
|
96
96
|
|
|
97
97
|
if (isNew) {
|
|
98
98
|
this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
|
|
@@ -112,16 +112,23 @@ class MultipleSwitchPlatform {
|
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
reconcileServices(accessory, switches, services, hasMaster) {
|
|
115
|
+
reconcileServices(accessory, device, switches, services, hasMaster) {
|
|
116
116
|
const activeSubtypes = new Set();
|
|
117
117
|
|
|
118
118
|
// Create master switch FIRST if enabled (so it appears at top in HomeKit)
|
|
119
119
|
if (hasMaster) {
|
|
120
120
|
activeSubtypes.add(MASTER_SUBTYPE);
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
const MasterServiceClass = this.getServiceClass(device.masterSwitchType);
|
|
123
|
+
let masterService = accessory.getServiceById(MasterServiceClass, MASTER_SUBTYPE);
|
|
124
|
+
|
|
125
|
+
// If type changed, remove old service and create new one
|
|
123
126
|
if (!masterService) {
|
|
124
|
-
|
|
127
|
+
const oldMaster = accessory.services.find((s) => s.subtype === MASTER_SUBTYPE);
|
|
128
|
+
if (oldMaster) {
|
|
129
|
+
accessory.removeService(oldMaster);
|
|
130
|
+
}
|
|
131
|
+
masterService = accessory.addService(MasterServiceClass, 'Master', MASTER_SUBTYPE);
|
|
125
132
|
}
|
|
126
133
|
|
|
127
134
|
this.setServiceName(masterService, 'Master');
|
package/package.json
CHANGED