Home Assistant seriál s Jakubem: Díl 13: Senzor CO₂ (ESPHome)
Úvod
Jak jsme si slíbili minule, v dnešním díle si vyrobíme CO₂ senzor, který se výborně hodí pro kontrolu kvality vzduchu ve vaší domácnosti. A věřím, že stejně jako já budete překvapeni, jak rychle se místnost může „vydýchat“. Díky senzoru zjistíme aktuální koncentraci CO₂ a můžeme si snadno poslat notifikaci, rozsvítit LEDku nebo spustit jakoukoli jinou automatizaci, která nám připomene, že je čas vyvětrat 🙂.
Vliv koncentrace CO₂ na lidský organismus:
- 350-400 ppm – úroveň venkovního prostředí
- do 1000 ppm – doporučená úroveň CO₂ ve vnitřních prostorách
- 1200-1500 ppm – doporučená maximální úroveň CO₂ ve vnitřních prostorách
- 1000-2000 ppm – nastávají příznaky únavy a snižování koncentrace
- 2000-5000 ppm – nastávají možné bolesti hlavy
- 5000 ppm – maximální bezpečná koncentrace; při delší expozici možné nevolnosti a zvýšený tep
- 15000 ppm – dýchací potíže
- 40000 ppm – možná ztráta vědomí
Z vlastní zkušenosti vím, že dostat se v menší místnosti bez pravidelného větrání na hodnoty mezi 1500-2000 ppm není moc velký problém. A ani to vlastně moc nepoznáte. Dříve jsem spal v ložnici se zavřeným oknem. Bez větrání před spaním a bez mikroventilace stoupne za 8 hodin spánku koncentrace klidně na 1500–2000 ppm – a to i když v místnosti spí jen jedna osoba. Mikroventilace výrazně pomůže a sníží hodnoty CO₂ na cca 1000 – 1200 ppm. Nejlepší je v létě spát s otevřeným oknem (alespoň na klasickou ventilaci) a v zimě každé dvě hodiny větrat a pořádně vyvětrat před spánkem 🙂.
Co budeme potřebovat
- nainstalovaný HA a ESPHome z předchozích dílů
- ESP32 vývojová deska
- datový microUSB kabel
- MH-Z19C/MH-Z19B CO₂ senzor
- 3D tiskárna nebo kamarád s tiskárnou
- propojovací kabely (jumpery)
- 5V/1A zdroj
- krimpovací kleště (volitelné)
- krimpovací konektory (volitelné)
- propojovací kablíky (volitelné)

Instalace ESPHome na desku
Budeme postupovat úplně stejně jako v minulém dílu, ale abyste nemuseli pročítat půlku minulého dílu, celý postup si znovu projdeme. Jako desku opět použijeme NodeMCU ESP32 Development Board (tedy klasická verze ESP32 s microUSB) a opět pro ní máme k dispozici tisknutelnou krabičku. Odkaz na model najdete na zde. Krabičku si zatím můžete poslat do tisku, ať neztrácíte čas :).
Pro instalaci použijeme webový tool, který je za mě nejrychlejší a nejjednodušší. Otevřeme si tedy tuto stránku, připojíme desku přes microUSB do počítače a na webu klikneme na Connect.

Otevře se nám dialogové okno, kde bychom měli vidět naši desku. Pokud jí tam nevidíte, zkuste si pročíst předchozí článek, kde je popsáno, v čem by mohl být problém (ovladače, kabel, který není datový apod.). V dialogovém okně vybereme naši desku.

Pokud vše proběhlo v pořádku, objeví se nám další nabídka s modrým textem PREPARE FOR FIRST USE na který klepneme.
Pokud se vám v další nabídce dlouho točí kolečko s nápisem Connecting, zkuste následující postup:
- Desku odpojte od USB kabelu (web se vám automaticky vrátí do předchozí nabídky s Connect).
- Podržte tlačítko označené jako BOOT (většinou to, které není označeno EN) vedle microUSB portu.
- Připojte USB kabel, znovu klepněte na Connect a PREPARE FOR FIRST USE a tlačítko pusťte až v momentě, kdy začne instalace.
Tento postup je někdy potřeba zkusit vícekrát, ale většinou je potřeba jen u desek, na kterých už je nainstalován ESPHome a vy chcete dát desku do „továrního“ nastavení s čerstvým ESPHome. Tímto postupem desku přepnete do bootovacího módu.

Po úspěšné instalaci odklepneme dialogové okno a klepneme na CHANGE WI-FI.


V nabídce vyberte svou Wi-Fi síť a vyplňte heslo k Wi-Fi.

Pokud nás uvítá dialogové okno Provisioned, máme napůl vyhráno – ESPHome je úspěšně nahrán a deska je připravena pro konfiguraci senzoru.
Přidání a nastavení desky v HA
Nyní se přesuneme do našeho HA a to konkrétně do ESPHome Builderu.
V horní části by se nám měla objevit nabídka Discovered 1 device, kde klepneme na SHOW vpravo.

Deska se nám přidá do menu k ostatním zařízením (pokud již nějaká máme) a my klepneme na TAKE CONTROL.

Zařízení si můžeme libovolně pojmenovat a poté znovu klepnout na TAKE CONTROL.
Pokud nám vyskočí chyba, ve většině případů stačí doplnit údaje k Wi-Fi, tj. u desky klepneme na EDIT, doplníme následující kód:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
… a v pravém rohu klepneme na INSTALL. Poté by se měla konfigurace zkompilovat a nainstalovat.
Místo opravy konfigurace můžeme rovnou přidat celý kód, který budeme potřebovat pro náš CO₂ senzor a radar:
esphome:
name: esphome-web-e55440
friendly_name: Bedroom - CO2
esp32:
board: esp32dev
framework:
type: esp-idf
# Enable logging
logger:
baud_rate: 0
# Enable Home Assistant API
api:
encryption:
key: ""
ota:
- platform: esphome
password: ""
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Bedroom-Co2 Fallback Hotspot"
password: ""
captive_portal:
uart:
rx_pin: GPIO16
tx_pin: GPIO17
baud_rate: 9600
sensor:
- platform: mhz19
co2:
name: "MH-Z19 CO2 Value"
temperature:
name: "MH-Z19 Temperature"
update_interval: 60s
automatic_baseline_calibration: False
bluetooth_proxy:
active: true
Ve svém konfiguračním kódu upravte následující čtyři části podle vlastních údajů:
esphome:
name: bedroom-co2
friendly_name: Bedroom - CO2
Friendly name si můžete nastavit libovolně, ale hodnota name musí přesně odpovídat názvu, který jste zadali ve webovém klientovi při první instalaci. Jinak se deska nenačte správně. Alternativně můžete do kódu přidat statickou IP adresu a bránu – a v routeru tuto IP přiřadit trvale k MAC adrese desky.
api:
encryption:
key: "MujVygenerovanyKod"
Zde nahraďte key: "" vlastním klíčem, který si můžete vygenerovat například zde.
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Fallback Hotspot"
password: "MojeHesloNaHotspot"
Tato sekce definuje záchranný hotspot, který deska začne vysílat, pokud se nepřipojí ke známé Wi-Fi síti. Díky tomu se k ní budete moci připojit a opravit konfiguraci.
ota:
- platform: esphome
password: "MojeHesloProOTAUpdate"
Sem zadejte heslo, které budete potřebovat při OTA (Over-the-Air) aktualizacích firmware.
Až budete mít vše připraveno, klikněte v pravém horním rohu na INSTALL a v nabídce zvolte možnost Wirelessly.
Kompilace může chvíli trvat – v některých případech i deset minut, tak se neděste 🙂

Také si v kódu můžeme povšimnout tohoto bloku:
bluetooth_proxy:
active: true
Tento kód slouží k tomu, aby se ESP32 deska chovala jako bluetooth proxy.
Bluetooth proxy v ESPHome umožňuje ESPčku (např. ESP32) fungovat jako přeposílač Bluetooth signálů (např. ze senzorů jako Xiaomi, inkbird, apod.) do Home Assistantu, protože většina Home Assistant serverů (např. na RPi nebo mini PC) Bluetooth čip nemá, nebo má příliš malý dosah.
Jak to funguje krok za krokem:
- ESP32 s ESPHome běží někde poblíž Bluetooth zařízení (např. Bluetooth teploměr Xiaomi Mi Thermometer).
- ESP32 zachytí Bluetooth signály z těchto zařízení.
- Tato data nevyhodnocuje sám, ale přepošle do Home Assistantu přes Wi-Fi.
- Home Assistant tyto signály zpracuje, jako by je chytil sám → zařízení se vám objeví v HA jako entita.
Bluetooth proxy tedy můžeme krásně využít pro rozšíření Bluetooth pokrytí po bytě/domě, ideální je mít v každé místnosti jednu bluetooth proxy a odstraníte tím problém např. se špatným signálem pro Xiaomi Mi Thermometer o kterém jsme mluvili v tomto dílu.
3D tisk krabičky
Celý projekt s krabičkou a držákem naleznete zde. Na dvou podložkách najdete variantu jak pro NodeMCU desku, tak i pro klasický ESP32 DevKit. Pokud byste chtěli i kompatibilní držák, najdete ho na jedné podložce z minulého projektu.
V projektu naleznete i druhý print profile, kde je víčko upravené pro model MH-Z19B, který je o trochu větší než MH-Z19C.
Tisk krabičky zabere přibližně 45 minut a budete potřebovat cca 26g filamentu. Veškeré důležité informace najdete přímo v projektu na MakerWorldu.
Vůle pro osazení ESP32 desky, radaru i víčka jsou minimální, takže je potřeba při sestavení použít trochu síly. Pokud nemáte perfektně kalibrovanou tiskárnu, doporučuji tisknout pomalu – model je navržen s přesností na setiny milimetru. 🙂
Soubor ve formátu .3mf je optimalizovaný pro tiskárny BambuLab. Pokud by vám nesedělo víčko nebo deska, můžete zkusit zmenšit boční stěny o 0,1 mm z každé strany – nicméně já osobně jsem tiskl několik kusů a všechny seděly bez úprav.

Kompletace
Osazení ESP32 desky a radaru
Nyní můžeme desku odpojit od microUSB kabelu a vložit ji do vytištěné krabičky. Desku je ideální vkládat mírně šikmo – tedy nejprve zasunout stranu s USB portem a pak druhou stranu mírným zatlačením dorovnat. Pokud deska nesedí rovně, jemně zatlačte na protilehlou stranu, tím se usadí.
Vyjmutí je trochu složitější. U NodeMCU se mi osvědčil malý imbusový klíč – dá se zasunout pod desku a lehce zatáhnout. U klasického ESP32 DevKitu pomáhá malý plochý šroubovák – opatrně jej vsuňte pod USB port a lehce nadzvedněte. Nicméně krabička není konstruovaná na časté výměny desek (a ani by to nemělo být potřeba).
Dále vložíme CO₂ senzor do víčka. Pasuje přesně, stačí ho lehce zatlačit (ideálně ze stran).


Zapojení konektorů
Pomocí krimpovacích kleští si vyrobíme čtyři dupont propojky (female to female). Délka každé bude zhruba 4 cm bez konektorů, s konektory přibližně 6 cm.
Pokud si propojky vyrábět nechcete, můžete použít hotové. Počítejte ale s tím, že uvnitř krabičky nebude tolik místa – bude nutné kablíky smotat, aby bylo možné krabičku vůbec zavřít.
| MH-Z19C pin | ESP32 pin | Poznámka |
| VCC | 5V | napájení |
| GND | GND | uzemnění |
| TX | GPIO17 (RX) | přijímá data z CO₂ senzoru |
| RX | GPIO16 (TX) | posílá data do CO₂ senzoru |

Po zapojení všech konektorů můžeme zavřít víčko krabičky a máme téměř vše připraveno.
Přidání senzoru do HA a nastavení
Přejdeme do Settings → Devices & Services → ESPHome. Nahoře by se mělo zobrazit nově objevené zařízení. Klikneme vpravo na ADD. Zařízení se přidá do Devices, kde můžeme kliknout na modré 1 device.

Senzor bude reportovat dvě základní hodnoty, teplotu a CO₂ v ppm. Nic víc od něj nečekejme, ale i tohle nám stačí více než dost.
Parametry CO₂ senzoru
| Model No. | MH-Z19C |
| Detection Gas | CO₂ |
| Working voltage | 5.0±0.1V DC |
| Average current | < 40mA (@5V power supply) |
| Peak current | 125mA (@5V power supply) |
| Interface level | 3.3 V (Compatible with 5V) |
| Detection Range | 400~5000ppm(optional) |
| Output signal | Serial Port (UART) (TTL level 3.3V), PWM |
| Preheat time | 1 min |
| Response Time | T90 < 120 s |
| Working temperature | -10 ~ 50 ℃ |
| Working humidity | 0 ~ 95% RH (No condensation) |
| Weight | 5 g |
| Lifespan | 5 years |
| Detection Gas | Formula | Detection Range | Accuracy |
| Carbon Dioxide | CO₂ | 400~2000ppm 400~5000ppm | ± (50ppm+5% reading value) |
Jak můžeme vidět, senzor je poměrně přesný (na domácí poměry naprosto dostačující). Kalibrace funguje následovně:
Zero Point Calibration (Kalibrace nulového bodu)
MH-Z19C/MH-Z19B senzor měří koncentraci CO₂ v jednotkách ppm (částic na milion) a pro správné měření potřebuje čas od času kalibraci – tedy nastavení „nulového bodu“, který odpovídá čistému vzduchu s 400 ppm CO₂.
Existují dva způsoby kalibrace:
Manuální kalibrace (ručně)
Pokud chcete senzor zkalibrovat ručně, musíte na pin HD přivést nízkou logickou úroveň (0V) a udržet ji alespoň 7 sekund.
Jednoduše řečeno: připojte HD pin ke GND (zem) na alespoň 7 sekund.
Než to uděláte, ujistěte se, že je senzor alespoň 20 minut zapnutý a nachází se v prostředí s čistým vzduchem (cca 400 ppm CO₂) – například venku nebo v dobře větrané místnosti. Jinak by se mohl kalibrovat na špatnou hodnotu a měřit nepřesně.
Automatická kalibrace (samokalibrace)
Senzor má také funkci automatické kalibrace, která se spouští každých 24 hodin od zapnutí. Senzor si během této doby sám určuje nulový bod podle prostředí – předpokládá ale, že se alespoň jednou denně dostane do vzduchu s běžnou hladinou CO₂ (cca 400 ppm).
Tahle funkce je fajn pro domácnosti nebo kanceláře, ale nevhodná pro skleníky, stáje, sklady a podobná místa, kde je CO₂ trvale vyšší.
V těchto případech doporučuji automatickou kalibraci vypnout (např. v ESPHome automatic_baseline_calibration: false) a provádět ruční kalibraci podle potřeby.
Jednodušší automatizace s jednou hláškou
Níže naleznete kód automatizace, která pošle notifikaci na telefon :). Automatizace jsem vám sem dal dvě, jedna je jednodušší a pošle hlášku pouze jednou, pokud je překročena mez 800ppm a druhá posílá notifikace opakovaně v 10minutových intervalech, což je dostatečně otravné na to, aby vás to donutilo vyvětrat :).
alias: "Bedroom CO2 - notification"
trigger:
- platform: numeric_state
entity_id: sensor.bedroom_co2_mh_z19_co2_value
above: 800
condition: []
action:
- variables:
co2: "{{ states('sensor.bedroom_co2_mh_z19_co2_value') | float }}"
- choose:
- conditions: "{{ co2 > 800 and co2 < 1000 }}"
sequence:
- service: notify.mobile_app_pixel_7_pro
data:
title: "CO₂ přes 800 ppm"
message: "Vzduch už není, co býval... 🫠 Možná by to chtělo okno?"
- conditions: "{{ co2 >= 1000 and co2 < 1500 }}"
sequence:
- service: notify.mobile_app_pixel_7_pro
data:
title: "CO₂ nad 1000 ppm"
message: "Mozek už stahuje rolety 🧠💤 – čas vyvětrat!"
- conditions: "{{ co2 >= 1500 }}"
sequence:
- service: notify.mobile_app_pixel_7_pro
data:
title: "KRITICKÝ CO₂!"
message: "🔥 Vzduch je jedovatej jak Twitter diskuze. Okno. HNED."
mode: single
Složitější automatizace s opakovanými hláškami
alias: "Bedroom CO2 - notification"
triggers:
- entity_id: sensor.bedroom_co2_mh_z19_co2_value
above: 800
trigger: numeric_state
- entity_id: sensor.bedroom_co2_mh_z19_co2_value
above: 1000
trigger: numeric_state
- entity_id: sensor.bedroom_co2_mh_z19_co2_value
above: 1500
trigger: numeric_state
conditions: []
actions:
- variables:
co2: "{{ states('sensor.bedroom_co2_mh_z19_co2_value') | float }}"
- choose:
- conditions:
- condition: template
value_template: "{{ co2 > 800 and co2 < 1000 }}"
sequence:
- data:
title: CO₂ přes 800 ppm
message: Vzduch už není, co býval... 🫠 Možná by to chtělo okno?
action: notify.mobile_app_pixel_7_pro
- delay: "00:10:00"
- condition: numeric_state
entity_id: sensor.bedroom_co2_mh_z19_co2_value
above: 800
below: 1000
- data:
title: CO₂ pořád přes 800 ppm
message: Ještě jsi neotevřel? Už to dýchej jak delfín pod dekou. 🐬
action: notify.mobile_app_pixel_7_pro
- conditions:
- condition: template
value_template: "{{ co2 >= 1000 and co2 < 1500 }}"
sequence:
- data:
title: Vzduch je těžký...
message: Mozek už stahuje rolety 🧠💤 – CO₂ nad 1000 ppm. Otevři to okno!
action: notify.mobile_app_pixel_7_pro
- delay: "00:10:00"
- condition: numeric_state
entity_id: sensor.bedroom_co2_mh_z19_co2_value
above: 1000
below: 1500
- data:
title: Pořád dusno
message: Tohle už není spánek, to je kyslíková dieta. Otevři okno! 🌬️
action: notify.mobile_app_pixel_7_pro
- conditions:
- condition: template
value_template: "{{ co2 >= 1500 }}"
sequence:
- data:
title: CO₂ KRITICKÉ!
message: >-
🔥 Vzduch je jedovatej jak Twitter diskuze. CO₂ nad 1500 ppm!
Okno. HNED.
action: notify.mobile_app_pixel_7_pro
- delay: "00:10:00"
- condition: numeric_state
entity_id: sensor.bedroom_co2_mh_z19_co2_value
above: 1500
- data:
title: Totální CO₂ smog!
message: Hele vážně – vstávej a větrej. 🧟💨
action: notify.mobile_app_pixel_7_pro
mode: single
Závěr
V dnešním díle jsme – jako vždy – odvedli pořádný kus práce. Máme funkční CO₂ senzor a s ním i možnost žít o něco zdravěji. Samozřejmě jen pokud se podle něj i skutečně řídíme 😉.
Příště se podíváme na senzor kouře, který nás může na dálku upozornit třeba na začínající požár.
Tak čistému vzduchu zdar!
