Ankündigung

Einklappen
Keine Ankündigung bisher.

Webservices mit dem Gira X1 oder L1 abfragen

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

    #31
    Hallo Horst,

    leider funzt das nicht.
    Was ich sicher weiss, ist dass die Kommunikation funktioniert. Es gibt noch eine weitere Adresse, mit der ich gewisse Basisdaten abfragen kann. Damit bekomme ich auch eine Ausgabe am Ausgang des Web-Request-Bausteins.
    Weiter komme ich aber noch nicht. Selbst bei der Authentifizierung bekomme ich nichts raus.

    Gibt es eine einfache Möglichkeit diese Authentifizierungs-Geschichte irgendwo einzugeben? Im Chrome funktioniert es schon mal nicht....

    Vielleicht hilft ja noch ein "Javascript example for ioBroker"

    1 var TimeInterval = setInterval ( MyJavascript ,5000) ;
    2
    3 function MyJavascript () {
    4 var request = require (’request ’) ;
    5 var user = " hycube ";
    6 var password = " hycube ";
    7 var options = {
    8 url : ’http ://10.1.1.51/ auth /’,
    9 headers : {
    10 " Authorization ": Buffer . from (" Basic " + user + ":" + password ) . toString (’base64 ’)
    11 } ,
    12 body : ’ [...] ’
    13 };
    14 request . post ( options , function (error , response , body ) {
    15 if ( error ) {
    16 console .log ("Ein Fehler ist aufgetreten ")
    17 } else {
    18
    19 var auth_token = body ;
    20
    21
    22 var url = require (’request ’) ;
    23 var options = {
    24 url : ’http ://10.1.1.51/ get_values /’,
    25 headers : {
    26 " Authorization ": auth_token
    27 } ,
    28 body : ’ [...] ’
    29 };
    30
    31 url . post ( options , function (error , response , body ) {
    32 if ( error ) {
    33 console .log ("Ein Fehler ist aufgetreten ")
    34 } else {
    35 var result = JSON . parse ( body ) ; 36
    37
    38
    39 var GridPower = ( result [" Grid_P "]) ; 8
    40 var BatteryPower = result [" Battery_P "];
    41 var HausPower = result [" Home_P "];
    42 var solar = result [" solar1_P "];
    43
    44 setState (’HyWeb . Batterie ’, BatteryPower ) ;
    45 setState (’HyWeb . Grid ’, GridPower ) ;
    46 setState (’HyWeb . Hausverbrauch ’, HausPower ) ;
    47 setState (’HyWeb . Solar ’, solar ) ;
    48
    49 }
    50 }) ;
    51
    52
    53
    54
    55 }
    56 }) ;
    57
    58
    59 }

    Kommentar


      #32
      Das, was der JavaScript-Code macht, deckt sich mit dem, was ich erwartet (und in meinem Post oben beschrieben) habe. Wichtig ist noch, dass Du die "Methode" auf "POST" stellst, das hatte ich noch nicht geschrieben.

      Kommentar


        #33
        Hallo,

        erst einmal großen Dank für den XML/JSON Parser :-)

        Allerdings habe ich gerade Startschwierigkeiten. Ich versuche per JSON die aktuelle Leistung einer Photovoltaikanlage aus einem Fronius Symo Wechselrichter auszulesen.
        In der Simulation des GPA klappt das, ausgeführt auf dem X1 leider nicht.

        So sieht das JSON aus

        Code:
        {
        "Body" : {
        "Data" : {
        "DAY_ENERGY" : {
        "Unit" : "Wh",
        "Values" : {
        "1" : 17429
        }
        },
        "PAC" : {
        "Unit" : "W",
        "Values" : {
        "1" : 1791
        }
        },
        "TOTAL_ENERGY" : {
        "Unit" : "Wh",
        "Values" : {
        "1" : 9012560
        }
        },
        "YEAR_ENERGY" : {
        "Unit" : "Wh",
        "Values" : {
        "1" : 3159160
        }
        }
        }
        },
        "Head" : {
        "RequestArguments" : {
        "DeviceClass" : "Inverter",
        "Scope" : "System"
        },
        "Status" : {
        "Code" : 0,
        "Reason" : "",
        "UserMessage" : ""
        },
        "Timestamp" : "2020-06-11T16:09:05+02:00"
        }
        }
        Der Webrequest wird (auch auf dem X1) erfolgreich an den Parser übergeben.
        Dort ist als Pfad 1 /root/Body/Data/PAC/Values/1 gesetzt, Art der Pfadauswahl "Erster Treffer aks Zahl". Wie gesagt, in der Simulation klappt das.
        Auf dem X1 ausgeführt erhalte ich als Laufzeitfehler aus dem Parser aber "'1' is not a vaild XML Name".
        Hab natürlich schon ein bisschen nach XPath gesucht und mit dem Pfad rumgespielt, komme aber nicht voran.

        Irgendwelche Tipps?

        Kommentar


          #34
          Jawohl!

          Das Problem hatte ich bei mir auch. Hat mir hyman dann auch gleich geholfen. Der Parser kommt mit den Ausdrücken "1" und "null" nicht klar (warum, habe ich auch nicht verstanden...). Deswegen muss man den JSON-Content erst durch einen Baustein schicken, der die doofen Ausdrücke gegen unproblematische Ausdrücke austauscht. Das geht über den Formelberechner (ebenfalls ein Baustein von hyman).

          Sieht bei mir so aus:

          Unbenannt.JPG

          Die komplette Formel lautet:

          Code:
          {text:S}.Replace("\"1\"","\"one\"").Replace("null","0.0")
          Dann solltest du auch keinen Laufzeitfehler mehr bekommen.
          Zuletzt geändert von jaydee73; 11.06.2020, 16:00.

          Kommentar


            #35
            Ja wunderbar, danke
            Ich hatte schon versucht die "1" zu ersetzen, mir fehlte dafür aber der passende Ausdruck. Ich hab natürlich direkt alle Ziffern "1" ersetzt, nicht nur die "alleinstehenden".
            So funktioniert das aber, danke

            Kommentar


              #36
              Hat jemand bereits einen Plenticore an den X1 gehängt?
              Das Thema JSON ist mir leider völlig neu und könnte mir Sparring geben?

              Kommentar


                #37
                hyman

                Vielen Dank für den Thread, der ist sehr hilfreich.

                Ich möchte meinen Yamaha AVR auch über den Webrequest steuern. Das funktioniert auch soweit.

                Bei Yamaha ist es so, das man z.B. die URL aufruft und per POST den text/plain übermittelt der den Befehl enthält.

                z.B.: <YAMAHA_AV cmd="PUT"><Main_Zone><Scene><Scene_Load>Scene 1</Scene_Load></Scene></Main_Zone></YAMAHA_AV>

                Ich finde es ziemlich umständlich, für jeden Befehl einen Web Request Block anzulegen. Man kann ja mit Variablen sich zusätzliche Inputs anlegen.
                Ist es möglich, das man die Zeichenkette an eine Gruppenadresse übermittelt und das auführen lässt?
                Dann müsste man immer nur den spezifischen Comand übermitteln.
                Ich könnte die Befehle auch durchnummerieren, aber irgendwie ist das auch bisschen umständlich.

                2020-06-29_21h32_20.png
                Angehängte Dateien

                Kommentar


                  #38
                  Hallo zusammen,

                  Ich bin recht neu hier und habe eine Frage zum XML/JSON Parser.

                  Ich möchte folgende JSON Antwort auswerten.

                  {"version":"0.3","data":{"tuples":[[1593550509426,2757458.3,1]],"uuid":"xxxx-xxxx","from":1593550508419,"to":1593550509 426,"average":0,"consumption":0,"rows":2}}

                  Wie komme ich denn an den markierten Wert und zwar nur an den? Wenn ich als Pfad "root/data/tuples/item[position()<2]" verwende bekomme ich zwar alle Werte am Ausgang in einer Art XML-Struktur, die Werte werden aber nicht weitergegeben.

                  Mein Ziel ist es aus dem JSON den Wert "2757458.3" als Zahl weiter zu geben und somit meinen Stromverbrauch (Quelle Volkszähler) in der Visu anzuzeigen.

                  Viele Grüße
                  Patrick

                  Kommentar


                    #39
                    Was hast Du im Parser-Baustein außer dem oben genannten XPath genau konfiguriert? Und was genau bekommst Du am Ausgang?

                    Schon mal position()=1 (statt ...<2) im obigen XPath probiert? Evtl. fehlt auch noch eine weitere Indizierungsstufe, weil da ja zwei Paare eckige Klammern um das tuple rum sind...
                    Zuletzt geändert von hyman; 01.07.2020, 06:12.

                    Kommentar


                      #40
                      Zitat von madex Beitrag anzeigen
                      Ist es möglich, das man die Zeichenkette an eine Gruppenadresse übermittelt und das auführen lässt?
                      Dazu brauchst Du keine Gruppenadresse. Ein interner Variablen-Datenpunkt reicht. Der kann auch Texte mit mehr als 14 Zeichen.

                      Kommentar


                        #41

                        Zitat von hyman Beitrag anzeigen
                        Was hast Du im Parser-Baustein außer dem oben genannten XPath genau konfiguriert? Und was genau bekommst Du am Ausgang?

                        Schon mal position()=1 (statt ...<2) im obigen XPath probiert? Evtl. fehlt auch noch eine weitere Indizierungsstufe, weil da ja zwei Paare eckige Klammern um das tuple rum sind...
                        Wenn ich als Pfad als "root/data/tuples/item[position()]" verwende bekomme ich beim Ausgang "<item type="number">1593583018081</item><item type="number">2759404.8</item><item type="number">1</item>".

                        Wenn ich als Pfad als "root/data/tuples/item[position()=2]" verwende bekomme ich beim Ausgang eine leere Antwort. Es scheint als hat du mit den beiden eckigen Klammern schon die richtige Idee.

                        Zu meiner Konfiguration vom Parser-Baustein, siehe Screenshot. (Ziel ist es eine Zahl auszugeben, wenn ich bei Pfadauswahl "Erster Treffer als Zahl" auswähle bekomme ich auch nur einen Wert, aber leider den falschen. Deshalb habe ich im Moment bei Pfadauswahl erst einmal "Alle Treffer als verketteter Text" gewählt.)

                        json-gira.PNG



























                        Leider weiß ich nicht wie im im Parser eine zweite Indizierungsstufe einbauen kann / soll.

                        Kommentar


                          #42
                          Habe die Lösung gefunden für mein Problem.

                          Quelle Volkszähler Json:
                          Code:
                          {"version":"0.3","data":{"tuples":[[1593550509426,2757458.3,1]],"uuid":"xxxx-xxxx","from":1593550508419,"to":1593550509 426,"average":0,"consumption":0,"rows":2}}
                          Problem war im Json ein array was übergeben wurde. Die Lösung ist wie folgt:
                          1. JSON parsen mit dem Pfad
                            Code:
                            root/data/tuples/item[1]
                            Ausgang
                            Code:
                            <item type="number">1593717755823</item><item type="number">2772176.1</item><item type="number">1</item>
                          2. Typ konvertieren und in eine XML Parser konforme Struktur bringen mit Hilfe des Textformatieres. Es fehlt um die Items ein "Klammer"-Tag.
                          3. String mit dem XML Parser auswerten und mit dem Pfad
                            Code:
                            root/item[position()=2]
                            kommt man an den gewünschten Wert.
                          Danke für die Anregung mit der doppelten Klammer die hat mich auf die richtiger Idee gebracht.

                          Screenshot der Modulkette.

                          json-gira-2.PNG
                          Angehängte Dateien

                          Kommentar


                            #43
                            Vielleicht einfacher mit nur einem Parser (nicht getestet):
                            Code:
                            root/data/tuples/item[1]/item[2]

                            Kommentar


                              #44
                              Zitat von hyman Beitrag anzeigen
                              Vielleicht einfacher mit nur einem Parser (nicht getestet):
                              Code:
                              root/data/tuples/item[1]/item[2]
                              Funktioniert, danke für den Tipp, so konnte ich etwas einfacher machen.

                              Kommentar


                                #45
                                Moin zusammen,

                                ich versuche mich als Neuling gerade auch mit dem HTTPGetRequest die aktuelle Temp aus Openweather zu bekommen.
                                In der Sim läuft auch alles und es wird zB "15,17" ausgelesen (Sommer ist ja vorbei).
                                Allerdings wird mir das nicht als Kachel in der X1 App angezeigt.
                                Ich denke ich habe einen Fehler bei Text / String etc.

                                Daten von: http://api.openweathermap.org/data/2...=xml&q=Hamburg
                                Im Parser: /weatherdata/forecast/time[position()<5]/temperature/@value
                                Ausgabe als Dezimalwert 9.x2Byte Dezimalwert Gleitkommawert "15,7" oder als 16.x ASCII "15.7" bringt leider nichts.

                                You do not have permission to view this gallery.
                                This gallery has 1 photos.

                                Kommentar

                                Lädt...
                                X