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 :-)
Oben Rechts. Dicker Roter Link.
FHEM 5.8
Du meinst den Token? Habe ich zum testen auf none gesetzt.
http://192.168.3.1:8085/fhem&cmd=%7BValue(%22testdummy%22)%7D&XHR=1
Also der Aufruf funktioniert aus einem Browser heraus?
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
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.
scheinbar gab es das Problem auch schon mal hier:
https://forum.fhem.de/index.php?topic=12093.0
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? (https://stackoverflow.com/a/10236480).
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?
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
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.
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 (http://php.net/manual/de/function.stream-wrapper-register.php), der mit cURL arbeitet. Den kannst du dann mit dem vanilla
file_get_contents() nutzen.
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_INET, SOCK_STREAM, SOL_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
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 (http://php.net/manual/de/function.stream-wrapper-register.php), der mit cURL arbeitet. Den kannst du dann mit dem vanilla file_get_contents() nutzen.
Hättest Du ein Beispiel dafür?