Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Const richtig bei timestamp (toTimeString)

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Const richtig bei timestamp (toTimeString)

    This topic has been deleted. Only users with topic management privileges can see it.
    • OliverIO
      OliverIO @matze55 last edited by

      @matze55

      Schau mal hier
      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

      matze55 2 Replies Last reply Reply Quote 0
      • matze55
        matze55 @OliverIO last edited by

        @oliverio danke versuche mal mein glück.

        1 Reply Last reply Reply Quote 0
        • matze55
          matze55 @OliverIO last edited by matze55

          @oliverio jäährr...du bist mein Retter hat geklappt. Super
          Der Code klappt super aber ..jetzt kommt es der Monatsname fehlt hast du da was in deiner zauberkiste ?

          OliverIO 1 Reply Last reply Reply Quote 0
          • OliverIO
            OliverIO @matze55 last edited by OliverIO

            @matze55

            Schaue unter den options. Da kann man sehr fein konfigurieren was ausgegeben werden soll.
            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString#using_options

            Leider hast u nicht gezeigt was du schon hast

            matze55 2 Replies Last reply Reply Quote 0
            • matze55
              matze55 @OliverIO last edited by matze55

              @oliverio Danke für deine Hilfe das hat geklappt mit den options. Ich habe folgendes getan. Ich wollte eine JSON tabelle für Alexa Sprachbefehle suchen aber hier nur das Log Script von Mic gefunden, was aber nicht mehr gepflegt wird, gefunden. Darauf hin gat mir die grosse Suchmaschine ein Code ausgespuckt wo ich die Sprachbefehle in eine JSON Tabelle schreibe und mir in der VIS anzeigen tut.

              Die Datenpunkte habe ich in 0_userdata angelegt. Da ich Fensterkontakte habe und die im Tuya Adapter intergriert sind fange ich dort true und false ab, bei geschlossenen und geöffneten Fenstern und habe per blockly worauf Alexa reagiert mit ihrer Stimme erstellt. Somit habe ich per JS den Code gefunden aber bin mit dem timestamp nicht klargekommen.

              Das war mein Anliegen aber jetzt klappt das Danke nochmals.

              1 Reply Last reply Reply Quote 0
              • matze55
                matze55 @OliverIO last edited by matze55

                @oliverio Ich habe mal noch eine Frage zu den timestamp. Kann man bei der Ausgabe beim timstamp die Texte ,,Heute,, und ,,Gestern,, integrieren. Die Definition ist momentan so definiert:

                //Datum und Uhrzeit definieren per const
                    const opt = {
                    weekday: "short",//Langer Wochentag
                    year: "numeric",//Jahr wird per Zahl angezeigt
                    month: "short",//Kurzer Monatsname
                    day: "numeric",//Tag wird per Zahl angezeigt
                    hour : "numeric",//Stunde wird per Zahl angezeigt
                    minute : "numeric",//Minute wird per Zahl angezeigt
                    second : "numeric",//Sekunde wird per Zahl angezeigt aber ist aus
                    };
                    //End
                

                Es ist eine Rechenaufgabe die man gestalten kann, aber die Ausgabe gestaltet sich schwierig.

                OliverIO 1 Reply Last reply Reply Quote 0
                • OliverIO
                  OliverIO @matze55 last edited by OliverIO

                  @matze55

                  ja rechenaufgabe. im js standard ist sowas nicht enthalten

                  function getRelativeDayLabel(dateInput) {
                    const inputDate = new Date(dateInput); // Kann Date, Timestamp oder ISO-String sein
                    const today = new Date();
                    
                    // Uhrzeit auf 00:00 setzen, damit nur der Tag verglichen wird
                    today.setHours(0, 0, 0, 0);
                    inputDate.setHours(0, 0, 0, 0);
                  
                    const diffInMs = today - inputDate;
                    const diffInDays = diffInMs / (1000 * 60 * 60 * 24);
                  
                    if (diffInDays === 0) {
                      return "heute";
                    } else if (diffInDays === 1) {
                      return "gestern";
                    } else if (diffInDays > 1) {
                      return "älter";
                    } else {
                      return "zukünftig"; // falls das Datum in der Zukunft liegt
                    }
                  }
                  

                  wo willst du das anwenden?

                  matze55 1 Reply Last reply Reply Quote 0
                  • matze55
                    matze55 @OliverIO last edited by matze55

                    @oliverio Danke für die Antwort ich will es hier integrieren denn so sieht der JS Code momentan aus:

                    // Datenpunkt für die JSON-Tabelle (anpassen!)
                    const jsonTableDp = '0_userdata.0.alexa.jsonTable';
                    
                    // Funktion zum Hinzufügen eines Eintrags zur Tabelle
                    function addJsonEntry(device, text, source) {
                      try {
                        // Datenpunkt vom Typ JSON erstellen oder aktualisieren
                        const currentState = getState(jsonTableDp).val;
                        let jsonTable = [];
                    
                        if (currentState && typeof currentState === 'string' && currentState.trim() !== '') {
                          jsonTable = JSON.parse(currentState);
                        }
                        //Datum und Uhrzeit definieren per const
                        const opt = {
                        weekday: "short",//Langer Wochentag
                        year: "numeric",//Jahr wird per Zahl angezeigt
                        month: "short",//Kurzer Monatsname
                        day: "numeric",//Tag wird per Zahl angezeigt
                        hour : "numeric",//Stunde wird per Zahl angezeigt
                        minute : "numeric",//Minute wird per Zahl angezeigt
                        second : "numeric",//Sekunde wird per Zahl angezeigt aber ist aus
                        };
                        //End
                        const newEntry = {
                          //timestamp: new Date().toISOString(),//Ausgeschalten
                          //date: new Date().toTimeString().slice(0,9,),//Ausgeschalten
                          date: new Date().toLocaleString('de-DE', opt),
                          device: device,
                          text: text,
                          source: source
                        };
                    
                        jsonTable.push(newEntry);
                    
                        setState(jsonTableDp, JSON.stringify(jsonTable), true);
                        log('Eintrag zur JSON-Tabelle hinzugefügt: ' + JSON.stringify(newEntry), 'info');
                    
                      } catch (error) {
                        log('Fehler beim Hinzufügen zum JSON: ' + error, 'error');
                      }
                    }
                    
                    
                    // Trigger für den Alexa-Adapter (Anpassen!)
                    on({id: 'alexa2.0.Echo-Devices.G090P30883460659.Commands.speak', change: "any"}, async function (obj) {
                      const deviceId = obj.id.split('.')[2];
                      const text = obj.state.val;
                    
                      if (text) {
                          addJsonEntry(deviceId, text, 'alexa2.0');
                      }
                    });
                    
                    ///TEST
                    
                    ///
                    
                    // Trigger für einen Datenpunkt (Beispiel)
                    /*on({id: '0_userdata.0.alexa.myTextSource', change: "any"}, async function (obj) {
                      const text = obj.state.val;
                    
                      if (text) {
                          addJsonEntry('MyCustomSource', text, 'Datenpunkt');
                      }
                    });*/
                    
                    // Optional: Skript zum Löschen der Tabelle (auf eigene Gefahr!)
                    on({id: '0_userdata.0.alexa.deleteJsonTable', change: "any"}, async function (obj) {
                      if (obj.state.val === true) {
                          setState(jsonTableDp, "[]", true);
                          log('JSON-Tabelle gelöscht.', 'warn');
                          setState('0_userdata.0.alexa.deleteJsonTable', false, true);
                      }
                    });
                    

                    Die Ausgabe erfolgt dann in der VIS. so werden die Sprachbefehle aufgelistet die ich per Blockly ansteuere. Wenn ich mich jetzt richtig ausdrücke.
                    Der timestamp mit dem Text ,,heute,, und ,,gestern,, sollte mit in die ,,const opt,, mit integriert sein. Ob das gehen würde.
                    Muss ich die funktion die du postet mit einfügen im JS oder muss das gesamte umgebaut werden.

                    mfg

                    OliverIO 1 Reply Last reply Reply Quote 0
                    • OliverIO
                      OliverIO @matze55 last edited by OliverIO

                      @matze55

                      In das const opt kannst du das nicht integrieren.
                      Aber du könntest Zeile 28 erweitern.
                      Allerdings würde es so aktuell ja immer heute ergeben, da new Date() immer den aktuellen Zeitpunkt ergibt.
                      Wo kommt das Datum her für das du das berechnen möchtest?

                      matze55 1 Reply Last reply Reply Quote 0
                      • matze55
                        matze55 @OliverIO last edited by matze55

                        @oliverio Zeile 28 da wird es in Json Eintrag geschrieben. Wenn das Licht eingeschalten wird ...wird der timestamp geschrieben...als Bsp. Das licht ist eingeschalten Heute um plapla ect.
                        Wenn ein Tag vergeht soll ja in der funktion die du hier postest..ensteht ja eine Differenz von 24 Stunden.

                        Ich habe mal deinen Code ausgetauscht was so aussieht:

                        function getRelativeDayLabel() {
                          const today = new Date().toLocaleString;
                          // Uhrzeit auf 00:00 setzen, damit nur der Tag verglichen wird
                          today.setHours(0, 0, 0, 0);
                          date.setHours(0, 0, 0, 0);
                          const diffInMs = today - date;
                          const diffDays = diffInMs / (24 * 60 * 60 * 1000);
                            if (diffDays === 0) {
                            return "Heute";
                            } else if (diffInDays === 1) {
                            return "Gestern";
                            } 
                            }
                        

                        und in der Ausgabe es geändert in:

                        date: new Date().toLocaleString('de-DE', getRelativeDayLabel),
                        

                        Ich habe es noch ein wenig angepasst für mich.

                        mfg

                        OliverIO 1 Reply Last reply Reply Quote 0
                        • OliverIO
                          OliverIO @matze55 last edited by OliverIO

                          @matze55

                          das dürfte so nicht funktionieren.
                          Es gibt kein Übergabeparameter
                          und date ist nicht gleich Date()

                          und das verstehe ich auch nicht.
                          du übergibst hier die referenz auf die funktion, der 2.Parameter muss aber eine Struktur wie dein const opt weiter oben.

                          date: new Date().toLocaleString('de-DE', getRelativeDayLabel),
                          
                          matze55 1 Reply Last reply Reply Quote 0
                          • matze55
                            matze55 @OliverIO last edited by matze55

                            @oliverio Ich habe doch nur die funktion aus deinem Post in die Abfrage gepackt.
                            Vorher:

                            date: new Date().toLocaleString('de-DE', opt),
                            

                            Nachher:

                            date: new Date().toLocaleString('de-DE', getRelativeDayLabel),
                            

                            3.Möglichkeit:

                            timestamp: new Date().toLocaleString('de-DE', getRelativeDayLabel),
                            

                            Ausgabe in JSON:

                            javascript.0	13:53:43.397	info	
                            
                            Eintrag zur JSON-Tabelle hinzugefügt: {"date":"26.8.2025, 13:53:43","device":"Echo-Devices","text":"Das Schlafzimmerlicht ist ausgeschalten","source":"alexa2.0"}
                            

                            Ich kann es drehen wie ich will aber mit der Anzeige klappt es nicht auch nicht mit deiner funktion, aber ich suche noch mal mit der grossen Suchmaschine mal sehen ob ich fündig werde.

                            mfg

                            OliverIO 1 Reply Last reply Reply Quote 0
                            • OliverIO
                              OliverIO @matze55 last edited by OliverIO

                              @matze55

                              ja, weil du diverse Fehler hast.

                              1. Zeile 4, du hast die Funktion umgestellt, aber diverse Parameter sind nicht vorhanden. Hier mal zur besseren Visualisierung
                                61a96e9a-3a82-4af7-9b91-5bc8068210e7-image.png
                                Der Fehler entsteht, weil du die Variable today in Zeile 2 durch den Befehl toLocaleString (wobei da fehlen auch noch die Funktionsklammern) in einen String umwandeln wolltest, aber dadurch eine Funktionsreferenz zugewiesen hast.. Ein String und auch eine Funktionsreferenz besitzt die Funktion setHours nicht. Die besitzt nur ein Date-Objekt

                              2. Zeile 5: hier hast du aus der ursprünglichen Version den dateInput in date umbenannt. Allerdings wird die variable date nirgends belegt, also wird die auch schief gehen

                              3. nochmal zum Fehler in Zeile2, evtl trägt das auch zum besseren Verständnis von javascript bei.
                                in new Date().toLocaleString, addressierst du die Variable .toLocalString des Objekts Date. Diese Variable enthält eine Referenz auf die Funktion. Diese Referenz kann man auch anderen Variablen zu weisen. Da wird aber nix ausgeführt. Erst die () bei
                                new Date().toLocaleString() führ die Funktion auch aus.
                                Daher ist in today kein String, sondern eine Funktionsreferenz.

                              Aber bevor wir weitermachen, beantworte mir zuerst die Frage:
                              Woher kommt das Datum anhand du ermitteln willst ob es heute, gestern, etc. ist. Aktuell sehe ich es nirgends. Du sagst es kommt aus dem JSON.
                              Ich sehe oben zwar was mit jsonTable, dem fügst du ein newEntry hinzu, aber da nimmst du ja immer nur das aktuelle Datum, welches dann auch immer "heute" ergibt.

                              Versuche mal grob Schritt für Schritt zu beschreiben was du da erreichen möchtest. Zeige am besten auch mal ein Beispiel deines json

                              Zum Abschluss nochmal kurz darauf eingegangen.

                              Du hast einfach das umgestellt

                              date: new Date().toLocaleString('de-DE', getRelativeDayLabel),
                              

                              Wie oben schon geschrieben, warum?
                              Bereitgestellte Funktionen mit ihren Parameter sind wie ein Vertrag und du verpflichtest dich den Vertrag einzuhalten
                              Wenn du dir die Parameters der Funktion anschaust
                              https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString#parameters
                              Dann steht da locales und options
                              als locales hast du "de-DE", also passt
                              als options hast du den Inhalt von opts, der Inhalt passte. Nun willst du aber den Inhalt Rückgabewert von getRelativeDayLabel (auch hier wahrscheinlich die Funktionsklammern () vergessen, ansonsten wie oben). Aber was gibt diese Funktion zurück? "heute"? Das versteht die Funktion nicht. Die will da ein Objekt haben.

                              Hiermal der Link zum playground
                              https://playcode.io/javascript
                              Da kannst du aber nur einfachste Dinge testen. Komplex geht schon nicht oder ist schwierig.

                              1 Reply Last reply Reply Quote 0
                              • First post
                                Last post

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              891
                              Online

                              32.0k
                              Users

                              80.5k
                              Topics

                              1.3m
                              Posts

                              2
                              14
                              143
                              Loading More Posts
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes
                              Reply
                              • Reply as topic
                              Log in to reply
                              Community
                              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                              The ioBroker Community 2014-2023
                              logo