Jednoduchý, otevřený a rozšiřitelný projekt pro Home Assistant
Typický problém s hotovými měřidly typu Netatmo nebo podobnými stanicemi je uzavřenost a omezená přizpůsobitelnost. Data často tečou přes cloud, API má limity, vizualizace je daná výrobcem a automatizace bývá omezená. Níže je řešení, které staví na snadno dostupných dílech, běží plně lokálně a nad daty máte plnou kontrolu. Jádro tvoří M5Stack Atom Matrix s 5×5 LED a senzor SCD40 pro CO₂, teplotu a vlhkost. Firmware je ESPHome pod ESP-IDF, integrace do Home Assistantu je bezbolestná.
Co to umí
- Zobrazení tří hodnot v reálném čase pomocí tří svislých sloupců na 5×5 matici
- Teplota vlevo. Spodní dvě modře, prostřední zeleně, horní dvě červeně
- Vlhkost uprostřed. Spodní oranžově, prostřední dvě zeleně, horní dvě červeně
- CO₂ vpravo. Spodní dvě zeleně do 800 ppm, prostřední dvě žlutě 800–1200 ppm, horní červeně nad 1200 ppm
- Tlačítkem na čele se displej zapíná a vypíná. Ve výchozím stavu je vypnutý
- Jas po zapnutí 50 %, aby se zařízení tolik nehřálo
- Data se odesílají do Home Assistantu a zároveň jsou vidět na vestavěném webu
- Měření je lokální bez cloudu a bez účtů
Proč je to užitečné oproti uzavřeným krabičkám
- Plná kontrola nad daty. Zůstávají ve vaší síti, nejsou závislá na cizím cloudu
- Rozšiřitelnost. Kód i schéma zobrazení si upravíte během minut a přidáte další senzory nebo logiku
- Automatizace bez omezení. Větrání podle CO₂, upozornění do mobilu, přepínání režimů klimatizace
- Cena a dostupnost. M5 Atom a SCD40 jsou běžně skladem, nepotřebujete proprietární gateway
- Dlouhodobá udržitelnost. Pokud výrobce přestane podporovat zařízení, projekt vám dál běží
Co budete potřebovat
- M5Stack Atom Matrix
- Senzor Sensirion SCD40 na I2C
- Propojky pro Grove port, napájení přes USB-C
- Home Assistant s doplňkem ESPHome
Zapojení a poznámky
- SCD40 připojte na I2C. U Atom Matrix je typicky SDA 26 a SCL 32
- LED matice je WS2812 na pinu 27
- ESPHome zde používá ESP-IDF a ovladač RMT pro stabilní řízení WS2812
- Teplota se může mírně zvedat vlivem ohřevu od LED. Proto je jas 50 % a v kódu je volitelný teplotní offset
YAML konfigurace
Níže je kompletní a okomentovaný kód. Před sdílením si vyměňte hesla a klíče za vlastní. Pokud kopírujete do produkce, doporučuji nahradit klíče v sekcích api a ota za hodnoty z vašeho prostředí.
# M5Stack Atom Matrix + SCD40 + ESPHome (ESP-IDF)
# Inline dokumentace pro sdílení a údržbu.
esphome:
name: matrix1
friendly_name: matrix1
# Nechávejte LED po startu vypnuté. Tlačítko a přepínač je mohou zapnout.
on_boot:
priority: -10 # spustí se později, až budou subsystémy připravené
then:
- switch.turn_off: display_enabled
- light.turn_off: matrix
esp32:
board: m5stack-atom
framework:
type: esp-idf # nativní RMT ovladač pro WS2812, stabilní buildy bez Arduino toolchainu
logger:
api:
encryption:
key: "VAŠE_API_KEY" # nahraďte vlastním klíčem pro šifrované spojení s Home Assistantem
ota:
- platform: esphome
password: "VAŠE_OTA_HESLO" # nahraďte vlastním heslem pro OTA
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap: # fallback AP při selhání Wi-Fi
ssid: "Matrix1 Fallback Hotspot"
password: "ZMĚŇTE_MĚ"
web_server: # jednoduchá stavová stránka
# SCD40 na Atomu: SDA=26, SCL=32
i2c:
sda: 26
scl: 32
scan: true
sensor:
# SCD40 CO2, teplota, vlhkost
- platform: scd4x
id: scd40
co2:
id: co2_ppm
name: "CO2"
accuracy_decimals: 0 # celé ppm v HA
temperature:
id: temp_c
name: "Temperature"
accuracy_decimals: 2 # dvě desetinná místa v HA
filters:
- offset: -2.0 # korekce, pokud zařízení čte přibližně o 2 °C výš
- lambda: |- # tvrdé zaokrouhlení na dvě desetinná místa
if (isnan(x)) return x;
return roundf(x * 100.0f) / 100.0f;
# Alternativa místo dvou řádků výše:
# temperature_offset: 2.0 # kompenzace v čidle zlepší i RH a CO2
humidity:
id: rel_hum
name: "Humidity"
accuracy_decimals: 2
filters:
- lambda: |-
if (isnan(x)) return x;
return roundf(x * 100.0f) / 100.0f;
update_interval: 10s # nové hodnoty každých 10 s
automatic_self_calibration: true # ASC pro dlouhodobý baseline CO2
# 5×5 WS2812 matice přes ESP-IDF RMT ovladač
light:
- platform: esp32_rmt_led_strip
id: matrix
name: "Atom Matrix"
pin: 27
num_leds: 25
chipset: WS2812
rgb_order: GRB
default_transition_length: 0s
restore_mode: ALWAYS_OFF # zůstane zhasnuto po výpadku i při startu
on_turn_on: # vynutí 50 % jasu při zapnutí
- light.control:
id: matrix
brightness: 50%
# Softwarový přepínač, který uvidíte i v Home Assistantu
switch:
- platform: template
id: display_enabled
name: "Matrix Display Enabled"
optimistic: true
restore_mode: RESTORE_DEFAULT_OFF
turn_on_action:
- light.turn_on:
id: matrix
brightness: 50%
turn_off_action:
- light.turn_off: matrix
# Přední tlačítko. GPIO39 nemá interní pull-up, tlačítko je aktivní v log. 0
binary_sensor:
- platform: gpio
id: atom_button
name: "Atom Button"
pin:
number: 39
mode:
input: true
inverted: true
on_press:
- switch.toggle: display_enabled
# 5×5 vizualizace: tři svislé sloupce ve sloupcích 0, 2 a 4
# T škáluje 18..30 °C, RH 10..100 %, CO2 400..2000 ppm
# Každý sloupec má pevné barevné zóny a střed je normální stav.
display:
- platform: addressable_light
id: matrix_display
addressable_light_id: matrix
width: 5
height: 5
rotation: 0
update_interval: 1s
lambda: |-
if (!id(display_enabled).state) { it.clear(); return; }
// Převod na výšku 1..5 (0 pokud není hodnota)
auto level = [](float v, float vmin, float vmax) -> int {
if (isnan(v)) return 0;
if (v < vmin) v = vmin;
if (v > vmax) v = vmax;
int L = (int)ceilf(((v - vmin) / (vmax - vmin)) * 5.0f);
if (L < 1) L = 1;
if (L > 5) L = 5;
return L;
};
float t = id(temp_c).state; // °C
float h = id(rel_hum).state; // %
float c = id(co2_ppm).state; // ppm
int lt = level(t, 18.0f, 30.0f);
int lh = level(h, 10.0f, 100.0f);
int lc = level(c, 400.0f, 2000.0f);
it.clear();
// Barvy zón po řádcích (y=0 dole .. 4 nahoře)
auto temp_color_for_row = [](int y) -> Color {
if (y <= 1) return Color(0x0000FF); # modrá
if (y == 2) return Color(0x00FF00); # zelená
return Color(0xFF0000); # červená
};
auto hum_color_for_row = [](int y) -> Color {
if (y == 0) return Color(0xFFA500); # oranžová
if (y <= 2) return Color(0x00FF00); # zelená
return Color(0xFF0000); # červená
};
auto co2_color_for_row = [](int y) -> Color {
if (y <= 1) return Color(0x00FF00); # zelená
if (y <= 3) return Color(0xFFFF00); # žlutá
return Color(0xFF0000); # červená
};
auto draw_zoned_col = [&](int x, int L, auto color_for_row) {
for (int y = 0; y < L; y++) {
it.draw_pixel_at(x, 4 - y, color_for_row(y));
}
};
if (lt > 0) draw_zoned_col(0, lt, temp_color_for_row);
if (lh > 0) draw_zoned_col(2, lh, hum_color_for_row);
if (lc > 0) draw_zoned_col(4, lc, co2_color_for_row);
Tipy k přesnosti
Nechte čidlo po startu několik minut ustálit. Pokud teplota dlouhodobě sedí o stálou hodnotu vedle, použijte temperature_offset na úrovni zařízení. LED matice může zahřívat okolí, proto je dobré držet jas na 50 % a displej mít zhasnutý, pokud zrovna neslouží jako indikátor.
Závěr
Otevřený CO₂ monitor z M5Stack Atom Matrix a SCD40 vám dá přesná data, okamžitou vizuální zpětnou vazbu a úplnou svobodu při zpracování v Home Assistantu. Komponenty jsou snadno dostupné, firmware je čitelný a upravitelný. Pokud budete chtít, můžeme přidat noční režim, adaptivní jas podle ambientního světla nebo automatické přepínání zobrazovaných metrik.
Hlavní výhody M5Stacku
- Bez pájení u většiny scénářů. Moduly a jednotky propojíte konektory Grove nebo přes připravené základny. Rychlé MVP i servis je snadnější.
- Plug and play ekosystém. Řada „Units“ a „Bases“ pokrývá I2C senzory, RS485, LoRa, relé, displeje, enkodéry a mnoho dalšího. Není potřeba řešit level shifty ani napájecí desky.
- Integrované periférie. U Atom Matrix máš 5×5 RGB matici a tlačítko přímo na čipu, v jiných modelech bývá mikrofon, reproduktor, IMU, RTC nebo baterie. Méně krabiček, méně kabelů.
- Stabilní napájení a RF část. M5Stack moduly mají odladěné napájení, USB-C a anténu, takže odpadá typická „ruleta“ s neočekávanými restarty nebo nestabilním Wi-Fi.
- Konzistentní pinout a dokumentace. Nemusíš pokaždé lovit, který devkit má jak mapované piny. Projekty se rychleji sdílí v týmu.
- Lepší mechanika. Krabičky, montážní otvory, držáky a 3D modely jsou k dispozici. Snadno to připevníš na zeď, do racku nebo na rozvaděčovou lištu.
- Dostupnost a životní cyklus. M5Stack prodává stejné moduly dlouhodobě a skladem, takže není problém vyrobit dalších 10 kusů za rok se stejným BOM.
- Čas jsou peníze. Samotné ESP32 je levnější, ale ztracený čas na pájení, ladění napájení a krabičku se rychle zaplatí v ceně M5Stacku.
- Lokální provoz bez cloudu. V kombinaci s ESPHome a Home Assistantem máš kompletní kontrolu nad daty, právy, aktualizacemi i integracemi.
- Snadné servisování. Výměna senzoru nebo celého modulu je otázka minut, ne hodin s páječkou.
Kdy dává smysl „holé“ ESP32
- Extrémně nízký rozpočet a velké série s vlastním PCB.
- Netypická mechanika nebo speciální periférie, které v M5Stack ekosystému nejsou.
- Projekty vyžadující přesné analogové měření s vlastní analogovou front-end částí.
Pro CO₂ monitor v článku je M5Stack Atom Matrix ideální: 5×5 displej pro okamžitou vizuální odezvu, tlačítko pro zapnutí a vypnutí, jeden kabel k SCD40 přes I2C a hotovo. Všechno běží lokálně, konfiguruje se v YAML a kdykoli to rozšíříš o další jednotky bez zásahu do krabičky.

