FHEM Dummy per HTTP/PHP auslesen

Begonnen von huhu, 18 Juli 2017, 15:08:39

Vorheriges Thema - Nächstes Thema

huhu

Hallo Leute,

nutzt jemand PHP um Werte in FHEM auszulesen?


<?PHP
$variable = file_get_contents('http://192.168.3.1:8085/fhem&cmd=%7BValue(%22testdummy%22)%7D&XHR=1');
?>


Als Webserver nutze ich eine Synology NAS - seit Update der Webstation funktioniert die Werteabfrage jedoch nicht mehr. Die "file_get_contents" Funktion läuft in einen Timeout, sobald ich fhem anfunke, zb auch bei "http://192.168.3.1:8085/fhem"

Gibt es hier eine Option seitens FHEM die die Abfrage verhindert?

Ich habe den CSRF Token deaktivert und die Authentifizierung testweise komplett aufgehoben. Ebenfalls habe ich eine neue FHEM Instanz unter Windows installiert mit gleichem Ergebnis. Den Webserver habe ich schon mit php 5.6, php 7, apache 2.2 und apache 2.4 durchgetestet. Oben genannter Link ist per Browser erreichabr :-)

CoolTux

Oben Rechts. Dicker Roter Link.
FHEM 5.8
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

huhu

Du meinst den Token? Habe ich zum testen auf none gesetzt.

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ares

Zitat von: huhu am 18 Juli 2017, 15:19:28
Du meinst den Token? Habe ich zum testen auf none gesetzt.

Für welches Device hast Du das zum Testen auf none gesetzt?
attr WEBtablet csrfToken none

huhu

Für WEBtablet, also Port 8085,
ja Seite wird sofort im Browser mit dem aktuellen Wert aus FHEM geöffnet.

Zwischenzeitlich habe ich herausgefunden, dass die Änderung des Befehls in:
file_get_contents("http://192.168.3.1:8085/fhem&cmd=%7BValue(%22testdummy%22)%7D&XHR=0", NULL, NULL, 0, 10);

den aktuellen Wert ebenfalls ausgibt. Wenn ich den String von 1 bis 10 aufrufe geht es relativ schnell. Erhöhe ich auf 20 Strings, dann dauert es wieder ewig lange bis etwas kommt. Wäre ein möglicher Workaround, wobei ich mir bei jeder Abfrage überlegen müsste, wie viele Strings ich max erhalten möchte /kann.

huhu


Christoph Morrison

#7
Zitat von: huhu am 18 Juli 2017, 15:56:03
scheinbar gab es das Problem auch schon mal hier:
https://forum.fhem.de/index.php?topic=12093.0

Ja, das dürfte es sein. Mit dem letzten Parameter bei file_get_contents begrenzt du die Zeichenlänge (nicht die Anzahl der Strings). Lässt du diesen Wert aus, versucht PHP bis zum Ende des Streams zu lesen - das kommt nur nicht, weil FHEM die Verbindung offen hält. Lies dazu mal eine Antwort auf Stackoverflow: Does file_get_contents() have a timeout setting?.


huhu

Hmm also connection close mitgeben bringt nichts. Man kann höchstens den Timeout anpassen, dann dauert das laden aber auch immer die X Sekunden.

Gibt es eine Datei, die von FHEM abgelegt wird, die die aktuellen Readings enthält?

ares

Kommt folgende Lösung in Frage?

Zitat von: URHome am 06 April 2013, 12:09:39
Also mit curl scheint es zu funktionieren :). Wenn ich

if (!function_exists('curl_init')){
    die('cURL is not installed!');
}

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://fritz.box:8083/fhem?cmd=jsonlist+Irgendwas&XHR=1");

$output = curl_exec($ch);

curl_close($ch);



kriege ich die JSONLIST von irgendwas sofort geliefert

huhu

Ja danke, werde wahrscheinlich alles auf curl umstellen.
Schade das es mit file_get_contents keine Lösung gibt, wäre aufjedenfall einfacher in der Handhabung.

Christoph Morrison

Zitat von: huhu am 19 Juli 2017, 14:04:43
Ja danke, werde wahrscheinlich alles auf curl umstellen.
Schade das es mit file_get_contents keine Lösung gibt, wäre aufjedenfall einfacher in der Handhabung.

Du kannst dir ja einen Wrapper für cURL schreiben (z.B. file_get_contents_curl()) oder schreibst dir einen eigenen Streamwrapper, der mit cURL arbeitet. Den kannst du dann mit dem vanilla file_get_contents() nutzen.

Wzut

Zitat von: huhu am 18 Juli 2017, 15:08:39
nutzt jemand PHP um Werte in FHEM auszulesen?
Nein, aber wenn es denn unbedingt so sein soll, warum dann immer das verdammte http ... geht doch mit alten Socken viel leicher,
Bsp state des Dummy Alarm_Msg vom Host 192.168.0.55 auslesen :
<?php

$target 
="192.168.0.55";
$port "7072";
$socket socket_create(AF_INETSOCK_STREAMSOL_TCP);


 if (@
socket_connect ($socket $target $port))
 {
 
  
$txt "{return ReadingsVal('Alarm_Msg','state','');;}\n";
  
$length strlen($txt); 
  
socket_write ($socket,$txt$length);

  
$buf socket_read($socket,1024); 
  echo 
$buf;

  
$txt "quit\r\n";
  
$length strlen($txt); 
  
socket_write ($socket,$txt$length);
 }  
 
socket_close($socket);
?>

Fehlerabfragen habe ich mir gespart, wenn den noch sein soll wirf einen Blick in die php Doku : http://php.net/manual/de/function.socket-read.php
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

huhu

Zitat von: jeschkec am 19 Juli 2017, 14:44:46
Du kannst dir ja einen Wrapper für cURL schreiben (z.B. file_get_contents_curl()) oder schreibst dir einen eigenen Streamwrapper, der mit cURL arbeitet. Den kannst du dann mit dem vanilla file_get_contents() nutzen.

Hättest Du ein Beispiel dafür?