Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Blocky und das Arbeiten mit einem Datum

    NEWS

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    Blocky und das Arbeiten mit einem Datum

    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      daPanic last edited by

      Salut,

      irgendwie habe ich einen Knoten in meinen Gedanken oder übersehe vielleicht was. Da ich bisher noch keine, von mir anzuwendende, Lösung gefunden habe versuche ich es mal mit einem Tread.

      Fragestellung: Ich möchte ein Datum in ein Objekt schreiben. Dann möchte ich durch ein Script mit automatischer Auslösung alle X Minuten prüfen ob von dem Datum 5, 10 oder 20 Minuten verstrichen sind.
      Aber fangen wir mit den 5 Minuten an.

      Ich schreibe das Datum in ein STRING Objekt. Mit einem OBJEKT Objekt klappt es nicht.
      Zunächst schreibe ich aktuell das Datum und Uhrzeit weg in das Objekt.
      538ced75-f47c-4098-91bb-1ca231b4cb59-grafik.png
      Hier ist ein aktueller Wert in dem Objekt.
      5fb819f1-ace9-4b2e-81b6-c85f0d6bcdda-grafik.png

      Mein aktueller Versuch ist das Datum und die Uhrzeit wieder aus dem Objekt zu holen und in eine Variable zu schreiben.
      9e172b01-f3ec-4333-96bf-1fd813e1863d-grafik.png

      Dann wollte ich dem Wert in der Variable 5 Minuten addieren.
      9f1a6c5e-d07d-4983-a91a-a492dc2ece9b-grafik.png

      Wenn die aktuelle Zeit nun größer oder gleich dem Wert +5 Minuten ist, dann schick mal ne Mail oder sowas.
      82eea940-727c-4362-bdfc-dedca6f36177-grafik.png

      Bei der Addition der Minuten macht er aber nicht wirklich mit
      05929d5a-f628-4458-9382-f6fce9245cc0-grafik.png

      Hier das aktuelle Script komplett:
      283ccad7-93f1-41d8-ad2c-3d31c60ef56b-grafik.png

      Bin um Ideen/Vorschläge oder Hinweise dankbar.

      S Asgothian 2 Replies Last reply Reply Quote 0
      • S
        Shadowhunter23 @daPanic last edited by Shadowhunter23

        @dapanic
        Als allgemeine Informationen zur Zeitdiffernez gerne mal das Video anschauen:
        https://youtu.be/sxkz3O6nfFQ?si=hiF-TmWUSCuB_co4

        1 Reply Last reply Reply Quote 0
        • Asgothian
          Asgothian Developer @daPanic last edited by Asgothian

          @dapanic sagte in Blocky und das Arbeiten mit einem Datum:

          Bin um Ideen/Vorschläge oder Hinweise dankbar.

          1. Warum willst du per Heartbeat eine vorher vorgegebene Zeitverzögerung 'prüfen'. Warum nicht via Timeout eine Aktion um die entsprechende Zeit verzögern ?

          Das Thema Mail nach 5 Minuten wenn die Garage noch offen ist löst man am einfachsten so:
          Screenshot 2025-04-20 at 21.28.54.png

          1. Warum willst du die Zeit in einem Anwender-lesbaren Format zur Berechnung nutzen ? Das ist doch Humbug. Für Berechnungen bietet sich an die aktuelle Zeit als 'DateTime Objekt' zu nutzen. Dieses ist (anders als Erwartet) kein JS Objekt, sondern eine Zahl mit der gerechnet werden kann. Sie ist in Millisekunden angegeben.

          Wenn du also wissen willst ob seit Zeitpunkt A 5 Minuten vergangen sind, dann machst du
          Screenshot 2025-04-20 at 21.17.46.png
          (unter der Bedingung das das was du in Time_A rein geschrieben hast auch als . .as date object. verwaltet wird. Nebenbei sind die üblichen 'timestamps' innerhalb des ioBroker auch in dem Format - sprich du kannst damit feststellen vor wieviel Minuten ein State geändert wurde.

          Parallel kannst du für eine Visu auch gerne noch eine String-Representation der gleichen Zeit ablegen - oder die Umrechnung in der Visu machen lassen. Da da zumeist JS benutzt wird, sähe das so aus:

          Timestring = new Date(Time_A).toLocaleString("de-DE")
          
          D 2 Replies Last reply Reply Quote 1
          • D
            daPanic @Asgothian last edited by

            @asgothian @Shadowhunter23
            Danke euch.

            1 Reply Last reply Reply Quote 0
            • D
              daPanic @Asgothian last edited by

              @asgothian said in Blocky und das Arbeiten mit einem Datum:

              @dapanic sagte in Blocky und das Arbeiten mit einem Datum:

              Bin um Ideen/Vorschläge oder Hinweise dankbar.

              1. Warum willst du per Heartbeat eine vorher vorgegebene Zeitverzögerung 'prüfen'. Warum nicht via Timeout eine Aktion um die entsprechende Zeit verzögern ?

              Meine Idee war dass ich, je nach vorher bestimmte Anzahl, Mails verschicken und dann die Garage schließe.
              Mit deinem Block müsste ich ja dann im Grunde z.B. 4 Timeouts stareten.
              Einen nach 5 Minuten, 10, 15 und 30 Minuten z.B. im 30 Minuten Block müsste dann nochmal der Schließimpuls gesteuert werden.
              Daher dachte ich ich prüfe jede Minute, zähle einen Counter hoch für jede Auslösung und wenn der Counter der Vorgabe entspricht dann schließe.

              Codierknecht Asgothian 2 Replies Last reply Reply Quote 0
              • Codierknecht
                Codierknecht Developer Most Active @daPanic last edited by Codierknecht

                @dapanic sagte in Blocky und das Arbeiten mit einem Datum:

                Mit deinem Block müsste ich ja dann im Grunde z.B. 4 Timeouts stareten.

                Was spricht dagegen?
                Man kann ja Funktionen verwenden, um Code nicht duplizieren zu müssen (dazu sind sie da).
                Und innerhalb der Funktion kann (und sollte) man den Timeout stoppen und mit der berechneten neuen Zeitspanne neu starten.
                Das Zauberwort an der Ecke lautet "Rekursion". Die Funktion ruft sich immer wieder selbst auf. Solange, bis entweder die vorgegebene Anzahl Durchläufe erreicht oder das Problem beseitigt wurde.
                Sowas geht auch in Blockly recht elegant.

                Daher dachte ich ich prüfe jede Minute, zähle einen Counter hoch für jede Auslösung und wenn der Counter der Vorgabe entspricht dann schließe.

                Wie @Asgothian schon schrieb, ist so ein "heartbeat" eine denkbar schlechte Variante um sowas zu lösen.
                Denk nochmal drüber nach, ob es sinnvoll ist für einen Fall, der vielleicht 1x pro Woche auftritt (vermutlich deutlich seltener), etwas 1.440x jeden Tag der Woche auszuführen.

                1 Reply Last reply Reply Quote 0
                • Asgothian
                  Asgothian Developer @daPanic last edited by Asgothian

                  @dapanic sagte in Blocky und das Arbeiten mit einem Datum:

                  Meine Idee war dass ich, je nach vorher bestimmte Anzahl, Mails verschicken und dann die Garage schließe.
                  Mit deinem Block müsste ich ja dann im Grunde z.B. 4 Timeouts stareten.
                  Einen nach 5 Minuten, 10, 15 und 30 Minuten z.B. im 30 Minuten Block müsste dann nochmal der Schließimpuls gesteuert werden.
                  Daher dachte ich ich prüfe jede Minute, zähle einen Counter hoch für jede Auslösung und wenn der Counter der Vorgabe entspricht dann schließe.

                  Na ja, ich würde zunächst einmal ein Intervall starten. Läuft alle 5 Minuten. Darin ein Zähler hochzählen.
                  Bei 1, 2, 3 gibts eine Meldung. Bei 3 zusätzlich - Intervall anhalten
                  zusätzlich einen Timeout, in 30 Minuten den Schliessimpuls

                  Und wenn das ganze geschlossen ist, timeout und Intervall beenden.

                  Generell ist das was du geplant hattest ein sogenannter 'Heartbeat' - nach dem Herzschlag des Menschen der alles kontrolliert. Ein Heartbeat der ständig mit läuft ist Ressourcenverschwendung - insbesondere wenn es nur um dedizierte Aktivierungen geht. Besser ist es, mit gezielten Events zu arbeiten, die nur dann laufen wenn sie benötigt werden.

                  A.

                  Nachtrag: Geht auch ohne Zählen, siehe hier:

                  Screenshot 2025-04-22 at 12.17.14.png

                  Wichtig - der Block state value und state timestamp (ja, der, es ist der gleiche) stammt aus dem Trigger Bereich, und ist da mit state value (oder wert auf deutsch) vorgelegt.

                  Nachtrag2: im Skript ist ein Typo drin - der stopTimeout Baustein ist eine Ebene zu hoch - er muss zum stop Intervall Baustein. Da ich das Blockly nicht mehr habe kann ich nicht mal eben ein neues Bild erzeugen.

                  D 1 Reply Last reply Reply Quote 0
                  • D
                    daPanic @Asgothian last edited by

                    @asgothian @Codierknecht
                    Abermals vielen Dank. Ich schaue mir das an.

                    Codierknecht 1 Reply Last reply Reply Quote 0
                    • Codierknecht
                      Codierknecht Developer Most Active @daPanic last edited by Codierknecht

                      @dapanic

                      Das Prinzip. Nicht getestet und möglicherweise verbesserungsfähig.

                      bffdd8f3-ae6c-499f-a150-b6da1b4156d7-image.png
                      Funktionsweise:
                      Beim Öffnen des Tores wird der Rundenzähler auf 0 gesetzt und damit die Funktion aufgerufen.
                      Die ermittelt die nötige Verzögerung anhand des Rundenzählers: Für die ersten 3 Durchläufe jeweils 5 und im letzten Durchlauf 15 Minuten.
                      Dann wird der passende Timeout gestartet. Sind die X Minuten abgelaufen, wird eine Nachricht gesendet und der Rundenzähler inkrementiert.
                      Ist der noch nicht größer als 4, ruft sich die Funktion mit geändertem Rundenzähler neu auf.

                      Man muss bei Rekursionen nur aufpassen, dass man eine saubere Abbruchbedingung einbaut. Sonst produziert man sich eine herrliche Endlosschleife.

                      Edit
                      Die Änderung im Trigger sorgt dafür, dass nach dem Schließen des Toren nicht noch eine Meldung abgesetzt wird.

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      522
                      Online

                      31.6k
                      Users

                      79.4k
                      Topics

                      1.3m
                      Posts

                      4
                      9
                      190
                      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