úterý 31. srpna 2021

TinyHA: centrální jednotka s RPi Zero

Centrálním mozkem celého systému je Raspberry Pi Zero W. Dnes už bych asi vše řešil embedded cestou s vhodnou bránou připojenou k hlavnímu serveru (což je u mě historický thin klient od HP s Debianem), nicméně dříve jsem místo něj měl jen NAS, takže samostatné řešení bylo vhodnější.

K RPi Zero jsem navrhl "hat". V uvozovkách proto, že rozšiřující hat destičky obvykle přidávají nějakou funkci či rozšíření a jsou maličké. Můj "hat" je víc než dvojnásobný než RPi Zero a vytahuje z GPIO konektoru vše myslitelné. Je na něm spínaný zdroj, oddělené vstupy, reléové výstupy, budič pro linku RS485, konektor pro SPI a I2C rozhraní, EEPROM paměť a řadič pro 1wire sběrnici. Bohužel UART na RPi nemá možnost řízení směru nutného pro RS485, proto je tato funkce realizována časovačem 555. Funguje spolehlivě pro jednu nastavenou rychlost komunikace, v případě změny se musí upravit časová konstanta.

Veškerá datová kabeláž se sbíhá v jedné místnosti, miniaturní serverovně neboli "špajzce". Pro propojení jsem využil levné patch panely po 8 pozicích, s postupným rozšiřováním na současných 16 pozic a RPi modul plus další drobnosti. Vše je spojeno zařezávacími konektory Krone. Jejich nacvaknutí je při použití správného nástroje snadné, spolehlivost výborná. Tedy dokud neřešíte stejně jako já problém dvou drátů v jedné svorce, to se sice dá, ale spolehlivost je rapidně horší.

Ne všechna kabeláž vede přes RPi, např. zvonek je nezávislý a do RPi vede jen jako vstup pro záznam událostí. Plexi kryt se ukázal jako nutnost před průzkumnými operacemi mých dětí.

Co tedy běží na samotném RPi Zero? Klasický Raspbian Lite (resp. nověji Raspberry Pi OS Lite), na kterém je systemd, apache, php, sqlite3, rrdtool. Prakticky vše je naskriptováno v php, což rozhodně není ideální řešení - mnohem vhodnější by byl např. python, jenže php jsem uměl a tak to bylo nejjednodušší k použití. Tedy aspoň jsem si to myslel, než jsem začal řešit problémy se sériovým portem...

Základní web je udělaný s využitím Bootstrapu, což je velká výhoda z hlediska jeho použitelnosti jak na PC, tak na mobilech. Data vhodná pro prezentaci formou grafů se ukládají do RRD databází, ze kterých se pak generují grafy v rámci cronu.

GPIO jsou inicializovány skriptem tinyha-init po startu. Následně se spustí na pozadí další skripty. Skript tinyha-busupdate zajišťuje komunikaci po RS485 a periodicky se dotazuje všech možných slave zařízení, aby z nich mohl generovat grafy a prezentovat jejich aktuální stav. Skript tinyha-doorbell čeká na hranu signálu tlačítka zvonku, aby mohl zalogovat událost (aneb konec věčných hádek, zda pošťačka zvonila či ne). Skript tinyha-onewire slouží ke sběru teplot z čidel připojených na 1wire sběrnici. Skript tinyha-pingupdate jednou za čas pingne přes síť (no dobře, přes wifinu, protože RPi Zero nemá ethernet) všemožná zařízení v domácí síti a aktualizuje jejich online stav. Skript tinyha-nibeupdate slouží k připojení do Nibe API, díky kterému můžu monitorovat stav tepelného čerpadla.