Ankündigung

Einklappen
Keine Ankündigung bisher.

[Newbie-Frage] Laufende Http-Abfragen auswerten und in MySQL Datenbank speichern

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

    [Newbie-Frage] Laufende Http-Abfragen auswerten und in MySQL Datenbank speichern

    Moin, ich bin neu in diesem Thema und brauche mal eine generelle Richtung in der ich weiter suchen soll:

    Mein Ziel ist es Daten von Webseiten (3) abzurufen (liefert JSON Script, aus dem mehrere Daten ausglesen werden sollen) und diese dann in eine MySQL Datenbank zu speichern.
    Dazu habe ich bisher die 3 Webabrufe als String Items erstellt, die alle x-Minuten abgerufen werden (funktioniert).
    Die einzelnen Daten will ich dann aus den String auslesen (sollte mit "= transform("JSONPATH"; "$.gesuchterEintrag", MeinString)" funktionieren. Obwohl ich nicht sicher bin ob das unter Items funktioniert.
    Die ausgewerteten Daten sollen dann mit einer Persistence Regel in die DB gespeichert werden. Das Abspeichern von Werten als solche in eine DB funktionierrt auch schon

    Ist dieser prinzipielle Weg richtig oder bin ich auf dem "Holzweg" ?

    Danke in vorraus!

    #2
    Ein verregneter Sonntag bietet viel Zeit:

    Mein Lösung:
    Je Webseite, die ich abfragen will, ein String-Item das das kompletten JSON Skript alle 10 Minuten als String ausliest. Anzeigen tue diesen aber nicht, daher keine Zuordnung zu einem Frame der Sitemap.
    Code:
    String Abfrage1 "Test: [%s]"  { http="<[https://WhatEver.What/xxxxxxxxxxxxxxxxxxxxxx:600000:REGEX((.*))]"
    Dazu passen eine Rule, die diesen String bei Änderung in die benötigten EinzelWerte parsed. (ob ich alle diese (kopierten ;-) ) Imports brauche, muss ich noch prüfen.
    Code:
    import org.openhab.core.library.types.*
    import org.openhab.core.persistence.*
    import org.openhab.model.script.actions.*
    
    rule "Logging"
      when
        Item Abfrage1 changed
      then
            var String json = (Abfrage1.state as StringType).toString
            var Double E10  = new Double(transform("JSONPATH", "$.station.e10", json))
            var Double E5  = new Double(transform("JSONPATH", "$.station.e5", json))
            var Double Diesel  = new Double(transform("JSONPATH", "$.station.diesel", json))
            var String ID = transform("JSONPATH", "$.station.id", json)
            var String Name = transform ("JSONPATH", "$.station.name", json)
    
            sendCommand(E10_1,  E10)
            sendCommand(E5_1, E5)
            sendCommand(Diesel_1,  Diesel)
            sendCommand(ID_1,  ID)
            sendCommand(Name_1, Name)
     end
    Die Items E10_1, E5_5 usw. werden zZ dann auf dem GUI angezeigt.
    Das Speichern in die Datenbank übernimmt die Standard-Persitence. Hier werden alle Items gespeichert, das kann ich später noch optimieren.
    Code:
    Strategies {
        default = everyUpdate
    }
    
    Items {
        * : strategy = default, restoreOnStartup
    }
    Damit komme ich ans Ziel.

    Kommentar


      #3
      Du kannst auch das http-Binding mit Cache verwenden. In der openhab.cfg:
      Code:
      http:abfrage.url=https://WhatEver.What/xxxxxxxxxxxxxxxxxxxxxx
      http:abfrage.updateInterval=600000
      Als Items:
      Code:
      Number    E10_1    "E10 [%0.3f EUR]"    { http="<[abfrage:60000:JSONPATH($.station.e10)]" }
      Number    E5_1    "E5 [%0.3f EUR]"    { http="<[abfrage:60000:JSONPATH($.station.e5)]" }
      Number    Diesel_1    "Diesel [%0.3f EUR]"    { http="<[abfrage:60000:JSONPATH($.station.diesel)]" }
      String    ID_1    "Preis E10 [%s]"    { http="<[abfrage:60000:JSONPATH($.station.id)]" }
      String    Name_1    "Preis E10 [%s]"    { http="<[abfrage:60000:JSONPATH($.station.name)]" }
      sollte eigentlich so funktionieren.
      Die Updatefrequenz der Items is bewusst auf 1 Minute gesetzt, damit die Items relativ schnell befüllt werden. Die Website wird trotzdem nur alle 10 Minuten abgefragt (updateinterval in der openhab.cfg)

      Kommentar


        #4
        Danke für diesen Input.
        Das Binding unterstützt sogar zwei Caches!
        Da ich aber 3 Abfragen auswerten will, muss ich m.E. einen/den anderen Weg gehen.
        Was mich noch stört ist die (mir) fehlende Möglichkeit den URL-String dynamisch zusammenzusetzen. Die drei Abfragen sind fast identisch, bis auf zwei Schlüssel, die hätte ich gerne per Variable festgelegt.
        Gleiches gilt für die o.a. Regel, für die drei Abfragen haben ich jetzt den Code verdreifacht (es gibt jetzt als Item E10_1, E10_ , E10_3 usw.). Könnte die die Items als Array oder List ansprechen, dann müsste es ohne diese Code-Doppelungen gehen.
        ...auf der Suche.

        Kommentar


          #5
          Also grundsätzlich kannst Du sogar beliebig viele Caches anlegen. Und wenn Du damit leben kannst, drei sehr ähnliche Abfragen in drei Caches bereitzuhalten, kommst Du komplett ohne Code aus (die Items musst Du ja ohnehin definieren).

          Kommentar


            #6
            Aha, so hatte ich den Hilfetext nicht verstanden. Aber ich lerne gerne dazu. Das wird mir natürlich helfen. Danke

            Kommentar


              #7
              .. und noch eine Frage zu dem Lösungsvorschlag:
              Zitat von udo1toni Beitrag anzeigen
              Die Updatefrequenz der Items is bewusst auf 1 Minute gesetzt, damit die Items relativ schnell befüllt werden. Die Website wird trotzdem nur alle 10 Minuten abgefragt (updateinterval in der openhab.cfg)
              Wozu die höhere Updatefrequenz? Ich verstehe das so, haben die Items einmal einen Wert, der sich ja innerhalb der 10 Minuten nicht ändert, wird dieser auch bei jeden Aufruf der entsprechenden Seite angezeigt. Haben die Items noch keinen Wert (nach einem SystemNeustart, bevor die erste WebAbfrage gelaufen ist), nützt auch der höhere Update nix.
              Oder liege ich auch da daneben?

              Kommentar


                #8
                Da liegst Du grundsätzlich richtig, bis auf den Moment, wo Du im laufenden Betrieb eine Itemdefinition veränderst, dann sind alle Items so lange uninitialiezed, bis sie ein Update oder Command empfangen oder senden. Grundsätzlich kannst Du die Updatefrequenz natürlich auf jeden beliebigen Wert setzen, wobei natürlich eine hohe Updatefrequenz auch eine höhere Belastung bedeutet

                Kommentar


                  #9
                  Zitat von udo1toni Beitrag anzeigen
                  Also grundsätzlich kannst Du sogar beliebig viele Caches anlegen. Und wenn Du damit leben kannst, drei sehr ähnliche Abfragen in drei Caches bereitzuhalten, kommst Du komplett ohne Code aus (die Items musst Du ja ohnehin definieren).
                  Funktioniert, obwohl so nicht beschrieben, auch mit 3 Caches!
                  Gibt es da eine Obergrenze?
                  Zuletzt geändert von Gast; 03.02.2016, 19:01. Grund: Eigen D***heit!

                  Kommentar


                    #10
                    Ah. Ich sehe jetzt das Missverständnis, im Wiki sind in der Definition <cacheItemName1> und <cacheItemName2> erwähnt. Damit wird aber nur angedeutet, dass man mehrere CacheItems definieren kann. Eine Obergrenze gibt es da nicht, außer die natürlichen, also RAM und HDD-Speicher der Maschine, auf der openHAB läuft.
                    Das gibt's auch bei etlichen anderen Bindings, wo man typischerweise auch mal mehr als ein entsprechendes Gerät im Haus erwarten kann, also Fernseher, Verstärker, Mediaplayer usw.

                    Kommentar

                    Lädt...
                    X