# Audyt spójności automatyzacji instancji `ken` — 2026-07-23

Zakres: wyłącznie analiza; żadnych zmian w automatyzacjach/skryptach/scenach.

Materiał: `config/ken/` (119 automatyzacji, 6 skryptów, 3 sceny),
`storage-export/ken/` (rejestry z 2026-07-22), `fixtures/ken-states-2026-07-22.yaml`
(stany + `last_triggered`), `config/ken-legacy/` (60 automatyzacji, archiwum),
DESIGN.md (Incident log).

Zastrzeżenia metodyczne:

- Rejestry i fixtures pochodzą z 2026-07-22, sprzed wdrożenia automatyki klimy
  (commity z 2026-07-23). Encje klimy „brakujące" w exportach nie muszą być
  martwe — patrz 1.1.
- HA po restarcie 2026-07-17 15:07 (update Supervisora) zresetował `last_changed`
  — encje pokazujące `unavailable od 2026-07-17 15:07` są martwe *co najmniej*
  od restartu; `last_triggered` automatyzacji wskazuje, że część padła dużo
  wcześniej (marzec–maj).
- Deploy helpers (`input_*`) nie istnieje (faza 1 obejmuje tylko
  automations/scripts/scenes), więc obecności helperów klimy nie da się
  potwierdzić z repo.

## Streszczenie

Liczby:

- 119 automatyzacji (112 włączonych, 7 wyłączonych), 6 skryptów, 3 sceny.
- 305 encji `unavailable` w fixtures; 6 czujników ruchu/obecności martwych
  lub gasnących (mdwejscie, mdsypialnia, mdtymka, mdheli, mdubikacja, occusalon).
- ~15 automatyzacji martwych lub zdegradowanych przez martwe czujniki — po cichu:
  triggery nie strzelają albo warunki `is_not_occupied` na encji `unavailable`
  nigdy nie przechodzą.
- 8 referencji do encji nieistniejących w registry (poza klimą).
- 13 automatyzacji na `time_pattern`, z tego 7 co ≤1 min (w tym 6 kalibracji TRV
  co 40–50 s i `Set current_player` co 15 s).
- Legacy: 54/60 automatyzacji ma odpowiednik 1:1 na ken, 6 bez odpowiednika
  (sekcja 5).

Top 5 znalezisk wg wagi:

1. **[krytyczne] Kalibracja TRV sypialnia i Tymek liczy średnią z martwego
   czujnika** — `unavailable → float(0)` zaniża temperaturę o połowę, kalibracje
   przypięte do −5.0 (potwierdzone w fixtures). W sezonie grzewczym oznacza to
   trwałe przegrzewanie obu pokoi. Pętle piszą po Zigbee co 40–45 s (baterie TRV
   20–38%). (1.4)
2. **[krytyczne] Martwy klaster czujników ruchu wyłączył alerty i nocne
   gaszenie** — m.in. `email on move in hall/sypialnia when on leave` (funkcja
   antywłamaniowa) nigdy nie wystrzeli; oba nocne „turn off lights if clear"
   martwe od marca; `sleep_mode` nie włącza się już automatycznie. (1.2, 2.4)
3. **[krytyczne] Łańcuch alertów wodnych dziurawy** — czujnik WC `unavailable`
   (brak alertu przy zalaniu), „dry in Kuchnia" triggeruje na `moist`
   (kopiuj-wklej), „dry in Lazienka" ma literówkę `mesaage:` (akcja bez
   `message` → skrypt się wywala). (1.3, 2.6)
4. **[istotne] `Poranek start` codziennie wisi 1 h na martwym czujniku** —
   `wait_for_trigger` na mdwejscie (unavailable) zawsze dobija do timeoutu 1 h;
   radio i powitanie startują o godzinę za późno. (1.2c)
5. **[istotne] Klima salon: helperów nie ma w żadnym exporcie, a gałąź OFF nie
   sprawdza `klima_salon_auto`** — jeśli helpery nie istnieją na instancji, obie
   automatyzacje są martwe (cicho); niezależnie od tego zachód słońca ubija też
   ręcznie włączone chłodzenie. (1.1, 3.1)

## 1. Martwe referencje

### 1.1 [istotne — do weryfikacji] Helpery klimy salonowej niepotwierdzone

Pliki: `1784804667795` „Klima salon: włącz…", `1784804668795` „Klima salon:
wyłącz…", `scripts/klima_salon_dry_off.yaml`.

Referencje: `input_boolean.klima_salon_auto`, `input_number.klima_salon_temp_docelowa`,
`input_number.klima_salon_tolerancja` — nie występują w
`storage-export/ken/input_*.yaml` ani w fixtures (snapshoty z 2026-07-22, sprzed
deployu klimy). Repo nie ma toru deployu helperów, więc musiały powstać ręcznie
w UI — albo nie powstały. Jeśli ich nie ma, warunek `state: 'on'` na
nieistniejącej encji nigdy nie przechodzi i cała automatyka klimy jest martwa
bez żadnego błędu.

PROPOZYCJA: jednorazowa weryfikacja na żywej instancji (`/api/states`), potem
re-import `input_*` do storage-export, żeby snapshot dogonił stan.

### 1.2 [krytyczne] Martwe czujniki ruchu/obecności — ~15 automatyzacji cicho nie działa

Stan w fixtures: `binary_sensor.0x00124b00251472ef_occupancy` (mdwejscie/hall),
`mdsypialnia_occupancy`, `mdheli_occupancy` — unavailable co najmniej od
restartu 2026-07-17; `occusalon_occupancy` od 2026-07-20, `mdtymka_occupancy` od
2026-07-21, `mdubikacja_occupancy` od 2026-07-22 (te trzy gasną/flapują —
typowy obraz siadających baterii). `last_triggered` wskazuje, że occusalon i
mdwejscie realnie przestały działać w okolicach marca–maja.

Skutki, w kolejności wagi:

a) **Alerty on-leave martwe**: `1753431022365` „email on move in hall when on
   leave" i `1753883109847` „email on move in sypialnia when on leave" —
   triggery na martwych czujnikach; nigdy nie wystrzelą. Przy `on_leave = on`
   dom NIE zgłosi ruchu. (Ostatnie odpalenia: 2026-01-29 / 2025-09-15 — jeszcze
   z czasów życia czujników.)

b) **Nocne gaszenie świateł martwe**: `1702844937214` „Turn off Lights after
   23:30 if clear" (ostatni raz 2026-03-27) i `1763384250145` „Turn off Swiatlo
   na Kuchnia after 23:30 if clear" (2025-11-27) mają w warunkach
   `is_not_occupied` na occusalon/mdwejscie/mdubikacja — `unavailable` ≠ `off`,
   warunek zawsze fałszywy. Konsekwencja wtórna: `1702844937214` było jedynym
   automatycznym włącznikiem `input_boolean.sleep_mode` — sleep mode działa już
   tylko z przycisku w sypialni. Realnie nocą domyka światła tylko
   `1700832676138` „Turn off lights unconditionally at 3am".

c) **`Poranek start` (`1763386155895`) wisi godzinę**: główna sekwencja czeka
   `wait_for_trigger` na mdwejscie occupied z timeoutem 1 h — czyli codziennie
   pełny timeout; radio/speak startują o ~7:42 zamiast po wykryciu ruchu.
   Dodatkowo `1764595573287` „Poranek pause media player…" (warunki na
   occusalon+mdwejscie) — martwe od 2026-03-26.

d) **`1763637049783`** („Turn off swiatlo nad kuchnia when no motion, no
   trigger", entity `automation.new_automation_3`, wywoływane codziennie przez
   `Poranek stop`): pętla `repeat–until` z warunkami na mdwejscie i occusalon —
   `until` nigdy nie przejdzie, pętla kręci się w nieskończoność (delay 1 min),
   aż ubije ją restart HA lub `stop_actions`. Zombie.

e) **`1752607597518` „Turn off led zasilanie w Kuchni"**: warunek AND na
   3 czujnikach, z których 2 martwe → nigdy nie przechodzi. Potwierdzone:
   `switch.tasmota_14` świeci się non stop (state `on`). LED zasilania w kuchni
   nie gaśnie od marca.

f) Mniejsze: `1666891422388`/`1666891723803` (Magic Mirror Display On/Off —
   trigger mdwejscie, lustro nie reaguje na obecność), `1667065238690` „Swiatlo
   na wejscie do domu" (trigger mdwejscie, ostatnio 2026-03-24), `1703104763868`
   „Turn OFF Heli sufit" (warunek mdheli, ostatnio 2026-04-08), `1763637857513`
   „…no motion in all home for 1h" (warunki na 5 martwych czujnikach; częściowo
   uratowane przez odnogę OR akceptującą `unavailable` mdkorytarz — ale AND na
   mdheli/mdtymka/mdsypialnia i tak blokuje), `1734943824257` „Turn ON Choinka
   na wejscie" (trigger mdwejscie — podwójnie martwe, patrz 4.2).

PROPOZYCJA: wymiana baterii / re-pairing 6 czujników to jedna fizyczna akcja,
która reanimuje większość powyższego. Po niej: przegląd, czy `1763637049783`
(zombie-pętla) nie powinno zostać przepisane na zwykłe warunki `for:`. Docelowo
rozważyć alerty ha-diag-agent na `unavailable > 24 h` dla czujników użytych w
automatyzacjach (routing `ha_entity_unavailable_long` już istnieje w
supervisorze).

### 1.3 [krytyczne] Czujnik wycieku WC martwy

`binary_sensor.waterleakwc_water_leak` unavailable (razem z baterią) →
`1752086527168` „email on water sensor moist in WC" i `1752086563805` „dry in
WC" nie wystrzelą przy zalaniu. Pozostałe czujniki wycieku żyją (bateria
łazienkowego: 35%).

PROPOZYCJA: bateria/re-pairing; rozważyć zbiorczy alert „czujnik bezpieczeństwa
unavailable" (jak w 1.2).

### 1.4 [krytyczne] Kalibracje TRV liczone z martwych czujników, pętle co 40–50 s

Pliki: `1764751049013` (Sypialnia), `1765817937658` (Tymek), `1766345640142`
(Łazienka), `1765817263673` (Heli), `1766348309347` (SalonLewy),
`1766348430579` (SalonPrawy).

- Sypialnia i Tymek: `room_temp = (thX + zhimi_Y)/2`, a oba czujniki zhimi są
  unavailable od 2026-07-17 → `float(0)` → średnia zaniżona o połowę → `diff`
  zawsze na dolnym ograniczniku → kalibracja dojechała do **−5.0** (potwierdzone
  w fixtures dla obu). TRV raportuje temperaturę o 5° za nisko; w sezonie
  grzewczym = trwałe przegrzewanie. Dziś (lato, TRV `off`) bug jest uzbrojony,
  ale nieszkodliwy — do naprawy przed sezonem.
- Łazienka: `climate.heaterlazienkatrv07` i jego `number.*_calibration` są
  unavailable (TRV zniknął z sieci) → `number.set_value` co 40 s w próżnię
  (błędy w logach). Powiązane: `1766408469485` „Boost heater temp in Lazienka
  when shower" — trigger na `sensor.thtuyalazienka_humidity_stats_5min`
  (state `unknown`; sensor statystyczny prawdopodobnie nie przeżył migracji na
  HAOS) + cel unavailable → martwe.
- Salon lewy/prawy: kalibracje przypięte do +5 (max). Częściowo tłumaczy to
  lato (TRV nie mierzy sensownie przy zaworze off), ale SalonPrawy ma clamp
  `diff` ±5, podczas gdy wszystkie pozostałe ±1.5 — wygląda na niedokończony
  eksperyment, nie świadomą różnicę.
- Wszystkie 6: `time_pattern` co 40/45/50 s pisze po Zigbee do TRV na baterii
  (poziomy 20–38%). To agresywny polling; `for:`/trigger na zmianę temperatury
  załatwiłby to samo przy ułamku ruchu.

PROPOZYCJA: (1) wywalić uśrednianie z czujników zhimi albo dodać guard
`is not unavailable`; (2) po naprawie ręcznie wyzerować kalibracje
sypialnia/Tymek; (3) zwolnić pętle do np. 5 min lub przejść na trigger
zmiany stanu; (4) ujednolicić clamp SalonPrawy; (5) reanimować TRV łazienki
albo wyłączyć jego automatyzacje.

### 1.5 [istotne] Encje usunięte z registry — automatyzacje trwale martwe

- `1751307777881` „Aktualizuj lokalizację Oskar": `sensor.owntracks_last_location`
  nie istnieje (integracja OwnTracks nie przeżyła migracji?). Ostatni trigger
  2025-12-20; `device_tracker.oskar` = `not_home` na stałe, mimo że
  `person.oskar` = `home` (inna ścieżka). PROPOZYCJA: przywrócić OwnTracks albo
  skasować automatyzację i sprzątnąć `device_tracker.oskar`.
- `1760432474594` „Notify on router sypialnia is away for too long":
  `sensor.routerheli_last_seen` nie istnieje; `last_triggered` NULL; pattern co
  1 min ocenia warunek na nieistniejącej encji. Uwaga: alias mówi „sypialnia",
  sensor „heli". PROPOZYCJA: skasować lub podpiąć istniejący sensor.
- `1763384250145` „Turn off Swiatlo na Kuchnia after 23:30 if clear": warunek na
  `binary_sensor.0x8c65a3fffeea673a_occupancy` — stary identyfikator occusalon
  sprzed zmiany nazwy. Nawet po reanimacji occusalon ta automatyzacja nie
  ożyje. PROPOZYCJA: podmienić na `binary_sensor.occusalon_occupancy`.
- `1640285211569`/`1640285276640` „Oczyszczacz i nawilżacz prze przycisk Tymka
  [ON]/[OFF]": `fan.mi_air_purifier_3_3h` i `switch.gniazdko_xiaomi_2` nie
  istnieją w registry; ostatnie triggery 2024. Martwe od ~2 lat. PROPOZYCJA:
  skasować (patrz też 4.5).
- `1752241986989` „test test Powitanie głosowe…": `sensor.temperature_salon`
  nie istnieje (jest `thsalon_temperature`); automatyzacja wyłączona, bez
  triggerów. PROPOZYCJA: skasować.

### 1.6 [istotne] Encje trwale unavailable w akcjach

- `1700837302203` „Speak" (4button 1_double): cel `media_player.salon_2`
  (soundbar Bose) unavailable — przycisk „powiedz" martwy. Jedyny konsument
  `tts.google_translate_say`; reszta domu mówi przez `tts.piper`+pimirror.
  PROPOZYCJA: przepiąć na pimirror/piper albo skasować.
- `1761038411219` „Oczyszcza w tryb nocny" (23:30): `xiaomi_miot.set_property`
  na `fan.zhimi_mc2_c369_air_purifier` — unavailable od 2026-07-17; co noc
  błąd. Szerszy obraz: **cała rodzina encji zhimi (mb3, mc2) padła równo z
  restartem/aktualizacją 2026-07-17** — wygląda na wysypaną integrację
  xiaomi_miot, nie na urządzenia. Dotyka też scen (4.2) i kalibracji TRV (1.4).
  PROPOZYCJA: zdiagnozować integrację miot po stronie HA zamiast naprawiać
  pojedyncze automatyzacje.
- Sceny `Oczyszczacze i Nawilzacze ON/OFF`: połowa encji żyje (tasmota_4/5,
  chuangmi), wentylatory zhimi unavailable → sceny wykonują się częściowo.

## 2. Sprzeczności i wyścigi

### 2.1 [istotne] „Disable AUTO off lights in Kuchnia" jest unieważniane po ≤15 min

`1762952673833` (double-click) wyłącza `automation.turn_off_lights_in_kuchania`
i zapala światła — intencja: „zostaw światła w spokoju". Ale `1764190493305`
„Turn off lights in Kuchnia after 15 minutes anyway" (zawsze włączone, pattern
/5 + własny trigger) gasi te same światła po 15 min bez ruchu i **z powrotem
włącza** auto-off. Przy bezruchu (oglądanie czegoś, gotowanie poza zasięgiem
czujników) decyzja użytkownika żyje kwadrans. Do tego `1763383792516` „Activate
AUTO… after 1h" i `1762954145724` „…at 23:30" też re-aktywują auto-off.
Nakładka intencji: „anyway" vs „disable".

PROPOZYCJA: „after 15 minutes anyway" powinno respektować stan wyłączenia
`turn_off_lights_in_kuchania` (warunek `state: automation... = on`) albo
double-click powinien ustawiać dedykowany `input_boolean.kuchnia_manual`
sprawdzany przez wszystkie gaszące automatyzacje.

### 2.2 [istotne] Cztery nakładające się nocne wyłączniki tych samych świateł

Na zestaw {switch.tasmota, sufit2/3, tasmota_12, tasmota_8, zblampkiregal}
działają równolegle: `1702844937214` (pattern /5, 23:30–6:30 — martwe, 1.2b),
`1763384250145` (pattern /3 — martwe, 1.5), `1768946230585` (sleep-mode
enforcer, pattern /5) i `1700832676138` (3:00). Trzy z nich to warianty tej
samej funkcji pisane w różnych epokach. Po reanimacji czujników wszystkie trzy
ożyją naraz i będą się ścigać (różne warunki, ten sam cel).

PROPOZYCJA: skonsolidować do jednej automatyzacji „nocne domknięcie" z jasnym
priorytetem trybów; pozostałe skasować.

### 2.3 [kosmetyczne] `1700832676138` „…at 3am": `time_pattern hours: '3'` bez minut

Odpala się co minutę przez całą godzinę 3:00–3:59 (60 prób, w tym 3 na
unavailable przełącznikach choinki). PROPOZYCJA: zwykły trigger `time: 03:00`.

### 2.4 [istotne] Enforcer sleep mode gasi światła co ~10 min przez całą noc

`1768946230585` „Turn OFF lights 5 minutes after sleep mode activated" ma dwa
triggery: krawędź `sleep_mode off→on` **i** `time_pattern /5», z warunkiem
`sleep_mode = on`. Efekt: to nie jest „5 minut po aktywacji", tylko cykliczny
dozorca — każde światło z listy zapalone ręcznie w trakcie sleep mode zgaśnie
w ciągu 5–10 min. Jeśli to celowe, alias kłamie; jeśli nie — pattern jest
zbędny. PROPOZYCJA: decyzja operatora (patrz checklista); przy „tylko raz"
usunąć trigger pattern.

### 2.5 [kosmetyczne] Blat w Pralni — double-click może zdesynchronizować parę automatyzacji

`1760992440280` toggluje **niezależnie** dwie automatyzacje (ON-ową i OFF-ową).
Dziś obie są `on`, więc działa; jeśli kiedykolwiek rozjadą się (restart,
ręczna zmiana), double-click będzie je wiecznie swapował zamiast włączać/
wyłączać parę. Dodatkowo w nocy `1768989504100` (night light 1%… w praktyce
turn_on/off) i para MD piszą w ten sam `switch.zbpralniablat` — kierunkowo
zgodne, ale night-light wyłącza po 5 min timeoutu nawet przy obecności (wait
`not_occupied` z `continue_on_timeout`). PROPOZYCJA: toggle zastąpić parą
`turn_on`/`turn_off` wg stanu jednej z nich.

### 2.6 [krytyczne → patrz Top 3] Para wodna Kuchnia: „dry" triggeruje na `moist`

`1752086407230` „email on water sensor dry in Kuchnia" ma trigger `type: moist`
(kopiuj-wklej z `1752086343222`). Efekt: przy zalaniu kuchni przychodzą DWA
maile („mokro" i „sucho") naraz, a informacja „wyschło" nie przyjdzie nigdy.
Ślad w fixtures: „dry" ma `last_triggered` 2026-01-20, „moist" — NULL (czyli
realne zdarzenie moist obsłużyła… automatyzacja „dry"; NULL na „moist"
prawdopodobnie przez późniejsze przeładowanie). Bonus: `1752085965483` „dry in
Lazienka" przekazuje parametr `mesaage:` (literówka) — skrypt
`notify_email_ntfy` dostaje niezdefiniowane `message` i akcja się wykłada.
PROPOZYCJA: trigger na `not_moist` w Kuchni; `mesaage → message` w Łazience.

### 2.7 [kosmetyczne] Redundantne harmonogramy Gniazdka w Łazience

ON: 7:00, 20:00 (warunek `on_leave off`); OFF: 1:00, 2:00, 9:30, 10:30, 12:30
(bez warunków). Okna 7:00–9:30 i 20:00–1:00 są spójne; trzy dodatkowe OFF-y to
pasy bezpieczeństwa. Sprzeczności brak. Odnotowane, bo pięć punktowych OFF-ów
w jednej automatyzacji utrudnia czytanie intencji.

### 2.8 [kosmetyczne] Dwa wyłączniki stereo

`1744976289447` (idle 15 min, po 23:30) i `1763662256621` (idle 1 h, zawsze) —
nakładka celowa (nocne zaostrzenie), kierunkowo zgodna. OK, odnotowane.

## 3. Trigger brzegowy bez lustrzanego warunku (klasa buga z klima_salon, fix `faa2e2a`)

Przejrzano wszystkie automatyzacje z >1 triggerem pod kątem: „warunek istnieje
tylko jako inny trigger, więc obcy trigger omija bramkę".

### 3.1 [istotne] `1784804668795` „Klima salon: wyłącz…" — OFF nie sprawdza `klima_salon_auto`

Gałąź ON wymaga `klima_salon_auto = on`; gałąź OFF (sunset / balkon ≤ salon
15 min / auto→off) ma tylko warunek `climate = cool`. Scenariusz: użytkownik
wyłącza tryb auto i chłodzi ręcznie — o zachodzie słońca (albo gdy balkon
zrówna się z salonem) automatyzacja i tak ubije chłodzenie i odpali suszenie
parownika. Jeśli intencja to „suszenie parownika zawsze, niezależnie od trybu"
— OK, ale wtedy warto to zapisać w `description`. PROPOZYCJA: decyzja
operatora; przy „auto-only" dodać warunek `klima_salon_auto = on`.

### 3.2 [istotne] `1768946230585` — pattern omija semantykę „po aktywacji" (opisane w 2.4)

Formalnie ta sama klasa: trigger krawędziowy (off→on) plus trigger czasowy,
który wchodzi tą samą bramką warunków co stan ciągły.

### 3.3 Przypadki sprawdzone i czyste

- `1751562415786` „Turn off lights in Kuchnia": triggery czujnikowe + pattern
  /5 + 23:30:02, ale warunki lustrzanie wymagają wszystkich czterech czujników
  `not_occupied` — pattern nie omija bramki. OK.
- `1764190493305` „after 15 minutes anyway": pattern /5 zlustrzany warunkami
  14:45. OK (problem tej automatyzacji to 2.1, nie klasa 3).
- `1744918189114`/`1744919280479`/`1744919746930` (pigry/piplayer): pattern co
  minutę, warunki z `for:` — lustrzane. OK.
- `1666471111199` „Zasilanie multimediów auto-off": pattern co minutę, warunki
  TV off 1 min + gniazdko on 10 min — okno rozruchu TV (2m35s w `1764610725230`)
  mieści się w 10-minutowej karencji. OK.
- Pary ON/OFF na wspólnym triggerze (`1640285211569/...276640` — 1_hold Tymka)
  bramkowane `is_off`/`is_on` — wzorzec poprawny (choć encje martwe, 1.5).

## 4. Higiena

### 4.1 [kosmetyczne] Aliasy-śmieci i rozjazdy alias ↔ entity_id

| entity_id (fixtures) | alias (repo) | problem |
|---|---|---|
| `automation.lampka_test_1_on` | „Mirror OFF" | entity z testu żarówki, robi lustro |
| `automation.xxxxxx` | „Turn on led nad blatem duzym prawym" | — |
| `automation.new_automation` | „4b: 1_sc: Swiatlo nad kuchnia" | — |
| `automation.new_automation_2` | „1b2: 1_ho: Choinka i lampki OFF" | — |
| `automation.new_automation_3` | „Turn off swiatlo nad kuchnia when no motion, no trigger" | — |
| `automation.choinka` | „4b:  2_dc: Activate Scene Film" | alias zmieniony (legacy: „Lampki na półce"), entity zostało po choince |
| `automation.swiatlo_za_telewizorem_z_przycisku` | „1b2: 1_dc: Choinka i lampki ON" | entity po starej funkcji |
| `automation.gniadka_w_lazience_off` | „Gniazdka w Łazience OFF" | alias naprawiony (57a5f66), entity z literówką zostało |
| `automation.turn_off_lights_in_kuchania` | „Turn off lights in  Kuchnia" | literówka „kuchania" — na tym entity wisi 8 referencji z innych automatyzacji! |
| `automation.email_on_water_sensor_dry_in_lazienka_2/3/4` | dry in **Kuchnia/Pralnia/WC** | kopie po Łazience |
| `automation.turn_off_blat_w_pralnia_on_md` | „Turn **ON** blat w Pralnia on MD" | entity mówi „off" |
| `automation.set_heaterhelitv07_…` / `set_heaterlazienkatrv10_…` / `set_heatersypialniatv02_…` / `set_heatertymktv10_…` | aliasy TRV10/TRV07 | numery TRV w entity nie zgadzają się z aliasami |

Duplikatów aliasów brak. PROPOZYCJA: nie zmieniać entity_id hurtowo (referencje
krzyżowe — zwłaszcza `turn_off_lights_in_kuchania` jest celem `automation.turn_on/off`
z 8 miejsc); jeśli porządkować, to najpierw mapa referencji, osobny task.
Aliasy typu „test"/„xxxxxx" można prostować bezpiecznie (alias nie jest
identyfikatorem).

### 4.2 [istotne] Sezonowe aktywne poza sezonem (choinka w lipcu)

- `1734943824257` „Turn ON Choinka na wejscie" — **włączona**, ostatni trigger
  2026-05-02 (sic!), cele: tasmota_12 („Lampki na półce"), tasmota_8
  („Choinka"), zblampkiregal — wszystkie trzy unavailable (fizycznie odpięte).
- `1689079279480`/`1689079321508` „1b2: 1_dc/1_ho: Choinka i lampki ON/OFF" —
  przyciskowe, włączone, cele unavailable.
- Scena `Film` (`1730724373818`) ma zapisany stan `switch.tasmota_8: unavailable`
  (scena robiona przy odpiętej choince) i `tasmota_12: on`.

PROPOZYCJA: wyłączać (nie kasować) sezonowe automatyzacje po sezonie — np.
konwencja aliasu `[sezon:zima]` + jedna automatyzacja/checklista sezonowa.
Scena Film do przegrania bez encji choinkowych.

### 4.3 [kosmetyczne] `last_triggered` NULL lub >12 miesięcy (kandydaci do przeglądu)

- 2024: `1640285211569`, `1640285276640` (Tymek ON/OFF — martwe encje, 1.5),
  `1703104933437` „Turn OFF TYmka sufit" (2024-09, wyłączona).
- NULL: `1752086343222` „moist in Kuchnia" (patrz 2.6 — zostawić, to alert),
  `1760432474594` (martwa, 1.5).
- Wyłączone od dawna: `1704492239040/288312` „prototyp w ubikacji" (2025-08,
  świadomie zarzucony — patrz 5), `1752241986989` „test test…" (2025-07),
  `1701370240657` „Przyjscie Tymka" (2025-11, wyłączona), `1744918520715`
  „Turn on pigry wo trigger" (2025-04; bez triggerów — de facto skrypt).
- `1714050591470` „Leave auto on: batch 02" — **wyłączona**, podczas gdy
  „Leave auto off: batch 02" włączona. Przy najbliższym urlopie symulacja
  obecności zapali tylko batch 01. Niespójność do decyzji.

### 4.4 [kosmetyczne] Automatyzacje-bez-triggerów używane jak skrypty

`speak_mirror`, `speak_mirror_alert`, `Poranek stop`, `new_automation_3`,
`Turn on pigry wo trigger`, `Test ntfy` — wywoływane przez `automation.trigger`
lub ręcznie. Działa, ale to semantycznie skrypty (byłyby widoczne w UI skryptów,
nie zaśmiecałyby listy automatyzacji i nie miałyby stanu on/off do przypadkowego
wyłączenia). PROPOZYCJA: przepisać na `script.*` przy okazji porządków.

### 4.5 [kosmetyczne] Inne

- `input_boolean.motion_front` — nieużywany w żadnej automatyzacji (kandydat do
  kasacji); `input_number.test` — jw.
- `input_datetime.koniec_urlopu` = 2026-01-31 (przeszłość) — trigger
  `End of On leave` nie odpali do czasu ustawienia nowej daty; spójne z
  `on_leave = off`, ale warto wiedzieć, że to ręczny krok przy każdym urlopie.
- `sensor.4button_battery` unavailable od 2026-07-17, a automatyzacje 4b:
  strzelały jeszcze 2026-07-12 — pilot prawdopodobnie na resztkach baterii
  (albo ofiara tej samej awarii co zhimi). Do sprawdzenia fizycznie — wisi na
  nim 8 automatyzacji salonu.

## 5. Porównanie z legacy (60 automatyzacji archiwum)

54/60 ma odpowiednik na ken po tym samym `id`. Bez odpowiednika:

| legacy id | alias | ocena |
|---|---|---|
| 1639950051409 | `--Test obecnosci telefonu` | test (prefiks `--`), strata zerowa |
| 1666696862316 | `---Zone Notification oka leave home` | blueprint, prefiks `---` (wyłączony konwencją), strata zerowa |
| 1667745509155 | `Notify move in Sypialnia` | na ken zastąpione wariantem **tylko on-leave** (`1753883109847`). Funkcja „zawsze powiadom o ruchu w sypialni" znikła — wygląda na świadomą redukcję szumu, do potwierdzenia |
| 1701086617456 | `Oczyszczacz i nawilżacz z przycisku` | przycisk sypialni (long) przemapowany na ken na Sleep mode OFF (`1768946838707`) — świadoma zmiana funkcji przycisku |
| 1701087364463 | `Wszystkie nawilżacze i oczyszczenie z przycisku` | jw. (double → Sleep mode ON) |
| 1703105565821 | `Turn OFF pimirror` | **jedyna realna strata**: graceful shutdown lustra (press przycisku shutdown → 1 min → odcięcie zasilania). Na ken zostało tylko twarde cięcie o 23:35 (`Mirror OFF`) i ścieżka ACK (`Magic Mirror OFF on ACK`), której nic już nie inicjuje — RPi lustra jest codziennie twardo odłączany od prądu |

Znany przypadek świadomej decyzji (wzorzec, jak to robić dobrze): „prototyp w
ubikacji" istnieje na ken, ale **wyłączony**, czujnik zdemontowany, a dimmer
`light.tsdimm01` przeznaczony ponownie do LED nad małym blatem w kuchni.
Uwaga praktyczna: przypadkowe włączenie tej pary automatyzacji miga światłem w
kuchni od (martwego dziś) czujnika ubikacji — bezpieczniej skasować niż trzymać
wyłączone.

PROPOZYCJA: odtworzyć graceful shutdown lustra (mqtt `halt` przed 23:35 +
istniejący ACK-flow zamiast gołego odcięcia zasilania); potwierdzić decyzję o
sypialni; resztę uznać za zamkniętą.

## 6. Spójność stylistyczna (informacyjnie, nie błędy)

- **Nazewnictwo**: trzy pokolenia konwencji naraz — prefiksy przyciskowe
  (`4b: 3_sc:`, `1b2: 1_ho:`), angielskie zdania („Turn off lights in Kuchnia
  after 15 minutes anyway"), polskie zdania („Oczyszczacz i nawilżacz prze
  przycisk Tymka"). Mieszanka PL/EN często w jednym aliasie. Literówki:
  „Toogle", „prze przycisk", „Lampiki", „wzmaczniacz", „Oczyszczecze",
  „Gniadka" (w entity), „kuchania" (w entity).
- **device_id vs entity_id**: ~60% akcji to `device automation` z surowymi
  `device_id`/UID-ami registry (32-znakowe hexy) — nieczytelne w YAML-u i
  kruche przy wymianie sprzętu (nowe urządzenie = nowy device_id = cicha
  śmierć automatyzacji; dokładnie ten mechanizm ubił parę Tymka z 1.5 i ukrył
  rename occusalon z 1.5). Nowsze automatyzacje (klima, ledy blatowe) używają
  już `action` + `entity_id` — ta konwencja powinna być docelowa dla wszystkich
  nowych/przepisywanych automatyzacji.
- **TTS**: dwa systemy równolegle — `tts.google_translate_say` na martwym
  Bose (Speak) vs `tts.piper` na pimirror (reszta). Docelowo jeden.
- **Polling vs zdarzenia**: 13 automatyzacji `time_pattern`, w tym co-minutowe
  („Send balkon temp to mm", multimedia, pigry/piplayer) i sub-minutowe
  (current_player 15 s, TRV 40–50 s). Część jest uzasadniona (ping-sensory),
  ale kierunek powinien być zdarzeniowy tam, gdzie HA ma trigger (np.
  `Send balkon temp` → trigger na zmianę stanu sensora zamiast REST co minutę).
- **Tryby**: cztery flagi trybów (`sleep_mode`, `night_mode`, `passive_mode`,
  `movie_mode`) o częściowo pokrywającej się semantyce; `night_mode` włącza się
  o 23:30 i gaśnie o wschodzie (latem 4:30), `sleep_mode` gaśnie o 6:30 —
  automatyzacje sprawdzają raz jedną, raz drugą, raz OR obu. Entity
  `automation.turn_off_sleep_mode_at_sunrise` steruje… `night_mode`. Do
  przemyślenia konsolidacja w jeden `input_select.tryb_domu`.

## Do decyzji operatora

Pytania tak/nie, do przejścia punkt po punkcie:

1. Wymieniamy baterie / re-parujemy 6 czujników ruchu (mdwejscie, mdsypialnia,
   mdtymka, mdheli, mdubikacja, occusalon) i czujnik wycieku WC? (1.2, 1.3)
2. Naprawiamy kalibracje TRV przed sezonem: guard na unavailable + reset −5.0
   w sypialni/Tymku + zwolnienie pętli do ≥5 min? (1.4)
3. Diagnozujemy integrację xiaomi_miot (padła 2026-07-17 razem z encjami zhimi)
   zamiast łatać pojedyncze automatyzacje? (1.6)
4. Poprawiamy parę wodną Kuchnia (`moist`→`not_moist`) i literówkę `mesaage`
   w „dry in Lazienka"? (2.6) — dwie zmiany one-linerowe.
5. Weryfikujemy na żywym ken istnienie helperów klimy
   (`klima_salon_auto`, `_temp_docelowa`, `_tolerancja`)? (1.1)
6. Czy „Klima salon: wyłącz" ma ubijać także ręczne chłodzenie o zachodzie
   (obecne zachowanie), czy respektować `klima_salon_auto = off`? (3.1)
7. Czy enforcer sleep mode ma gasić światła cyklicznie całą noc (obecne
   zachowanie), czy tylko raz po aktywacji? (2.4)
8. Czy „Turn off lights in Kuchnia after 15 minutes anyway" ma respektować
   ręczne „Disable AUTO off" (double-click)? (2.1)
9. Konsolidujemy cztery nocne wyłączniki świateł do jednego? (2.2)
10. Kasujemy martwe od lat: para Tymka [ON]/[OFF], „test test Powitanie…",
    „Notify on router sypialnia…", para „prototyp w ubikacji"? (1.5, 4.3, 5)
11. Przywracamy OwnTracks (lokalizacja Oskar) czy kasujemy automatyzację
    i `device_tracker.oskar`? (1.5)
12. Włączamy z powrotem „Leave auto on: batch 02" (symulacja obecności) —
    czy celowo została wyłączona? (4.3)
13. Wyłączamy na lato automatyzacje choinkowe i przegrywamy scenę Film bez
    encji choinki? (4.2)
14. Odtwarzamy graceful shutdown pimirror (jedyna realna strata z migracji)?
    (5)
15. Sprawdzamy baterię pilota 4button (8 automatyzacji salonu na jednym
    urządzeniu, encje unavailable od 2026-07-17)? (4.5)
16. Naprawiamy „Turn off lights unconditionally at 3am" na punktowy trigger
    03:00 (dziś strzela 60×/noc)? (2.3)
17. Ustalamy konwencję na przyszłość: nowe automatyzacje tylko `entity_id`
    (bez device automations) + aliasy w jednym języku? (6)

---
Wygenerowano w ramach audytu read-only; żadna automatyzacja, skrypt ani scena
nie zostały zmodyfikowane. Snapshot źródłowy: registry/fixtures 2026-07-22,
repo `task/ha-audyt-automatyzacji` (parent `faa2e2a`).
