Privacy comparison (proč invertovaná byla bug)
v1.13 měl light router code:
// BEFORE (wrong)
const blindOpen = roletaPos < 0.2;
if (blindOpen && wantsLight) → block;
Logika byla: „pokud roleta dole (< 0,2) = open prostor venku → block lights."
Ale to je obráceně — roleta na 0,1 znamená dolů (zataženo), ne otevřeno.
Důsledek: user-zavřená roleta = blokovala lights. Přesný opak požadovaného.
// AFTER (right) v1.14
const blindOpen = roletaPos > 0.2;
if (blindOpen && wantsLight) → block;
Položka 0,2 = privacy threshold. Nad = open (vidět dovnitř). Pod = closed
(privacy zachována). Memory: reference_open_space_lighting_pipeline.md.
Safety interlock (auto-close pipeline)
Když user emituje light request a roleta je nad 0,2 v privacy hours
(TOD evening / night, lux pod prahem):
- Light_router detekuje privacy fail
- setCap
windowcoverings_set = 0.15 (config: sh_cfg_blind_privacy_position)
- Listen na driver ack (pozice dosažena, ~3–5 s) NEBO timeout 10 s
- Po ack: setCap light onoff (původní request)
- Pokud timeout: log warning + default deny (radši tma než breach)
Pipeline atomicky — jeden flow rozhodne celý sequence. Žádný race condition
(„roleta dolů + light → během toho user otevře roletu manuálně" — by se to
v 5 s okně mělo dovnitř, ale pokud ano, příští cyklus to dořeší).
Position semantics (windowcoverings_set vs. _state)
Homey má dvě capabilities:
-
windowcoverings_set: float 0,0–1,0 — target
position. Set čte device na drive direction. 0 = bottom (closed),
1 = top (open).
-
windowcoverings_state: enum 'idle' / 'up' / 'down'
— současný stav motoru. Read-only z driver. Užitečné pro „čekej až
dojede".
IKEA Fyrtur convention: 0 = full down (tělo lana navinuté), 1 = full up
(lano vysunuté). Aqara curtain motor naopak často 0 = open, 1 = closed —
ověřit per device.
Schedule format (auto-open / auto-close)
Schedule per zóna podobně jako heating:
{
"version": 1, "enabled": true,
"schedule": {
"weekday": [
{"time": "06:30", "position": 1.0, "comment": "morning open"},
{"time": "22:00", "position": 0.1, "comment": "night close"}
],
"weekend": [
{"time": "08:00", "position": 1.0},
{"time": "23:00", "position": 0.1}
]
}
}
Cron sh_blind_scheduler_v1 (every 5 min) najde aktuální slot
a aplikuje. Manual override z dashboardu má prioritu (config:
sh_cfg_blind_manual_override_until_ts).
Battery management (Fyrtur ~1 rok)
IKEA Fyrtur má integrovaný Li-Ion akumulátor, USB-C nabíjení. Capability
measure_battery:
- > 50 % — green
- 20–50 % — yellow, log warning
- 10–20 % — red, push alert (až bude implementováno)
- < 10 % — kritický, schedule nabíjení do týdne
Real-life: při 2 cyklech denně (open ráno + close večer) battery drží ~1 rok.
Nabíjení trvá ~4 h, lze přes noc bez vyndání. USB-C kabel zůstává během
nabíjení.