Ankündigung

Einklappen
Keine Ankündigung bisher.

clock.countdown Parameter

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

    clock.countdown Parameter

    Guten Morgen

    Ich versuche gerade clock.countdown zu verwenden.
    Ist das wirklich so, dass mann starttime und duration zwingend als item liefern muss?

    starttime: siehe auch neuen Thread im SHNG Bereich.

    wvhn 'starttime' ist ein Pflichtparameter. Ich stelle mir allerdings die Frage, wozu man den braucht? Was außer 'now' sollte denn da sinnvoll drin stehen, also welchen anderen Anwendungsfall gibt es, um dort einen anderen Zeitwert rein zu schreiben? Ein Wert für die Zukunft? Wozu?
    Wäre es nicht einfacher, das Widget würde den Wert selber berechnen, womit der Parameter überflüssig wäre, oder man hätte die Option sowas wie 'now' dort anzugeben?​

    duration: kann ich sowas wie '10i' wenigstens direkt in den Parameter schreiben oder muss das - obwohl ein fester Wert - auch zwingend in einem Item stehen?

    Mich wundert, dass ich mit der Suche nach clock.countdown oder nur countdown hier so gut wie keine Treffer bekomme. Ich dachte es gäbe für dieses relativ neue Widget einen eigenen Thread?

    Danke schon mal

    Martin
    Zuletzt geändert von Sipple; 09.06.2024, 08:53.

    #2
    Ergänzung:
    Ich habe jetzt also folgende Item Struktur:

    Code:
    Waschhaus:
        Spuelpumpe:
            Schalten:
                type: bool
                knx_dpt: 1
                knx_send: 8/2/2
                knx_cache: 8/2/3
                on_update: Waschhaus.Spuelpumpe.Timestamp = datetime.datetime.timestamp(shtime.now())
            Timestamp:
                type: num
                cache: true
            Duration:
                type: str
                initial_value: '10i'
    Und das Widget:

    Code:
    {{ clock.countdown('Spuelpumpe', 'Waschhaus.Spuelpumpe.Schalten', 'Waschhaus.Spuelpumpe.Timestamp', 'Waschhaus.Spuelpumpe.Duration', '1s') }}
    Funktioniert nicht, wird immer nur --.--.-- angezeigt.
    Wo ist der Fehler?

    Kommentar


      #3
      Moin Martin,

      in smartVISU werden alle Zeitstempel in der Einheit Millisekunden verarbeitet. datetime.timestamp() liefert m.W. Sekunden. Du müsstest den Wert also noch mit 1000 multiplizieren.

      Das item für den Zeitstempel wird benötigt, um den Countdown zu triggern und dabei den Startzeitpunkt abzuspeichern. Der Countdown muss unabhängig von der Visu sein, denn es ist ja nicht gewährleistet, dass der anzuzeigende Vorgang von der Visu gestartet wurde. Außerdem will man u.U. während des Countdowns auch mal andere Seiten anzeigen. Der Countdown wird durch die nächste Änderung des Schalt-items beendet und kann durch Update des Startzeitpunkt-items jederzeit neu getriggert werden.

      Die Duration sollte veränderbar sein, z.B. wenn man wetterabhängig veränderliche Bewässerungszeiten hat. Deshalb auch hier das item. Hier könnte ich aber sicher alternativ einen Wert aus den Parametern übernehmen, wenn das gewünscht wird.

      Gruß
      Wolfram

      EDIT: Erklärung präzisiert: Startzeitpunkt wird zum Triggern des Countdowns als item benötigt.
      Zuletzt geändert von wvhn; 14.06.2024, 14:23.

      Kommentar


        #4
        Ok, verstanden. Und nach 10 Versuchen mit dem eval, damit der Countdown nur startet und läuft wenn die Pumpe an ist, funktioniert es nun so:

        Code:
        Waschhaus:
            Spuelpumpe:
                Schalten:
                    type: bool
                    knx_dpt: 1
                    knx_send: 8/2/2
                    knx_cache: 8/2/3
                Timestamp:
                    type: num
                    eval: (datetime.datetime.timestamp(shtime.now()) *1000) if sh.Waschhaus.Spuelpumpe.Schalten() == 1 else 0
                    eval_trigger: Waschhaus.Spuelpumpe.Schalten
                Duration:
                    type: str
                    initial_value: '10i'
        Code:
        {{ clock.countdown('Spuelpumpe', 'Waschhaus.Spuelpumpe.Schalten', 'Waschhaus.Spuelpumpe.Timestamp', 'Waschhaus.Spuelpumpe.Duration', '1s') }}
        Was jetzt noch richtig schön wäre: Kann man den countdown auch ohne die Stunden (und gegebenenfalls Minuten) darstellen, wenn die eh 00 sind?

        Kommentar


          #5
          Moin Martin,

          ich hab mir das mal angesehen, aber noch keine Idee zur (eleganten) Lösung. Das Problem ist, dass die Funktionen zur Datums- und Zeitausgabe immer die Zeitzone und die Sommerzeit berücksichtigen. Wir wollen hier aber keine Uhrzeit darstellen, sondern eine Zeitspanne. Deshalb hatte ich die Funktion "timedisplay" erstellt, welche die Stunden rein aus dem Zeitstempel errechnet. Du kannst vorerst mal diese Funktion in Deine visu.js kopieren und darin die unerwünschten Zeilen auskommentieren - vorausgesetzt, Du verwendest dann überall in der Visu dasselbe Format für die Zeitspanne. Hier mal als Beispiel der Verzicht auf die Stunden:
          Code:
          /**
           * Displays a timestamp as time in H:i:s format
           */
          function timedisplay (num) {
          	var ret='';
          	if (num <0){  
          		num = -num;
          		ret +='-'
          	};
          	var timestamp = new Date(num - num%1000);
          	var s = timestamp.getSeconds();
          	var i = timestamp.getMinutes();
          //	var h = (timestamp - s*1000 - i*60000)/3600000;
          //	ret +=(h<10?'0'+h : h)+':';
          	ret +=(i<10?'0'+i : i)+':';
          	ret +=(s<10?'0'+s : s);
          	return ret;
          };
          Gruß
          Wolfram

          Kommentar


            #6
            Servus Wolfram

            Super, schau ich mir an.
            Wie immer vielen Dank!

            Gruß, Martin

            Kommentar


              #7
              Moin Martin Sipple,

              ich habe die Erklärung oben für das Startzeitpunkt-item nochmal präzisiert.

              Außerdem habe ich kleine Veränderungen am Widget vorgenommen. Die duration wird jetzt als Festwert interpretiert, wenn der parameter mit einer Ziffer beginnt. Man kann also entweder z.B. 'mein.duration.item' oder '10i 30s' angeben. Zudem erlaubt der Parameter für die Startzeit neben dem Unix-Zeitstempel im ms nun auch einen String z.B. "2023-05-21T23:00:34.566439+02:00".

              Kannst Du das bei Gelegenheit einmal testen?

              Gruß
              Wolfram
              Angehängte Dateien

              Kommentar


                #8
                Hi Wolfram

                Ich weiß noch nicht wann ich dazu komme, aber ich schau es mir an.

                Gruß, Martin

                Kommentar


                  #9
                  Hier nochmal eine erweiterte Version. Es ist der Parameter "condition" hinzugekommen. Wenn dafür ein Wert angegeben wird, startet der Countdown nur, wenn das Schaltitem den angegebenen Wert annimmt. Das sollte den Aufwand für Logik / eval in shNG nochmal senken. Man kann dann einfach mit jeder item-Änderung einen Zeitstempel in das Startzeit-item schreiben und die Visu prüft, ob die Bedingung für den Countdown erfüllt ist.

                  Idee dahinter ist, dass man als Startzeit-item auch die Eigenschaft (item property) "last_update" oder "last_change" des Schaltitems einsetzen kann, sobald
                  Msinn eine Möglichkeit findet, diese wie die abonnierten items über den Websocket zu aktualisieren

                  Gruß
                  Wolfram
                  Angehängte Dateien

                  Kommentar


                    #10
                    Servus Wolfram wvhn

                    Ich habe nun endlich Zeit gefunden meine Visu von 3.4 auf 3.5 zu ändern.
                    Bis auf zwei Sachen hat der Umzug gut geklappt.

                    Das eine ist Backup/Restore. Backup klappt problemlos, Zipfile wird erstellt. Restore klappt gar nicht, ich bekomme einen "Unknown command" Fehler. Aber das ist ein anderes Thema und jetzt nicht so wichtig.

                    Das zweite ist der Countdown. Der hat unter 3.4 genau so geklappt, wie er sollte (siehe Lösung im Post #4 weiter oben). Habe ich meine Spülpumpe eingeschaltet, hat der 10min Countdown angefangen zu laufen. Wenn die Pumpe aus war, wurde schlicht nichts angezeigt.

                    Das war aber noch eine Develop Version und ich bin mir nicht sicher, welche aus dem Thread hier das war. Da in der 3.5 nun eine neuere Version des Countdown Widgets enthalten ist, versuche ich grad, das so zu konfigurieren, dass es wie vorher funktioniert.

                    Erster Versuch war gar nichts zu ändern. Der Countdown startete so erst gar nicht, wenn die Pumpe eingeschaltet wurde, also das Item 1 wurde (bei 3.4 aber natürlich sehr wohl). Ging die Pumpe aus, das Item also auf 0, startete der Countdown.
                    Bei der 3.5 konnte man für unter eine Sekunde die 00.09.59 sehen, dann stand da plötzlich eine ellenlange, negative Zahl.

                    Da ich eh die Vereinfachung implementieren wollte, habe ich erst mal die Items modifiziert. Das sieht jetzt so aus:

                    Code:
                    Waschhaus:
                        Spuelpumpe:
                            Schalten:
                                type: bool
                                knx_dpt: 1
                                knx_send: 8/2/2
                                knx_cache: 8/2/3
                            Timestamp:
                                type: str
                                eval: shtime.now()
                                eval_trigger: Waschhaus.Spuelpumpe.Schalten
                    Das Widget in der Visu nun:

                    Code:
                    {{ clock.countdown('Spuelpumpe', 'Waschhaus.Spuelpumpe.Schalten', 'Waschhaus.Spuelpumpe.Timestamp', '10i', '1s', 'zero', ' ', 1) }}
                    Was ich nun bekomme ist gleich beim Neustart von SHNG einen Fehler:

                    Code:
                    2025-05-21  11:35:27 WARNING  lib.item.item       Item Waschhaus.Spuelpumpe.Timestamp: value "2025-05-21 11:35:27.778932+02:00" does not match type str. Via caller Init:Eval, source None
                    Was für ein Datentyp sollte es denn sonst sein, wenn das kein String ist?

                    Der Zeitstempel. den shtime.now() liefert sieht auch nicht zu 100% so aus wie von dir in der Doku beschrieben. Es fehlt das 'T' zwischen Datum und Uhrzeit. Keine Ahnung, ob das Widget das dann so versteht, aber soweit komme ich aktuell noch gar nicht, weil wie gesagt schon SHNG meckert.

                    Steh grad auf dem Schlauch.

                    Gruß, Martin

                    Kommentar


                      #11
                      Ein Schuss ins blaue: shtime.now() liefert ein datetime Objekt, keinen string. ein str(shtime.now()) könnte zum gewollten Ergebnis führen. Eventuell müsstest Du das aber auch speziell in einen string umwandeln in das Format was die SmartVISU versteht.

                      Kommentar


                        #12
                        Ich war gerade draußen und habe etwas stupide Hausarbeit erledigt. Dabei habe ich drüber nachgedacht und hatte die selbe Idee

                        Der eval Syntax Prüfer sagt auch Datentyp wäre datetime.datetime.
                        Ein str drumrum macht was es soll und das Leerzeichen zischen Datum und Uhrzeit stört das Widget offensichtlich nicht.
                        Nur einen harmlosen Seiteneffekt gibt es beim Neustart von SHNG. Da der init schon einen Zeitstempel ins Item schreibt, wird beim allerersten Schalten des Pumpen-Items ganz kurz eine falsche Zeit im Countdown angezeigt, bis dann der eval trigger den richtigen Zeitstempel erzeugt hat. Dann passt es.

                        Geht also wieder.

                        Kommentar


                          #13
                          Moin Martin,

                          danke für das Update. Ich schau mir den Countdown nochmal an, weil ich sein Verhalten nicht recht nachvollziehen kann, wenn der letzte Parameter (condition) leer ist.

                          Seit shNG v1.11 kann man übrigens item properties abonnieren, so dass diese bei jedem Update aktualisiert werden. Somit sollte das Hilfsitem überflüssig sein und Du kannst "Waschhaus.Spuelpumpe.Schalten.property.last_c hang e" (ohne Leerzeichen! Das fügt die Forensoftware ein) für den Zeitstempel verwenden. Das kommt unmittelbar im richtigen Format, so dass man keine Umwandlung in einen String machen muss.

                          Gruß
                          Wolfram

                          EDIT: Antwort auf das Thema Backup hierhin verschoben.
                          Zuletzt geändert von wvhn; 22.05.2025, 07:27.

                          Kommentar


                            #14
                            Zitat von wvhn Beitrag anzeigen
                            Seit shNG v1.11 kann man übrigens item properties abonnieren, so dass diese bei jedem Update aktualisiert werden. Somit sollte das Hilfsitem überflüssig sein und Du kannst "Waschhaus.Spuelpumpe.Schalten.property.last_c hang e" (ohne Leerzeichen! Das fügt die Forensoftware ein) für den Zeitstempel verwenden.
                            Klingt gut, danke für den Tipp. Bin noch auf 1.10, aber auf die neuen Server habe ich die 1.11 schon drauf. Sobald ich alles komplett umgezogen habe, werde ich das verwenden.
                            Zuletzt geändert von wvhn; 22.05.2025, 07:24.

                            Kommentar


                              #15
                              Zitat von wvhn Beitrag anzeigen
                              Ich schau mir den Countdown nochmal an, weil ich sein Verhalten nicht recht nachvollziehen kann, wenn der letzte Parameter (condition) leer ist.
                              Das ist jetzt im develop branch korrigiert:
                              • wenn "condition" leer ist, startet der Countdown mit dem Empfang des Zeitstempels unabhängig vom Wert des Schaltitems und wird beendet, sobald sich das Schaltitem ändert.
                              • wenn "condition" einen Wert enthält, dann wird der Countdown nur dann gestartet, wenn das Schaltitem den Wert der „condition“ bereits beim Empfang des Zeitstempels besitzt. Ändert das Schaltitem seinen Wert erst nach Empfang des Zeitstempels, läuft der Countdown nicht los. Hier gab es noch einen Fehler, wenn die Seite neu geladen wurde.
                              Gruß
                              Wolfram

                              Kommentar

                              Lädt...
                              X