Jak zobrazit data z řídicího systému na webové stránce

PHP programováníNa těchto stránkách jsem již popisoval funkce řídicích systémů AMiT v mém rodinném domě a zmínil jsem se i o webovém serveru AWEB, který umožňuje zobrazení hodnot z řídicích systémů v jakémkoliv webovém prohlížeči. Občas jsem přemýšlel, jak na těchto stránkách zobrazit aktuální data ze systémů. Možnost vložení konkrétní stránky z webserveru např. pomocí <iframe> není vhodné minimálně ze dvou důvodů.

Především je to omezení současných přístupů k webovému serveru AWEB (spolehlivě garantuje pouze 2 současné přístupy). Na veřejných webových stránkách nikdy nemůžete vyloučit jakýkoliv provoz, a tak by se mohlo stát, že většina návštěvníků místo hodnot uvidí hlášku "přetíženého" webserveru. A druhý problém je v povinné autentizaci uživatele, aby si mohl stránky z webserveru zobrazit. Což je pro běžné zobrazení webové stránky velmi omezující. K vyřešení tohoto problému mě dokopal požadavek jednoho uživatele s řídicími systémy AMiT a webserverem AWEB, který chtěl zobrazit měřenou venkovní teplotu na svých prezentačních webových stránkách a dále dva publikované zdrojové kódy Miroslava Legutka na jeho Google+ profilu. Vánoce poskytly nepatrně volného času a výsledek vidíte v pravém sloupci nahoře tohoto webu - aktualizované hodnoty venkovní teploty, okamžitého výkonu fotovoltaické elektrárny na střeše a celkovou roční sumu výrobu elektrárny.

Filozofie řešení

Hlavní myšlenka řešení je tato - periodicky spouštět skript, který si zobrazí předpřipravenou stránku z AWEBu, z této stránky "vydolovat" aktuální hodnoty, ty zapsat do SQL databáze a dalším skriptem zobrazit při každém přístupu uživatele na webových stránkách. Většina webových prezentací je provozována na některém webhostingovém serveru zpravidla běžícím v konfiguraci LAMP (Linux, MySQL, PHP a Apache). Plnění aktuálních hodnot do SQL zajišťuje PHP skript periodicky spouštěný např. systémovým plánovačem Cron. Tento skript v pevně dané periodě načte data z AWEBu do SQL databáze. Další, zobrazovací skript, se poté aktivuje vždy, když si uživatel zobrazí webovou stránku, v mém případě prakticky na každé stránce, a vypíše aktuální hodnoty. I kdyby bylo takových současných uživatelů relativně hodně, vždy se údaje zobrazí a hlavně není potřeba žádné přístupové heslo. Prakticky žádná jiná jednoduchá možnost na hostingovém serveru asi není. Představa, že by vám provider umožnil spouštět komunikační ovladače ATOUCH na serveru je iluzorní. Popišme si krok za krokem, jak jsem data na tuto stránku vlastně dostal.

1. Příprava stránky v AWEBu

Ve stávající parametrizaci webového serveru AWEB jsem si připravil pomocí programu AWDET stránku nazvanou "tosql", která obsahuje postupné zobrazení tří hodnot z řídicích systémů AMiT pomocí prvku NumericView. Na stránce není kromě těchto tří prvků nic jiného.

Ukázka parametrizace AWEBu

Stránku jsem nahrál do AWEBu, přístup k ní je něco jako http://10.0.0.10/pages/page01/tosql.hta (IP adresa je smyšlená, navíc lokální...).

2. Příprava SQL databáze na serveru

Na mém hostovaném serveru jsem si v SQL databázi připravil tabulku nazvanou "db_aweb" obsahující pět sloupců (položek). První tři floatová čísla připravená pro hodnoty (sloupce nazvané teplota, fve_vykon, fve_suma). Další položka (time) je určená pro časovou značku, ve které uchovávám datum a čas posledního platného zápisu hodnot do databáze a v položce valid_db si uchovávám informaci, zda se podařilo poslední plánované čtení hodnot z AWEBu. Pokud se nepodařilo, vím, že hodnoty jsou v SQL databázi staré a neplatné.

Přístupové údaje do SQL databáze dostanete vždy od providera.

3. PHP kód pro načtení hodnot a uložení do SQL

V tuto chvíli můžeme začít programovat PHP skript. Kupodivu to není nic složitého. Kdo někdy programoval, syntaxi se naučí za pár hodin. Horší je to pak s orientací v nepřeberném množství různých funkcí a deklarací. Ale od toho je tu Internet, prakticky na všechno se dá najít vzorový příklad.

Nejprve si připravíme pomocný konfigurační PHP soubor pro nastavení přístupových parametrů k AWEBu a SQL databázi. Tento "config.php" soubor pak můžeme využít jak u zapisovacího, tak u čtecího skriptu.

Konfigurační PHP soubor

V horní části vidíme přístupové jméno a heslo k webovým stránkám v AWEBU, v dolní části přístupové údaje k SQL databázi. Mezi uvozovky prostě napíšete příslušné údaje. Upozorňuji na link stránky AWEBU - má příponu .hta a ne .htm(l). SQL_TABLE bude v mém případě vytvořená tabulka "db_aweb".

Čtecí skript si vloží tento konfigurační soubor na samém počátku. Podívejme se na výpis skriptu "storedata.php".

Výpis čtecího PHP skriptu

Využijeme s výhodou knihovnu cURL, která nám umožní načíst http protokolem naši stránku v AWEBu s autentizací a uloží ji do textového pole, se kterým budeme dále pracovat. Načtení zajistí kód na řádcích 5 až 11. Nyní máme v textovém poli to samé, jako když si zobrazíte zdrojový kód stránky ve vašem prohlížeči. Z celé změti textů, html tagů a formátovacích parametrů nás zajímají pouze tři hodnoty našich dat. Na řádku 12 pomocí funkce strip_tags() smažeme všechny html tagy a získáme něco jako na následujícím výpisu.

HTML source stránky z AWEBu

Vidíte, že "naše" data jsou až od řádku 37. Všechen text před tímto řádkem je nám nyní k ničemu. Posledním znakem před smysluplými údaji je znak "}". Tohoto poznatku  využijeme a  pomocí dvou funkcí na řádku 13 získáme text s našimi údaji a spoustou zbytečných mezer a znaků pro nový řádek. Pomocí funkce trim() na řádku 15 smažeme všechny zbytečné mezery a případné tabelátory a kouzelnou funkcí explode() rozdělíme zbylý text na tři stringy s číselnou hodnotou. Mezi těmito hodmotami je totiž vždy znak "\r" (návrat vozíku). No a je to. Tento postup je zcela univerzální pro načtení jakéhokoliv množství dat ze stránky AWEBu zobrazených prvkem NumericView.

Další část kódu od řádku 23 je již zcela běžné uložení hodnot do připravené tabulky "db_aweb". Za zmínku stojí snad jen upozornění na řádky 34-35, kde řeším uložení informace, že se nepodařilo z nějakého důvodu přenést data z AWEBu (na základě hodnoty v proměnné $output v návaznosti na podmínku na řádku 5).

Jak jsem zmínil výše, tento skript spouštím co pět minut standardním Cronem.

4. Zobrazení hodnot na stránce

Tyto webové stránky běží pod redakčním systémem Drupal, který naštěstí povoluje bez problémů začlenit PHP skript téměř do jakékoliv části webu. Kód vypadá v tomto případě takto (skript "getdata.php").

Zobrazení hodnot z SQL databáze

Nejprve se načtou hodnoty z databáze a podle hodnoty platnosti dat (valid_db) se rozhodne, jakým způsobem se data mají zobrazit. Pokud z nějakého důvodu nastanou problémy s přístupem do databáze, zobrazuji chybové hlášky. To je vše.

Závěrem

Nejsem žádný PHP programátor (omluvte tedy případné programátorské prohřešky), přesto jsem během tří večerů data dokázal zobrazit. Je nutné upozornit, že během té doby jsem se neučil jen PHP programování, ale dost času mi zabralo nastudování a instalace ladicího prostředí (nakonec jsem sáhl po Vertrigo serveru a pro psaní kódu po PSPad editoru). Trochu jsem ještě laboroval s SQL databází. Myslím ale, že nyní bych dokázal s pomocí uvedených postupů zrealizovat zobrazení dat z řídicích systémů během jednoho posezení u počítače. Zkuste to taky! Abyste nemuseli opisovat skripty z uvedených obrázků, tady jsou k dispozici zdrojové kódy.

Komentáře

Re: Jak zobrazit data z řídicího systému na webové stránce

Dobrý den,

díky za skvělý článek. Popsané algoritmy mi ušetřily hodně času.
Původně jsem chtěl pro vzdálenou správu a vizualizaci použít také AWEB, ale po předchozích zkušenostech s internet. providery (problémy s pevnými resp. veřejnými IP adresami a proNATováním portů) jsem zvolil koncepci při které není potřeba řešit ani IP adresy ani nastavení routerů : řídicí systém AMiT(RS232) <=> XPort Lantronix(Ethernet) <=> webový server VPS(SQL databáze) <=> www stránky.

S pozdravem

Martin Valeš
martin.vales@athea.cz