🌟 EaSun Multi-Senzor v2.12.0

ESP32 Dev Module s BH1750 Luxmetr + DS18B20 Teplota + DHT22 Teplota/Vlhkost + Hardwarový Watchdog + Event Logging + NTP Synchronizace + Dual-Core + ESP-NOW + Memory Management + Graf Historie + Home Assistant + Webové rozhraní | Verze 2.12.0 | Aktualizace Datum: 2026-03-14

Nové v2.12.0: Přidán DHT22 teploměr/vlhkoměr s konfigurační stránkou, vylepšené debug výpisy, optimalizace měření senzorů, kompletní multi-senzorové řešení

🚀 Přehled funkcí

📊 BH1750 Luxmetr

Přesné měření intenzity osvětlení s kategorizací a historií posledních 20 měření.

🌡️ DS18B20 Teplota

Přesné měření teploty s rozlišením 0.0625°C a kategorizací teplotních pásem.

🌡️💧 DHT22 Teplota/Vlhkost

Digitální měření teploty (-40°C až +80°C) a relativní vlhkosti (0-100% RH) s přesností ±0.5°C a ±2% RH.

🌐 Webové rozhraní

Responzivní web s real-time daty, JSON API a HTTP Basic Authentication.

📡 ESP-NOW komunikace

Bezdrátová komunikace s jinými ESP32 bez WiFi routeru, dosah až 200m.

🔐 AES-128 šifrování

Zabezpečené ESP-NOW komunikace s webovou správou šifrovacích klíčů.

🛜 WiFi konfigurace

Automatické WiFi připojení nebo konfigurační AP mód s web rozhraním.

⚡ Dual-Core architektura

Optimalizované využití obou jader ESP32 pro maximální výkon.

🔄 Restart stránka

Profesionální restart stránka s odpočtem a automatickým přesměrováním na hlavní stránku.

🔧 Optimalizované WiFi parametry

Konzistentní názvy parametrů (Multi-SenzorSSID/Password) pro spolehlivé ukládání hesla.

📶 ESP-NOW stabilizace

Optimalizované pořadí inicializace pro bezkonfliktní provoz webserveru s ESP-NOW.

🔄 ESP-NOW auto-restart

Automatický restart ESP-NOW komunikace při problémech s příjemcem - spolehlivost na prvním místě.

📊 Webový monitoring ESP-NOW

Kompletní statistiky ESP-NOW komunikace přímo na webové stránce - bez sériového monitoru.

🐕 Hardwarový Watchdog

30s timeout s automatickým restartem při zamrznutí, kontinuální monitoring všech kritických funkcí.

📝 Inteligentní Event Logging

Automatické logování událostí do SPIFFS s rotací, rozlišení chyb od normálních stavů.

🗂️ Webová správa událostí

Real-time zobrazení event logu s možností vymazání a manuální údržby přes web rozhraní.

🧹 Automatická údržba logů

Mazání záznamů starších 10 dní, kontrola velikosti souboru (32KB limit), údržba každých 60 minut.

⚡ Optimalizované měření

Senzory se čtou každou 1 sekundu s mutex synchronizací mezi dual-core tasky.

🕐 NTP Synchronizace času

Automatická synchronizace středoevropského času (CET/CEST) s pool.ntp.org, správné časové značky v logu.

🔄 Vylepšený restart handler

Asynchronní restart s odpočítáváním, bez blokování webserveru, profesionální UX s přesměrováním.

🧹 Automatická defragmentace paměti

4-úrovňový systém monitoring paměti s automatickou defragmentací a emergency restartem při kritické fragmentaci.

📊 Memory Monitoring System

Real-time monitoring fragmentace heap paměti, proaktivní defragmentace, webové statistiky a JSON API.

⚡ Dual-Core Memory Management

Monitoring paměti z obou jader ESP32, String cache optimalizace, SPIFFS cache management pro maximální stabilitu.

📈 Interaktivní graf historie

HTML5 Canvas graf s 100 měřeními, dvojité Y-osy pro různé rozsahy hodnot, barevná legenda, jen při načtené stránce.

🏠 Home Assistant integrace

Kompletní JSON REST API s identifikací zařízení, automatické entity, grafy historie, automatizace podle osvětlení.

🔧 Optimalizace NTP

Synchronizace pouze při startu a každou hodinu, kontrola jen každou minutu, úspora 99.8% volání NTP funkcí.

🧠 Inteligentní časové značky

Automatická detekce NTP vs millis() času, správné zobrazení s časovou zónou Europe/Prague.

🐛 Debug výstupy

Detailní logování NTP synchronizace, typu časových značek a system events pro snadné debugging.

🔧 První nastavení a spuštění

📋 Požadované komponenty

Mikrokontrolér:
ESP32 Dev Module (30 pinů)
Senzory:
BH1750 luxmetr (I2C)
DS18B20 teplota (OneWire)
Napájení:
5V USB nebo 3.3V externí
Připojení:
BH1750: 4 vodiče + ADDR
DS18B20: 3 vodiče + pull-up

🔌 Zapojení senzorů

💡 BH1750 Luxmetr (I2C)

BH1750 Pin ESP32 Dev Module Popis
VCC 3.3V Napájení senzoru
GND GND Společná zem
SDA GPIO21 I2C data (standardní pin)
SCL GPIO22 I2C clock (standardní pin)
ADDR GND I2C adresa 0x23 (nebo 3.3V pro 0x5C)

🌡️ DS18B20 Teplotní senzor (OneWire)

DS18B20 Pin ESP32 Dev Module Popis
VCC (červený) 3.3V Napájení senzoru
GND (černý) GND Společná zem
DATA (žlutý) GPIO4 OneWire datová sběrnice
Pull-up rezistor 4.7kΩ mezi DATA a VCC Povinný pro OneWire komunikaci

🌡️💧 DHT22 Teplotní a vlhkostní senzor (Digitální)

DHT22 Pin ESP32 Dev Module Popis
VCC (červený) 3.3V Napájení senzoru (3.3V - 6V)
GND (černý) GND Společná zem
DATA (žlutý) GPIO5 Digitální datový pin (konfigurovatelný)
Pull-up rezistor 4.7kΩ mezi DATA a VCC Doporučený pro stabilní komunikaci
💡 Důležité: Všechny tři senzory mohou být připojeny současně! Aplikace automaticky detekuje dostupné senzory a přizpůsobí se jejich konfiguraci. DHT22 má konfigurovatelný GPIO pin přes webové rozhraní.

💻 Instalace a nahrání

  1. Knihovny:
    Nainstalujte přes Arduino IDE Library Manager:
    ArduinoJson (verze 6.x) AsyncTCP ESPAsyncWebServer OneWire DallasTemperature DHT sensor library Vestavěné knihovny (automaticky dostupné): esp_task_wdt.h (Hardwarový Watchdog) esp_system.h (Systémové funkce) time.h (NTP synchronizace času) Wire.h (I2C komunikace) WiFi.h (WiFi funkcionalita) SPIFFS.h (Flash file system) esp_now.h (ESP-NOW komunikace)
  2. Nastavení desky:
    V Arduino IDE vyberte: Tools → Board → ESP32 Dev Module
  3. Nahrání kódu:
    Zkompilujte a nahrajte ESP32-LUX12.ino do ESP32
  4. Zapojení senzorů:
    Připojte BH1750 a/nebo DS18B20 podle tabulek výše
💡 Tip: Aplikace funguje i bez senzorů v informativním režimu. Program se nikdy nezastaví kvůli chybějícím čidlům. Můžete připojit pouze jeden senzor nebo oba současně.

⚡ Dual-Core architektura

🎯 Proč Dual-Core?

ESP32 má 2 jádra (Core 0 a Core 1), které můžeme využít pro optimální výkon:

📊 Core 1 - Senzory & ESP-NOW

  • Čtení BH1750 luxmetru každé 1 sekundu
  • ESP-NOW odesílání každých 10 sekund
  • Zpracování dat a historie
  • Sériový výpis pro debugging

🌐 Core 0 - Síťová komunikace

  • WiFi management a monitoring
  • AsyncWebServer (HTTP requesty)
  • JSON API odpovědi
  • Webové rozhraní

🔒 Mutex synchronizace

Pro bezpečné sdílení dat mezi jádry používáme dataMutex:

// Core 1 zapisuje data if (xSemaphoreTake(dataMutex, pdMS_TO_TICKS(100)) == pdTRUE) { currentLux = lux; currentCategory = kategorizujOsvetleni(lux); xSemaphoreGive(dataMutex); } // Core 0 čte data pro web if (xSemaphoreTake(dataMutex, pdMS_TO_TICKS(100)) == pdTRUE) { doc["lux"] = currentLux; doc["category"] = currentCategory; xSemaphoreGive(dataMutex); }

✅ Výhody Dual-Core

  • Přesnější měření: Senzory mají dedikované jádro bez rušení
  • Rychlejší ESP-NOW: Nižší latence komunikace
  • Stabilnější web: Síťová komunikace neblokuje senzory
  • Škálovatelnost: Snadné přidání dalších senzorů na Core 1

🌐 Webové rozhraní a konfigurace

🔄 První spuštění (AP mód)

  1. Automatický AP mód:
    ESP32 vytvoří WiFi síť "EASUN-LUX" (bez hesla)
  2. Připojení k AP:
    Připojte se k síti "EASUN-LUX" na vašem telefonu/počítači
  3. Konfigurace WiFi:
    Otevřete http://192.168.4.1 v prohlížeči
  4. Přihlášení:
    Username: admin, Heslo: (prázdné)
  5. Nastavení WiFi:
    Vyberte vaši WiFi síť a zadejte heslo
  6. Automatický restart:
    ESP32 se restartuje a připojí k vaší WiFi síti

📱 Funkce webového rozhraní

Stránka URL Popis
🏠 Hlavní / Real-time data, grafy, historie měření
📡 ESP-NOW /espnow-config Konfigurace MAC adresy příjemce
🔐 Šifrování /encryption-config Správa AES-128 šifrování
🛜 WiFi /wifi-config Změna WiFi nastavení
🌡️💧 DHT22 /dht22-config Konfigurace DHT22 GPIO PIN
🐕 Event Log /error-log Watchdog status a správa event logů
🔄 Restart /restart Restart stránka s odpočítáváním
⚡ Skutečný restart /do-restart Asynchronní restart endpoint (volá se JavaScriptem)
📊 JSON API /api/data Data ve formátu JSON
📝 Event Log API /api/error-log Event logy ve formátu JSON

🐕 Hardwarový Watchdog & Event Logging

🚀 Nové ve verzi 2.4.1

Kompletní systém pro zajištění spolehlivého provozu s automatickým restartem při jakékoliv chybě a inteligentním logováním událostí. Nově s NTP synchronizací času pro přesné časové značky.

🐕 Hardwarový Watchdog Timer

  • Timeout: 30 sekund
  • Automatický restart: při zamrznutí aplikace
  • Kontinuální monitoring: všech kritických funkcí
  • Webové ovládání: možnost zapnout/vypnout přes web interface
  • Dual-core monitoring: každý task má vlastní krmení

📝 Inteligentní Event Logging

  • SPIFFS úložiště: všechny události se ukládají do flash paměti
  • Rotace logů: automatické udržování posledních 50 záznamů
  • Detailní informace: čas, typ události, zpráva, systémové informace
  • Perzistentní: logy přetrvají restart systému
  • Chytrá detekce: rozlišuje mezi chybou a normálním stavem
  • Severity levels: rozlišení chyb (❌) a informačních zpráv (✅)

🧹 Automatická údržba logů

  • Stáří záznamů: automatické mazání událostí starších než 10 dní
  • Velikost souboru: kontrola velikosti, restart logu při překročení 32KB
  • Frekvence údržby: každých 60 minut automaticky
  • Manuální údržba: tlačítko v webovém rozhraní

🕐 NTP Synchronizace času

  • Časová zóna: Středoevropský čas (CET/CEST)
  • Automatické přepínání: letní čas (GMT+2) a zimní čas (GMT+1)
  • NTP servery: pool.ntp.org, time.nist.gov, time.google.com
  • Synchronizace: při startu systému a pak každou hodinu
  • Timeout: maximálně 10 sekund na inicializaci
  • Přesné časové značky: všechny logy obsahují skutečný čas místo millis()
  • Debug výstupy: detailní informace o synchronizaci v serial monitoru

📊 Monitorované události

✅ Informační události (zelené)

  • SYSTEM_START - úspěšný start systému
  • NTP_SYNC - úspěšná NTP synchronizace času
  • BH1750_RECOVERED - obnoven BH1750 senzor
  • DS18B20_RECOVERED - obnoven DS18B20 senzor
  • WATCHDOG_TOGGLE - změny stavu watchdog
  • MEMORY_STATUS - pravidelný report paměti
  • MEMORY_DEFRAG - úspěšná defragmentace
  • MEMORY_RECOVERED - emergency defragmentace úspěšná

❌ Chybové události (červené)

  • NTP_FAIL - selhání NTP synchronizace
  • USER_RESTART - restart iniciovaný uživatelem
  • SENSOR_TASK - kritické chyby v sensor task
  • BH1750_LOST - ztráta BH1750 během provozu
  • DS18B20_LOST - ztráta DS18B20 během provozu
  • LOW_MEMORY - nedostatek paměti (legacy)
  • MEMORY_CRITICAL - kritická fragmentace paměti
  • MEMORY_EMERGENCY - absolutní minimum paměti
  • ESP_NOW_* - chyby ESP-NOW komunikace

⚠️ Důležité upozornění

Inteligentní detekce: Pokud senzor nebyl nikdy zapojen, NENÍ to logováno jako chyba. Chyby se logují pouze při skutečných problémech - např. když senzor fungoval a pak přestal reagovat.

🧹 Memory Management & Defragmentace

🎯 Proč je defragmentace paměti potřebná?

ESP32 má omezenou heap paměť (~300KB), která se při běhu aplikace fragmentuje kvůli častým alokacím a dealokacím. Fragmentace může způsobit:

❌ Problémy bez defragmentace

  • Selhání alokace i při dostupné paměti
  • Neočekávané restarty při kritické fragmentaci
  • Pomalé String operace (HTML generování)
  • Nestabilní provoz webového serveru

✅ Výhody s defragmentací

  • Stabilní dlouhodobý provoz (týdny/měsíce)
  • Rychlejší generování webových stránek
  • Méně restartů kvůli nedostatku paměti
  • Proaktivní řešení před kritickou situací

📊 4-úrovňový systém monitoring paměti

🟡 LEVEL 1: Varování

Podmínka: Fragmentace >40% nebo <50KB

Akce: Log varování + sériový výpis

⚠️ Memory Warning #5: Free=45000, Frag=45.2%

🟠 LEVEL 2: Defragmentace

Podmínka: Fragmentace >50% nebo <40KB

Akce: Automatická defragmentace

🧹 Spouštím defragmentaci: Free=35000, Frag=55.1%

🔴 LEVEL 3: Kritická situace

Podmínka: Fragmentace >70% nebo <25KB

Akce: Emergency defragmentace + conditional restart

💀 KRITICKÁ PAMĚŤ! Free=20000, Frag=75.0% - RESTART za 10s!

💀 LEVEL 4: Emergency restart

Podmínka: <15KB volné paměti

Akce: Okamžitý restart ESP32

💀💀💀 ABSOLUTNÍ MINIMUM: 12000 bytes - RESTART NYNÍ!

🔧 Defragmentační proces

1️⃣ String Cache Cleanup

  • Vyčištění scanned_ssids_html_select
  • Kompaktifikace espnow_status_text
  • Optimalizace device_location
  • Trim a realokace všech String objektů

2️⃣ Garbage Collection

  • yield() cykly pro uvolnění paměti
  • Delay pro dokončení operací
  • Více agresivní yield při kritické situaci
  • Force cleanup dočasných objektů

3️⃣ SPIFFS Cache Reset

  • SPIFFS.end() - ukončení
  • Delay pro cleanup
  • SPIFFS.begin(true) - restart
  • Vyčištění file system cache

4️⃣ Měření efektivity

  • Free Heap před/po defragmentaci
  • Max Alloc před/po defragmentaci
  • Výpočet získané paměti
  • Log výsledků pro monitoring

🌐 Webové rozhraní - Memory statistiky

📊 Hlavní stránka

  • Free Heap: aktuální volná paměť
  • Max Alloc: největší možný blok
  • Fragmentace: % fragmentace
  • Min Free: minimum od startu
  • Defragmentace: počet provedených

📡 JSON API rozšíření

{ "memory_free": 45000, "memory_max_alloc": 35000, "memory_fragmentation": 22.2, "memory_min_free": 42000, "memory_defrag_count": 3, "memory_warning_count": 12 }

⚡ Dual-Core Memory Monitoring

🔧 Core 0 (Webserver)

Kontrola: Každých 30 sekund

Funkce: Hlavní memory monitoring

Akce: Defragmentace + restart

📡 Core 1 (Senzory)

Kontrola: Každou minutu

Funkce: Alternativní monitoring

Akce: Varování při <20KB

📈 Monitoring výsledků

📊 Memory Status: Free=45000, Used=75000, MaxAlloc=35000, Frag=22.2%, MinFree=42000 🧹 Defragmentace dokončena: Free 35000→38000 (+3000), MaxAlloc 25000→30000 (+5000) ⚠️ Core1 Memory Warning: 18000 bytes ✅ Emergency defragmentace úspěšná - pokračuji (Free=25000)

✅ Výsledek implementace

Stabilita: ESP32 nyní běží týdny bez restartů kvůli paměti. Automatická defragmentace udržuje fragmentaci pod 30% a zajišťuje dlouhodobý stabilní provoz systému.

📈 Interaktivní graf historie měření

🎯 Přehled funkcí grafu

Verze 2.6.0 přidává pokročilý HTML5 Canvas graf, který zobrazuje historii posledních 100 měření v reálném čase s inteligentním škálováním pro různé typy senzorů.

📊 Dvojité Y-osy

  • Levá osa: Primární měření (modrá/zelená)
  • Pravá osa: Sekundární měření (červená)
  • Automatické škálování podle rozsahu hodnot
  • Barevné popisky pro snadné rozlišení

🎨 Vizuální prvky

  • 🔵 Modrá linie: Osvětlení (lx)
  • 🟢 Zelená linie: Teplota (jen teplota)
  • 🔴 Červená linie: Teplota (oba senzory)
  • Mřížka pro lepší orientaci
  • Malé body na každém měření

⚡ Optimalizace výkonu

✅ Efektivní implementace

  • Pouze při načtené stránce: Graf se kreslí jen když je web otevřený
  • Žádné pozadí procesy: 0% zátěž když stránka není aktivní
  • Minimální paměť: 100 měření = pouze 800 bajtů (0.25% RAM)
  • Rychlé vykreslení: Vanilla JavaScript bez externích knihoven

🔍 Řešení problému různých rozsahů

Problém: Osvětlení 70-95 lx vs Teplota 20-30°C → Teplota byla neviditelná na společné ose Řešení: Dvojité Y-osy s nezávislým škálováním → Osvětlení: 66.5-99.8 lx (levá osa, modrá) → Teplota: 19.0-31.5°C (pravá osa, červená)

📱 Responsivní design

🖥️ Desktop

Plný graf 400×150px s detailní legendou a všemi popisky os.

📱 Mobil

Automatické přizpůsobení šířce obrazovky, zachovaná funkcionalnost.

📊 Technické detaily

// Paměťová spotřeba float luxHistory[100]; // 400 bajtů float tempHistory[100]; // 400 bajtů Total: 800 bajtů z ~320KB RAM = 0.25% // Aktualizace - Kreslení: Pouze při otevřené stránce - Frekvence: Každou sekundu (když je stránka aktivní) - Zobrazení: Posledních 100 měření (circular buffer)

🏠 Home Assistant integrace

🎯 Kompletní REST API

EaSun Multi-Senzor poskytuje kompletní JSON REST API pro snadnou integraci s Home Assistant a dalšími domácími automatizačními systémy.

📊 Dostupné API endpointy

🔗 /api/data

  • Senzorová data: lux, temperature, dht22_temperature, dht22_humidity, category
  • Identifikace: device_id, device_location, device_mac
  • DS18B20 cache/outage: ds18b20_outage, ds18b20_last_valid_age_ms
  • Status: uptime, memory_free, espnow_status, sensor_status

🔗 /api/error-log

  • Event logy: Všechny systémové události
  • Chyby: Detailní error reporting
  • Diagnostika: Memory, WiFi, senzory
  • Časové značky: NTP čas nebo uptime

🔧 JSON struktura /api/data

{ "device_id": 1, "device_location": "Obývák", "device_name": "Obývák", "device_mac": "24:6F:28:12:34:56", "lux": 77.50, "temperature": 22.15, "temperatures": [22.10, 22.20], "temp_count": 2, "dht22_temperature": 22.3, "dht22_humidity": 45.2, "category": "Šero", "timestamp": 12345678, "uptime": 3600, "bh1750_available": true, "ds18b20_available": true, "ds18b20_outage": false, "ds18b20_last_valid_age_ms": 0, "api_mutex_timeout": false, "dht22_available": true, "sensor_status": "BH1750 luxmetr + DS18B20 teplota + DHT22 teplota/vlhkost", "memory_free": 163932, "espnow_enabled": true, "espnow_total_sent": 150, "espnow_total_failed": 2 }

🏠 Home Assistant konfigurace

Přidejte do souboru configuration.yaml:

# REST senzory pro EaSun Multi-Senzor rest: - resource: "http://IP_ADRESA_ESP32/api/data" authentication: basic username: "admin" # nebo vaše uživatelské jméno password: "VASE_HESLO" scan_interval: 30 # aktualizace každých 30 sekund sensor: # Identifikace zařízení - name: "EaSun Device ID" value_template: "{{ value_json.device_id }}" icon: "mdi:identifier" - name: "EaSun Místo" value_template: "{{ value_json.device_location }}" icon: "mdi:map-marker" # Senzorová data s automatickým pojmenováním - name: "{{ value_json.device_location }} Osvětlení" unit_of_measurement: "lx" device_class: "illuminance" state_class: "measurement" value_template: "{{ value_json.lux | round(2) }}" icon: "mdi:brightness-6" unique_id: "easun_{{ value_json.device_mac | replace(':', '_') }}_lux" - name: "{{ value_json.device_location }} Teplota" unit_of_measurement: "°C" device_class: "temperature" state_class: "measurement" value_template: "{{ value_json.temperature | round(2) }}" icon: "mdi:thermometer" unique_id: "easun_{{ value_json.device_mac | replace(':', '_') }}_temp" - name: "{{ value_json.device_location }} Kategorie" value_template: "{{ value_json.category }}" icon: "mdi:lightbulb-outline" - name: "{{ value_json.device_location }} Uptime" unit_of_measurement: "s" value_template: "{{ value_json.uptime }}" icon: "mdi:clock-outline" binary_sensor: - name: "{{ value_json.device_location }} BH1750" value_template: "{{ value_json.bh1750_available }}" device_class: "connectivity" - name: "{{ value_json.device_location }} DS18B20" value_template: "{{ value_json.ds18b20_available }}" device_class: "connectivity" - name: "{{ value_json.device_location }} DS18B20 výpadek" value_template: "{{ value_json.ds18b20_outage }}" device_class: "problem"

📱 Lovelace Dashboard

# Entity karta type: entities title: "EaSun Multi-Senzor" entities: - entity: sensor.obyvak_osvetleni name: "Osvětlení" - entity: sensor.obyvak_teplota name: "Teplota" - entity: sensor.obyvak_kategorie name: "Kategorie světla" - entity: binary_sensor.obyvak_bh1750 name: "BH1750 senzor" - entity: binary_sensor.obyvak_ds18b20 name: "DS18B20 senzor" --- # Graf historie type: history-graph entities: - entity: sensor.obyvak_osvetleni - entity: sensor.obyvak_teplota hours_to_show: 24 refresh_interval: 0

🔄 Automatizace příklady

# Automatické rozsvícení při tmě automation: - alias: "EaSun světlo detekce" trigger: - platform: state entity_id: sensor.obyvak_kategorie to: "Tma" action: - service: light.turn_on target: entity_id: light.obyvak_hlavni --- # Notifikace při výpadku senzoru automation: - alias: "EaSun senzor offline" trigger: - platform: state entity_id: binary_sensor.obyvak_bh1750 to: "off" for: minutes: 5 action: - service: notify.mobile_app data: message: "BH1750 senzor v obýváku je offline!"

🏷️ Více zařízení současně

✅ Automatická identifikace

Každé EaSun zařízení má jedinečnou identifikaci:

  • device_id: Číselné ID (1-255) nastavené přes web
  • device_location: Název místa ("Obývák", "Ložnice", "Garáž")
  • device_mac: MAC adresa ESP32 (absolutně jedinečná)

Home Assistant automaticky vytvoří entity jako sensor.obyvak_osvetleni, sensor.loznice_teplota atd.

⚙️ Nastavení krok za krokem

  1. Najděte IP adresu ESP32 v sériovém monitoru nebo na routeru
  2. Nahraďte IP_ADRESA_ESP32 skutečnou IP adresou
  3. Nastavte správné heslo pro HTTP autentizaci
  4. Přidejte konfiguraci do configuration.yaml
  5. Restartujte Home Assistant
  6. Přidejte entity do dashboard
  7. Vytvořte automatizace podle potřeby

⚠️ Důležité poznámky

  • HTTP autentizace: API vyžaduje stejné přihlášení jako webové rozhraní
  • Scan interval: Doporučujeme 30-60 sekund pro úsporu síťového provozu
  • Unique ID: Používá MAC adresu pro jedinečnost napříč restarty
  • Device class: Správné třídy pro automatické ikony a jednotky

📡 ESP-NOW komunikace s jinými ESP32

🎯 Co je ESP-NOW?

ESP-NOW je proprietární bezdrátový komunikační protokol od Espressif, který umožňuje přímou komunikaci mezi ESP32 zařízeními bez potřeby WiFi routeru.

⚡ Výhody ESP-NOW

  • Dosah až 200m (bez překážek)
  • Nízká latence (< 10ms)
  • Minimální spotřeba energie
  • Bez potřeby routeru

🔐 AES-128 šifrování

  • Silné šifrování všech dat
  • Automatická správa klíčů
  • Webová správa PMK klíčů
  • Kompatibilní se všemi ESP32

🔧 Nastavení ESP-NOW

  1. Získání MAC adresy příjemce:
    Na druhém ESP32 spusťte kód s WiFi.macAddress()
  2. Konfigurace odesílatele:
    Jděte na stránku "📡 ESP-NOW konfigurace"
  3. Zadání MAC adresy:
    Zadejte MAC adresu ve formátu AA:BB:CC:DD:EE:FF
  4. Nastavení šifrování:
    Na stránce "🔐 Šifrování" zapněte/vypněte AES-128
  5. Kopírování kódu:
    Zkopírujte vygenerovaný kód pro příjemce

🏷️ Identifikace zařízení (Device ID & Location)

Nové v2.4.1: Každé ESP32 zařízení nyní může mít jedinečné ID a název místa pro snadné rozpoznání na příjemci.

🆔 Webová konfigurace

  1. Otevřete webové rozhraní ESP32
  2. Klikněte na "📡 ESP-NOW"
  3. V sekci "Identifikace zařízení":
  4. Zadejte Device ID (1-255)
  5. Zadejte Název místa (max 19 znaků)
  6. Klikněte "💾 Uložit identifikaci"

📋 Příklady nastavení

  • ID: 1, Místo: Obyvak - obývací pokoj
  • ID: 2, Místo: Loznice - ložnice
  • ID: 11, Místo: Garaz - garáž
  • ID: 15, Místo: Sklep - sklep

Nastavení se ukládá do SPIFFS a načítá automaticky při restartu.

🔄 Schéma ESP-NOW komunikace

📡 ESP32 #1

ID: 1
Místo: Obyvak
MAC: 24:6F:28:...
🌡️ BH1750 (luxmetr)
🌡️ DS18B20 (teplota)
📡
ESP-NOW
🔐 AES-128

🖥️ ESP32 Příjemce

Webové rozhraní:
Obývák: 22.5°C, 250 lux
Garáž: 18.2°C, 45 lux

📡 ESP32 #11

ID: 11
Místo: Garaz
MAC: 24:6F:28:...
🌡️ BH1750 (luxmetr)
🌡️ DS18B20 (teplota)
📡 → 🔐 →

✨ Klíčové výhody:

📏 Dosah: až 200m
Latence: < 10ms
🔋 Spotřeba: nízká
🔐 Šifrování: AES-128
🆔 Identifikace: automatická
🌐 Bez routeru: přímá komunikace

📊 Aktualizovaná struktura dat

typedef struct { uint8_t device_id; // 🆔 ID zařízení (1-255) - pro rozpoznání odesílatele char location[20]; // 🏠 Název místa (max 19 znaků) - např. "Garaz", "Obyvak" float lux; // Hodnota osvětlení v luxech (0.0 - 100000.0) float temperature; // Teplota v °C (-55.0 - 125.0, nebo -999.0 = neplatná) char category[30]; // Textový popis osvětlení (např. "Pokojové osvětlení") uint32_t timestamp; // Časová značka v milisekundách od startu ESP32 uint8_t battery_level; // Úroveň baterie v % (0-100, aktuálně vždy 100) bool bh1750_available; // true = BH1750 luxmetr je připojen a funkční bool ds18b20_available; // true = DS18B20 teplota je připojena a funkční } sensor_data_t;

🔄 Jak funguje odesílání dat

⏱️ Časování odesílání

  • Frekvence: Každou 1 sekundu
  • Podmínka: Pouze pokud je alespoň jeden senzor připojen
  • Dual-core: Běží na Core 1 (nezávisle na webovém rozhraní)
  • Priorita: Vysoká - minimální latence

📡 Odesílaná data

  • lux: Aktuální hodnota luxů (při výpadku poslední validní hodnota)
  • temperature: Aktuální teplota (při výpadku poslední validní hodnota)
  • category: "Pokojové osvětlení", "Tmavé" atd.
  • timestamp: Čas od startu ESP32
  • battery_level: Vždy 100% (napájení z USB)
  • *_available: Které senzory jsou funkční

📋 Příklady odesílaných dat

🔹 Oba senzory připojeny:

{ lux: 245.83, temperature: 23.45, category: "Pokojové osvětlení", timestamp: 12345678, battery_level: 100, bh1750_available: true, ds18b20_available: true }

🔹 Pouze BH1750 luxmetr:

{ lux: 1250.67, temperature: 23.45, // Poslední validní hodnota DS18B20 (cache) category: "Jasné osvětlení", timestamp: 12345678, battery_level: 100, bh1750_available: true, ds18b20_available: false // DS18B20 dočasně nedostupný }

🔹 Pouze DS18B20 teplota:

{ lux: 45.20, // Poslední validní hodnota BH1750 (cache) temperature: 25.12, category: "Nízké osvětlení", timestamp: 12345678, battery_level: 100, bh1750_available: false, // BH1750 dočasně nedostupný ds18b20_available: true }

📡 Příklad kódu pro příjemce

#include <esp_now.h> #include <WiFi.h> // PMK klíč (zkopírujte z webového rozhraní) uint8_t pmk_key[16] = {0x2B,0x7E,0x15,0x16,0x28,0xAE,0xD2,0xA6, 0xAB,0xF7,0x15,0x88,0x09,0xCF,0x4F,0x3C}; // Struktura dat (stejná jako na odesílateli) typedef struct { float lux; float temperature; char category[30]; uint32_t timestamp; uint8_t battery_level; bool bh1750_available; bool ds18b20_available; } sensor_data_t; // Callback pro příjem dat s rozpoznáním zařízení void onDataReceived(const esp_now_recv_info_t *recv_info, const uint8_t *data, int data_len) { sensor_data_t receivedData; memcpy(&receivedData, data, sizeof(receivedData)); // 🔍 Rozpoznání zařízení podle MAC adresy char macStr[18]; snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X", recv_info->src_addr[0], recv_info->src_addr[1], recv_info->src_addr[2], recv_info->src_addr[3], recv_info->src_addr[4], recv_info->src_addr[5]); // 🏠 Rozpoznání podle Device ID a názvu místa Serial.printf("📡 Data z: MAC=%s, ID=%d, Místo=%s\n", macStr, receivedData.device_id, receivedData.location); // 📊 Zpracování dat podle konkrétního zařízení switch(receivedData.device_id) { case 11: Serial.printf("🏠 GARÁŽ: "); break; case 1: Serial.printf("🏠 OBÝVÁK: "); break; case 2: Serial.printf("🏠 LOŽNICE: "); break; default: Serial.printf("🏠 %s (ID=%d): ", receivedData.location, receivedData.device_id); break; } // Zobrazení naměřených dat if (receivedData.bh1750_available) { Serial.printf("💡 %.2f lx (%s)", receivedData.lux, receivedData.category); } if (receivedData.bh1750_available && receivedData.ds18b20_available) { Serial.print(", "); } if (receivedData.ds18b20_available) { Serial.printf("🌡️ %.2f °C", receivedData.temperature); } Serial.printf(" | ⏰ %lu ms\n", receivedData.timestamp); // Zpracování dat podle potřeby processReceivedData(receivedData); }

🎯 Praktický příklad kompletního nastavení

📋 Scénář: Monitoring domu

  • ESP32 #1: ID=1, Místo="Obyvak"
  • ESP32 #2: ID=2, Místo="Loznice"
  • ESP32 #11: ID=11, Místo="Garaz"
  • ESP32 #15: ID=15, Místo="Sklep"

⚙️ Postup nastavení

  1. Nahrajte kód na všechna ESP32
  2. Připojte k WiFi
  3. Na každém nastavte Device ID a Místo
  4. Na příjemci získejte MAC adresu
  5. Na všech odesílatelích nastavte MAC příjemce
  6. Aktivujte šifrování na všech zařízeních

📺 Výsledek na sériovém monitoru příjemce

📡 Data z: MAC=24:6F:28:AB:CD:EF, ID=1, Místo=Obyvak 🏠 OBÝVÁK: 💡 250.50 lx (Pokojové osvětlení), 🌡️ 22.30 °C | ⏰ 123456 ms 📡 Data z: MAC=24:6F:28:12:34:56, ID=11, Místo=Garaz 🏠 GARÁŽ: 💡 45.20 lx (Nízké osvětlení), 🌡️ 18.50 °C | ⏰ 789012 ms 📡 Data z: MAC=24:6F:28:78:9A:BC, ID=2, Místo=Loznice 🏠 LOŽNICE: 💡 10.80 lx (Tma), 🌡️ 20.10 °C | ⏰ 345678 ms
// Funkce pro zpracování přijatých dat void processReceivedData(sensor_data_t data) { // Příklad zpracování dat if (data.bh1750_available) { // Uložení dat o osvětlení float luxValue = data.lux; String luxCategory = String(data.category); // Zde můžete přidat vlastní logiku if (luxValue < 50) { Serial.println("⚠️ Nízké osvětlení - zapnout světla?"); } } if (data.ds18b20_available) { // Uložení teplotních dat float tempValue = data.temperature; // Zde můžete přidat vlastní logiku if (tempValue > 30) { Serial.println("🔥 Vysoká teplota - zapnout ventilaci?"); } else if (tempValue < 15) { Serial.println("❄️ Nízká teplota - zapnout topení?"); } } } void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); // Inicializace ESP-NOW esp_now_init(); // Nastavení PMK klíče pro šifrování esp_now_set_pmk(pmk_key); // Registrace callback esp_now_register_recv_cb(onDataReceived); // Přidání odesílatele s šifrováním esp_now_peer_info_t peerInfo; memcpy(peerInfo.peer_addr, odesílatel_MAC, 6); peerInfo.channel = 0; peerInfo.encrypt = true; // Zapnout šifrování esp_now_add_peer(&peerInfo); }

🛠️ Praktické využití přijatých dat

🏠 Automatizace domácnosti

if (data.bh1750_available && data.lux < 50) { digitalWrite(LED_PIN, HIGH); // Zapnout světla } if (data.ds18b20_available) { if (data.temperature > 25) { digitalWrite(FAN_PIN, HIGH); // Zapnout ventilátor } else if (data.temperature < 18) { digitalWrite(HEAT_PIN, HIGH); // Zapnout topení } }

📊 Ukládání do databáze

void saveToDatabase(sensor_data_t data) { String query = "INSERT INTO sensors VALUES ("; query += String(data.timestamp) + ","; if (data.bh1750_available) { query += String(data.lux, 2) + ",'" + data.category + "',"; } else { query += "NULL,NULL,"; } if (data.ds18b20_available) { query += String(data.temperature, 2); } else { query += "NULL"; } query += ")"; // Odeslat do MySQL/SQLite }

📈 Formáty dat pro různé účely

Pole Typ Rozsah Význam
lux float 0.0 - 100000.0 Intenzita osvětlení v luxech
temperature float -55.0 - 125.0 Teplota v °C (-999.0 = neplatná)
category char[30] String "Tmavé", "Pokojové", "Jasné" atd.
timestamp uint32_t 0 - 4294967295 Milisekundy od startu ESP32
battery_level uint8_t 0 - 100 Procenta baterie (vždy 100)
bh1750_available bool true/false Je luxmetr připojen?
ds18b20_available bool true/false Je teplotní senzor připojen?
ds18b20_outage bool true/false Výpadek DS18B20, ale teplota je držena z cache
ds18b20_last_valid_age_ms uint32_t 0+ Stáří poslední validní teploty v milisekundách

🔍 Debugging ESP-NOW komunikace

📟 Výpis na sériovém monitoru (odesílatel)

🔐 ESP-NOW AES-128 Send: ✅ Success ESP-NOW data odeslána: 245.83 lx, 23.45 °C Osvětlení: 245.83 lx Kategorie: Pokojové osvětlení Teplota: 23.45 °C WiFi IP: 192.168.1.100 ESP-NOW: 🔐 Aktivní + AES-128 šifrování 📊 BH1750 luxmetr + DS18B20 teplota

📥 Výpis na sériovém monitoru (příjemce)

📡 ESP-NOW přijato: 💡 245.83 lx (Pokojové osvětlení), 🌡️ 23.45 °C | Čas: 12345678 ms, Baterie: 100% ⚠️ Nízké osvětlení - zapnout světla? 🔥 Vysoká teplota - zapnout ventilaci?

🚨 Časté problémy a řešení

Problem: ESP-NOW data se neodesílají
Řešení:
Problem: Příjemce neobdrží data
Řešení:
💡 Debug tipy:
• Sledujte sériový monitor na obou zařízeních současně
• Použijte různé baud rates (115200 je doporučeno)
• Zkontrolujte sílu WiFi signálu - ESP-NOW používá stejný kanál
• Testujte nejprve bez šifrování, pak přidejte AES-128
⚠️ Důležité pro šifrování:
• Všechna ESP32 musí mít STEJNÝ PMK klíč
• Na příjemci nastavte peerInfo.encrypt = true
• Po změně klíče restartujte všechna zařízení

🔄 Využití a spolupráce s dalšími ESP32

🏠 Scénáře použití

🌡️ Domácí meteorologická stanice

Více ESP32 s různými senzory (teplota, vlhkost, tlak) odesílá data na centrální jednotku.

🏭 Průmyslový monitoring

Monitoring osvětlení v různých částech budovy s centrálním sběrem dat.

🌱 Smart Garden

Monitoring světelných podmínek pro automatické řízení osvětlení rostlin.

🔬 Vědecké měření

Dlouhodobé sběr dat o osvětlení s vysokou přesností a automatickým ukládáním.

🔗 Síťové topologie

⭐ Hvězdicová topologie (doporučená)

ESP32-LUX (Master) ←--→ Router WiFi ←--→ Internet ↑ ESP-NOW komunikace ↓ ESP32-A (Slave) ESP32-B (Slave) ESP32-C (Slave) [Teplota] [Vlhkost] [Tlak]

🔄 Mesh síť (pokročilá)

ESP32-A ←--→ ESP32-B ←--→ ESP32-C ↓ ↓ ↓ ESP32-D ←--→ ESP32-E ←--→ ESP32-F

🔧 Rozšíření aplikace

➕ Přidání dalších senzorů

Aplikace je připravena pro snadné rozšíření o další senzory:

// V detectAvailableSensors() přidat: dht22_available = testDHT22(); bme280_available = testBME280(); // V sensorTaskCode() přidat čtení: if (dht22_available) { float temp = dht.readTemperature(); float hum = dht.readHumidity(); // Uložit do mutex chráněných proměnných } // V JSON API přidat: doc["temperature"] = currentTemperature; doc["humidity"] = currentHumidity;

💾 Ukládání dat

📱 Mobilní aplikace

JSON API umožňuje vytvoření mobilních aplikací:

// GET http://ESP32_IP/api/data { "lux": 245.83, "temperature": 23.45, "category": "Pokojové osvětlení", "sensor_status": "BH1750 luxmetr + DS18B20 výpadek (poslední hodnota)", "bh1750_available": true, "ds18b20_available": false, "ds18b20_outage": true, "ds18b20_last_valid_age_ms": 42000, "api_mutex_timeout": false, "timestamp": 12345678, "uptime": 3600 }

⚙️ Technické specifikace

Mikrokontrolér:
ESP32 Dev Module (Dual-Core 240MHz)
Paměť:
520KB SRAM, 4MB Flash, SPIFFS
WiFi:
802.11 b/g/n, 2.4GHz, WPA2/WPA3
ESP-NOW:
2.4GHz, dosah 200m, AES-128 šifrování
I2C:
100kHz, GPIO21 (SDA), GPIO22 (SCL)
BH1750:
0.11-100000 lx, 16-bit rozlišení
DS18B20:
-55°C až +125°C, rozlišení 0.0625°C
Webserver:
AsyncWebServer, JSON API, Basic Auth
Spotřeba:
~150mA (WiFi + senzor + ESP-NOW)

📊 Výkonové charakteristiky

Parametr Hodnota Poznámka
Frekvence měření 0.5 Hz (každé 2s) Konfigurovatelné v kódu
ESP-NOW odesílání 0.1 Hz (každých 10s) Nezávislé na web rozhraní
Web refresh 0.5 Hz (každé 2s) JavaScript auto-refresh
Historie měření 20 hodnot Kruhový buffer v RAM
Webový response < 100ms Díky dual-core architektuře
ESP-NOW latence < 10ms Přímá komunikace bez routeru

🛠️ Řešení problémů

❌ Časté problémy a řešení

Problem: ESP32 nevytvoří AP síť "EASUN-LUX"
Řešení:
Problem: BH1750 senzor není detekován
Řešení:
Problem: ESP-NOW komunikace nefunguje
Řešení:
💡 Debug tipy:
• Sledujte sériový monitor (115200 baud)
• Použijte web browser developer tools (F12)
• Zkontrolujte JSON API endpoint: /api/data
• Status report se zobrazuje každých 60 sekund