Začíná bazénová sezóna, a tak je nejvyšší čas oprášit a aktualizovat bazénový teploměr. Původní verze odesílala naměřená data na ThingSpeak, ale po zkušenostech s monitoringem solárního parapetu jsem se rozhodl vytvořit novou verzi ve stejném duchu – tentokrát s ukládáním a zobrazováním dat na vlastním hostingu.

Hardware
Teploměr je postavený na modulu NodeMCU s procesorem ESP8266. Modul je připájený na kousku univerzální DPS, na které je kromě něj ještě odporový trimr 10 kΩ a připojení pro teplotní čidla DS18B20.
Trimr je potřeba nastavit tak, aby komunikace s čidly po 1-Wire sběrnici fungovala spolehlivě. Datová linka čidel je připojená na pin D2. Napájení je řešené jednoduše přes USB port.
Celá deska je umístěná v rozvaděči, který ovládá filtraci bazénu. Tento rozvaděč jsem podrobněji popisoval už v samostatném článku.


Software
Softwarová část je rozdělená na dvě části. První běží přímo v modulu ESP8266 a stará se o měření teploty a odesílání dat. Druhá část běží na webu, kde data přijímá, ukládá a zobrazuje.
Program pro ESP8266
Program pro ESP8266 má na starosti čtení dvou teplotních čidel DS18B20. Jedno čidlo měří teplotu vody v bazénu, druhé teplotu vzduchu ve stínu.
Po spuštění se ESP8266 nejprve pokusí připojit k uložené Wi-Fi síti. Aby nebylo nutné Wi-Fi údaje zadávat přímo do programu, je použitý konfigurační režim. Pokud modul nemá uložené připojení, nebo se konfigurace ručně vynutí (spojením GND a D7 při startu), ESP vytvoří vlastní Wi-Fi síť. Po připojení mobilem nebo počítačem se otevře jednoduchá konfigurační stránka, kde jde nastavit Wi-Fi síť, heslo, adresa PHP skriptu na webu, bezpečnostní token a interval odesílání.
Díky tomu není potřeba při změně Wi-Fi sítě znovu nahrávat program do ESP. Stačí spustit konfigurační režim, zadat nové údaje a zařízení pak dál běží samostatně.
Samotné měření probíhá jednoduše. ESP načte teplotu z obou čidel, zkontroluje, jestli jsou hodnoty platné, a potom je odešle na web pomocí HTTP požadavku. V mém případě je interval nastavený na 5 minut, což je pro měření teploty bazénové vody úplně dostačující. Voda mění teplotu pomalu, takže kratší interval by zbytečně zatěžoval web i samotné zařízení.
Odesílaná data obsahují hlavně:
teplotu vody
teplotu vzduchu
sílu Wi-Fi signálu
název zařízení
bezpečnostní token
Sílu Wi-Fi signálu jsem si do dat přidal hlavně pro kontrolu. Pokud by se zařízení chovalo nespolehlivě, dá se podle RSSI poznat, jestli není problém ve slabém signálu.
Konfigurační mód
Po aktivaci konfiguračního režimu si teploměr vytvoří vlastní Wi-Fi síť s názvem BazenTeplomer-setup. Stačí ji v telefonu vyhledat, připojit se k ní a zadat heslo bazen1234.

Poté stačí v nastavení připojené Wi-Fi zvolit možnost Správa směrovače nebo podobnou položku podle konkrétního telefonu. Tím se otevře konfigurační stránka teploměru.

Na konfigurační stránce zvolíme možnost Configure WiFi, pomocí které provedeme vlastní nastavení připojení.
K dispozici je také položka Info, kde si můžete zobrazit technické informace o samotném ESP modulu.

Vlastní nastavení je jednoduché. V horní části stránky se zobrazí seznam nalezených Wi-Fi sítí. Stačí kliknout na vybraný název a ten se automaticky doplní do pole SSID. Poté už jen zadáme heslo k síti.
Dále je potřeba vyplnit správnou URL adresu, na které běží přijímací PHP skript, a zadat token. Ten musí být stejný jako token nastavený v PHP skriptu, jinak se data neuloží.
Následuje nastavení intervalu v sekundách, tedy jak často bude teploměr odesílat naměřené hodnoty. Poslední volbou je Prohodit čidla. Ta se hodí v případě, že ESP načte čidla v opačném pořadí, než jsou fyzicky umístěná. Díky tomu je lze jednoduše programově prohodit bez nutnosti přepojování.
Nakonec nastavení uložíme tlačítkem Save.

Proběhne uložení nastavení a ESP by se mělo připojit k zadané Wi-Fi síti. Pokud je ale špatně zadané heslo nebo název sítě, ESP se nepřipojí a automaticky znovu přejde do konfiguračního režimu.

Odesílání dat na web
ESP posílá data na web pomocí jednoduchého GET požadavku. Výhodou je, že na straně webu stačí obyčejný PHP skript. Není potřeba žádná databáze ani složitý server.
Adresa požadavku může vypadat například takto:
pridej.php?token=XXX&device=bazen_esp8266&t_water=24.6&t_air=27.1&rssi=-61
Token slouží jako jednoduchá ochrana proti tomu, aby do souboru nemohl zapisovat kdokoliv. Pokud token nesouhlasí, PHP skript požadavek odmítne a nic neuloží.
PHP skript pro příjem dat
Na webu je první PHP skript, který přijímá data z ESP. Ten zkontroluje token, přečte odeslané hodnoty a uloží je do CSV souboru.
CSV soubor má jednoduchou strukturu:
time;device;t_water;t_air;rssi;ip;remote_ip
Každý řádek odpovídá jednomu měření. Ukládá se čas, název zařízení, teplota vody, teplota vzduchu a síla Wi-Fi signálu. IP adresa se sice může uložit pro případné ladění, ale na výsledné stránce ji nezobrazuji.
Pro tento projekt mi CSV soubor bohatě stačí. Data jsou jednoduchá, měření probíhá jen jednou za několik minut a není potřeba řešit databázi. Navíc se CSV dobře zálohuje, upravuje a dá se kdykoliv otevřít třeba v Excelu nebo LibreOffice Calcu.
Zobrazení dat na webu
Druhá PHP stránka slouží k zobrazení naměřených hodnot. Při načtení stránky si přečte CSV soubor, najde poslední záznam a z něj zobrazí aktuální stav.

Na stránce jsou vidět hlavní hodnoty:

Stav zařízení se určuje podle stáří posledního záznamu. Pokud přišla data nedávno, zařízení je označené jako online. Pokud delší dobu nic nepřišlo, stránka ukáže zpoždění nebo offline stav. Díky tomu je hned vidět, jestli teploměr stále komunikuje.
Grafy
Pro přehlednější sledování vývoje teplot jsou na stránce dva grafy. Jeden zobrazuje teplotu vody a druhý teplotu vzduchu. Grafy jsou oddělené, protože voda i vzduch se chovají jinak. Teplota vzduchu se během dne mění rychleji, zatímco voda reaguje pomaleji a její průběh je plynulejší.

Nad grafy jsou tlačítka pro výběr období:

Díky tomu se dá rychle podívat jak na aktuální den, tak i na delší vývoj. Pro běžnou kontrolu používám hlavně zobrazení za posledních 24 hodin.
Závěr
Celé řešení je schválně jednoduché. ESP8266 jen měří a posílá data. Web je přijme, uloží do CSV a zobrazí. Není potřeba žádná externí služba, žádný cloud a žádná databáze. Všechna data mám uložená přímo na svém webu a můžu si stránku upravit přesně podle sebe.
Oproti původní verzi teploměru je tohle řešení praktičtější. Data se neodesílají na cizí službu, ale přímo na můj web. Zároveň můžu stejný princip použít i pro další podobné projekty, kde stačí pravidelně měřit nějakou hodnotu a ukládat ji do jednoduchého CSV souboru.
