Seit smartVISU 2.9b (Stand 10. Nov 2020 aktueller develop Branch) wird ein tolles Widget angeboten, das auf der Visualisierungsseite einen Countdown anzeigt. Dieser kann beispielsweise für folgende Szenarien genutzt werden:

  • Treppenlichtfunktion
  • Vorübergehende Aktivierung eines Zustands/Items, z.B. Lüftungsstufe
  • Stateengine Plugin Suspendmodus
  • Nachlaufzeit Bewegungsmelder

Das Widget benötigt folgende Informationen:

  • UNIX Zeitstempel mit der Startzeit des Countdowns
  • Dauer des Countdowns
  • ein Item, das durch eine Wertänderung den Countdown beendet

Die Dauer des Countdowns muss in Stunden, Minuten und Sekunden angegeben werden. Dieses Format kann am einfachsten durch ein eval aus einem anderen Item generiert werden, das z.B. die Dauer in Minuten oder Sekunden hält. Angenommen, die Dauer des Countdowns und Timers wird in Minuten angegeben, sieht das Item Konstrukt wie folgt aus:


item:
    nachlaufzeit:
        visu_acl: rw
        type: num
        cache: True

        duration_format:
        type: str
        visu_acl: ro
        eval: "'{}h {}i 0s'.format(int(sh...()//60), round((sh...()%3600)%60))"
        eval_trigger: ..
        crontab: init

Alternativ könnte die Konvertierung auch mittels datetime Bibliothek durchgeführt werden, aber der oben genannte Eval-Ausdruck funktioniert auch zuverlässig. Ist nun die Nachlaufzeit in Sekunden angegeben, muss der eval Ausdruck wie folgt angepasst werden:


eval: "'{}h {}i {}s'.format(int(sh...()//3600), int((sh...()%3600)//60), round((sh...()%3600)%60))"

Der Unix Zeitstempel kann durch folgenden Item Baum generiert werden. „time“ beinhaltet schlichtweg nur die Uhrzeit und ist nur der Vollständigkeit hier erwähnt (wäre für den Countdown nicht nötig). „date_time“ ist das Item, das die aktuelle Zeit beinhaltet. Es muss durch das Item, das den Countdown auslösen soll, getriggert werden. „unix_timestamp“ ist schließlich das Item, das vom Countdown Widget genutzt wird.


item:
    nachlaufzeit:
        start:
            time:
                type: str
                visu_acl: ro
                eval: >-
                      '' if sh..self.date_time() in ['', ' '] else 
                      sh..self.date_time().split(' ')[1].split('.')[0]
                eval_trigger: .date_time
                crontab: init

            date_time:
                type: str
                visu_acl: ro
                cache: True
                eval: str(shtime.now())) # or str(sh.shtime.now()))

            unix_timestamp:
                remark: Can be used for the clock.countdown widget
                type: num
                visu_acl: ro
                eval: >-
                      0 if sh...date_time() in ['', ' '] else 
                      sh.tools.dt2ts(shtime.datetime_transform(sh...date_time())) * 1000
                eval_trigger: ..date_time
                crontab: init

Das „item“ wäre das Item, das den Countdown beenden kann. Außerdem wird es in den meisten Fällen auch das Item sein, das den Countdown startet, indem es die Startzeit auf die aktuelle Uhrzeit setzt. Hier ist wichtig, dass das Setzen der Uhrzeit VERZÖGERT zur Item Änderung stattfindet, da sonst die Wertänderung des Items zum sofortigen Stoppen des Countdowns führen könnte. Um sicherzugehen, dass date_time immer NACH item verändert wird, ist ein timer oder autotimer einzusetzen.

In diesem Beispiel setzt „item“ das „date_time“ mit einer Verzögerung von einer Sekunde. Das Setzen eines leeren Werts wäre nicht nötig und kann in bestimmten Fällen auch zu ungewollten Ergebnissen führen. Dennoch wird es im Beispiel so gehandhabt, da so schnell auch am „start“ Item erkannt werden kann, ob der Countdown nun läuft oder nicht (weil „date_time“ leer ist).


item:
    knx_dpt: 1
    visu_acl: ro
    type: bool
    cache: True
    on_change: >-
               sh..self.nachlaufzeit.start.date_time.timer(1, str(sh.shtime.now())) 
               if value is True else sh..self.nachlaufzeit.start.date_time('') 
               if value is False else None

Das Smartvisu Widget müsste wie folgt konfiguriert werden:


{{ clock.countdown('', 'item', 'item.nachlaufzeit.start.unix_timestamp', 
'item.nachlaufzeit.duration_format', '1s', '', ' ') }}

KNX Bewegungsmelder

Möchte man die Nachlaufzeit eines KNX Bewegungsmelders visualisieren, ist bei den meisten BWM eine spezielle Parametrisierung über ETS nötig, da die Nachlaufzeit über erneute Bewegung nur intern verlängert wird und nicht als KNX Objekt zur Verfügung steht. Bietet der Bewegungsmelder die Parametrisierung mehrerer Sektoren an (wie zB Argus BWM), müssen zwei Sektoren entsprechend eingestellt werden:
Sektor 1: Reagiert auf Bewegung, Nachlaufzeit ist auf max. 1 Sekunde gestellt, die Nachlaufzeit kann NICHT durch Bewegung verlängert werden. Telegramme sollen nur beim Start der Bewegung gesendet werden, nicht am Ende. Eines dieser Telegramme kann nun ein spezielles Item für SHNG sein (z.B. nachlaufzeit_aktiv) oder als Mastertrigger einen zweiten Sektor aktivieren.

Sektor 2: Der zweite Sektor wiederum darf Telegramme nur nach Ablauf der Nachlaufzeit senden und nicht zu Beginn. Diese Telegramme können beispielsweise das Schalten von Lichtern, Setzen von Szenen, etc. beinhalten. Die Nachlaufzeit ist im Idealfall als eigenes Objekt einstellbar (item.nachlaufzeit).

Alternativ kann anstelle dieses zweiten „Sektors“ natürlich auch ein normaler Schaltaktor getriggert werden, bei dem eine Treppenlichtfunktion hinterlegt ist. Dort ist meist die Nachlaufzeit nicht über ein Objekt einstellbar, weshalb die Herangehensweise über den zweiten BWM-Sektor komfortabler und flexibler ist. Die Funktionsweise wäre aber ähnlich: Der Bewegungsmelder muss wie oben bei Sektor 1 beschrieben eingestellt werden, für das Abschalten des Aktors sorgt die interne Treppenlichtfunktion.

Stateengine Plugin

Das Stateengine Plugin bietet ab Version 1.7.3 bereits die nötigen Items im struct als stateengine.state_suspend an, um das Countdown Widget mit den richtigen Werten zu versorgen. Das Widget muss dann wie folgt aufgerufen werden – der Itempfad muss natürlich noch angepasst werden:


{{ clock.countdown('', 'item.automatik.suspend', 
'item.automatik.suspend_start.unix_timestamp', 
'item.automatik.settings.suspendduration.duration_format', '1', '', ' ') }}

Möchte man einen eigenen Status erstellen, der nur eine bestimmte Dauer aktiv bleibt, müsste folgende Konfiguration genutzt werden, wobei sowohl die Dauer als entsprechendes Item nach obiger Vorlage erstellt werden müsste, als auch ein Item, das den Startzeitpunkt speichert (im Beispiel status.taster.start.date_time)


    rules:
        se_item_taster_start: ..status.taster.start.date_time

        taster:
            name: taster

            on_enter_or_stay:
                se_action_retrigger:
                  - 'function: special'
                  - 'value: retrigger:..retrigger'
                  - 'delay: eval:se_eval.get_relative_itemvalue("..settings.taster.dauer") * 60'
            on_enter:
                se_action_taster_start:
                  - 'function: set'
                  - 'to: eval:str(shtime.now())'

            on_leave:
                se_action_taster_start:
                  - 'function: set'
                  - 'to:  '
                  - 'delay: 1'


0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.