EaSun Multi-Senzor v2.16

Jednotný firmware pro ESP32 Dev i ESP32-C3 · BH1750 · DS18B20 · DHT22 · ESP-NOW auto-sync · OTA · mDNS · Watchdog · NTP · Web správa

Verze 2.16 | Aktualizace: 2026-08-02 | Vzdálená správa přes WiFi (bez nutnosti sériového monitoru)

✨ Co je nového ve v2.16

🧩 Jednotný firmware

Jeden projekt pro ESP32 Dev Module i ESP32C3 Dev Module. Piny a jádra se zvolí podle desky v Arduino IDE.

🔄 Auto-provisioning ESP-NOW

Nový vysílač po WiFi stáhne z masteru PMK, šifrování a MAC příjemců (/api/espnow-config).

📶 OTA přes web

Menu OTA — nahrání .bin přes WiFi. Vyžaduje partition scheme s OTA (4MB flash).

🌐 Vzdálená správa

WiFi/AP startuje před senzory. AP EASUN-MULTIhttp://192.168.4.1. Po připojení: http://easun.local.

📡 Kontrola shody sítě

Na hlavní stránce: kanál, PMK fingerprint, master IP, sync status, odesláno / chyby.

📖 Návod v zařízení

Odkaz ?/navod: ESP-NOW, OTA a Home Assistant (REST /api/data).

Architektura systému (přehled)

flowchart TB
  subgraph LAN["Domácí WiFi síť"]
    R[Router]
    M["Master EaSun
např. 192.168.1.44"] S["Další vysílač
např. 192.168.1.93"] RX["Příjemce ESP-NOW
MAC v konfiguraci"] PC["Telefon / PC
web + OTA"] end R --- M R --- S R --- PC M -->|"HTTP /api/espnow-config
PMK + MAC příjemců"| S M -->|"ESP-NOW 1×/s
stejný PMK + kanál"| RX S -->|"ESP-NOW 1×/s
stejný PMK + kanál"| RX PC -->|"http://easun.local
nebo IP"| M PC -->|"http://IP"| S
Důležité: Vysílače si mezi sebou senzorová data neposílají. Oba vysílají na stejného příjemce. Shoda = stejný PMK, stejný WiFi kanál, stejné MAC příjemců.

🚀 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 (/api/data) pro Home Assistant — bez Basic Auth.

📡 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

REST poll /api/data (bez Auth): lux, DS18B20, DHT22 teplota/vlhkost, dostupnost čidel, device_location / MAC.

🔧 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 nebo
ESP32-C3 Dev Module
Senzory:
BH1750 luxmetr (I2C)
DS18B20 teplota (OneWire)
DHT22 teplota/vlhkost
Napájení:
5V USB nebo 3.3V externí
Flash: 4MB (pro OTA)
Arduino IDE:
Board = ESP32 Dev / ESP32C3
Partition: Minimal SPIFFS
(1.9MB APP with OTA)

Výběr desky → automatické piny

flowchart LR
  IDE["Arduino IDE
Tools → Board"] --> DEV["ESP32 Dev Module"] IDE --> C3["ESP32C3 Dev Module"] DEV --> P1["I2C SDA21 / SCL22
DS18B20: 4,13,14
DHT22: 5,18,19
dual-core"] C3 --> P2["I2C SDA8 / SCL9
DS18B20: 4,5,6
DHT22: 5,6,7
single-core + USB CDC On"]

🔌 Zapojení senzorů (podle desky)

💡 BH1750 Luxmetr (I2C)

BH1750 Pin ESP32 Dev ESP32-C3 Popis
VCC 3.3V 3.3V Napájení senzoru
GND GND GND Společná zem
SDA GPIO21 GPIO8 I2C data
SCL GPIO22 GPIO9 I2C clock
ADDR GND GND I2C adresa 0x23

🌡️ DS18B20 Teplotní senzor (OneWire)

DS18B20 Pin ESP32 Dev ESP32-C3 Popis
VCC 3.3V 3.3V Napájení
GND GND GND Zem
DATA GPIO 4 / 13 / 14 GPIO 4 / 5 / 6 Výchozí GPIO4 + 4.7kΩ pull-up

🌡️💧 DHT22

DHT22 Pin ESP32 Dev ESP32-C3 Popis
VCC 3.3V 3.3V Napájení
GND GND GND Zem
DATA GPIO 5 / 18 / 19 GPIO 5 / 6 / 7 Výchozí GPIO5 + 4.7kΩ pull-up

💻 Instalace a nahrání

  1. Otevřete složku ESP32-LUX14-C3 v Arduino IDE
  2. Tools → Board: ESP32 Dev Module nebo ESP32C3 Dev Module
  3. Flash Size: 4MB; Partition: Minimal SPIFFS (1.9MB APP with OTA)
  4. ESP32-C3: USB CDC On Boot = Enabled
  5. První nahrání vždy USB (poté lze OTA)

🛜 První připojení (bez sériového monitoru)

  1. Na telefonu hledejte WiFi EASUN-MULTI (bez hesla, 2.4 GHz)
  2. Otevřete http://192.168.4.1
  3. Vyberte domácí WiFi, heslo, případně IP masteru
  4. Po restartu: http://easun.local nebo IP z routeru

Start zařízení (pořadí bootu)

sequenceDiagram
  participant U as Uživatel
  participant E as EaSun
  participant AP as AP EASUN-MULTI
  participant W as Domácí WiFi
  E->>E: Watchdog + SPIFFS
  alt Nemá SSID / WiFi fail
    E->>AP: SoftAP 192.168.4.1
    U->>AP: Připojení telefonem
    U->>E: Uložení WiFi (+ master IP)
    E->>E: Restart
  else Má SSID
    E->>W: STA připojení
    E->>E: mDNS easun.local
    E->>E: Senzory + ESP-NOW + Web
    opt Auto-sync a prázdní příjemci
      E->>E: GET master /api/espnow-config
    end
  end
                    
Poznámka: WiFi/AP startuje před senzory, aby hang na I2C/OneWire nezablokoval vzdálený přístup.

📚 Požadované knihovny

ArduinoJson (verze 6.x) ESPAsyncWebServer AsyncTCP OneWire DallasTemperature DHT sensor library (ESP32 core: WiFi, SPIFFS, Update/OTA, ESPmDNS, esp_now)

🔄 Master vysílač a přidání dalšího zařízení

Stejný firmware na všechny EaSun. Master = první vysílač s nastaveným ESP-NOW. Další zařízení stáhnou config po síti.

1) Master (např. 192.168.1.44)

  1. Nahrajte firmware, nastavte WiFi (master IP nechte prázdné)
  2. ESP-NOW → zadejte MAC příjemce (jeden i více řádků)
  3. Šifrování → zkontrolujte / vygenerujte PMK
  4. Ověřte: http://MASTER_IP/api/espnow-config → JSON s "configured": true

2) Další vysílač (např. 192.168.1.93)

  1. Stejný firmware, WiFi + vyplňte IP masteru
  2. Nebo později: ESP-NOW → Master IP → Stáhnout ESP-NOW config
  3. Nastavte vlastní Device ID a název místa
  4. Na hlavní stránce porovnejte PMK fingerprint a kanál s masterem

Auto-sync (HTTP provisioning)

sequenceDiagram
  participant N as Nový vysílač
  participant M as Master
  participant R as Příjemce
  N->>N: Uložena master IP
  N->>M: GET /api/espnow-config
  alt 404
    M-->>N: Starý firmware / špatná IP
  else configured false
    M-->>N: Master ještě nemá MAC příjemců
  else OK
    M-->>N: PMK + encryption + receivers + mode
    N->>N: Uložit SPIFFS + initESPNOW
    N->>R: ESP-NOW data 1×/s
    M->>R: ESP-NOW data 1×/s
  end
                    
HTTP 404 při sync: Master nemá nový firmware, nebo máte špatnou IP masteru. Ověřte JSON přímo v prohlížeči na masteru.

Jak poznat, že jsou „na stejné síti“

KontrolaKdeOčekávání
PMKŠifrování / hlavní stránkaStejný klíč / fingerprint
KanálESP-NOW detailyStejné číslo (stejná WiFi)
MAC příjemcůESP-NOWStejný seznam
OdeslánoHlavní stránkaČítač roste
SyncESP-NOWOK: N příjemců…
PříjemceAplikace příjemceData z obou Device ID

📶 OTA — vzdálená aktualizace

Menu OTA na zařízení. Funguje na ESP32 Dev i ESP32-C3 při OTA partition schemě.

  1. Arduino IDE: Sketch → Export compiled Binary (stejná deska jako cíl)
  2. Na zařízení otevřete /ota
  3. Nahrajte soubor *.ino.bin
  4. Po úspěchu se zařízení samo restartuje

OTA tok

flowchart LR
  A["Export .bin
Arduino IDE"] --> B["Web /ota
upload"] B --> C["Zápis do
neaktivní OTA partition"] C --> D["Restart"] D --> E["Nový firmware běží"]
SPIFFS nastavení (WiFi, PMK, MAC…) zůstává. První flash USB musí použít OTA-capable partitions (partitions.csv / Minimal SPIFFS with OTA).

⚡ 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ždou 1 sekundu
  • 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:
    ESP vytvoří WiFi síť EASUN-MULTI (bez hesla, 2.4 GHz)
  2. Připojení k AP:
    Připojte telefon/PC k síti EASUN-MULTI
  3. Konfigurace WiFi:
    Otevřete http://192.168.4.1
  4. Nastavení:
    Domácí WiFi + heslo (+ volitelně IP master vysílače)
  5. Po restartu:
    http://easun.local nebo IP z routeru — bez přihlášení

📱 Funkce webového rozhraní

Stránka URL Popis
🏠 Hlavní / Real-time data, grafy, historie měření
📡 ESP-NOW /espnow-config MAC příjemců, master IP, sync z masteru
🔐 Šifrování /encryption-config Správa AES-128 / PMK
📶 OTA /ota Vzdálená aktualizace firmwaru (.bin)
? /navod ESP-NOW, OTA, Home Assistant (/api/data)
🛜 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
🔄 ESP-NOW config API /api/espnow-config Provisioning pro nové vysílače (PMK + MAC)
📝 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

Jak to funguje

EaSun nespouští MQTT ani native HA integraci. Home Assistant si data sám stahuje přes HTTP z endpointu /api/data (platforma rest: v configuration.yaml). Stejná data jsou dostupná i z menu ? → odkaz /api/data na zařízení.

Přihlášení není vyžadováno — API je otevřené v lokální síti (Basic Auth je ve firmwaru vypnuté).

🎯 REST API

Kompletní JSON REST API pro Home Assistant a další automatizační systémy. Ověření: otevřete http://IP_ZARIZENI/api/data v prohlížeči — musí se zobrazit JSON.

📊 Dostupné API endpointy

🔗 /api/data

  • Senzory: lux, temperature, temperatures[], dht22_temperature, dht22_humidity, category
  • Identifikace: device_id, device_location, device_name, device_mac
  • Dostupnost: bh1750_available, ds18b20_available, dht22_available, ds18b20_outage
  • Síť / ESP-NOW: ip, hostname, wifi_channel, pmk_fingerprint, espnow_*
  • Systém: uptime, memory_free, board_type, fw_version, sensor_status

🔗 /api/error-log

  • Event logy: systémové události
  • Chyby: error reporting
  • Diagnostika: memory, WiFi, senzory
  • Časové značky: NTP 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_ready": true, "encryption_enabled": true, "wifi_channel": 6, "pmk_fingerprint": "A1B2C3D4...E5F60718", "espnow_master_ip": "192.168.1.44", "espnow_sync_status": "OK: 1 příjemců, PMK synchronizován", "espnow_total_sent": 150, "espnow_total_failed": 2, "ip": "192.168.1.93", "hostname": "easun.local", "board_type": "ESP32 Dev Module", "fw_version": "2.16" }

🏠 Home Assistant konfigurace

Přidejte do configuration.yaml (nahraďte IP). Bez authentication / username / password:

# REST senzory pro EaSun Multi-Senzor (bez Basic Auth) rest: - resource: "http://IP_ADRESA_ESP32/api/data" # případně: "http://easun.local/api/data" (jeden EaSun v síti) scan_interval: 30 sensor: - 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" - 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 DS18B20" 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 }} Teplota DHT22" unit_of_measurement: "°C" device_class: "temperature" state_class: "measurement" value_template: "{{ value_json.dht22_temperature | round(1) }}" icon: "mdi:thermometer" unique_id: "easun_{{ value_json.device_mac | replace(':', '_') }}_dht22_temp" - name: "{{ value_json.device_location }} Vlhkost DHT22" unit_of_measurement: "%" device_class: "humidity" state_class: "measurement" value_template: "{{ value_json.dht22_humidity | round(1) }}" icon: "mdi:water-percent" unique_id: "easun_{{ value_json.device_mac | replace(':', '_') }}_dht22_hum" - 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 }} DHT22" value_template: "{{ value_json.dht22_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 (názvy entit závisí na device_location) type: entities title: "EaSun Multi-Senzor" entities: - entity: sensor.obyvak_osvetleni name: "Osvětlení" - entity: sensor.obyvak_teplota_ds18b20 name: "Teplota DS18B20" - entity: sensor.obyvak_teplota_dht22 name: "Teplota DHT22" - entity: sensor.obyvak_vlhkost_dht22 name: "Vlhkost" - entity: sensor.obyvak_kategorie name: "Kategorie světla" - entity: binary_sensor.obyvak_bh1750 name: "BH1750" - entity: binary_sensor.obyvak_ds18b20 name: "DS18B20" - entity: binary_sensor.obyvak_dht22 name: "DHT22" --- type: history-graph entities: - entity: sensor.obyvak_osvetleni - entity: sensor.obyvak_teplota_ds18b20 - entity: sensor.obyvak_teplota_dht22 - entity: sensor.obyvak_vlhkost_dht22 hours_to_show: 24

🔄 Automatizace příklady

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 --- 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ě

✅ Identifikace

Každé EaSun má vlastní REST resource (vlastní IP) a identifikaci v JSONu:

  • device_id: 1–255 (web ESP-NOW)
  • device_location: název místa („Obývák“, „Ložnice“…)
  • device_mac: MAC ESP32 — vhodné pro unique_id

Pro každý EaSun přidejte samostatný blok - resource: "http://…/api/data". Hostname easun.local funguje spolehlivě jen když je v síti jeden EaSun.

⚙️ Nastavení krok za krokem

  1. Na zařízení ověřte /api/data (JSON v prohlížeči)
  2. Do configuration.yaml vložte rest: blok výše (bez Auth)
  3. Nahraďte IP_ADRESA_ESP32 skutečnou IP (z hlavní stránky EaSun)
  4. Restartujte Home Assistant / znovu načtěte YAML
  5. Přidejte entity do dashboardu a případně automatizace

⚠️ Důležité poznámky

  • Bez Basic Auth: API nevyžaduje username/password (lokální síť)
  • Scan interval: 15–60 s podle potřeby
  • Unique ID: MAC adresa pro stabilní entity napříč restarty
  • Chybějící čidlo: pole zůstane v JSONu; *_available je false
  • Návod na ESP: menu ? → sekce Home Assistant

📡 ESP-NOW komunikace s jinými ESP32

🎯 Co je ESP-NOW?

ESP-NOW je bezdrátový protokol Espressif pro přímou komunikaci mezi ESP zařízeními. V EaSun vysílač každou 1 s odesílá strukturu sensor_data_t na nakonfigurované MAC příjemců (unicast, více příjemců podporováno).

Tok dat vysílač → příjemce

flowchart TB
  subgraph TX["EaSun vysílač"]
    SEN["BH1750 / DS18B20 / DHT22"]
    WEB["Web / OTA / Log"]
    NOW["esp_now_send
1× za sekundu"] end subgraph NET["Stejný WiFi kanál + stejný PMK"] CH["Kanál z AP routeru
peerInfo.channel = 0"] end RX["Příjemce
peer encrypt = true
stejný PMK"] SEN --> NOW NOW --> CH --> RX WEB -.-> TX
Data se posílají jen pokud je připojené alespoň jedno čidlo. Nezapojená čidla se nečtou; status flagy v paketu říkají příjemci, co je platné.

🎯 Výhody ESP-NOW

⚡ Výhody ESP-NOW

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

🔐 AES-128 šifrování

  • Silné šifrování všech dat
  • Automatická správa klíčů
  • Webová správa PMK klíčů
  • Stejný PMK na všech EaSun + příjemci

🔧 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 (bez 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