Obsah

OpenFVELog

Pokud chcete zasílat data z vaší FVE na server MyPower.CZ, ozvěte se prosím na diskuzním fóru, dohodneme detaily, měřené veličiny, zabezpečení přenosu dat, atd.

Hotové aplikace

Hotové aplikace umožňující přenos dat na MyPower.CZ

OpenFVELog/GET

OpenFVELog/GET je protokol využívající jednoduchý HTTP dotaz pro zaslání měřených dat z FVE.

Příklad HTTP dotazu na server:

http://log.mypower.cz/?unix=1320171659&u_in=0.04&i_in=0&u_bat=25.72&u_tgt=0&p_bat=0&e_dly=3120

Jiný příklad HTTP dotazu na server:

http://log.mypower.cz/?unix=1320192323&fv1=20.78&fv2=23.33&u16v=15.86&bat2=13.82&i1=4.3&i2=6.22&i3=2.12&i3=0.78&i4=1.35&i5=2.27

26.11.2012 byl přidán parametr fveid

Příklad HTTP dotazu na server s parametrerm fveid:

http://log.mypower.cz/?fveid=VASEFVE&unix=1320192323&fv1=20.78&fv2=23.33&u16v=15.86&bat2=13.82&i1=4.3&i2=6.22&i3=2.12&i3=0.78&i4=1.35&i5=2.27

OpenFVELog/XML

OpenFVELog/XML je jednoduchý protokol využívající HTTP pro přenos měřených dat z FVE ve formátu XML. XML data jsou serializována pomocí PHP funkce serialize, komprimována pomocí gzcompress, výsledná binární data jsou kódována pomocí base64_encode a odeslána metodou POST na server jako formulářové pole HTML formuláře s názvem „data“. V zaslaných datech se může vyskytovat i pole „src“, které obsahuje dohodnutý název FVE z důvodů odlišení jednotlivých FVE, jejichž měření přichází ze stejné IP adresy.

$data=base64_encode(gzcompress(serialize($xmldata)))

Ze serveru se vrátí krátká zpráva obsahující výsledek HTTP dotazu. Na tomto jednoduchém komunikačním protokolu je realizováno například měření FVE Maršov na úvodní straně webu MyPower.CZ. Data jsou na serveru archivována v MySQL databázi pro generování různých statistických výstupů a monitoringu FVE.

Odeslání dat na server

Příklad zasílaných dat ($xmldata)

<!--  File Name: fve_solar.xml --> 
<data> 
<time> 
<unix>1315685222</unix> 
<formated>2011-09-10 22:07:02</formated> 
</time> 
<values> 
<u_in>0.00</u_in> 
<i_in>0.00</i_in> 
<u_bat>11.90</u_bat> 
<i_bat>-3.65</i_bat> 
<almf>14</almf> 
<bat_temp>16</bat_temp> 
<fv_temp>12.6</fv_temp> 
<solar>0.0</solar> 
<twilight_switch>1</twilight_switch> 
</values> 
</data> 

Data zasílaná mezi tagy <values> a </values> se mohou lišit podle způsobu měření dané FVE a měřených veličin.

Jiný příklad:

<!--  File Name: fve_solar.xml --> 
<data> 
<time> 
<unix>1315685222</unix> 
<formated>2011-09-10 22:07:02</formated> 
</time> 
<values> 
<fv1>0.00</fv1> 
<fv2>0.00</fv2> 
<bat1>12.663</bat1> 
<bat2>12.275</bat2> 
</values> 
</data> 

Buffering

S ohledem na možné výpadky sítě, či problémy ať už na straně serveru či na straně klienta (měřené FVE) je doporučováno měření rozdělit na dvě různé funkce. První funkcí je samotné měření, tedy odečítání dat z čidel FVE. Data je doporučeno ukládat do datového úložiště, ať již se jedná o souborový systém, nebo o databázi, záleží pouze na vašich preferencích. Při měření FVE Napajedla je využíváno techniky ukládání serializovaných dat do souborů, jejichž název je unixtimestamp (čas), kvůli možnosti setřídění a přípona „.dat“.

Příklad scriptu zajišťujícího odečítání dat:

#!/usr/bin/php
<?

function GetValuesFromFVE() {
$data=array();
// ... kód pro načtení dat z čidel FVE do asociativního pole uloženého do proměnné $data ...
$data["unix"]=time();
return ($data);
}

$data=GetValuesFromFVE();
file_put_contents("/path/to/datafiles/".$data["unix"].".dat",serialize($data));

?>

Výše uvedený script je spouštěn jako naplánovaná úloha (například pomocí programu cron), u FVE Napajedla konkrétně jednou za 2 minuty. Tímto způsobem máme zajištěno vytváření úložiště s měřenými daty.

Dalším scriptem je script, který nezávisle na prvním scriptu zajistí přesun jednotlivých měření na server a jejich smazání po úspěšném přenosu, aby se data nepřenášela vícekrát. Smazání souboru je provedeno pouze pokud server po zaslání dat vráti návratovou hodnotu OK. Pokud nikoliv, script se ukončí a příští spuštění zajistí nový pokus o odeslání posledního vzorku měření, který zaručeně na serveru ještě není uložen.

#!/usr/bin/php
<?

clearstatcache();
$files=glob("/path/to/datafiles/*.dat");
sort($files);
reset($files);
while ($cc=each($files))
  {
  clearstatcache();
  $filename=$cc["value"];
  if (!is_file($filename))
    die("Pravděpodobně běžím vícekrát :(").
  $content=file_get_contents($filename);
  $result=trim(file_get_contents("http://log.mypower.cz?data=".base64_encode($content)));
  if ($result=="OK")
    unlink($filename);
  else
    die("Chyba");
  }
  
?>

Script pro transfer dat je spouštěn rovněž jako plánovaná úloha. Není nutno ho spouštět ve stejném intervalu jako měření, je možno použít i delší interval. Například transfer 1x za 10 minut a měření 1x za 2 minuty. Doporučený postup však je spouštět měření i transfer ve stejných časových intervalech.

Vhodnou technikou je také zamykání a expirace zámku pro zamezení vícenásobného spuštění transferu, což by mohlo způsobit kolize. Ve výše uvedeném scriptu je použita jednoduchá detekce. V případě, že script pro transfer poběží vícekrát, pak nejspíše dojde k tomu, že jednomu z nich přestanou existovat dříve nalezené soubory s daty měření, které se povedlo odeslat jinému běžícímu scriptu a tyto po smazání přestanou existovat. Script se při této situaci ukončí a dále už nepokračuje. Tato technika není stoprocentní, ale s vysokou pravděpodobností bude ve většině případů fungovat správně.

Výše uvedené postupy je nutno chápat pouze jako ukázku principů, nikoliv jako hotové řešení. Lze však z těchto scriptů vyjít při tvorbě řešení pro měření a přenos, které bude odolné proti výpadkům sítě, nebo serveru v případě, že server z nějakého důvodu data nemůže příjmout.

Changelog

v.0.1 - vytvoreno a vyuzito pro prenos dat z FVE Maršov
v.0.2 - 3.11.2011 - pridan parametr src a protokol rozdelen na /GET a /XML variantu.