Kostra hotové IoT aplikace pro ESP32 / ESP8266. A k tomu nějaký server… (4/4)

Poslední, co zbývá, je popsat serverovou stranu aplikace. Co umí a jak ji nainstalovat?

Funkce webové aplikace – co je vidět?

Webová aplikace kromě zajištění vlastního komunikačního kanálu samozřejmě umožňuje administrátorovi spravovat uživatele a uživateli spravovat svá zařízení. Přihlášený uživatel vidí seznam zařízení; detail zařízení včetně stavu všech jeho senzorů; seznam souborů, které zařízení poslalo…

Ve vlastnostech senzoru je možné si vykreslit graf hodnot z daného senzoru, prohlédnout statistiku nebo třeba nastavit si notifikace při překročení maxima nebo minima.

Největší kouzlo je však skryté v sekci Grafy. Zde je možné jednoduše definovat jednotlivé grafy. Grafy zde vytvořené vidí každý, kdo zná správné URL – součástí adresy je uživatelem určený bezpečnostní token. Všechny grafy, které mají nastavený stejný token, jsou zobrazovány jako jedna skupina, jsou provázané levým menu. Na ukázku možných výstupů se můžete podívat zde.

Základní „čárový graf“ má následující funkce:

  • Graf může mít libovolný počet datových řad. U každé z nich je možné nastavit, jakou barvou se bude vykreslovat a na které ose Y bude odpovídající jednotka.
  • V jedné datové řadě může být použito více senzorů. Pokud pro nějaké datum nejsou dostupná data prvního ze senzorů, použijí se data druhého, třetího atd. Když se tedy na jednom stanovišti měnilo více senzorů (např. jste zahodili starou meteostanici a pořídili novou), datová řada pokrývá oba zdroje jako jeden.
  • Uživatel si volí, od jakého data a jakou délku grafu chce vykreslit. Pokud to u grafu zapnete, je možné srovnávat mezi zvoleným časovým rozsahem stejným časovým rozsahem v jiném kalendářním roce. Třeba takto.

Pokud vaše zařízení posílá na server obrázky, je podobně, jako jsou zpřístupněny grafy, zveřejněna i automaticky se obnovující galerie.


Co není vidět? Ostatní funkce back-endu.

  • Implementace šifrovaného přenosového kanálu pro mikrokontroléry.
  • Zpracování přijatých dat – předpočítání hodinových a denních sumarizací, maxim a minim.
  • Posílání mailů při dosažení nastavených maxim/minim.
  • Posílání mailů, pokud zařízení neposílá data tak, jak má.

Ukládání dat

Data jsou uložena v MySQL. Existují sofistikovanější nástroje, ale MySQL je k dispozici na každém hostingu a pro potřeby takovéhle aplikace je dostačující.

Aby bylo vykreslování zejména dlouhých grafů rychlejší, je použit špinavý trik. Do databáze se samozřejmě ukládají všechny přijaté hodnoty. Ale pro každou hodinu a pro každý den si server spočítá sumární data:

  • Maximální hodnotu (a čas, kdy byla dosažena)
  • Minimální hodnotu (a čas, kdy byla dosažena)
  • Průměr
  • Počet zpracovaných hodnot

Pro vykreslení grafů pak používá přímo naměřená data jen tehdy, pokud to dává smysl – jen pro krátké grafy zahrnující datumy blízké ke dnešku. Jakmile požádáte o graf pokrývající delší období nebo o vykreslení starých dat, použijí se jen sumární data. Místo desítek tisíc řádků pro graf pokrývající celý rok se načte jen 365 denních položek; místo všech dat za dva týdny se načte jen 14*24 hodinových záznamů. Je to podvod? Na výsledku to vcelku nepoznáte.

V následujících dvou ukázkách jsem nechal vykreslit jak originální zdrojová data (modře), tak graf ze sumárních dat. Jak vidíte, graf ze sumárních dat sice ztratí nějaké detaily, ale pro běžné použití obsahuje vše, co je potřeba.

Díky tomuto triku může např. náš malinký domovní server (což je dvoujádrový Intel Atom z roku 2009 s výkonem někde mezi Raspberry Pi 3 a 4) zobrazovat data z mnoha senzorů za 15 let, a ani se přitom moc nezadýchá.

V defaultní konfiguraci se pak originální zdrojová data mažou třeba po půl roce a pro starší období jsou k dispozici jen sumární data.


Instalace aplikace

Potřebujete:

  • webový server s podporou pro přepisování URL – tedy pro Apache httpd je potřeba zapnutý mod_rewrite
  • rozumná verze PHP (nyní mám v provozu na 7.2)
    • potřebný je zapnutý modul gmp (což ne vždy bývá – takže ‚sudo apt-get install php7.2-gmp‘)
    • a standardní gd a openssl – ty asi máte
  • databázi MySQL
  • možnost z cronu periodicky spouštět úkol (webový dotaz)

Instalační kroky:

1) Stáhněte si celou serverovou aplikaci z githubu.

2) Založte databázi. Proveďte nad ní SQL příkazy ze souborů ratatoskr.sql (založení tabulek a číselníků) a user0.sql (založení defaultního administrátora „admin“ s heslem „heslo“).

3) V adresáři vašeho webového serveru (nejčastěji něco jako /var/www/) udělejte adresář pro aplikaci, třeba „iot“. Bude tedy existovat adresář /var/www/iot přístupný zvenčí jako https://vas-server/iot/ .

4) V konfiguraci webserveru (zde předpokládám Apache) povolte použití vlastních souborů .htaccess v adresářích aplikace – v nastavení /etc/apache2/sites-available/vaše-site.conf pro konkrétní adresář povolte AllowOverride

<Directory /var/www/iot/>
        AllowOverride all
        Order allow,deny
        allow from all
</Directory>

5) Nakopírujte obsah php-app/ do vytvořeného adresáře; vznikne tedy /var/www/iot/app ; /var/www/iot/data; …

6) V adresáři app/config/ přejmenujte local.neon.sample na local.neon a zadejte zde správné hodnoty – zejména přístup k databázi. Pozor, soubor je citlivý na hloubku odsazení jednotlivých řádek (hloubka odsazení definuje strukturu).

7) Přidělte webové aplikaci právo zapisovat do adresářů data, log a temp! Bez toho nebude nic fungovat. Nejčastěji by mělo stačit udělat v /var/www/iot/ něco jako:

chown www-data:www-data data log temp
chmod u+rwx data log temp

8) No a nyní zkuste v prohlížeči zadat https://vas-server/iot/ a měli byste dostat přihlašovací stránku. Přihlašte se jako admin / heslo . Hned si změňte heslo a nastavte správnou e-mail adresu pro notifikace.

9) Pokud až sem všechno fungovalo, stačí už jen zajistit, aby jednou za minutu cron udělal

wget -O /tmp/1.tmp http://vas-server/iot/crontask/

a jednou za den

wget -O /tmp/1.tmp http://vas-server/iot/crontask/daily

Řešení problémů, ladění, úpravy

Aplikace je napsaná v Nette frameworku. Pokud Nette neznáte, dva základní triky:

1) Pro řešení případných problémů: v souboru app/Bootstrap.php je řádek

$configurator->setDebugMode('192.168.32.242');

Do něj si zadejte IP adresu počítače, ze kterého přistupujete na server. Když dojde k chybě, dostanete stránku s velmi detailním výpisem, co je špatně. Tuto stránku ale dostane pouze určená IP adresa, všichni ostatní dostávají obecné „něco se rozbilo“ (protože detailní výpis je nebezpečný, lze se přes něj dostat k výpisu konfigurace atd.)

Na každé zobrazené stránce pak máte (opět pouze z určené IP adresy) vpravo dole malý plovoucí widget s informacemi, jak dlouho trvalo zpracování, jaké dotazy do databáze se dělaly atd.

2) Při úpravách aplikace či nasazování nové verze je třeba smazat adresář temp/cache/ (tedy v návodu výše /var/www/iot/temp/cache). V tomto adresáři si Nette ukládá předkompilované šablony, mapování databázové struktury atd. Smazáním adresáře vynutíte novou kompilaci.


Administrace

Aplikace loguje do podadresáře log/. Jsou zde soubory:

  • audit.<datum>.txt – přihlášení a odhlášení uživatele, chyby v přístupu, mazání zařízení
  • cron.<datum>.txt – výpis toho, co dělá periodická cronem spouštěná údržba
  • ra-conn.<datum>.txt – komunikace s mikrokontroléry
  • webapp.<datum>.txt – obecná hlášení z webové aplikace

Všechny díly:

  1. Úvod – co to dělá a co to nedělá
  2. Bezpečnost
  3. Aplikace na mikrokontroléru
  4. Serverová strana – funkce, instalace

Napsat komentář