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

    Zitat von hyman Beitrag anzeigen
    weil "0" und "1" keine gültigen XML-Keys
    Habe jetzt folgenden Ansatz probiert:

    Auf Basis des JSON:
    "{"playlists":{"37":"Menschen","56":"Dinge","17":" Geschichten","2":"Sammlungen","78":"Porträts (Frauen)","14":"Sensual"}}"

    generiere ich einmal die Rohdaten:
    "<a:item xmlns:a="item" item="37" type="string">Menschen</a:item><a:item xmlns:a="item" item="56" type="string">Dinge</a:item><a:item xmlns:a="item" item="17" type="string">Geschichten</a:item><a:item xmlns:a="item" item="2" type="string">Sammlungen</a:item><a:item xmlns:a="item" item="78" type="string">Porträts (Frauen)</a:item><a:item xmlns:a="item" item="14" type="string">Sensual</a:item>"

    und die Values wie gehabt.

    Nun könnte ich mit der folgenden Regex Expression:
    "(?<=item=")\d+(?=" type="string")"
    alle Keys generieren.

    Ich habe nur Schwierigkeiten die Expression in die Formelberechnung zu setzen.

    Screenshot (804).png

    Kommentar


      hyman

      Hallo und Guten Abend Horst,

      Hättest Du zu Post 331 noch einen Ansatz für mich?

      Gruss André

      Kommentar


        Wie generierst Du die Rohdaten? Und kannst Du die -- wenn Du sie schon hast -- nicht einfach durch den XML-Parser schieben?

        In der Formelberechnung kannst Du Regular Expressions benutzen. Ob das hilft?

        Oder halt eine simple Textersetzung im JSON mit String.Replace ...

        Kommentar


          hyman

          Guten Morgen Horst.

          die Rohdaten sind das Ergebnis vom XML/JSON Parser, da ich die API bei unserem Dienstleister zwar beeinflussen, aber nicht komplett ändern kann. Das heisst mein Basis-JSON sieht folgendermassen aus:

          {"playlists":{"37":"Menschen","56":"Dinge","17":"G eschichten","2":"Sammlungen","78":"Porträts (Frauen)","14":"Sensual"},"active":"37"​}

          Wenn ich dies mit den Pfaden:

          1: /root/playlists

          2: /root/playlists/*

          3: /root/active

          nutze, erhalte ich in:

          1: <a:item xmlns:a="item" item="37" type="string">Menschen</a:item><a:item xmlns:a="item" item="56" type="string">Dinge</a:item><a:item xmlns:a="item" item="17" type="string">Geschichten</a:item><a:item xmlns:a="item" item="2" type="string">Sammlungen</a:item><a:item xmlns:a="item" item="78" type="string">Porträts (Frauen)</a:item><a:item xmlns:a="item" item="14" type="string">Sensual</a:item>

          2: Menschen;Dinge;Geschichten;Sammlungen;Porträts (Frauen);Sensual

          3: 37

          Nun ist der Wunsch aus 1 einen kommaseparierten String der Keys zu generieren - analog zu Deinem schon genannten Beispiel (das hat auch wunderbar funktioniert, allerdings kann ich genau da die API nicht "umbiegen", sondern muss mir der erhaltenen JSON Key-Value-Pair Liste arbeiten).

          Ich versuche mich gerade an diversen Regex-Expressions und an einem tieferen Blick in C# aber komme da einfach nicht weiter. Ich denke mit Regex wäre es schon der richtige Weg aber ich sehe es gerade nicht.......

          Kommentar


            Du könntest die Anwort aus 1. in einen XML-Parser stecken und dort die item-Attribute aller a:item-Tags matchen und als komma-separierte Liste ausgeben.
            Zuletzt geändert von hyman; 24.02.2024, 11:24.

            Kommentar


              Zitat von hyman Beitrag anzeigen
              XML-Parser
              Mit Hilfe des Textformatierers have ich um dem String noch "<test>.....</test>" gebaut und dann mit Hilfe eines Online-Generators den Pfad "/test/a:item/@item" getestet: es funktioniert online eiwandfrei. Nur der XML-Parser gibt mir die Fehlermeldung "Namespace-Manager oder 'XsltContext' erforderlich. Diese Abfrage hat einen Präfix, eine Variable oder eine benutzerdefinierte Funktion." Ich vermute es liegt an "a:item" - jetzt stehe ich wieder auf dem Schlauch.....

              Kommentar


                Zitat von hyman Beitrag anzeigen
                XML-Parser
                und gelöst: mit "/test//@item" geht es wunderbar. Sehr geil und vielen Dank für Deinen Ansatz.

                Kommentar


                  hyman

                  Entschuldige! Habe es gestern im falschen Thread geschrieben:

                  So nun habe ich die in der Simulation funktionierende Lösung live gestellt und es geht leider nicht. Der X1 meldet mir "'37' is not a valid XML Name"

                  Das ist das Ergebnis der Webabfrage:

                  {"playlists":{"37":"Menschen","56":"Dinge","17" :"G eschichten","2":"Sammlungen","78":"Porträts (Frauen)","14":"Sensual"},"active":"37","state":"1 ","display":"1"}

                  und das sind die Formeln im XML/JSON-Parser. Ich denke, dass es wieder mit den Keys zu tun hat - aber wie kann ich es sonst lösen? Das JSON ist ja absolut korrekt.​

                  Angehängte Dateien

                  Kommentar


                    Hatten wir jetzt schon ein paar Mal: Die Keys müssen alle mit einem Buchstaben anfangen. Entweder in Deinem API ändern oder mit Textersetzung in der Formelberechnung. In Deinem Fall müssen ja mehrere Keys ersetzt werden (evtl. sind die noch nicht mal alle genau bekannt), da hilft dann die Variante mit regular expression …

                    Kommentar


                      Zitat von stefanknx Beitrag anzeigen

                      Die Abfrage funktioniert bei mir auch ohne Probleme über folgende URL: https://api.amc.husqvarna.dev/v1/mowers

                      In Husqvarna API Dokumentation steht, dass die Befehle über folgende URL mit der passenden Mower ID angesprochen werden: https://api.amc.husqvarna.dev/v1/mowers/${mowerId}/actions

                      Ich habe mir schon überlegt, ob es daran liegen könnte, dass die Header im Web-Request-Baustein nach dem Body-Inhalt angehängt werden. Aber da kenne ich mich leider nicht aus:

                      -w "%{http_code}"
                      -X POST
                      -d "{"data": {"type": "ParkUntilFurtherNotice"}}"
                      -H "X-Api-Key: XXXXX"
                      -H "Authorization: Bearer XXXXX"
                      -H "Authorization-Provider: husqvarna"
                      -H "Content-Type: application/vnd.api+json"
                      -k "https://api.amc.husqvarna.dev/v1/mowers/XXXXX/actions"

                      Es ist eigentlich alles enthalten, wie es in der Dokumentation gefordert wird:
                      image.png
                      Falls noch jemand Interesse an der Lösung hat.
                      Man muss dem Baustein im Body den JSON-String in folgendem Format übergeben und vor jedes Hochkomma ein \ machen:

                      {"data": {"type": "ParkUntilFurtherNotice"}}
                      Zuletzt geändert von stefanknx; 14.03.2024, 16:42.

                      Kommentar


                        Hallo in die Runde!

                        derzeit versuche ich mich daran, die Daten meiner Netatmo Wetterstation auszulesen. Dies habe ich soweit auch erstmal hinbekommen, scheitere aber jetzt an dem Bearer Token... Aktuell gibt es einen Access Token und einen Refresh Token, welche beide benötigt werden, um eine Verlängerung um 3h für den Access Token zu erhalten.

                        Jetzt habe ich gelesen, dass zukünftig sowohl Access Token als Refresh Token erneuert werden und somit gesendet und empfangen werden müssen.

                        Da ich leider nicht wirklich tief in der Materie stecke, bräuchte ich bitte Eure Hilfe. Wie kann ich mit den hier im Thread thematisierten LBS dieses Problem lösen, oder gibt es da ggf. schon einen eigenen LBS?

                        Grüße
                        Marc
                        Angehängte Dateien
                        Grüße
                        Marc

                        Kommentar


                          Zitat von SMA Beitrag anzeigen
                          Dies habe ich soweit auch erstmal hinbekommen, scheitere aber jetzt an dem Bearer Token
                          Wenn Du am Token scheiterst, was hast Du dann hinbekommen? Ich unterstelle mal, dass Du aufgrund des nicht funktionierenden Tokens auch keine Daten zurückbekommen hast?

                          Kommentar


                            Die Abfrage läuft, bekomme alle Werte geliefert, dann läuft nach ein paar Stunden der Token ab und die Werte bleiben aus. Ich weiß eben nicht, wie ich zum einen den Refresh Token mitschicken kann und zum anderen, wie ich beide abfrage und dann wieder aktualisiert übergeben kann.

                            Habe nun mit einem zweiten Baustein versucht die Token zu aktualisieren und die notwendigen Daten in Header gepackt, erhalte aber als Antwort eine Fehlermeldung...

                            {"error":"invalid_request","error_description":"In valid grant_type parameter or parameter missing"}
                            Gemäß Doku sollen die Werte wie folgt übergeben werden:
                            Code:
                            POST /oauth2/token HTTP/1.1
                            Host: api.netatmo.com
                            Content-Type: application/x-www-form-urlencoded;charset=UTF-8
                            
                            grant_type=refresh_token
                            refresh_token=[YOUR_REFRESH_TOKEN]
                            client_id=[YOUR_APP_ID]
                            client_secret=[YOUR_CLIENT_SECRET]
                            
                            
                            Return exampleHTTP/1.1 200 OK
                            Content-Type: application/json;charset=UTF-8
                            Cache-Control: no-store
                            Pragma: no-cache
                            
                            {
                            "access_token":"2YotnFZFEjr1zCsicMWpAA",
                            "expires_in":10800,
                            "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
                            }​
                            Angehängte Dateien
                            Zuletzt geändert von SMA; 20.03.2024, 06:47.
                            Grüße
                            Marc

                            Kommentar


                              Du könntest versuchen Dir Deinen ersten Token-Request mit der Formelberechnung zusammenzubauen und dann an den Web-Request-Baustein zu übergeben um das erhaltene Token in der weiteren Abfrage zu benutzen - glücklich ist die variante aber dennoch nicht. Nicht umsonst haben einige fleissige User aufgrund diverser API-Authentifizierungen extra eigene Logik-Bausteine gebaut. Eine funktionierende Alternative wäre noch einen eigene API-Konverter auf einem existierenden Web-Space zu bauen.....
                              Zuletzt geändert von araeubig; 20.03.2024, 16:14.

                              Kommentar


                                Danke für den Tipp, ich habe die Anfrage jetzt erstmal hinbekommen, wenn auch sehr unschön im Textformatierer gelöst...
                                Code:
                                grant_type={a:B||refresh_token}&client_id={b:S}&client_secret={c:S}&refresh_token={d:S}
                                Da ich sowohl im Textformatierer wie auch in der Formelberechnung einen Trigger brauche, ist die aktuelle Abfrage etwas sehr unprofessionell.
                                Wie muss ich den Formelbaustein befüllen, um nachfolgende Zeile im Body ausgeben zu können?
                                Code:
                                grant_type=refresh_token&client_id=XXX&client_secret=XXX&refresh_token=XXX​
                                Angehängte Dateien
                                Zuletzt geändert von SMA; 20.03.2024, 21:24.
                                Grüße
                                Marc

                                Kommentar

                                Lädt...
                                X