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

    #31
    Korrekt.

    Generell ist das Auswerten einer Webseite natürlich eine "Krücke" - jede kleine Änderung an der Seite führt u.U. dazu, dass die Auswertung scheitert. Oder noch schlimmer: Unerwartete Werte liefert - z.B. die Regenmenge anstelle der Temperatur, plötzlich werden 1000 Grad gemeldet und die Heizung spinnt

    Für rein visuelle Zwecke ist's natürlich egal, aber ich würde mit den so ermittelten Werten keinesfalls "arbeiten" wollen (Logik, etc.)!
    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

    Kommentar


      #32
      In meinem Fall ist es keine generische Webseite, ich bekomme über ne API folgende xml Struktur zurück (Gekürzt, nur die ersten Zeilen zur Veranschaulichung)

      Code:
      <data>
      <request>
      <type>City</type>
      <query>Weyhe, Germany</query>
      </request>
      <current_condition>
      <observation_time>10:03 AM</observation_time>
      <temp_C>14</temp_C>
      <temp_F>57</temp_F>
      <weatherCode>122</weatherCode>
      Hier ändert sich natürlich an der Struktur nichts und kann auch prima für Logiken genutzt werden. Ich nutze es zb aktuell für die relative Außenluftfeuchtigkeit, da ich noch keinen Sensor dafür habe. (Fehlplanung meinerseits)

      Aber grundsätzlich hat gaert schon recht, das Risiko einer Änderung auf einer Webseite ist enorm.

      Kommentar


        #33
        Zitat von tunneltruppe Beitrag anzeigen
        Kann man sich das so erklären? Oder (wegen dem von innen nach außen Abarbeiten) läuft das anders?
        Ja, richtig verstanden

        Um konkret auf die Fragen einzugehen:
        1) ja
        2) ja

        Wenn man das °C nicht im Ergebnis haben moechte, kann man auch die letzte Klammer versetzen, also zB so:
        Code:
        [COLOR=#FF0000]([0-9\.,]+).[B]C[/B][/COLOR]
        Dann wird zwar dasselbe gesucht, aber da die Klammer nicht mehr alles umschliesst, landet nur die tatsaechlich Temperatur im Ergebnis.

        Kommentar


          #34
          Zitat von NexusCore Beitrag anzeigen
          In meinem Fall ist es keine generische Webseite, ich bekomme über ne API folgende xml Struktur zurück
          Also wenn da eh XML zurueckgeworfen wird, dann wuerde ich unbedingt das XML in ein Array umwandeln und direkt auswerten anstatt drin rumzusuchen. Das ist einfacherer und sichererererer, besonders gegen Aenderungen in der API.

          Kommentar


            #35
            In meinem VLC LBS parse ich auch eine XML-Antwort, das ist in PHP mit SimpleXMLElement::xpath recht einfach.
            Und um den gewünschten XPath-Ausdruck zu bekommen, verwende ich in Chrome das XPath Helper Plugin und wie die XPath-Syntax aufgebaut ist, ist hier ganz gut beschrieben.

            Kommentar


              #36
              Ich habe neulich auch eine Logic (allerdings in Python für Smarthome.py) entwickelt. Ich habe mir dazu den relevanten Quelltext aus der Website kopiert und mittels der Seite https://regex101.com erstmal die Regexp erstellt. Der Rest ist dann meistens ein Kinderspiel.
              ++ Der ultimative ETS Schnellkurs ++
              KNX und die ETS vom Profi lernen
              www.ets-schnellkurs.de

              Kommentar


                #37
                Hi, ich wollte mich jetzt auch mal mit Regexp beschäftigen und ein paar Sachen umstellen.

                ich wollte folgenden Code parsen:

                PHP-Code:
                    <div class="span-11 append-1" style="float:left"><table class="info"><tr><th colspan="2" class="round-top">RAUMTEMPERATUR</th></tr>  <tr class="even">
                    <
                td class="key">SOLLTEMPERATUR HK 1</td>
                    <
                td class="value">19,0 °C</td>
                  </
                tr>
                </
                table></div><div class="span-11 prepend-1" style="float:right"><table class="info"><tr><th colspan="2" class="round-top">HEIZUNG</th></tr>  <tr class="even">
                    <
                td class="key">AUSSENTEMPERATUR</td>
                    <
                td class="value">14,7 °C</td>
                  </
                tr
                dazu habe ich folgendes mal als test gemacht:

                PHP-Code:
                <?php
                $src
                =file_get_contents("http://192.168.84.155/?s=1,0");
                if (
                preg_match("/AUSSENTEMPERATUR.*?([0-9\.,]+.C)/s",$src,$matches)) {
                  print 
                $matches[1];
                }

                ?>

                Ausgabe bleibt allerdings leer, sieht jemand wo mein Fehler liegt???

                Gruß


                Kommentar


                  #38
                  Hi

                  Ohne es ausprobiert zu haben: In der RegEx fehlt " °", Du erwartest das "C" als zweites Zeichen nach einer Ziffer, es ist aber das dritte.
                  Kind regards,
                  Yves

                  Kommentar


                    #39
                    Starwarsfan war schneller und hat recht, dein + bezieht sich auf die Zeichengruppe vorher und das Leerzeichen fehlt. Vorschlag von mir allerdings ebenfalls ohne Test (und ohne Einheit):

                    PHP-Code:
                    if (preg_match("/>AUSSENTEMPERATUR<.*?>([0-9\.,]+)\s.C</s",$src,$matches)) { 
                    Zuletzt geändert von panzaeron; 29.05.2016, 09:15.

                    Kommentar


                      #40
                      <besserwissermodus>
                      Zitat von panzaeron Beitrag anzeigen
                      PHP-Code:
                      if (preg_match("/>AUSSENTEMPERATUR<.*?>([0-9\.,]+)\s+.C</s",$src,$matches)) { 
                      </besserwissermodus>
                      Hinter dem \s sollte ein "quantfier" stehen der angibt wie oft der/die/das Zeichen vorkommen mag.... "+" steht hier "fuer ein oder oefter". Wegen der Eindeutigkeit und so...

                      Kommentar


                        #41
                        läuft so. Danke

                        Kommentar


                          #42
                          Erstmal DANKE ins Forum und DANKE Michael für die gute Unterstützung!!
                          Denn, mein erster ###[EXEC]### Baustein läuft, wenn auch mit
                          einigen geklauten Eintragungen und nicht sooo richtig!!

                          Nun habe ich noch zu zwei Problemen ein paar Fragen:

                          Problem 1:
                          Ich denke das Problem hat Michael schon angesprochen:
                          Ich zitiere:
                          (das ist genau genommen unsauber programmiert, liegt aber daran, dass die
                          Webseite ein falsch kodiertes °-Symbol zurückliefert)

                          Die Ergebnisse werden, z:b. E2=21,6?C, mit dem ? für das “ ° “ angezeigt?!?!?!?.
                          Nun die Fragen dazu:
                          1) Kann man das ° Zeichen im String, bei einer unsauberen Webseite überhaupt
                          reinbekommen?
                          2) Wenn man die Einheit bei einer unsauberen Webseite nicht bekommt, kann man
                          dann im LBS eine Einheit „dazu Dichten“?

                          Problem 2:
                          Ich frage den Baustein zwar zyklisch ab, aber die Werte weichen von der Webseite ab.
                          Nur wenn ich das Projekt neu Einspiele werden aktualisiert.
                          Was habe ich da wohl falsch gemacht??
                          LBS_242_1.jpg
                          Also DANKE ERSTMAL bis hierhin!!
                          Gruß Marcus
                          LBS_242_2.jpg

                          Kommentar


                            #43
                            Zu Problem 2: Unter Umständen mag der Ziel-Server deine Abfragen im 6-Sekunden-Takt nicht? Viele Dienste dieser Art merken sich die IP-Adresse und lassen nur ein bestimmtes Abfrage-Intervall zu.
                            EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                            Kommentar


                              #44
                              Hallo Christian,
                              danke für den Tipp.
                              Auf wieviel Minuten soll man am besten das stellen?
                              Wetter ist ja nicht sooo wichtig? 5- 10 min?
                              Noch mal eine Frage zu den LBS. Bzw. den Text im z.B. Ausgang.
                              LBS_242_3.jpg
                              Der wird ja bei mir?!?! immer abgeschnitten. Habe ich etwas überlesen wie lang der nur sein darf??

                              Kommentar


                                #45
                                Du setzt setLogicElementStatus nicht mehr auf 0, daher geht er vermutlich nur beim allerersten Start in den Teil wo das EXEC gestartet wird.

                                Mach mal am Ende des EXEC ein

                                PHP-Code:
                                  setLogicElementStatus($id,0); 

                                Kommentar

                                Lädt...
                                X