Cíle
Pro svou meteostanici WH1080 a další zdroje dat – například Arduino s meteo čidly apod. – jsem potřeboval unifikované úložiště, do kterého bych nasměroval veškerá data a měl možnost snadno data prohlížet. Celé to mělo být koncipováno dostatečně univerzálně, aby v rámci jednoho systému bylo možné shromažďovat data z libovolných čidel – prostě IoT ready.
Popis
Vzhledem k tomu, že jednou z mých hlavních náplní práce v mém současném zaměstnání je práce s databázemi, začal jsem s tímto projektem od databáze. V MySQL jsem navrhl strukturu databáze sestávající z pouhých dvou tabulek:
- Sensor … číselník čidel. V zásadě jde o seznam všech čidel, ke kterým je možné přiřadit nějakou okamžitou hodnotu.
- Reading … načtené hodnoty. Do této tabulky se ukládá hodnota a existuje z ní relace do tabulky čidel.
Později z důvodu výkonu vznikla potřeba data archivovat a mít možnost efektivně pracovat s průměry. Vznikly tedy další tabulky:
- ReadingArchive … sem se archivují hodnoty z tabulky Reading po třech měsících.
- StatsDaily … do této tabulky cron job každou noc napočítá min, max a průměr pro každé z čidel. Pokud tedy budu potřebovat pracovat se statistikami s granularitou jednoho dne, stačí pracovat s touto tabulkou, která neobsahuje mnoho dat.
A po tom, co jsem do celého systému přidal už příliš mnoho čidel, bylo nutné nějak zobrazení filtrovat. Vznikly proto tzv. skupiny, v rámci kterých je možné sdružovat jednotlivá čidla a zobrazit tak výstup jen z části dat. Sestává z tabulek:
- Group … „hlavičky“ skupin, tj. základní pojmenování a popis.
- GroupSensorMapping … vazební tabulka pro relaci m:n mezi tabulkou čidel (Sensor) a skupin (Group).
A jak vlastně data plním? Zdroje mám v současné době tři:
- Arduino, na kterém jsou čidla hlavně pro skleník: DS18B20 (teplota půdy), DHT22 (vlhkost a teplota vzduchu), BMP180 (barometrický tlak + teplota v boxu s arduinem). Arduino data posílá po ethernetu a volá triviální webovou stránku a hodnoty čidel ukládá POST funkcí. Stránka následně POST zvaliduje a uloží do MySQL i s timestampem.
- RTL-SDR přijímač na Raspberry Pi, který prostřednictvím programu rtl_433 „poslouchá“ na 868MHz a vyčítá data z venkovní jednotky stanice WH1080. Ukládá přímo do MySQL, parsováním výstupu programu rtl_433 pomocí Pythonu.
- Skriptíky v pythonu na jednom z mých SDR serverů (opět RPi), které čtou z čidla DS18B20 připojených přímo na GPIO po 1wire sběrnici. Ukládají přímo do MySQL.
Status projektu
Dokončeno, rutinní provoz.
Zdroje
- HighCharts … www.highcharts.com
- rtl_433 … github.com/merbanan/rtl_433