update doumentacji

This commit is contained in:
2026-04-18 01:57:52 +02:00
parent 78fbb9acd9
commit 848a433a60

View File

@@ -6,6 +6,16 @@
---
## Opis ogólny
Main Hub to centralny kontroler oświetlenia dla całego domu, oparty na mikrokontrolerze ESP32. Urządzenie działa pod kontrolą firmware ESPHome skompilowanego z frameworkiem esp-idf i łączy się z siecią domową przez Ethernet (nie WiFi — co zapewnia stabilniejsze połączenie i niższe opóźnienia).
Fizycznie hub obsługuje **48 wejść** (przyciski, przełączniki) i **48 wyjść** (przekaźniki, obwody oświetleniowe) poprzez sześć ekspanderów I2C MCP23017. Dodatkowo steruje **9 kanałami LED** (taśmy RGBWW, CWWW, monochromatic) przez dwa sterowniki PWM PCA9685. Integracja z Home Assistant odbywa się przez natywne szyfrowane API ESPHome.
Urządzenie działa w pełni **lokalnie** — logika przycisków jest wykonywana na ESP32, bez zależności od Home Assistant. HA jest potrzebne tylko do sterowania zewnętrznymi encjami (paski WLED, wentylator salon).
---
## Sprzęt
| Komponent | Opis |
@@ -17,10 +27,14 @@
| Sterowniki PWM | 2× PCA9685 @ 1500 Hz (pca9685_hub1, pca9685_hub2) |
| Status LED | RGB — GPIO5 (niebieski), GPIO14 (zielony), GPIO15 (czerwony) |
Wszystkie ekspandery i sterowniki PWM komunikują się przez jeden magistrali I2C (SDA: GPIO13, SCL: GPIO16, 200 kHz). Scan I2C jest wyłączony (`scan: False`) aby nie spowalniać startu.
---
## Sieć
Hub używa statycznego adresu IP — brak DHCP eliminuje opóźnienia przy restarcie i zapewnia przewidywalny adres niezależnie od stanu routera.
| Parametr | Wartość |
|---|---|
| Statyczne IP | `10.10.0.5` |
@@ -29,10 +43,14 @@
| Port API (HA) | `6053` |
| Web UI | `http://10.10.0.5` (login: admin) |
Urządzenie **nie restartuje się automatycznie** przy braku połączenia z Home Assistant (`reboot_timeout: 0s`). Oznacza to że hub działa i obsługuje przyciski lokalnie nawet gdy HA jest niedostępny (restart, aktualizacja).
---
## Mapa I2C (SDA: GPIO13, SCL: GPIO16, 200 kHz)
Adresy I2C są przydzielone kolejno — parzyste dla wejść (IN), nieparzyste dla wyjść (OUT). Ułatwia to diagnozowanie problemów na magistrali.
| Adres | ID | Rola |
|---|---|---|
| 0x20 | mcp23xxx_hub1_IN | 16 wejść (hub1_in0..15) |
@@ -48,18 +66,24 @@
## Status LED
Wbudowany RGB LED (trzy niezależne kanały LEDC) informuje wizualnie o stanie urządzenia. Jest widoczny z zewnątrz obudowy i pozwala ocenić stan połączenia bez dostępu do logów.
| Stan | Kolor / Efekt |
|---|---|
| Boot | Niebieski — Slow Pulse |
| Połączono z HA | Zielony — stały (50% brightness) |
| Rozłączono z HA | Czerwony — Slow Pulse (100% brightness) |
Dostępne efekty: `Fast Pulse`, `Slow Pulse`, `Random Effect`
Dostępne efekty: `Fast Pulse` (0.5s), `Slow Pulse` (1s), `Random Effect` (2s)
---
## Wejścia — Binary Sensors
Wszystkie wejścia są skonfigurowane jako `INPUT` z inwersją (`inverted: True`) — przyciski zwierają do masy. Filtr `delayed_on_off` eliminuje drgania styków (debouncing). Hub1_in5 ma zwiększony debounce (100ms) ze względu na właściwości konkretnego przycisku w sypialni.
Wejścia hub1_in10..15, hub2_in14..15 oraz hub3_in13..15 są niepodpięte — reserved na przyszłość.
### hub1_IN (mcp23xxx_hub1_IN)
| ID | Opis | Debounce |
@@ -119,6 +143,12 @@ Dostępne efekty: `Fast Pulse`, `Slow Pulse`, `Random Effect`
## Wyjścia — Switches
Wszystkie wyjścia MCP23017 są zdefiniowane jako `switch` (platforma gpio) z `restore_mode: ALWAYS_OFF` — po każdym restarcie urządzenia wszystkie wyjścia startują wyłączone, niezależnie od poprzedniego stanu. Zapobiega to przypadkowemu włączeniu oświetlenia przy restarcie huba.
Wyjścia hub1_out4, hub2_out5, hub2_out8 i hub3_out2 sterują wentylatorami. Pozostałe wyjścia sterują obwodami oświetleniowymi (halogeny, sufity, kinkiety, lustra).
Hub3_out3..out15 są przeznaczone wyłącznie do sterowania ogrzewaniem — są kontrolowane przez automacje Home Assistant (generic_thermostat), a nie przez logikę przycisków.
### hub1_OUT (mcp23xxx_hub1_OUT)
| ID | Opis |
@@ -182,12 +212,17 @@ Dostępne efekty: `Fast Pulse`, `Slow Pulse`, `Random Effect`
| hub3_out14 | Ogrzewanie Biała Łazienka/WC |
| hub3_out15 | Ogrzewanie Sypialnia 1 |
Wszystkie wyjścia: `restore_mode: ALWAYS_OFF`
---
## Światła PWM (PCA9685)
Taśmy LED są podłączone do dwóch sterowników PCA9685 pracujących na częstotliwości 1500 Hz. Każde światło ma zdefiniowane `default_transition_length: 2.0s` — płynne przejście przy włączaniu i wyłączaniu.
Typy świateł:
- **cwww** — zimna + ciepła biel (regulacja temperatury barwowej)
- **rgbww** — pełny kolor RGB + zimna/ciepła biel (sypialnia)
- **monochromatic** — jeden kanał PWM (regulacja jasności)
| ID | Nazwa | Typ | Kanały PCA9685 |
|---|---|---|---|
| status_led | Status LED | rgb | GPIO5/14/15 (LEDC) |
@@ -201,25 +236,40 @@ Wszystkie wyjścia: `restore_mode: ALWAYS_OFF`
| *(brak id)* | TEST LED 1 | monochromatic | PWM1_2_Hub2 |
| test_led_2 | TEST LED 2 | monochromatic | PWM3_1_Hub2 |
Wszystkie LED: `default_transition_length: 2.0s`
PWM3_2_Hub2 (ch5): `max_power: 95%` — pozostałe: `100%`
PWM3_2_Hub2 (ch5 na pca9685_hub2): `max_power: 95%` — ograniczenie ze względu na właściwości podłączonej taśmy. Pozostałe kanały: `max_power: 100%`.
---
## Logika przycisków
Granica single/multi-click: **350ms**
### Jak działa multi-click
Każde wejście używa mechanizmu `on_multi_click` z granicą **350ms** między pojedynczym a wielokrotnym naciśnięciem. ESP32 samodzielnie mierzy czas i decyduje o wykonaniu akcji — bez udziału Home Assistant. Opóźnienie między naciśnięciem a reakcją wynosi od 350ms (po zwolnieniu przycisku ESPHome czeka czy nie nastąpi kolejne naciśnięcie) do kilku ms dla długiego naciśnięcia.
| Gest | Timing |
|---|---|
| 1× | ON ≤350ms, OFF ≥350ms |
| 2× | dwa krótkie impulsy |
| 1× | ON ≤350ms, potem OFF ≥350ms |
| 2× | dwa krótkie impulsy, każdy ≤350ms |
| 3× | trzy krótkie impulsy |
| Długi | ON ≥350ms |
| Długi | ON ≥350ms (akcja przy trzymaniu) |
### Legenda
- **[HA]** — akcja przez `homeassistant.service` (WLED, wentylator salon)
- **off_all** — skrypt wyłączający wszystkie switche i LED-y
### Zasada działania toggle
Większość akcji 1× wykonuje `switch.toggle` — jeśli światło jest OFF to je włącza, jeśli ON to wyłącza. Wyjątek stanowi **hub1_in3** (Sypialnia 3), który używa logiki warunkowej:
- jeśli **oba** łóżka (hub2_out12 i hub2_out1) są włączone → wyłącz oba
- w każdym innym przypadku → włącz oba
Dzięki temu jeden przycisk przy drzwiach sypialni zawsze zachowuje się intuicyjnie — jedno naciśnięcie rozświetla lub gasi całą sypialnię.
### Skrypt off_all
Długie naciśnięcie na wybranych wejściach wywołuje skrypt `off_all`, który wyłącza wszystkie wyjścia MCP23017 (hub1/2/3_out) oraz wszystkie LED PCA9685. Przydatny jako "wychodzę z domu" — jedno przytrzymanie przy wyjściu i cały dom jest ciemny.
### Legenda tabel
- **[HA]** — akcja przez `homeassistant.service` (wymaga działającego HA; jeśli HA jest niedostępny, akcja jest pomijana)
- **off_all** — lokalny skrypt ESPHome, działa bez HA
### hub1_IN
@@ -236,7 +286,7 @@ Granica single/multi-click: **350ms**
| hub1_in8 / Pokój Gości Lewy | hub2_out10 (Pokój Gościnny Sufit) | hub1_out7 (Garderoba Duża) | — | — |
| hub1_in9 / Pokój Gości Prawy | pokoj_dla_gosci_led | — | — | — |
¹ Smart toggle hub1_in3 1×: jeśli oba (hub2_out12 i hub2_out1) są ON → oba OFF; w przeciwnym razie → oba ON.
¹ Smart toggle: jeśli oba (hub2_out12 i hub2_out1) są ON → oba OFF; w przeciwnym razie → oba ON.
### hub2_IN
@@ -279,6 +329,10 @@ Granica single/multi-click: **350ms**
## Czujniki BLE (ATC Mithermometer)
Hub ma aktywny skaner BLE (`esp32_ble_tracker`) który odbiera dane z czujników temperatury/wilgotności Xiaomi ATC Mithermometer rozmieszczonych w kluczowych pomieszczeniach. Dane są raportowane do Home Assistant i wykorzystywane przez termostaty ogrzewania (`generic_thermostat`).
Czujniki używają zmodyfikowanego firmware ATC (nie oryginalnego Xiaomi), który nadaje dane w formacie BLE advertisement — hub nie musi parować się z czujnikami, tylko nasłuchuje.
| Nazwa | MAC |
|---|---|
| Biuro | A4:C1:38:C5:11:58 |
@@ -287,19 +341,23 @@ Granica single/multi-click: **350ms**
| WC | A4:C1:38:C9:FE:CA |
| Łazienka | A4:C1:38:63:6D:DB |
Każdy czujnik raportuje: temperatura, wilgotność, poziom baterii.
Każdy czujnik raportuje: temperaturę (°C), wilgotność względną (%), poziom baterii (%).
---
## Czujniki diagnostyczne
Encje diagnostyczne są widoczne w Home Assistant w sekcji urządzenia i pomagają monitorować stan huba bez logowania się do Web UI.
| Encja | Opis | Interwał |
|---|---|---|
| sensor.main_hub_uptime | Czas pracy (sekundy) | 300s |
| sensor.main_hub_esp32_temperatura | Temperatura chipu ESP32 | 60s |
| text_sensor.main_hub_ip_address | Adres IP | przy zmianie |
| text_sensor.main_hub_firmware_version | Wersja firmware | przy zmianie |
| text_sensor.main_hub_esphome_version | Wersja ESPHome | przy zmianie |
| sensor.main_hub_uptime | Czas pracy w sekundach od ostatniego restartu | 300s |
| sensor.main_hub_esp32_temperatura | Temperatura wewnętrzna chipu ESP32 | 60s |
| text_sensor.main_hub_ip_address | Aktualny adres IP | przy zmianie |
| text_sensor.main_hub_firmware_version | Wersja firmware (z substitutions) | przy zmianie |
| text_sensor.main_hub_esphome_version | Wersja ESPHome użyta do kompilacji | przy zmianie |
> **Uwaga:** Temperatura chipu ESP32 może zwracać błąd `Ignoring invalid temperature` na niektórych wersjach esp-idf. Jest to znany problem — encja jest wyciszona w logach (`internal_temperature: WARN`).
---
@@ -309,71 +367,100 @@ Każdy czujnik raportuje: temperatura, wilgotność, poziom baterii.
|---|---|
| off_all | Wyłącza wszystkie switche (hub1/2/3_out) oraz wszystkie LED (PCA9685 + status_led) |
Skrypt `off_all` jest wywoływany przez długie naciśnięcie wybranych wejść (patrz tabela logiki przycisków).
Skrypt `off_all` jest wywoływany przez długie naciśnięcie na wejściach: hub1_in0, hub1_in2, hub1_in6, hub1_in7, hub2_in1, hub2_in2, hub2_in7, hub3_in12.
---
## Logi
**Poziom globalny:** `INFO` — widoczne są tylko `[I]`, `[W]`, `[E]`
### Poziom i filtry
Globalny poziom logów ustawiony na `INFO` — w konsoli pojawiają się tylko zdarzenia istotne operacyjnie. Poziomy `DEBUG` i `CONFIG` (różowy dump konfiguracji przy starcie) są wyciszone.
Filtry per-komponent (wyciszenie INFO z BLE):
```yaml
logs:
atc_mithermometer: WARN
esp32_ble_tracker: WARN
ble_advertise: WARN
logger:
level: INFO
logs:
atc_mithermometer: WARN # wycisza INFO z BLE czujników
esp32_ble_tracker: WARN # wycisza INFO ze skanera BLE
ble_advertise: WARN # wycisza INFO z BLE advertise
# Odkomentuj poniższe gdy log_level ustawiony na DEBUG:
#sensor: WARN
#text_sensor: WARN
#internal_temperature: WARN
#binary_sensor: WARN
#switch: WARN
#light: WARN
#component: WARN
```
Format komunikatu przy naciśnięciu przycisku:
### Format komunikatów
Każde naciśnięcie przycisku loguje komunikat INFO z nazwą wejścia, gestem i listą urządzeń które zostały przełączone:
```
[I][main:XXXX]: Nazwa Przycisku [gest] → Co zostało włączone
```
Przykład:
Przykłady:
```
[I][main:1775]: Schody 3 [1×] → Oczka Taras, Skrzynia, Tunel, Zwis Schody
[I][main:1643]: Kuchnia Filar 1_1 [1×] → Salon Plafon
[I][main:1694]: Kuchnia Filar 1_2 [1×] → Komin LED, Salon Kinkiety LED
[I][main:998]: Sypialnia 3 [1×] → Sypialnia Łóżko Lewa strona, Sypialnia Łóżko Prawa strona
[I][main:1138]: Sypialnia Łóżko Prawo [długi] → off_all
```
Zdarzenia połączenia z HA:
```
[I]: HA client connected
[W]: HA client disconnected
```
### Historia w Home Assistant
Każde naciśnięcie przycisku zapisuje wpis w logbooku HA (`logbook.log`) przypisany do konkretnej encji (switcha lub światła które zostało przełączone). Dzięki temu w historii danej encji widać który przycisk ją ostatnio przełączył.
---
## Konfiguracja API
| Parametr | Wartość |
|---|---|
| Szyfrowanie | Noise (klucz w secrets.yaml) |
| reboot_timeout | 0s (nie restartuje się przy braku HA) |
Komunikacja z Home Assistant używa natywnego protokołu ESPHome z szyfrowaniem Noise (klucz zapisany w `secrets.yaml`). Protokół jest binarny i bardziej efektywny niż MQTT.
| Parametr | Wartość | Opis |
|---|---|---|
| Port | 6053 | Standardowy port ESPHome API |
| Szyfrowanie | Noise Protocol | Klucz w secrets.yaml (`api_key`) |
| reboot_timeout | 0s | Brak automatycznego restartu przy braku HA |
| Max połączeń | 8 | Maksymalna liczba klientów jednocześnie |
---
## OTA / Flashowanie
Urządzenie wspiera OTA (Over-The-Air) przez dwa mechanizmy: natywne ESPHome OTA oraz przez web server. Pierwsze wgranie firmware wymaga połączenia USB (jeśli urządzenie nie ma jeszcze ESPHome), kolejne można robić zdalnie.
```bash
# Tylko kompilacja
esphome compile main-hub_do\ zrobienia.yaml
# Tylko kompilacja — sprawdza błędy w YAML
esphome compile "main-hub_do zrobienia.yaml"
# Wgranie OTA
esphome upload main-hub_do\ zrobienia.yaml
# Wgranie OTA (kompilacja + upload)
esphome upload "main-hub_do zrobienia.yaml"
# Kompilacja + wgranie + logi
esphome run main-hub_do\ zrobienia.yaml
# Kompilacja + wgranie + podgląd logów
esphome run "main-hub_do zrobienia.yaml"
# Podgląd logów
esphome logs main-hub_do\ zrobienia.yaml
# Podgląd logów z działającego urządzenia
esphome logs "main-hub_do zrobienia.yaml"
# Walidacja configu
esphome config main-hub_do\ zrobienia.yaml
# Walidacja i dump połączonego configu (z pakietami)
esphome config "main-hub_do zrobienia.yaml"
```
Wymagany plik `secrets.yaml` w tym samym katalogu:
Wymagany plik `secrets.yaml` w tym samym katalogu co YAML:
```yaml
api_key: "<32-byte-base64>"
ota_key: "<hasło>"
@@ -384,7 +471,9 @@ web_password: "<hasło>"
## Encje sterowane przez Home Assistant
Poniższe encje są sterowane przez `homeassistant.service` (wymagają działającego HA):
Poniższe encje są sterowane przez `homeassistant.service` — wywołanie wysyłane jest do HA przez API i HA wykonuje akcję lokalnie. Oznacza to że jeśli HA jest niedostępny, te konkretne akcje nie zadziałają (hub nadal działa lokalnie dla pozostałych świateł).
Wszystkie poniższe encje to paski WLED lub wentylator zarządzany przez HA.
| Encja HA | Opis |
|---|---|
@@ -400,3 +489,11 @@ Poniższe encje są sterowane przez `homeassistant.service` (wymagają działaj
| light.tunel_2 | WLED — Tunel |
| light.zwis_schody_2 | WLED — Zwis schody |
| switch.salon_wentylator | Wentylator salon |
---
## Ogrzewanie
Strefy ogrzewania (hub3_out3..out15) są sterowane wyłącznie przez Home Assistant — nie mają przypisanej logiki przycisków w ESPHome. Każda strefa to osobny przekaźnik włączający/wyłączający siłownik zaworu.
Kontrola odbywa się przez encje `climate` (generic_thermostat) w HA, które jako czujniki temperatury używają kombinacji czujników BLE z main-huba oraz dodatkowych czujników Zigbee (z2m). Harmonogramy i logika termostatów są w całości po stronie HA.