fhem Readings und SVG-Plots in andere Web-Anwendungen (php) einbauen

Begonnen von Mike_GKA, 06 Juli 2018, 12:37:22

Vorheriges Thema - Nächstes Thema

Mike_GKA

Fragestellung:
Werte (readings) aus fhem und auch komplette SVG-plots sollen in anderen Web-Anwendungen zur Anzeige gebracht werden.
Diese Web-Anwendungen laufen auf dem selben Raspberry und sollen vom Internet aus aufrufbar sein. Entsprechende Port-Weiterleitungen für http und/oder https sind auf dem Router eingerichtet.

Randbedingung:
Port Weiterleitungen für die fhem ports sind nicht erlaubt. fhem darf aus dem Internet nicht direkt sichtbar sein (nur über VPN).

Lösung:
Sicher gibt es auch andere Möglichkeiten, aber ich habe das mal mit php gemacht.


<?php

$ch curl_init(); 
curl_setopt($chCURLOPT_RETURNTRANSFER1); 
curl_setopt($chCURLOPT_URL,  "https://<Loginname>:<Passwort>@127.0.0.1:8083/fhem?cmd=jsonlist2%20<device>%20STATE&XHR=1"); 
$result curl_exec($ch);
$json json_decode($resulttrue);
$result array_findfirst_element_by_key('STATE'$json);

?>



Die URL muss man natürlich an seine Bedürfnisse anpassen:
https://<Loginname>:<Passwort>@127.0.0.1:8083/fhem?cmd=jsonlist2%20<device>%20STATE&XHR=1

Hier wird STATE vom Device <device> abgefragt.
Das Ergebnis liefert fhem als JSON und man muss jetzt den gesuchten Wert aus diesem JSON heraussuchen. In $result steht dann dieser Wert.
Dazu nutze ich die Funktion "array_findfirst_element_by_key".


<?php
function &array_findfirst_element_by_key($key, &$form) {
  if (
array_key_exists($key$form)) {
    
$ret =& $form[$key];
    return 
$ret;
  }
  foreach (
$form as $k => $v) {
    if (
is_array($v)) {
      
$ret =& array_findfirst_element_by_key($key$form[$k]);
      if (
$ret) {
        return 
$ret;
      }
    }
  }
  return 
FALSE;
}
?>



Des Weiteren muss man noch herausfinden, unter welchem key man diesen Wert findet. Hier ist es einfach "STATE", aber das kann auch komplizierter sein.
Readings findet man in aller Regel unter dem key "Value".
Um das genauer heraus zu finden, gibt man obige URL einfach in einem Browser ein und schaut sich den JSON-String an.

Einschränkung: Die Funktion "&array_findfirst_element_by_key" sucht nur nach dem ersten Auftreten vom key. D.h. man kann über die URL nicht ein komplettes Device abfragen, in dem dann alle Readings enthalten sind.

Will man das machen, dann muss man einfach den JSON-Pfad abfragen in der Art:
$json['Results']['0']['Readings']['<Reading>']['Value'];

Auf diese Weise kann man jetzt also jedes Reading aus fhem abfragen und in seine Web-Anwendung einbauen.

Will man einen kompletten SVG-Plot abfragen und in seine Web-Anwendung einbauen, dann geht das auch recht analog über die fhem Funktion "SVG_showLog".


<?php

$ch curl_init(); 
curl_setopt($chCURLOPT_RETURNTRANSFER1); 
curl_setopt($chCURLOPT_URL,  "https://<Loginname>:<Passwort>@127.0.0.1:8083/fhem/SVG_showLog?dev=<SVGNAME>&logdev=<FileLogName>&gplotfile=<GplotFileName>&logfile=CURRENT&pos=<ZoomAndOffset>"); 
$result curl_exec($ch);

?>



Auch hier muss man das natürlich an seine Bedürfnisse anpassen:
/SVG_showLog?dev=<SVGNAME>&logdev=<FileLogName>&gplotfile=<GplotFileName>&logfile=CURRENT&pos=<ZoomAndOffset>

Für &pos=<ZoomAndOffset> wählt man z.B. wenn man den aktuellen Tag sehen will:
&pos=zoom=day;off=0

In $result steht dann der gesamte SVG-Plot als SVG-Document.
Das heißt insbesondere auch, dass $result mit
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg>
beginnt.
Bei Bedarf kann man dies noch in dem String $result löschen bevor man das Ergebnis verwendet. Aber in der Regel stört das auch nicht besonders.

Hintergrund:
Ich verwende hier curl und insbesondere
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
Man könnte auch auf die Idee kommen (und das war auch mein erster Ansatz) einfach file_get_contents() zu nutzen.
Aber das Problem ist hier, dass man viel zu lange (Minuten!) auf das Ergebnis warten muss.
Meine Vermutung ist, dass hier darauf gewartet wird bis die Connection wieder geschlossen wird, deshalb mit curl und CURLOPT_RETURNTRANSFER.

Fazit:
Über diese php-Code-Schnipsel kann man serverseitig die fhem-Werte und komplette SVG-Plots abfragen und in seine Webseite einbauen.
Diese Webseiten sind entsprechende Port-Weiterleitungen eingerichtet aus dem Internet aufrufbar und fhem selbst ist aus dem Internet nicht direkt sichtbar.