Databáze pro IoT

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

Fotogalerie

Štítky: , , , ,