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. Node-Red
  5. Datum und Zeitverarbeitung mit NodeRed

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    14
    1
    157

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    12
    1
    566

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.7k

Datum und Zeitverarbeitung mit NodeRed

Geplant Angeheftet Gesperrt Verschoben Node-Red
node-red
33 Beiträge 5 Kommentatoren 32.7k Aufrufe 5 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.
  • mickymM Offline
    mickymM Offline
    mickym
    Most Active
    schrieb am zuletzt editiert von
    #22

    Hier mal wieder eine genial, einfache Methode, wie man verschiedene Bestandteile eines Datums mit Hilfe der moments library analysieren und als Objekt zur Verfügung stellen kann - um sie ggf. auch dann wieder in einzelne Datenpunkte zu zerlegen.

    Als erstes nutzt man halt den Formatstring, um verschiedene Bestandteile des Datums zu ermitteln und trennt diese mit Kommas.

    Zum Beispiel:

    $moment().format('YYYY,Q,M,DDD,W,e,H')	
    

    Das Ganze soll auch noch in Zahlenwerte konvertiert werden - deshalb habe ich alles vermieden, was Wörter ausspuckt.

    YYYY = gibt die 4 stellige Jahreszahl an
    Q = das Quartal (1-4)
    M = der Monat (1-12)
    DDD = Tag des Jahres (1-365(bzw. 366))
    W = Kalenderwoche europäisch
    e = Wochentag beginnend mit 0 = So.
    H = Stunde (0-23)

    Der Trick ist nun, dass man einfach eine CSV Node zur Konvertierung nutzt.

    d2d05e41-8e0f-4492-b795-ada92c289e2f-image.png

    Mit Zahlenwerte ermitteln wird automatisch die Konvertierung durchgeführt und mit den Namen als Spalte werden die Objekteigenschaften gleich richtig benannt.

    Somit ergibt dieser Flow - ein Objekt mit den entsprechenden Eigenschaften:

    c1bbd2a2-8fde-45f7-8c59-8c3e884d4af1-image.png

    Hier der einfache Flow:

    [
       {
           "id": "90e855fff6300508",
           "type": "debug",
           "z": "a3b6dd9f9b565227",
           "name": "Datum analysiert",
           "active": true,
           "tosidebar": true,
           "console": false,
           "tostatus": false,
           "complete": "payload",
           "targetType": "msg",
           "statusVal": "",
           "statusType": "auto",
           "x": 890,
           "y": 4460,
           "wires": []
       },
       {
           "id": "81785bd9ea91f30d",
           "type": "inject",
           "z": "a3b6dd9f9b565227",
           "name": "",
           "props": [
               {
                   "p": "payload"
               },
               {
                   "p": "topic",
                   "vt": "str"
               }
           ],
           "repeat": "",
           "crontab": "",
           "once": false,
           "onceDelay": 0.1,
           "topic": "",
           "payload": "true",
           "payloadType": "bool",
           "x": 330,
           "y": 4460,
           "wires": [
               [
                   "37cb9f15de0e0171"
               ]
           ]
       },
       {
           "id": "37cb9f15de0e0171",
           "type": "change",
           "z": "a3b6dd9f9b565227",
           "name": "",
           "rules": [
               {
                   "t": "set",
                   "p": "payload",
                   "pt": "msg",
                   "to": "$moment().format('YYYY,Q,M,DDD,W,e,H')\t",
                   "tot": "jsonata"
               }
           ],
           "action": "",
           "property": "",
           "from": "",
           "to": "",
           "reg": false,
           "x": 510,
           "y": 4460,
           "wires": [
               [
                   "16121dc11c791032"
               ]
           ]
       },
       {
           "id": "16121dc11c791032",
           "type": "csv",
           "z": "a3b6dd9f9b565227",
           "name": "",
           "sep": ",",
           "hdrin": "",
           "hdrout": "none",
           "multi": "one",
           "ret": "\\n",
           "temp": "year,quarter,month,day of year,week of year,day of week,hour",
           "skip": "0",
           "strings": true,
           "include_empty_strings": "",
           "include_null_values": "",
           "x": 710,
           "y": 4460,
           "wires": [
               [
                   "90e855fff6300508"
               ]
           ]
       }
    ]
    

    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.

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

      Hier mal wieder eine neue Anwendung mit der $moments Bibliothek um zu überprüfen ob der aktuelle Zeitpunkt in einem von mehreren definierten Zeitfenstern liegt.

      Praktische Anwendung könnte zum Beispiel sein, dass ein Gerät oder Heizung zu bestimmten Zeit innerhalb eines Tages eingeschaltet werden soll oder nicht. Dies habe ich gerade als Lösungsvorschlag für einem Beispielflow erstellt.

      [
         {
             "id": "811d7797475ab2a4",
             "type": "change",
             "z": "6e170384.60c96c",
             "name": "Check mehrer Zeitfenster",
             "rules": [
                 {
                     "t": "set",
                     "p": "payload",
                     "pt": "msg",
                     "to": "[]",
                     "tot": "json"
                 },
                 {
                     "t": "set",
                     "p": "payload[0]",
                     "pt": "msg",
                     "to": "$moment().isBetween($moment(\"06:00\", \"HH:mm\"),$moment(\"08:00\", \"HH:mm\"),'minute','[)')",
                     "tot": "jsonata"
                 },
                 {
                     "t": "set",
                     "p": "payload[1]",
                     "pt": "msg",
                     "to": "$moment().isBetween($moment(\"11:00\", \"HH:mm\"),$moment(\"13:00\", \"HH:mm\"),'minute','[)')",
                     "tot": "jsonata"
                 },
                 {
                     "t": "set",
                     "p": "payload[2]",
                     "pt": "msg",
                     "to": "$moment().isBetween($moment(\"19:00\", \"HH:mm\"),$moment(\"23:00\", \"HH:mm\"),'minute','[)')",
                     "tot": "jsonata"
                 },
                 {
                     "t": "set",
                     "p": "payload",
                     "pt": "msg",
                     "to": "payload ~> $reduce (function($A, $i){$A or $i})",
                     "tot": "jsonata"
                 }
             ],
             "action": "",
             "property": "",
             "from": "",
             "to": "",
             "reg": false,
             "x": 1610,
             "y": 2060,
             "wires": [
                 [
                     "a49f55322d881c9c"
                 ]
             ]
         }
      ]
      

      Die Prüfung der Zeitfenster speichert man in einem Array:

      594f25d1-3ec6-4876-9e57-69bb4609b0b3-image.png

      Zum Schluss verknüpft man alle Arraywerte mit ODER, um zu überprüfen, ob aktuell eines der definierten Zeitfenster WAHR ist und gibt das Ergebnis als ein Boolean aus.

      Außerdem wird hier die Anwendung des Ein- und Ausschlusses der Zeitgrenzen gezeigt. Normalerweise sind die angegebenen Zeitgrenzen ausgeschlossen. Mit eckigen Klammern schließt man diese ein, mit runden Klammern schließt man sie aus.

      Das Beispiel [) schließt also den Anfang ein, das Ende aus.

      Ergänzung: Man kann das ganze natürlich auch in einen Ausdruck verfrachten, dann schaut das noch schöner aus:

      a52dc24e-2884-4c57-9ac7-78558307514f-image.png

      [
         {
             "id": "218060d1fbd89410",
             "type": "change",
             "z": "578345f4956c7a57",
             "name": "Check Zeitfenster",
             "rules": [
                 {
                     "t": "set",
                     "p": "payload",
                     "pt": "msg",
                     "to": "[\t   $moment().isBetween(\t       $moment(\"06:00\", \"HH:mm\"),\t       $moment(\"08:00\", \"HH:mm\"),\t       'minute',\t       '[)'\t   ),\t   $moment().isBetween(\t       $moment(\"11:00\", \"HH:mm\"),\t       $moment(\"13:00\", \"HH:mm\"),\t       'minute',\t       '[)'\t   ),\t   $moment().isBetween(\t       $moment(\"18:00\", \"HH:mm\"),\t       $moment(\"23:00\", \"HH:mm\"),\t       'minute',\t       '[)'\t   )\t]~> $reduce (function($A, $i){$A or $i})",
                     "tot": "jsonata"
                 }
             ],
             "action": "",
             "property": "",
             "from": "",
             "to": "",
             "reg": false,
             "x": 450,
             "y": 2640,
             "wires": [
                 [
                     "85ad88e10464701c"
                 ]
             ]
         }
      ]
      

      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.

      1 Antwort Letzte Antwort
      1
      • B Offline
        B Offline
        Bernhard59
        schrieb am zuletzt editiert von
        #24

        Hallo zusammen, ich habe auch ein Problem mit der Zeit... wer hat das nicht :wink:

        Ich möchte in der Regelung meiner Solaranlage den Wechselrichter abschalten, wenn er eine bestimmte Zeit keine Werte mehr über meinen DTU Adapter zu meinem Flow gesendet hat. Das kommt manchmal vor und um zu verhindern, daß mein Solarakku zu tief entladen wird, soll der Wechselrichter abgeschaltet werden. Dazu möchte ich den " timestamp of last inverter statistics udpate" mit der aktuellen Uhrzeit vergleichen und wenn die Differenz der beiden z.B. größer als 10 min ist, soll der Befehl zum Abschalten erfolgen. Ich weiß, wie ich den " timestamp of last inverter statistics udpate" mit einer iobroker Node auslese und wie ich abschalte, aber wie ich die beiden Zeiten verwenden und daraus eine Differenzüberschreitung ermitteln kann ist mir noch unklar.

        Vielleicht kann mir ja hier jemand helfen... besten Dank im Voraus...

        mickymM 1 Antwort Letzte Antwort
        0
        • B Bernhard59

          Hallo zusammen, ich habe auch ein Problem mit der Zeit... wer hat das nicht :wink:

          Ich möchte in der Regelung meiner Solaranlage den Wechselrichter abschalten, wenn er eine bestimmte Zeit keine Werte mehr über meinen DTU Adapter zu meinem Flow gesendet hat. Das kommt manchmal vor und um zu verhindern, daß mein Solarakku zu tief entladen wird, soll der Wechselrichter abgeschaltet werden. Dazu möchte ich den " timestamp of last inverter statistics udpate" mit der aktuellen Uhrzeit vergleichen und wenn die Differenz der beiden z.B. größer als 10 min ist, soll der Befehl zum Abschalten erfolgen. Ich weiß, wie ich den " timestamp of last inverter statistics udpate" mit einer iobroker Node auslese und wie ich abschalte, aber wie ich die beiden Zeiten verwenden und daraus eine Differenzüberschreitung ermitteln kann ist mir noch unklar.

          Vielleicht kann mir ja hier jemand helfen... besten Dank im Voraus...

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

          @bernhard59 Für so was nutzt man eine trigger Node und führt keine Berechnungen durch.

          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.

          B 1 Antwort Letzte Antwort
          0
          • mickymM mickym

            @bernhard59 Für so was nutzt man eine trigger Node und führt keine Berechnungen durch.

            B Offline
            B Offline
            Bernhard59
            schrieb am zuletzt editiert von
            #26

            @mickym sagte in Datum und Zeitverarbeitung mit NodeRed:

            @bernhard59 Für so was nutzt man eine trigger Node und führt keine Berechnungen durch.

            Danke für die schnelle Antwort... und wie funktioniert das ?

            mickymM 1 Antwort Letzte Antwort
            0
            • B Bernhard59

              @mickym sagte in Datum und Zeitverarbeitung mit NodeRed:

              @bernhard59 Für so was nutzt man eine trigger Node und führt keine Berechnungen durch.

              Danke für die schnelle Antwort... und wie funktioniert das ?

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

              @bernhard59 sagte in Datum und Zeitverarbeitung mit NodeRed:

              @mickym sagte in Datum und Zeitverarbeitung mit NodeRed:

              @bernhard59 Für so was nutzt man eine trigger Node und führt keine Berechnungen durch.

              Danke für die schnelle Antwort... und wie funktioniert das ?

              6ad223ac-e357-48f4-9fe8-47b2ef5649e0-image.png

              und halt vorne dran die Node oder die Nachrichten die Du sonst empfängst, also parallel schalten. Sind die 10 Minuten abgelaufen, wird der trigger automatisch wieder scharf-

              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.

              B 1 Antwort Letzte Antwort
              0
              • mickymM mickym

                @bernhard59 sagte in Datum und Zeitverarbeitung mit NodeRed:

                @mickym sagte in Datum und Zeitverarbeitung mit NodeRed:

                @bernhard59 Für so was nutzt man eine trigger Node und führt keine Berechnungen durch.

                Danke für die schnelle Antwort... und wie funktioniert das ?

                6ad223ac-e357-48f4-9fe8-47b2ef5649e0-image.png

                und halt vorne dran die Node oder die Nachrichten die Du sonst empfängst, also parallel schalten. Sind die 10 Minuten abgelaufen, wird der trigger automatisch wieder scharf-

                B Offline
                B Offline
                Bernhard59
                schrieb am zuletzt editiert von
                #28

                @mickym

                Danke... dann versuche ich das mal...

                B 1 Antwort Letzte Antwort
                0
                • B Bernhard59

                  @mickym

                  Danke... dann versuche ich das mal...

                  B Offline
                  B Offline
                  Bernhard59
                  schrieb am zuletzt editiert von
                  #29

                  Perfekt, es funktioniert und soooo einfach... DANKE

                  mickymM 1 Antwort Letzte Antwort
                  0
                  • B Bernhard59

                    Perfekt, es funktioniert und soooo einfach... DANKE

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

                    @bernhard59 sagte in Datum und Zeitverarbeitung mit NodeRed:

                    Perfekt, es funktioniert und soooo einfach... DANKE

                    Ja Node-Red halt. ;)

                    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.

                    B 1 Antwort Letzte Antwort
                    0
                    • mickymM mickym

                      @bernhard59 sagte in Datum und Zeitverarbeitung mit NodeRed:

                      Perfekt, es funktioniert und soooo einfach... DANKE

                      Ja Node-Red halt. ;)

                      B Offline
                      B Offline
                      Bernhard59
                      schrieb am zuletzt editiert von
                      #31

                      Jetzt habe ich das nächste Problem und vielleicht kannst du mir wieder helfen...

                      Ich möchte mir, wenn die Datenübertragung mit der DTU längere Zeit nicht funktioniert eine Mail schicken. Das habe ich auch an anderen Stellen im Flow schon gemacht und es funktioniert einwandfrei.

                      Ich lese ja den Unix-Zeitstempel der letzten Aktualisierung der Wechselrichterstatistik mit einem iobroker In Nodes ein und werte diesen dann mit einen Trigger aus und wenn dann eine bestimmte Zeit keine Aktualisierung stattgefunden hat, möchte ich eine Mail bekommen. Das funktioniert auch alles, nur die Mail Nodes sagt dann "Senden fehlgeschlagen" und bringt folgende Fehlermeldung:
                      "Error: Mail command failed: 550-Requested action not taken: mailbox unavailable 550 Sender address is not allowed."

                      Wenn ich aber mit einem Injekt Nodes vor dem Trigger einen Timestamp schicke, geht die Mail einwandfrei raus... ich habe schon alle möglichen Einstellungen probiert... kein Erfolg.

                      Kennst du dich da aus?

                      a20197d7-257a-41b8-9bf8-4e7e189a7694-image.png

                      mickymM 1 Antwort Letzte Antwort
                      0
                      • B Bernhard59

                        Jetzt habe ich das nächste Problem und vielleicht kannst du mir wieder helfen...

                        Ich möchte mir, wenn die Datenübertragung mit der DTU längere Zeit nicht funktioniert eine Mail schicken. Das habe ich auch an anderen Stellen im Flow schon gemacht und es funktioniert einwandfrei.

                        Ich lese ja den Unix-Zeitstempel der letzten Aktualisierung der Wechselrichterstatistik mit einem iobroker In Nodes ein und werte diesen dann mit einen Trigger aus und wenn dann eine bestimmte Zeit keine Aktualisierung stattgefunden hat, möchte ich eine Mail bekommen. Das funktioniert auch alles, nur die Mail Nodes sagt dann "Senden fehlgeschlagen" und bringt folgende Fehlermeldung:
                        "Error: Mail command failed: 550-Requested action not taken: mailbox unavailable 550 Sender address is not allowed."

                        Wenn ich aber mit einem Injekt Nodes vor dem Trigger einen Timestamp schicke, geht die Mail einwandfrei raus... ich habe schon alle möglichen Einstellungen probiert... kein Erfolg.

                        Kennst du dich da aus?

                        a20197d7-257a-41b8-9bf8-4e7e189a7694-image.png

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

                        @bernhard59 Dann sind da halt noch eine Menge anderer Eigenschaften im Nachrichtenobjekt. Du du eh eine function nutzt, würde ich halt ein neues Nachrichtenobjekt erstellen, das nur den Zeitstempel und topic enthält.

                        var newMsg = {payload:msg.payload, topic:msg.topic};
                        return newMsg;
                        

                        oder halt

                        var newMsg = {payload:"keine Datenübertragung", topic: "Warnung"};
                        return newMsg;
                        

                        Sobald Dein Nachrichtenobjekt ja eine dieser Eigenschaften aufweist:

                        a70d1019-9447-4992-a3ae-a10f49be7c65-image.png

                        zum Beispiel msg.to und da Mist drin steht gibts halt eine Fehlermeldung.

                        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.

                        B 1 Antwort Letzte Antwort
                        0
                        • mickymM mickym

                          @bernhard59 Dann sind da halt noch eine Menge anderer Eigenschaften im Nachrichtenobjekt. Du du eh eine function nutzt, würde ich halt ein neues Nachrichtenobjekt erstellen, das nur den Zeitstempel und topic enthält.

                          var newMsg = {payload:msg.payload, topic:msg.topic};
                          return newMsg;
                          

                          oder halt

                          var newMsg = {payload:"keine Datenübertragung", topic: "Warnung"};
                          return newMsg;
                          

                          Sobald Dein Nachrichtenobjekt ja eine dieser Eigenschaften aufweist:

                          a70d1019-9447-4992-a3ae-a10f49be7c65-image.png

                          zum Beispiel msg.to und da Mist drin steht gibts halt eine Fehlermeldung.

                          B Offline
                          B Offline
                          Bernhard59
                          schrieb am zuletzt editiert von
                          #33

                          @mickym

                          Perfekt... Ich habe das erste gerade mit einer zusätzlichen Funktion probiert... funktioniert einwandfrei... Wieder einmal ein groooooßes DANKESCHÖN...

                          Ich muss mich wohl doch mal intensiver damit beschäftigen...

                          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

                          285

                          Online

                          32.5k

                          Benutzer

                          81.8k

                          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