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

    #16
    Weil ich nicht so fit in PHP bin: gibt es eine native Funktion um eine PCRE auf Gueltigkeit zu pruefen und ggbnflls zu escapen? Weil wenn nicht, dann wuerde ein solcher Baustein in den meisten Installationen nur dazu fuehren, dass das error.log ueberflutet wird.
    Falls doch, waere der Baustein allerdings quasi eine Art Zweizeiler

    BTW: mehrere Werte lassen sich durchaus in derselben RegExp abfruehstuecken, nur das "zweite Feld" muesste dann quasi mehrere numerische Werte zulassen. Aber ja, als LBS sicherlich (mindestens mal) flexibler zu implementieren.

    Kommentar


      #17
      Moin Männers,
      nicht sooooo schnell!! Muss erstmal mitkommen!!!
      DANKE für die Tipps!!
      Mache ich mich mal ran.
      P.S. das mit dem Besitzer der Webseite abstimmen ob ich das darf,
      ist das erste was ich mache. Der Besitzer erlaubt es, möchte aber nicht
      zitiert werden (oder gar Email erwähnt!!!).
      Nen guten Morgengruß Marcus

      Kommentar


        #18
        Zitat von wintermute Beitrag anzeigen
        gibt es eine native Funktion um eine PCRE auf Gueltigkeit zu pruefen und ggbnflls zu escapen?
        Ist mir nicht bekannt (muss aber nichts heißen). Aber das Prüfen ist m.E. auch nicht sooo wichtig - man könnte ja in der LBS-Hilfe ein paar Hinweise zum prinzipiellen Aufbau geben. Der LBS wäre ohnehin eher etwas für Fortgeschrittene...
        EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

        Kommentar


          #19
          Zitat von wintermute Beitrag anzeigen
          Weil ich nicht so fit in PHP bin: gibt es eine native Funktion um eine PCRE auf Gueltigkeit zu pruefen und ggbnflls zu escapen?.
          preg_match() returns 1 if the pattern matches given subject, 0 if it does not, or FALSE if an error occurred.
          http://php.net/manual/en/function.preg-match.php

          Somit kannst du doch preg_match() === false machen. Oder verstehe ich dich falsch?

          Kommentar


            #20
            Zitat von gaert Beitrag anzeigen
            Klar, aber Du kennst das ja: Spätestens übermorgen heißt es dann "Wie kann ich mehrere(!) Werte aus einer Webseite auslesen?!" Und und und...

            Aber wie wäre es mit einem LBS, der einigermaßen universell arbeitet:
            E1 = URL
            E2 = RegEx-String
            ...

            Entschuldigt Leute, aber ihr seid zu schnell (und zu gut!!!) und hängt mich ab!!
            Also:
            1) mit preng_match kann man die Webseite (mit der Definition zwischen /) auswerten.
            Und ja es kommen einige Werte in der Seite zusammen (numerische und Text- Werte)

            2) Diese Werte muss ich dann mit Regexp im Logikbaustein in einen Ausgangswert schreiben?
            Auszug aus dem 19000210 (NIBE- Wärmepumpe)
            / Status
            $regexp="#ID40004">(.*?)°#";
            preg_match($regexp, $result, $string);
            setLogicLinkAusgang($id,9,$string[1]);
            // print "Aussentemperatur : $string[1]\r\n";


            Also müsste ich dann den Befehl preng_match in den regexp einbinden? Könnte ich so dann alle Webseitendaten
            In jeweils einen Befehl abfragen?
            Anbei meine erste Überlegung zu einer Hilfe!!! Nur mal so!!
            EDOMI Webseitenabfrage.pdf

            Kommentar


              #21
              Zitat von pamo Beitrag anzeigen
              Somit kannst du doch preg_match() === false machen. Oder verstehe ich dich falsch?
              Ich meinte eher die entstehenden Syntax-Fehler bei zB fehlenden " oder '... das faehrt dann EDOMI immer an die Wand, vermute ich.
              Man muesste (oder sollte) sich auf jeden Fall Gedanken darueber machen wie man das moeglichst sorgfaeltig escaped ohne die eigentliche RegExp kaputt-zu-escapen. Und dann am besten im LBS das error_reporting wegbiegen, sonst landen die Warnings (die vermutlich auch beim Ergebnis FALSE kommen werden) alle im Edomi-Errorlog, was unschoen waere.
              Ich hab aber grad keine Zeit LBS zu schreiben, sry

              Kommentar


                #22
                Zitat von tunneltruppe Beitrag anzeigen
                1) mit preng_match kann man die Webseite (mit der Definition zwischen /) auswerten.
                Und ja es kommen einige Werte in der Seite zusammen (numerische und Text- Werte)
                PHP-Code:
                '/Lufttemperatur \(2m\).*?aktuell.*?([0-9\.,]+.C)/s' 
                Ich versuch mal kurz, die RegExp zu erlaeutern (normalerweise faengt man bei mehreren Klammer-Ebenen IMMER innen an, aber sowas haben wir hier ja zum Glueck nicht wirklich )
                Begrenzt wird sie jeweils durch "/", an Anfang & Ende, dafuer koennen auch andere Zeichen genommen werden. tut man gern wenn innerhalb der der RexExp zB selbst sehr viele "/" vorkommen die man alle escapen muesste (was man mit einem vorangestellten "" tut) sofern man die Begrenzer nicht aendert. Folgende RegExp (mit geaendertem Begrenzer) waere also identisch zu der urspruenglichen:
                PHP-Code:
                '#Lufttemperatur \(2m\).*?aktuell.*?([0-9\.,]+.C)#s' 
                Das "s" am Ende bedeutet, dass der Vergleich ueber Zeilentrenner hinweg durchgefuehrt wird.

                Zunaechst wird also nach "Lufttemperatur (2m)" gesucht, die "" vor den Klammern sind zum Escapen, da Klammen in regulaeren Ausdruecken eine besondere Bedeutung haben - wir hier aber einfach nur nach Klammern suchen wollen.
                Das ".*?" danach ist aus drei Elementen aufgebaut, wobei "." fuer ein beliebiges Zeichen steht, "*" fuer keines oder beliebig viele des voranstehenden Elementes und "?" fuer "nicht gierig werden" (also "ungierig" nach beliebig vielen beliebigen Zeichen suchen), danach wird ein "aktuell" erwartet. Taete man das "?" weglassen, dann wuerde das "aktuell" sowie alles folgende von dem ".*" mit einverleibt werden, das "?" sorgt also quasi dafuer nur solange wie noetig zu suchen...
                Nach dem "aktuell" kommt wieder ein ".*?", dann kommt eine Klammer...
                PHP-Code:
                ([0-9\.,]+.C
                Wir erinnern uns: bei Klammerungen immer innen anfangen zu lesen
                "[0-9\.,]" ist eine Aufzaehlung von moeglichen Zeichen, hier also die Zahlen "0-9", der Punkt "\." (welcher escaped werden muss, weil der "." allein ja - siehe oben - sonst eine andere Bedeutung haette) sowie ein ",". Entweder das Komma oder der Punkt waren ueberfluessig, ich weiss aber nicht mehr ob in der Webseite nu "3.4" oder "3,4" standen, drum steht da jetzt beides drin.
                Das "+" bedeutet "eins oder mehr" und bezieht sich (wie oben das "*" auch) auf das voranstehende Element, hier also die Auflistung in eckigen Klammern.
                Es wird also eine nicht-leere Zeichenfolge gesucht, die aus Zahlen, Komma und Punkten bestehen kann.
                Dann kommt wieder ein "." (fuer beliebiges Zeichen, hier aber nur eines, weil ja kein "*" oder "+" dahinter steht) und schliesslich ein "C".

                Der Kram in der Klammer wuerde also zB das hier finden:
                19,55...5223,121MC
                oder auch
                19.2°C
                allerdings kein
                ab,c°C
                Wichtig an der Stelle ist, dass der gesuchte String mit einem "C" aufhoeren wird.

                Alles was in der RegExp in Klammern steht (also hier unser letzter Teil) findet sich dem preg_match in dem Array wieder, welches man als 3. Parameter angegeben hat, bei mir also in $matches.
                $matches[0] enthaelt den kompletten gefunden String
                $matches[n] dann jeweils den Inhalt der n-ten gefundenen Klammer, wobei von "vorn nach hinten" und von "aussen nach innen" gezaehlt wird. In $matches[1] steht also die gesuchte Temperatur.

                Einfach mal probieren nach demselben Muster andere Werte aus der Webseite auszulesen, dabei einfach nach eindeutigen Mustern im Quellcode suchen und versuchen die ueber eine entsprechende RegExp "einzufangen". Die obige welche sollte schonmal ein guter Anfang sein

                Das sieht vllt kompliziert aus, ist aber wirklich ganz einfach...

                Um auf die Frage zurueck zu kommen: man kann nun mit einer entsprechend komplizierten RegExp alle gesuchten Werte auf einmal abfragen - wenn man eben die entsprechenden Klammern setzt. Aber das wird schnell sehr lang und unueberschaubar...

                Zitat von tunneltruppe Beitrag anzeigen
                2) Diese Werte muss ich dann mit Regexp im Logikbaustein in einen Ausgangswert schreiben?
                ...
                preg_match($regexp, $result, $string);
                setLogicLinkAusgang($id,9,$string[1]);
                Jau, genau so.

                Zitat von tunneltruppe Beitrag anzeigen
                Also müsste ich dann den Befehl preng_match in den regexp einbinden? Könnte ich so dann alle Webseitendaten
                In jeweils einen Befehl abfragen?
                Ich glaube, das versteh ich grad nicht... jedenfalls kannst Du (s.o.) alle Werte in einem Rutsch rausbasteln oder fuer jeden gewuenschten Wert ein eigenes preg_match anlaufen lassen. Gehen tut beides, letzteres taete ich persoenlich der Lesbarkeit halber bevorzugen - zumindest bei groesseren Abfragen.

                Ich hoffe das hilft irgendwem tatsaechlich, dann haette ich nicht alles umsonst getippert

                Kommentar


                  #23
                  Hallo Michael!!!! DANKE für die tolle Erläuterung!!!!!
                  Ein Teil habe ich schon im Netz gefunden, aber die "Schachtelung" ist schön von Dir erklärt!!
                  Das /s habe ich bei Dir erst verstanden!!!
                  Ich mache mich heute und die Tage mal ran EINEN Wert hin zu bekommen Dann werde ich
                  mich an die weiteren Werte machen!!!
                  ALSO DANKE DIR für die Mühe des Erklärens!!!
                  Gruß Marcus
                  Zuletzt geändert von tunneltruppe; 25.05.2016, 12:10.

                  Kommentar


                    #24
                    Hallo Michael,
                    ich bin dabei deine tollte Erklärung zu deuten.
                    Leider weiß ich nicht genau ob Du hier etwas flasches sagst:
                    Ich zitiere:
                    Zunaechst wird also nach "Lufttemperatur (2m)" gesucht, die "" vor den Klammern sind zum Escapen, da Klammen in regulaeren Ausdruecken eine besondere Bedeutung haben - wir hier aber einfach nur nach Klammern suchen wollen.
                    Müsste es nicht lauten:
                    Zunaechst wird also nach "Lufttemperatur (2m)" gesucht, die \ \ (also \(2m\)) vor den Klammern sind zum Escapen, da Klammen in regulaeren Ausdruecken eine besondere Bedeutung haben - wir hier aber einfach nur nach Klammern suchen wollen.
                    P.S. leider kann es sein, dass ich Dich noch öfters "anhaue"
                    DANKE DIR vorab!!

                    Kommentar


                      #25
                      Zitat von tunneltruppe Beitrag anzeigen
                      Hallo Michael!!!! DANKE für die tolle Erläuterung!!!!!
                      Dem kann ich mich nur anschließen! Ich bin leider aktuell Beruflich etwas sehr eingespannt als das ich Zeit fürs experimentieren finde.
                      Aber mit der Erklärung werde ich dann sicherlich auch weiterkommen (allgemein was Regexp angeht )

                      Kommentar


                        #26
                        In der Tat! Gut und auf den Punkt Du kannst gerne die Hilfetexte verfassen.....
                        EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                        Kommentar


                          #27
                          Zitat von tunneltruppe Beitrag anzeigen
                          Leider weiß ich nicht genau ob Du hier etwas flasches sagst:
                          Das liegt am Forum... wie gewohnt habe *ich* alles richtig gemacht
                          Das Forum hat irgendwie die backslashes zwischen den " gefressen, da sollte also eigentlich " \ " stehen und nicht ""
                          Zuletzt geändert von wintermute; 25.05.2016, 17:45.

                          Kommentar


                            #28
                            Zitat von gaert Beitrag anzeigen
                            Du kannst gerne die Hilfetexte verfassen.....
                            Ich fuehle mich geehrt, aber wir sollten dieses Thema nicht ueber das Mass hinaus strapazieren

                            Kommentar


                              #29
                              Zitat von wintermute Beitrag anzeigen
                              Das liegt am Forum... wie gewohnt habe *ich* alles gemacht
                              Das Forum hat irgendwie die backslashes zwischen den " gefressen, da sollte also eigentlich " \ " stehen und nicht ""
                              DU DOCH NICHT!!!! Dachte mir schon, das hier jemend was gefressen hat!!!!
                              Die Tage mache in mal weiter und sehe dann wer noch was hier gefressen hat!!!
                              DANKE DIR!!!!

                              Kommentar


                                #30
                                Guten Morgen die Herren,
                                ich sitze ja seit Tagen dran (also nicht ganze Tage) Michael seine Erläuterung
                                zu verstehen. Klappt jetzt auch ganz gut.
                                Anbei einmal der für mich leicht erweiterte Text von Michael in meine „Hilfedatei“.
                                Darein werde ich dann auch den LBS packen.
                                Nun einfach noch mal eine Frage vom Ablauf des Befehls preng_match:
                                Also:
                                ("/Lufttemperatur \(2m\).*?aktuell.*?([0-9\.,]+.C)/s"
                                Quellcode.JPG
                                1) Im Quellcode wird nach dem Schlüsselwort: Lufttemperatur \(2m\)gesucht.
                                (den Schlüsselwert Lufttemperatur denke ich brauche ich, da auf der Seite noch mehr Temp.werte sind).

                                2) Danach wird der eigentliche auszuwertende Wert/ String aktuell gesucht und entsprechend mit den
                                Auswertbefehlen ([0-9\.,]+.C) der eigentliche Wert rausgesucht. Das C am Ende begrenzt den zu
                                suchenden String.

                                Kann man sich das so erklären? Oder (wegen dem von innen nach außen Abarbeiten) läuft das anders?
                                Gruß Marcus
                                EDOMI Webseitenabfrage V1.1.pdf

                                Kommentar

                                Lädt...
                                X