Ankündigung

Einklappen
Keine Ankündigung bisher.

Webseite parsen - Wie geht das mit Edomi?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Derol
    antwortet
    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]###

    Einen Kommentar schreiben:


  • NorbertB
    antwortet
    Nein, die URL soll nicht statisch gesetzt werden.
    So funktioniert es jetzt

    Vielen Dank

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    Du musst noch die URL aus dem Eingang E2 setzen. Am besten unter der Zeile:

    PHP-Code:
    $header[] = "Accept: text/vnd.wap.wml,*.*"
    folgende Zeile einfügen.

    PHP-Code:
    $url $E[2]['value']; 
    EDIT: Falls Du sie statisch setzt, wie in Michas Antwort, dann kannst du den Eingang E2 entfernen.

    Einen Kommentar schreiben:


  • vento66
    antwortet
    Weil du in der Variable   $url  noch die URL angeben musst   $url = 'http://192.168.11.225/index.html'  

    Einen Kommentar schreiben:


  • NorbertB
    antwortet
    Vielen Dank für die Hinweise, ich habe die Sachen zusammenkopiert und versucht anzupassen.
    Der LBS von Dir tut's aber leider auch noch nicht, ich bekomme "not found" als output, obwohl die Syntax des preg_match stimmen sollte.
    Dieses Script gibt den gewünschten Wert zurück:
    Code:
    <?php
    $src=file_get_contents("http://192.168.11.225/index.html");
    if (preg_match("/Aussen-Temperatur:.*?([0-9\.,]+)/s",$src,$matches)) {
      print $matches[1];
    }
    ?>
    Ausserdem bekomme ich einen Eintrag im error.log: Undefined variable: url

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    Ich sehe da mehere Probleme:

    1. Du definierst eine function, die aber nie aufgerufen wird.
    2. Die Variable $regexp kommt aus dem Nichts und wird in einem preg_match verwendet. Sie müsste vorher mal irgendwo initialisiert werden.
    3. $postdata wird nicht verwendet, da ein HTTP-GET gemacht wird.

    Vorschlag:

    1. Die function() entfernen.
    2. Wofür wird das zweite preg_match() gemacht? Aus meiner Sicht müsste das Ergebnis schon aus dem ersten preg_match kommen, oder? => Zweites preg_match() entfernen.
    3. Postdata Bereich löschen

    PHP-Code:
    ###[DEF]###
    [name        = Temperatur aus Webseite]

    [e#1        = Trigger]
    [e#2        = URL]

    [a#1        =Temperatur]

    ###[/DEF]###


    ###[HELP]###

    ###[/HELP]###


    ###[LBS]###
    <?
    function LB_LBSID($id) {
        callLogicFunctionExec(LBSID,$id);
    }
    ?>
    ###[/LBS]###


    ###[EXEC]###
    <?
    require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");

    sql_connect();

    if ($E=logic_getInputs($id)) {
       $agent = "Chrome v1.0 :)";
       $header[] = "Accept: text/vnd.wap.wml,*.*";

       $ch = curl_init($url);

       if ($ch)
       {
          curl_setopt($ch,    CURLOPT_RETURNTRANSFER, 1);
          curl_setopt($ch,    CURLOPT_USERAGENT, $agent);
          curl_setopt($ch,    CURLOPT_HTTPHEADER, $header);
          curl_setopt($ch,    CURLOPT_FOLLOWLOCATION, 1);
          $tmp = curl_exec ($ch);
          curl_close ($ch);
          if (preg_match("/Aussen-Temperatur:.*?([0-9\.,]+)/s",$tmp,$string))
                logic_setOutput($id,1,$string[1]);
          else
             logic_setOutput($id,1,'not found');
       }
       else 
          logic_setOutput($id,1,'curl error');
    }

    sql_disconnect();

    ?>
    ###[/EXEC]###

    Einen Kommentar schreiben:


  • NorbertB
    antwortet
    Hm..., jetzt müsste ich es nurnoch hinbekommen, das Ganze in einen LBS zu verpacken.
    Ich versuche es so:
    Code:
    ###[DEF]###
    [name        = Temperatur aus Webseite]
    
    [e#1        = Trigger]
    [e#2        = URL]
    
    [a#1        =Temperatur]
    
    ###[/DEF]###
    
    
    ###[HELP]###
    
    ###[/HELP]###
    
    
    ###[LBS]###
    <?
    function LB_LBSID($id) {
        callLogicFunctionExec(LBSID,$id);
    }
    ?>
    ###[/LBS]###
    
    
    ###[EXEC]###
    <?
    require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
    
    sql_connect();
    
        $_buffer = "";
    
    if ($E=getLogicEingangDataAll($id)) {
    
        function HomepageLaden($url, $postdata)
            {
            $agent = "Chrome v1.0 :)";
            $header[] = "Accept: text/vnd.wap.wml,*.*";
            $ch = curl_init($url);
    
            if ($ch)
                {
                curl_setopt($ch,    CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch,    CURLOPT_USERAGENT, $agent);
                curl_setopt($ch,    CURLOPT_HTTPHEADER, $header);
                curl_setopt($ch,    CURLOPT_FOLLOWLOCATION, 1);
    
                if (isset($postdata))
                    {
                    curl_setopt($ch,    CURLOPT_POST, 1);
                    curl_setopt($ch,    CURLOPT_POSTFIELDS, $postdata);
                    }
    
                $tmp = curl_exec ($ch);
                curl_close ($ch);
                }
    
            if (preg_match("/Aussen-Temperatur:.*?([0-9\.,]+)/s",$tmp,$string))
                {
                preg_match($regexp, $tmp, $string);
                setLogicLinkAusgang($id,1,$string[1]);
                }
        }
    }
    sql_disconnect();
    ?>
    ###[/EXEC]###

    Leider bleibt die Ausgabe leer:

    Screenshot.PNG

    Einen Kommentar schreiben:


  • vento66
    antwortet
    Versuch doch mal ein    print matches[1]  
    Zuletzt geändert von vento66; 28.12.2018, 21:00.

    Einen Kommentar schreiben:


  • NorbertB
    antwortet
    Ich muss den alten Thraed nochmal hochholen, irgendwie hab' ich's noch nicht gerallt...
    Ich möchte aus dieser html-Seite die Warmwasser-Temperatur, also im Beispiel 52,31 rausholen:
    Code:
    <!DOCTYPE HTML>
    <html>
    <head><meta http-equiv=refresh content=15></head><body bgcolor=33363B><center><h1><font face=Ubuntu color=FFFFFF>Aussen-Temperatur:
    7.50
     &deg;C
    <br>
    Warmwasser-Temperatur:
    52.31
    &deg;C</font></h1></center></body></html>
    Das versuche ich mit:
    PHP-Code:
    <?php
    $src
    =file_get_contents("http://192.168.11.225/index.html");
    if (
    preg_match("/Warmwasser.*?([0-9\.,]+)/s",$src,$matches)) {
      print 
    $matches;
    }
    ?>
    Die Ausgabe des Scriptes ist aber:
    Code:
    Array
    Ich sehe den Fehler nicht...

    Edit:
    Kaum habe ich die Post abgeschickt sehe ich's...
    Code:
    print $matches[MARKIEREN][1][/MARKIEREN];
    Zuletzt geändert von NorbertB; 28.12.2018, 20:57. Grund: Fehler gefunden.

    Einen Kommentar schreiben:


  • tunneltruppe
    antwortet
    Zitat von jonofe Beitrag anzeigen
    ich würde einfach auch das setLogicLinkAusgang mit dem && verbinden. Dann wird der Ausgang auch nur gesetzt, wenn prge_match ein Ergebnis liefert. Das print brauchst du nicht, denn wo sollte edomi das ausgeben? Wenn

    Also so: (am besten dann bei allen Abfragen so machen)

    PHP-Code:
    preg_match("#aktueller Tag.*?</td>.*?([^>]+)</font>#s",$src,$matches) && setLogicLinkAusgang($id,28,$matches[1]); 
    Falls du natürlich am Ausgang signalisieren willst, dass etwas schief gelaufen ist, müsste das so aussehen:

    PHP-Code:
    if (preg_match("#aktueller Tag.*?</td>.*?([^>]+)</font>#s",$src,$matches)) setLogicLinkAusgang($id,28,$matches[1]);
    else 
    setLogicLinkAusgang($id,28,'FEHLER'); 
    Ach André!!
    Wenn ich Dich nicht hätte!! DANKE DIR für die Erklärung!!!!
    Hmmmm... bei den Wetterdaten denke ist es nicht soooo wichtig,
    eine Fehlerauswertung zu bekommen (sieht man ja eh gleich, dass da kein Wert
    in der Visu steht!!).
    Ich werde den LBS so umbau wie in Deinem Beispiel 1!!!
    ...spiele heute Abend mal rum......

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    ich würde einfach auch das setLogicLinkAusgang mit dem && verbinden. Dann wird der Ausgang auch nur gesetzt, wenn prge_match ein Ergebnis liefert. Das print brauchst du nicht, denn wo sollte edomi das ausgeben? Wenn

    Also so: (am besten dann bei allen Abfragen so machen)

    PHP-Code:
    preg_match("#aktueller Tag.*?</td>.*?([^>]+)</font>#s",$src,$matches) && setLogicLinkAusgang($id,28,$matches[1]); 
    Falls du natürlich am Ausgang signalisieren willst, dass etwas schief gelaufen ist, müsste das so aussehen:

    PHP-Code:
    if (preg_match("#aktueller Tag.*?</td>.*?([^>]+)</font>#s",$src,$matches)) setLogicLinkAusgang($id,28,$matches[1]);
    else 
    setLogicLinkAusgang($id,28,'FEHLER'); 

    Einen Kommentar schreiben:


  • tunneltruppe
    antwortet
    Zitat von jonofe Beitrag anzeigen
    Fehler 1: du hast keine Funktion debug() definiert rufst diese aber in Zeile 225 auf.
    Fehler 2: Vermutlich liefert der Aufruf von

    PHP-Code:
    preg_match("#aktueller Tag.*?</td>.*?([^>]+)</font>#s",$src,$matches) && print $matches[1]; //A28= Niederschlag aktueller Tag
    setLogicLinkAusgang($id,28,$matches[1]); 
    kein Array in $matches zurück. Daher liefert dann die Nutzung von $matches[1] einen Fehler.
    Moin André,
    DANKE DIR!!!
    Fehler 1:
    Ahh gut, dann nehme ich die Zeile raus: //$DEBUG && debug($id,"Baustein startet");

    Fehler 2:
    Kommt der Fehler immer dann, wenn die Webseite nichts liefert? Weil ich auch ansich die anderen
    Ausgänge so auch ausgewertet habe. Also ein "sporadischer" Fehler? (den der Fehler kommt nicht immer).

    DANKE DIR!!!!!

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    Fehler 1: du hast keine Funktion debug() definiert rufst diese aber in Zeile 225 auf.
    Fehler 2: Vermutlich liefert der Aufruf von

    PHP-Code:
    preg_match("#aktueller Tag.*?</td>.*?([^>]+)</font>#s",$src,$matches) && print $matches[1];                            //A28= Niederschlag aktueller Tag
    setLogicLinkAusgang($id,28,$matches[1]); 
    kein Array in $matches zurück. Daher liefert dann die Nutzung von $matches[1] einen Fehler.

    Einen Kommentar schreiben:


  • tunneltruppe
    antwortet
    Guten Abend,
    ich versuche gerade in EDOMI die Fehler gegen null zu bekommen.
    Nun muss ich sehen, dass mein LBS ..242 auch einen Fehlereintrag macht.
    Leider bin ich ja nicht soooo gut im Thema PHP drin.
    Hier der Eintrag des Fehlers in Edomi:
    Log aus edomi.jpg
    Noch ein Fehler dazu gekommen:
    Log aus edomi_2.jpg

    Der Baustein im Edomi Ordner sieht so aus:
    Baustein aufbau.jpg

    Nun wie gesagt weiß ich nicht was für ein Fehler in der Zeile 7 sein soll.
    Kann mir jemand sagen was ich hier falsch (zusammengeklaut) habe?
    DANKE vor ab!!!
    19000242_lbs.pdf
    P.S. .pdf in php ändern!!
    Angehängte Dateien
    Zuletzt geändert von tunneltruppe; 11.07.2016, 22:05.

    Einen Kommentar schreiben:


  • tunneltruppe
    antwortet
    Zum Glück muss man sich ja hier nicht über den Nutzen und die Sinnhaftigkeit
    seines Treiben rechtfertigen!!!
    Nachdem ich 87 Werte der Webseite im LBS ausgewertet habe und diese in der Visu
    dargestellt habe, kann ich nun den LBS abharken!!!
    Habe viel gelernt über den PHP Befehl „preg_match“ und wie ich einen Quellcode
    auswerte.
    Probleme für mich bleibet jedoch: Die Icons!! Habe mir schon einige gekauft und einige
    dann in Word „zusammengebaut“, aber schön finde ich das noch nicht!!!
    Ich hätte gerne eine Linie der Icons drin, aber tu mich schwer mit .png Icons!!
    Aber wird schon noch….
    Also DANKE für die Hilfe zum Erstellen der Visuseite!!!
    Anbei nun einmal die Unter- Visuseite
    Gruß Marcus
    Wetter Hannover Visu.jpg

    Einen Kommentar schreiben:

Lädt...
X