Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Hallo zusammen,
ich habe eine Heizung die über Webservices abgefragt werden kann.
Dafür habe ich nun anhand der hier im Threat gemachten Hilfestellungen einen eigenen LBS erstellt.
Leider funktioniert dieser noch nicht, finde aber auch das Problem nicht.
Könnte mir hier bitte einer helfen?
Das folgende XML erhalte ich beim Auslesen von "http://IP-Adresse:8080/user/var/120/10251/0/0/12528" und dort möchte ich die Zahl 277 auslesen.
<?xml version="1.0" encoding="utf-8"?>
<eta version="1.0" xmlns="http://www.eta.co.at/rest/v1">
<value uri="/user/var/120/10251/0/0/12528" strValue="28" unit="%" decPlaces="0" scaleFactor="10" advTextOffset="0">277</value>
</eta>
Hier mein Logikbaustein:
Code:
###[DEF]###
[name =Heizung Statusabfrage]
[e#1 = Trigger !=0 ]
[a#1 = A1]
###[/DEF]###
###[HELP]###
Dieser Baustein wertet den Status der Heizung aus.
Alle Parameter abrufbar unter:
http://Ip-Adresse:8080/user/menu
Eingänge:
E1 = Trigger !=0
Ausgänge:
A1 = Ladezustand
###[/HELP]###
###[LBS]###
<?
function LB_LBSID($id)
{
if ($E=getLogicEingangDataAll($id)) // die aktuelle Belegung der Eingänge des LBS in ein Array übergeben
{
if (getLogicElementStatus($id)==0) // Liefert den aktuellen Status der LBS-Instanz $elementid
{
if ($E[1]['value']!=0 && $E[1]['refresh']==1) // Damit ein LBS überhaupt "startet", muss mindestens ein Eingang des LBS getriggert werden
{
setLogicLinkAusgang($id,1,0); // Setzt einen Ausgang der LBS-Instanz $elementid auf einen Wert
setLogicElementStatus($id,1); // Setzt den aktuellen Status der LBS-Instanz $elementid. 1=LBS läuft
callLogicFunctionExec(LBSID,$id); // Startet ggf. das EXEC-Script der LBS-Instanz $elementid.
}
} else
{
//### ggf. checken, ob Timeout erreicht wurde! Sonst "läuft" der LBS ja für immer, obwohl das EXEC-Script schon längst abgekackt ist...
}
}
}
?>
###[/LBS]###
###[EXEC]###
<?
require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
set_time_limit(30); //Script soll maximal 30 Sekunden laufen
sql_connect();
// Auswertung
$src=file_get_contents_utf8("http://IP-Adresse:8080/user/var/120/10251/0/0/12528"); // Liest die gesamte zurückgelieferte XML in einen String
//$src=utf8_encode(file_get_contents("http://IP-Adresse:8080/user/var/120/10251/0/0/12528"));
preg_match("#advTextOffset=\"0\">.*?([0-9\.,]+)<\/value>#s",$src,$matches) && setLogicLinkAusgang($id,1,$matches[1]); // Führt eine Suche mit einem regulären Ausdruck durch
setLogicElementStatus($id,0);
function file_get_contents_utf8($fn) {
$content = file_get_contents($fn);
return mb_convert_encoding($content, 'UTF-8',
mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
}
//--------------------------------------------------------------------------------------------------------------------------
sql_disconnect();
?>
###[/EXEC]###
Ich würde als erstes mal die Funktion LB_LBSID() vereinfachen:
PHP-Code:
function LB_LBSID($id) { logic_callExec(LBSID, $id); }
Mehr brauchst du da eigentlich nicht, da der LBS ohnehin nur aufgerufen wird, wenn er über E1 getriggert wird (mehr Eingänge gibts ja nicht) und der logic_callExec() Aufruf verhindert, dass das EXEC Skript zweimal zur selben Zeit aufgerufen wird.
Das setLogicElementStatus($id,0); im EXEC brauchst du auch nicht.
Hast du dein preg_match denn mal auf einer preg_match Online Webseite ausprobiert?
EDIT: Als pattern könntest du folgendes verwenden:
danke für deine schnelle Hilfe.
Ich habe alles abgeändert wie von dir beschrieben. Leider funktioniert das immer noch nicht.
Das pattern habe ich hier getestet: https://regex101.com/. Hat eigentlich funktioniert.
Den Wert 277 müsste ich doch zumindest in der Edomi Hilfe unter A1 sehen oder? Hier trägt sich aber leider nichts ein.
Auf die Logikseite gehen. Liveansicht aktivieren. Dann auf E1 klicken und eine 1 eingeben und bestätigen. Danach nochmal auf Liveansicht klicken, dann solltest du an der Klemme den Wert sehen.
Wenn jetzt noch immer nichts am Ausgang erscheint, dann kann ich es nicht erklären, denn selbst wenn es keinen Match gibt, sollte nun ERROR ausgegeben werden. Projekt hast du auch neu aktiviert? Und nach dem Triggern nochmal auf Liveansicht geklickt? Kannst ja mal einen Screenshot der finalen Liveansicht nach dem Triggern posten.
Vermutlicherweise ja... ich hab mich nur gescheut das so direkt zu schreiben weil die Multibyte-String-Geschichte hier garnicht notwendig ist und es viel sinnvoller gewesen waere die ueberfluessige Funktion aus dem LBS zu werfen anstatt ein nicht wirklich benoetigtes Paket zu installieren wodurch der LBS auf Default-Installationen dann nicht mehr laeuft und es am Ende des Tages wieder die ewig gleichen Postings gibt weil die Logik-Engine abschmiert
Aber jetzt hat vento ja stattdessen den BH der Pandora geoeffnet
Jo eh, ich verstehe deinen Ansatz vollkommen! Deshalb installieren meine LBS die notwendigen Abhängikeiten bei Bedarf mit (Das weist Du ja selbst am besten Danke noch mal für den Schubs......) Und ja, für den LBS ist es sicher nicht notwendig, aber nun mal so drin.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar