Ankündigung

Einklappen
Keine Ankündigung bisher.

Das lesen von Daten aus einem API

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

    X1 Das lesen von Daten aus einem API

    Moin Leute, ich bin neue in der KNX Umgebung und versuche gerade Daten über ein API in dem X1 zu übertragen. Ich bin erstmal in der Simulationsphase auf GPA.
    Die Daten sollen über den Web Request Logikbaustein reinkommen und die Antwort soll ich dann verarbeiten können.

    Weiß jmd wie ich die Infos aus der Antwort filtern kann? Z.b Start Time, End Time und Preis für jedes Element der Liste. Hier ist der Link für die Liste: api.corrently.io/v2.0/gsi/marketdata?zip=69256
    Ich freue mich auf eure Beiträge.

    Grüße

    #2
    Herzlich Willkommen im Forum!

    Zum Filtern gibt es den LBS XML-/JSON-Parser​ im Paket ​Neue Logikbausteine für den L1/X1: Formelberechnung, Statistik und mehr...​

    Kommentar


      #3
      Mit "für jedes Element der Liste" wird es schwierig, weil es ja im X1 keine Datentypen für Listen gibt. Vielleicht schreibst Du uns mal, was Du mit den Daten nach dem Extrahieren aus dem JSON-Text tun möchtest.

      Kommentar


        #4
        Danke für eure Beiträge!!!

        Ich habe vor, bei Intervallen (Start Time - End Time) mit niedrigen Werten (lokale Preisen) die Aktoren anzuschalten.
        Wäre es mit LBS XML-/JSON-Parser​ möglich? und wenn ja, wie könnte ich den Pfad zusammen setzen?

        Kommentar


          #5
          Eigentlich brauchst Du also die Zeiträume mit den niedrigsten Preisen, sehe ich das richtig? Dazu ist der Json-Parser schonmal der richtige Einstieg. Man muss den so konfigurieren, dass er kommaseparierte Listen der Zeitmarken und zugehörigen Preise ausgibt. Dazu dienen z.B. die folgenden Pfade:
          • /root//start_timestamp
          • /root//localprice
          Als Art der Pfadauswahl jeweils "Alle Treffer als verketteter Text" auswählen und als Trennzeichen z. B. den Strichpunkt (weil der in Zahlen nie vorkommt).

          Die kommaseparierten Listen kann man dann mit der Formelberechnung weiter verarbeiten. Die Startzeit der billigsten Viertelstunde ermittelt man z. B. mit folgenden Formeln:
          1. /* Minimalwert */ Data.Sort(Data.ConvertDoubles({prices:S}.Split(';' )))[0]
          2. /* Index des Minimalwerts */ Array.IndexOf(Data.ConvertDoubles({prices:S}.Split (';')), _out1_)
          3. /* Startzeit des Minimalwerts */ Data.ConvertDoubles({starts:S}.Split(';'))[_out2_]/1000
          Die Feststellung des Minimalwertindex mit den ersten beiden Formeln ist leider ziemlich ineffizient, weil man dazu zweimal das Preisarray erzeugen und es einmal sortieren muss, mir ist aber nix besseres eingefallen ...

          Unklar ist mir noch, was bei Dir das Kriterium für "jetzt einschalten" sein soll. In Frage käme aus meiner Sicht sowas wie "aktueller Preis nicht mehr als 120% von niedrigstem Preis". Das sollte mit der Formelberechnung auch hin zu bekomen sein ...

          Kommentar


            #6
            Dein Einsatz funktioniert schon mal Danke. Da die Preisen ein Tag vorher freigegeben werden, würde ich ein Paar Slots mit niedrigen Preisen auswählen und das Datum inkl Uhrzeiten (Start Time ) an Aktoren weiter geben als Einschaltpunkten.
            Könnte mal vielleicht die Preisen aufsteigend mit dazu gehörigen Startzeit sortieren? So könnte es klappen oder?

            Kommentar


              #7
              Synchrones Sortieren von zwei oder drei Arrays ist schwierig, weil die Formeln ja nix von einander wissen.

              Werden die Daten nicht laufend aktualisiert? Dann könnte man immer den aktuellen Preis im Vergleich zum günstigsten als Entscheidungskriterium nehmen, ob jetzt eingeschaltet werden soll.

              Kommentar


                #8
                Moin das wäre einen Ansatz. Würde man dafür die gleiche Logikbausteine wie hier oben benutzen?
                Ich habe erstmal deine Formel umgesetzt und bekomme eine Fehlermeldung für die Startzeit. Hätte ich etwas falsch eingesetzt? image.png

                Kommentar


                  #9
                  Wenn Du die Formeln richtig übernommen hast, ist wahrscheinlich einfach der Typ des Ausgangs falsch eingestellt.

                  Kommentar


                    #10
                    Ich habe nun für den Ausgang sukzessiv mit Integer, Int64 und Number ausprobiert.

                    Kommentar


                      #11
                      Und welchen Typ hat Ausgang 2? Wenn NUMBER dann stell mal auf INT ...

                      Kommentar


                        #12
                        Wenn ich den Typ INTEGER oder INT64 im Ausgang 2 eintrage, dann bekomme ich einfach ein "Laufzeitfehler. Expression 3: Eingabezeichenfolge hat das falsche Format". Ich habe so kombiniert: Ausgang 2: INTEGER -Ausgang 3: INTEGER; Ausgang 2: INTEGER -Ausgang 3: INT64; Ausgang 2: INTEGER -Ausgang 3: NUMBER; INT64 -Ausgang 3: INTEGER; Ausgang 2: INT64 -Ausgang 3: INT64; Ausgang 2: INT64 -Ausgang 3: NUMBER

                        Kommentar


                          #13
                          Also der Index (Ausgang 2) wie auch der Zeitstempel (Ausgang 3) sind bei mir beide Ganzzahlen (INTEGER). Die Meldung "Eingabezeichenfolge hat das falsche Format" deutet auf einen Fehler in Formel 3 hin ... was eigentlich nicht sein kann, wenn Du da genau das genommen hast, was ich in Post #5 unter 3. geschrieben habe.
                          Zuletzt geändert von hyman; 04.03.2024, 19:30.

                          Kommentar


                            #14
                            Es hat nun geklappt!! Vielen Dank!
                            Wie könnte ich dann den aktuellen Preis abfragen, damit ich einen Vergleicher benutzen kann?

                            Kommentar


                              #15
                              Schlaflos in Gummersbach?

                              Folgende Formeln --> Ausgabetypen liefern den aktuellen Preis:
                              1. /* Aktuelle Timestamp */ (DateTime.Now.ToLocalTime() - (new DateTime(1970,1,1,0,0,0,0,DateTimeKind.Local))).To talSeconds --> INTEGER
                              2. /* Index des aktuellen Preises */ Array.FindIndex(Data.ConvertDoubles({ends:S}.Split (';')), s => s/1000 >= _out1_) --> INTEGER
                              3. /* Aktueller Preis */ Data.ConvertDoubles({prices:S}.Split(';'))[_out2_] --> NUMBER
                              4. /* Niedrigster Preis*/ Data.Sort(Data.ConvertDoubles({prices:S}.Split(';' )))[0] --> NUMBER
                              5. /* Aktueller Preis weniger als 2 * Niedrigster Preis */ _out3_ < (2 * _out4_) --> BOOL
                              ACHTUNG: In die 1. Formel schummelt mir die Forumssoftware immer ein Leerzeichen rein, das da nicht hin darf.

                              In der 4. und 5. Formel habe ich Dir beispielhaft einen möglichen Vergleich mit dem niedrigsten Preise hinzugefügt. Was da sinnvoll ist, hängt natürlich stark davon ab, welche Art von Verbraucher damit geschaltet werden soll. Hat es Sinn den nur viertelstundenweise einzuschalten? Wie lange soll er täglich mindestens eingeschaltet sein? Oder muss man z. B. die günstigsten zusammenhängenden 2 Stunden finden? Das wäre dann wieder schwieriger ...
                              Zuletzt geändert von hyman; 05.03.2024, 07:20.

                              Kommentar

                              Lädt...
                              X