Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [Gelöst] Was tut die Funktion jsonataExpression

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    946

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

[Gelöst] Was tut die Funktion jsonataExpression

Geplant Angeheftet Gesperrt Verschoben JavaScript
13 Beiträge 4 Kommentatoren 387 Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • R ROGA

    als ich ein Blockly Script in direktes Javascript konvertiert hatte, fand ich darin die Funktion

    await jsonataExpression()
    

    Ich habe leider im ganzen Internet nichts darüber gefunden, was diese Funktion genaues tut.

    kann mir das jemand erklären?

    GlasfaserG Offline
    GlasfaserG Offline
    Glasfaser
    schrieb am zuletzt editiert von
    #4

    @roga sagte in Was tut die Funktion jsonataExpression:

    kann mir das jemand erklären?

    https://konfuzio.com/de/jsonata/

    Synology 918+ 16GB - ioBroker in Docker v9 , VISO auf Trekstor Primebook C13 13,3" , Hikvision Domkameras mit Surveillance Station .. CCU RaspberryMatic in Synology VM .. Zigbee CC2538+CC2592 .. Sonoff .. KNX .. Modbus ..

    1 Antwort Letzte Antwort
    0
    • mickymM Offline
      mickymM Offline
      mickym
      Most Active
      schrieb am zuletzt editiert von mickym
      #5

      Die Originialdokumentation findest Du hier: https://docs.jsonata.org/overview

      Das ist ein sehr leistungsfähige Bibliothek, die Dir in NodeRed(da wird es noch viel mehr eingesetzt), in Javascript oder Blockly verwendet. Gerade das Blockly kann überhaupt nicht gut mit Objekten umgehen. Deswegen habe ich schon oft versucht auch Puzzle Freunde mit dieser genialen Bibliothek vertraut zu machen.

      In der Doku findest Du auch ein try Fenster (das Du auch teilen kannst). Da kannst Du links selbst Eingangsdaten erstellen - rechts oben gibst Du Deinen Code ein - und unten siehst Du das Ergebnis.

      Wenn Du da Hilfe brauchst - dann melde Dich mal - um Dir zu zeigen, wie effizient diese Bibliothek ist - folgendes Beispiel:

      Selbst wenn das folgende Array nicht bereist sortiert wäre:

      [{"total":0.274,"energy":0.0742,"tax":0.1998,"startsAt":"2023-09-22T14:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2783,"energy":0.0778,"tax":0.2005,"startsAt":"2023-09-22T13:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2798,"energy":0.079,"tax":0.2008,"startsAt":"2023-09-22T15:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2877,"energy":0.0856,"tax":0.2021,"startsAt":"2023-09-22T12:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2895,"energy":0.0872,"tax":0.2023,"startsAt":"2023-09-22T01:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2905,"energy":0.088,"tax":0.2025,"startsAt":"2023-09-22T02:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2908,"energy":0.0883,"tax":0.2025,"startsAt":"2023-09-22T00:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2908,"energy":0.0882,"tax":0.2026,"startsAt":"2023-09-22T16:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2914,"energy":0.0888,"tax":0.2026,"startsAt":"2023-09-22T03:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.294,"energy":0.091,"tax":0.203,"startsAt":"2023-09-22T04:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.294,"energy":0.0909,"tax":0.2031,"startsAt":"2023-09-22T11:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2948,"energy":0.0917,"tax":0.2031,"startsAt":"2023-09-22T05:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3043,"energy":0.0996,"tax":0.2047,"startsAt":"2023-09-22T10:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3084,"energy":0.1031,"tax":0.2053,"startsAt":"2023-09-22T23:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3118,"energy":0.1059,"tax":0.2059,"startsAt":"2023-09-22T22:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3131,"energy":0.107,"tax":0.2061,"startsAt":"2023-09-22T17:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3198,"energy":0.1126,"tax":0.2072,"startsAt":"2023-09-22T06:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.3221,"energy":0.1146,"tax":0.2075,"startsAt":"2023-09-22T21:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3265,"energy":0.1183,"tax":0.2082,"startsAt":"2023-09-22T09:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.3446,"energy":0.1334,"tax":0.2112,"startsAt":"2023-09-22T20:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.3473,"energy":0.1358,"tax":0.2115,"startsAt":"2023-09-22T08:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.3481,"energy":0.1364,"tax":0.2117,"startsAt":"2023-09-22T18:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.35,"energy":0.138,"tax":0.212,"startsAt":"2023-09-22T07:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.376,"energy":0.1599,"tax":0.2161,"startsAt":"2023-09-22T19:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"}]
      

      bekommst Du mit JSONATA mit einem simplen Einzeiler (in Blockly und JavaScript müsstest Du mindestens 2 mal Schleifen durchlaufen):

      $[total=$min($$.total)].startsAt
      

      die Uhrzeit raus, an dem der günstigeste Preis existiert. Wie gesagt dieses Array könnte auch völlig unsortiert sein. Du müssest also keine Sortierroutinen schreiben und Blockly kann sowas schon gar nicht. Und so was kannst Du in dem try Fenster selbst ausprobieren.

      d630a178-9f37-43ed-a2bd-e1bb5eb1da56-image.png

      Hier mal zum selbst ausprobieren: https://try.jsonata.org/qD4MSRGIg

      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

      R 1 Antwort Letzte Antwort
      0
      • mickymM mickym

        Die Originialdokumentation findest Du hier: https://docs.jsonata.org/overview

        Das ist ein sehr leistungsfähige Bibliothek, die Dir in NodeRed(da wird es noch viel mehr eingesetzt), in Javascript oder Blockly verwendet. Gerade das Blockly kann überhaupt nicht gut mit Objekten umgehen. Deswegen habe ich schon oft versucht auch Puzzle Freunde mit dieser genialen Bibliothek vertraut zu machen.

        In der Doku findest Du auch ein try Fenster (das Du auch teilen kannst). Da kannst Du links selbst Eingangsdaten erstellen - rechts oben gibst Du Deinen Code ein - und unten siehst Du das Ergebnis.

        Wenn Du da Hilfe brauchst - dann melde Dich mal - um Dir zu zeigen, wie effizient diese Bibliothek ist - folgendes Beispiel:

        Selbst wenn das folgende Array nicht bereist sortiert wäre:

        [{"total":0.274,"energy":0.0742,"tax":0.1998,"startsAt":"2023-09-22T14:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2783,"energy":0.0778,"tax":0.2005,"startsAt":"2023-09-22T13:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2798,"energy":0.079,"tax":0.2008,"startsAt":"2023-09-22T15:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2877,"energy":0.0856,"tax":0.2021,"startsAt":"2023-09-22T12:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2895,"energy":0.0872,"tax":0.2023,"startsAt":"2023-09-22T01:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2905,"energy":0.088,"tax":0.2025,"startsAt":"2023-09-22T02:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2908,"energy":0.0883,"tax":0.2025,"startsAt":"2023-09-22T00:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2908,"energy":0.0882,"tax":0.2026,"startsAt":"2023-09-22T16:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2914,"energy":0.0888,"tax":0.2026,"startsAt":"2023-09-22T03:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.294,"energy":0.091,"tax":0.203,"startsAt":"2023-09-22T04:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.294,"energy":0.0909,"tax":0.2031,"startsAt":"2023-09-22T11:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.2948,"energy":0.0917,"tax":0.2031,"startsAt":"2023-09-22T05:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3043,"energy":0.0996,"tax":0.2047,"startsAt":"2023-09-22T10:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3084,"energy":0.1031,"tax":0.2053,"startsAt":"2023-09-22T23:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3118,"energy":0.1059,"tax":0.2059,"startsAt":"2023-09-22T22:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3131,"energy":0.107,"tax":0.2061,"startsAt":"2023-09-22T17:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3198,"energy":0.1126,"tax":0.2072,"startsAt":"2023-09-22T06:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.3221,"energy":0.1146,"tax":0.2075,"startsAt":"2023-09-22T21:00:00.000+02:00","currency":"EUR","level":"NORMAL"},{"total":0.3265,"energy":0.1183,"tax":0.2082,"startsAt":"2023-09-22T09:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.3446,"energy":0.1334,"tax":0.2112,"startsAt":"2023-09-22T20:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.3473,"energy":0.1358,"tax":0.2115,"startsAt":"2023-09-22T08:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.3481,"energy":0.1364,"tax":0.2117,"startsAt":"2023-09-22T18:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.35,"energy":0.138,"tax":0.212,"startsAt":"2023-09-22T07:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"},{"total":0.376,"energy":0.1599,"tax":0.2161,"startsAt":"2023-09-22T19:00:00.000+02:00","currency":"EUR","level":"EXPENSIVE"}]
        

        bekommst Du mit JSONATA mit einem simplen Einzeiler (in Blockly und JavaScript müsstest Du mindestens 2 mal Schleifen durchlaufen):

        $[total=$min($$.total)].startsAt
        

        die Uhrzeit raus, an dem der günstigeste Preis existiert. Wie gesagt dieses Array könnte auch völlig unsortiert sein. Du müssest also keine Sortierroutinen schreiben und Blockly kann sowas schon gar nicht. Und so was kannst Du in dem try Fenster selbst ausprobieren.

        d630a178-9f37-43ed-a2bd-e1bb5eb1da56-image.png

        Hier mal zum selbst ausprobieren: https://try.jsonata.org/qD4MSRGIg

        R Offline
        R Offline
        ROGA
        schrieb am zuletzt editiert von ROGA
        #6

        Vielen Dank für eure Hilfe! Ich habe mir das wesenlich einfacher vorgestellt, als was die Doku darüber erzählt. Ich dachte, es wäre einfach nur eine "normale" Funktion, wie z.B. formatDate(), console.log(), JSON.stringify() etc. etc. aber das scheint hier nicht der Fall zu sein. Das es sich dabei um eine Bibliothek handelt, war mir nicht bewusst. Da ich kein Programmierer bin, ist mir das irgendwie zu kompliziert. Ich komme gerade so halbwegs mit dem Scripten voran, da wird's mir bei Jsonata definitiv zu kompliziert. :-(

        Trotzdem allen ein herzliches Dankeschön! Wenigstens weiss ich jetzt, dass ich es nicht so einfach einsetzen kann.

        LG Roli

        mickymM T 2 Antworten Letzte Antwort
        0
        • R ROGA

          Vielen Dank für eure Hilfe! Ich habe mir das wesenlich einfacher vorgestellt, als was die Doku darüber erzählt. Ich dachte, es wäre einfach nur eine "normale" Funktion, wie z.B. formatDate(), console.log(), JSON.stringify() etc. etc. aber das scheint hier nicht der Fall zu sein. Das es sich dabei um eine Bibliothek handelt, war mir nicht bewusst. Da ich kein Programmierer bin, ist mir das irgendwie zu kompliziert. Ich komme gerade so halbwegs mit dem Scripten voran, da wird's mir bei Jsonata definitiv zu kompliziert. :-(

          Trotzdem allen ein herzliches Dankeschön! Wenigstens weiss ich jetzt, dass ich es nicht so einfach einsetzen kann.

          mickymM Offline
          mickymM Offline
          mickym
          Most Active
          schrieb am zuletzt editiert von
          #7

          @roga Na Du kannst es auch ganz einfach einsetzen - Du musst halt nur sagen, was Du willst und dann schauen wir uns das an.Oder gerade zum Formatieren von Werten.

          Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

          R 1 Antwort Letzte Antwort
          0
          • R ROGA

            Vielen Dank für eure Hilfe! Ich habe mir das wesenlich einfacher vorgestellt, als was die Doku darüber erzählt. Ich dachte, es wäre einfach nur eine "normale" Funktion, wie z.B. formatDate(), console.log(), JSON.stringify() etc. etc. aber das scheint hier nicht der Fall zu sein. Das es sich dabei um eine Bibliothek handelt, war mir nicht bewusst. Da ich kein Programmierer bin, ist mir das irgendwie zu kompliziert. Ich komme gerade so halbwegs mit dem Scripten voran, da wird's mir bei Jsonata definitiv zu kompliziert. :-(

            Trotzdem allen ein herzliches Dankeschön! Wenigstens weiss ich jetzt, dass ich es nicht so einfach einsetzen kann.

            T Offline
            T Offline
            ticaki
            schrieb am zuletzt editiert von
            #8

            @roga
            Ja ist kompliziert. Wenn du aber Json-Daten konvertieren willst ist es am Ende einfach als das ganze in Javascript zu schreiben und erst recht als Blockly.

            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

            Spenden

            1 Antwort Letzte Antwort
            0
            • mickymM mickym

              @roga Na Du kannst es auch ganz einfach einsetzen - Du musst halt nur sagen, was Du willst und dann schauen wir uns das an.Oder gerade zum Formatieren von Werten.

              R Offline
              R Offline
              ROGA
              schrieb am zuletzt editiert von
              #9

              @mickym

              naja, eigenlich hat ja Blockly das Javascript quasi für mich geschrieben. Ich wollte halt jetzt nur verstehen, was genau da passiert.

              Als Beispiel:

              Ich frage meine SQL-DB nach dem Gesamtverbrauch in KWh des gestrigen Tages ab:

              DPPath = 'javascript.0.Energieverbrauch.Täglich.';
              
              Query = 'SELECT date(from_unixtime(ts/1000)) as Intervall, ' +
              	'       round((max(val)  - min(val)) / 1000, 2) as KWh, ' +
              	'       max(val) as MaxZählerstand, ' +
              	'       min(val) as MinZählerstand ' +
              	'FROM iobroker.ts_number where id=10 and ' +
              	'       val is not null and ' +
              	'       date(from_unixtime(ts/1000)) = date(now()) - interval 1 day ' +
              	'group by Intervall;';
              
              Response  = JSON.parse(JSON.stringify(await sendToAsync('sql.0', 'query', Query)));
              SQLResult = Response.result;
              
              

              und erhalten als Rückgabewert mit console.log(JSON.stringify(SQLResult)) folgede Daten im JSON-Format:

              [{"Intervall":"2023-10-13T22:00:00.000Z","KWh":14.26,"MaxZählerstand":3295036.8,"MinZählerstand":3280780.5}]
              

              Nun möchte ich daraus die "KWh" und das "Intervall" (entspricht dem Datum des gestrigen Tages) in die Variable "ConsumedPower" bzw. "Datum" extrahieren.

              for (Item in SQLResult) {
                    ConsumedPower = parseFloat(JSON.stringify(SQLResult[Item].KWh));
                    Datum = formatDate(getDateObject((await jsonataExpression(SQLResult[Item],'Intervall'))), "YYYY.MM.DD");
              };
              

              und an dieser Stelle habe ich eben das JsonataExpression() gesehen. Ich habe mir gedacht, wieso braucht's diese Funktion, kann das nicht so ähnlich extrahiert werden, wie "ConsumedPower"? also so:

              Datum = formatDate(getDateObject(JSON.stringify(SQLResult[Item].Intervall)), 'YYYY.MM.DD');
              

              Doch das gab mir kein Datum mehr zurück (undefined oder so). Auch ist mir aufgefallen, dass im Rückgabewert für das Datum das Format 'ISO-8601' ausgegeben wurde und das eigentliche Tagesdatum nicht gestern, sondern von vorgestern enthält:

              "Intervall":"2023-10-13T22:00:00.000Z"
              

              Wie gesagt, wenn ich das Datum mit jsonataExpression() extrahiere, erhalte ich das richtige Datum, so wie ich es gerne hätte:

              Datum = formatDate(getDateObject((await jsonataExpression(SQLResult[Item],'Intervall'))), "YYYY.MM.DD");
              
              console.log('Datum=' + Datum);
              
              

              Rückabe:

              Datum=2023.10.14
              

              Und deshalb wollte ich wissen, was macht diese Funktion jsonataExpression() genau, bzw. wie wird aus diesem ISO-8601 Datumsformat (dessen Tag ja nicht gestern, sonder vorgestern ist) dass korrekte Datum von gestern??????

              Ich hoffe, ich hab's irgendwie halbwegs verständlich erklärt, sonst einfach fragen.

              schönes Wochenende

              LG Roli

              T mickymM 2 Antworten Letzte Antwort
              0
              • R ROGA

                @mickym

                naja, eigenlich hat ja Blockly das Javascript quasi für mich geschrieben. Ich wollte halt jetzt nur verstehen, was genau da passiert.

                Als Beispiel:

                Ich frage meine SQL-DB nach dem Gesamtverbrauch in KWh des gestrigen Tages ab:

                DPPath = 'javascript.0.Energieverbrauch.Täglich.';
                
                Query = 'SELECT date(from_unixtime(ts/1000)) as Intervall, ' +
                	'       round((max(val)  - min(val)) / 1000, 2) as KWh, ' +
                	'       max(val) as MaxZählerstand, ' +
                	'       min(val) as MinZählerstand ' +
                	'FROM iobroker.ts_number where id=10 and ' +
                	'       val is not null and ' +
                	'       date(from_unixtime(ts/1000)) = date(now()) - interval 1 day ' +
                	'group by Intervall;';
                
                Response  = JSON.parse(JSON.stringify(await sendToAsync('sql.0', 'query', Query)));
                SQLResult = Response.result;
                
                

                und erhalten als Rückgabewert mit console.log(JSON.stringify(SQLResult)) folgede Daten im JSON-Format:

                [{"Intervall":"2023-10-13T22:00:00.000Z","KWh":14.26,"MaxZählerstand":3295036.8,"MinZählerstand":3280780.5}]
                

                Nun möchte ich daraus die "KWh" und das "Intervall" (entspricht dem Datum des gestrigen Tages) in die Variable "ConsumedPower" bzw. "Datum" extrahieren.

                for (Item in SQLResult) {
                      ConsumedPower = parseFloat(JSON.stringify(SQLResult[Item].KWh));
                      Datum = formatDate(getDateObject((await jsonataExpression(SQLResult[Item],'Intervall'))), "YYYY.MM.DD");
                };
                

                und an dieser Stelle habe ich eben das JsonataExpression() gesehen. Ich habe mir gedacht, wieso braucht's diese Funktion, kann das nicht so ähnlich extrahiert werden, wie "ConsumedPower"? also so:

                Datum = formatDate(getDateObject(JSON.stringify(SQLResult[Item].Intervall)), 'YYYY.MM.DD');
                

                Doch das gab mir kein Datum mehr zurück (undefined oder so). Auch ist mir aufgefallen, dass im Rückgabewert für das Datum das Format 'ISO-8601' ausgegeben wurde und das eigentliche Tagesdatum nicht gestern, sondern von vorgestern enthält:

                "Intervall":"2023-10-13T22:00:00.000Z"
                

                Wie gesagt, wenn ich das Datum mit jsonataExpression() extrahiere, erhalte ich das richtige Datum, so wie ich es gerne hätte:

                Datum = formatDate(getDateObject((await jsonataExpression(SQLResult[Item],'Intervall'))), "YYYY.MM.DD");
                
                console.log('Datum=' + Datum);
                
                

                Rückabe:

                Datum=2023.10.14
                

                Und deshalb wollte ich wissen, was macht diese Funktion jsonataExpression() genau, bzw. wie wird aus diesem ISO-8601 Datumsformat (dessen Tag ja nicht gestern, sonder vorgestern ist) dass korrekte Datum von gestern??????

                Ich hoffe, ich hab's irgendwie halbwegs verständlich erklärt, sonst einfach fragen.

                schönes Wochenende

                T Offline
                T Offline
                ticaki
                schrieb am zuletzt editiert von
                #10

                @roga sagte in [Gelöst] Was tut die Funktion jsonataExpression:

                Datum = formatDate(getDateObject(JSON.stringify(SQLResult[Item].Intervall)), 'YYYY.MM.DD');

                Da das Datum im JSON Format vorliegt reicht auch:

                Datum = formatDate(new Date(SQLResult[Item].Intervall), 'YYYY.MM.DD');
                

                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                Spenden

                R 1 Antwort Letzte Antwort
                0
                • T ticaki

                  @roga sagte in [Gelöst] Was tut die Funktion jsonataExpression:

                  Datum = formatDate(getDateObject(JSON.stringify(SQLResult[Item].Intervall)), 'YYYY.MM.DD');

                  Da das Datum im JSON Format vorliegt reicht auch:

                  Datum = formatDate(new Date(SQLResult[Item].Intervall), 'YYYY.MM.DD');
                  
                  R Offline
                  R Offline
                  ROGA
                  schrieb am zuletzt editiert von
                  #11

                  @ticaki sagte in [Gelöst] Was tut die Funktion jsonataExpression:

                  Da das Datum im JSON Format vorliegt reicht auch:
                  Datum = formatDate(new Date(SQLResult[Item].Intervall), 'YYYY.MM.DD');

                  LOL :-)

                  Jetzt weiss ich zwar immer noch nicht, wie jsonataExpression() die Konvertierung gemacht hat, aber diese Lösung verstehe ich jetzt und sie funktioniert tatsächlich!!!!!

                  Vielen lieben Dank!

                  LG Roli

                  1 Antwort Letzte Antwort
                  0
                  • R ROGA

                    @mickym

                    naja, eigenlich hat ja Blockly das Javascript quasi für mich geschrieben. Ich wollte halt jetzt nur verstehen, was genau da passiert.

                    Als Beispiel:

                    Ich frage meine SQL-DB nach dem Gesamtverbrauch in KWh des gestrigen Tages ab:

                    DPPath = 'javascript.0.Energieverbrauch.Täglich.';
                    
                    Query = 'SELECT date(from_unixtime(ts/1000)) as Intervall, ' +
                    	'       round((max(val)  - min(val)) / 1000, 2) as KWh, ' +
                    	'       max(val) as MaxZählerstand, ' +
                    	'       min(val) as MinZählerstand ' +
                    	'FROM iobroker.ts_number where id=10 and ' +
                    	'       val is not null and ' +
                    	'       date(from_unixtime(ts/1000)) = date(now()) - interval 1 day ' +
                    	'group by Intervall;';
                    
                    Response  = JSON.parse(JSON.stringify(await sendToAsync('sql.0', 'query', Query)));
                    SQLResult = Response.result;
                    
                    

                    und erhalten als Rückgabewert mit console.log(JSON.stringify(SQLResult)) folgede Daten im JSON-Format:

                    [{"Intervall":"2023-10-13T22:00:00.000Z","KWh":14.26,"MaxZählerstand":3295036.8,"MinZählerstand":3280780.5}]
                    

                    Nun möchte ich daraus die "KWh" und das "Intervall" (entspricht dem Datum des gestrigen Tages) in die Variable "ConsumedPower" bzw. "Datum" extrahieren.

                    for (Item in SQLResult) {
                          ConsumedPower = parseFloat(JSON.stringify(SQLResult[Item].KWh));
                          Datum = formatDate(getDateObject((await jsonataExpression(SQLResult[Item],'Intervall'))), "YYYY.MM.DD");
                    };
                    

                    und an dieser Stelle habe ich eben das JsonataExpression() gesehen. Ich habe mir gedacht, wieso braucht's diese Funktion, kann das nicht so ähnlich extrahiert werden, wie "ConsumedPower"? also so:

                    Datum = formatDate(getDateObject(JSON.stringify(SQLResult[Item].Intervall)), 'YYYY.MM.DD');
                    

                    Doch das gab mir kein Datum mehr zurück (undefined oder so). Auch ist mir aufgefallen, dass im Rückgabewert für das Datum das Format 'ISO-8601' ausgegeben wurde und das eigentliche Tagesdatum nicht gestern, sondern von vorgestern enthält:

                    "Intervall":"2023-10-13T22:00:00.000Z"
                    

                    Wie gesagt, wenn ich das Datum mit jsonataExpression() extrahiere, erhalte ich das richtige Datum, so wie ich es gerne hätte:

                    Datum = formatDate(getDateObject((await jsonataExpression(SQLResult[Item],'Intervall'))), "YYYY.MM.DD");
                    
                    console.log('Datum=' + Datum);
                    
                    

                    Rückabe:

                    Datum=2023.10.14
                    

                    Und deshalb wollte ich wissen, was macht diese Funktion jsonataExpression() genau, bzw. wie wird aus diesem ISO-8601 Datumsformat (dessen Tag ja nicht gestern, sonder vorgestern ist) dass korrekte Datum von gestern??????

                    Ich hoffe, ich hab's irgendwie halbwegs verständlich erklärt, sonst einfach fragen.

                    schönes Wochenende

                    mickymM Offline
                    mickymM Offline
                    mickym
                    Most Active
                    schrieb am zuletzt editiert von mickym
                    #12

                    @roga Also nur um es grundsätzlich mal klar zustellen, ich habe jetzt mal zur Sicherheit in ein Objekt gewandelt.

                    Mit $ greifst Du auf das ganze Objekt zu, dass Du sonst via Attribut von .. bekommst.

                    05e6299f-c96d-4c67-a932-082c9d4d2a11-image.png

                    Das ganze hat mit JSONATA also nichts zu tun.

                    Diese Zeit ist

                    "Intervall":"2023-10-13T22:00:00.000Z"
                    

                    ist auch korrekt - da in allen Datenbanken die UTC gespeichert wird. Sprich diese Zeit entspricht 0:00 Uhr am 14.10.2023 - da UTC ja 2 Std. nachhängt.

                    Die Konvertierung liegt ggf. daran, dass daraus die lokale Zeit gemacht wurde.

                    Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                    R 1 Antwort Letzte Antwort
                    0
                    • mickymM mickym

                      @roga Also nur um es grundsätzlich mal klar zustellen, ich habe jetzt mal zur Sicherheit in ein Objekt gewandelt.

                      Mit $ greifst Du auf das ganze Objekt zu, dass Du sonst via Attribut von .. bekommst.

                      05e6299f-c96d-4c67-a932-082c9d4d2a11-image.png

                      Das ganze hat mit JSONATA also nichts zu tun.

                      Diese Zeit ist

                      "Intervall":"2023-10-13T22:00:00.000Z"
                      

                      ist auch korrekt - da in allen Datenbanken die UTC gespeichert wird. Sprich diese Zeit entspricht 0:00 Uhr am 14.10.2023 - da UTC ja 2 Std. nachhängt.

                      Die Konvertierung liegt ggf. daran, dass daraus die lokale Zeit gemacht wurde.

                      R Offline
                      R Offline
                      ROGA
                      schrieb am zuletzt editiert von
                      #13

                      @mickym sagte

                      "Intervall":"2023-10-13T22:00:00.000Z"
                      

                      ist auch korrekt - da in allen Datenbanken die UTC gespeichert wird. Sprich diese Zeit entspricht 0:00 Ihr am 14.10.2023 - da UTC ja 2 Std. nachhängt.

                      Die Konvertierung liegt ggf. daran, dass daraus die lokale Zeit gemacht wurde.

                      Ach so! Jetzt verstehe ich das auch, ja macht durchaus Sinn und so gesehen ist es dann tatsächlich der 14.10.2023.

                      Wieder etwas wichtiges dazugelernt, vielen Dank!

                      LG Roli

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      670

                      Online

                      32.6k

                      Benutzer

                      82.2k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe