Countdown-Zähler z.B. für on-for-timer

Begonnen von wkarl, 13 Juli 2015, 13:15:47

Vorheriges Thema - Nächstes Thema

wkarl

Hallo,

der Bedarf kam bei mir mit der Fertigstellung unserer Bewässerungsautomatik mit HM. Bei langen Bewässerungszeiten stellt sich immer mal die Frage wie lange läuft das 'on-for-timer' noch.
Zuerst noch: ich bin kein Vollblutprogrammierer und habe den folgenden code unter Blut und Schweiß sowie viel try'n error umgesetzt. Also seht es nach falls der code nicht vom allerfeinsten Stil ist ;-)
Hier nun kurz die Implementierung der Lösung. Ach ja, da mich bzgl der Bewässerung nur die Minuten interessieren werden eben nur diese heruntergezählt. Eine Anpassung an Sekunden sollte aber nicht das Problem sein.

  • Für das device für das der Countdown gelten soll wird ein userReading angelegt
    attr <device> userReading usrCountDown:set_on-for-timer.* { CountDown($name, ReadingsVal($name,"state","off"));; }
  • in 99_MyUtils.pm folgenden code packen:
sub CountDown($$)
{
my ($dev,$devState) = @_;
my ($dummy,$ctTime) = split(/ /,$devState);
$ctTime = sprintf("%.0f",$ctTime/60);

if ($ctTime >= 1) {
fhem ("define -temporary ".$dev."_CountDown at +*00:01:00 { \\
my \$count = ReadingsVal(\"$dev\",\"usrCountDown\",\"0\");; \\
my \$status = ReadingsVal(\"$dev\",\"state\",\"off\");; \\
if ( \$status eq \"off\" ) \{ \\
fhem (\"setreading ".$dev." usrCountDown 00:00\");; \\
fhem (\"delete ".$dev."_CountDown\") \\
\} \\
elsif ( \$count > 0 ) \{ \\
\$count -= 1;; \\
fhem (\"setreading ".$dev." usrCountDown \$count\") \\
\} \\
else \{ \\
fhem (\"setreading ".$dev." usrCountDown 00:00\");; \\
fhem (\"delete ".$dev."_CountDown\") \} \\
}");
return sprintf("%02d:%02d",$ctTime,"00");
}
else {
return "Error: value has to be greater than 60s!";
}
}


  • 99_MyUtils.pm neu laden und der Countdown-Zähler sollte zur Verfügung stehen

Zur Funktion: das sub CountDown($$) erzeugt ein at, dass minütlich den anfangs gesetzten Wert um 1 verringert. Wird ein Wert kleiner/gleich Null erreicht löscht sich das at selbstständig.

Edit: leider wird der Zähler nicht automatisch aufgefrischt. Hat jemand einen Tipp?
Sorry, mein Fehler. Da ich die Log/Event-Informationen minimal halten will, kontrolliere ich sie mit event-on-change-reading. usrCountDown muss also mit dazu  :o

Edit: das sub habe ich dahingehend erweitert, wenn on-for-timer mit einem 'off' abgebrochen wird. Dann wird usrCountDown auf 0 gesetzt und das at gelöscht. Zusätzlich werden die Sekunden beim umrechnen in Minuten Auf- bzw Abgerundet. Wird ein Wert unter 30s eingegeben gibt es eine Fehlermeldung.

Edit: screenshot angefügt.
Edit: code etwas verfeinert und -temporary hinzugefügt

Feedback und Verbesserungsvorschläge jederzeit willkommen.

ciao walter
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

Timmy.m

Hallo Walter.

Eine Countdown Funktion habe ich gesucht, dann bin ich u.a. auf deinen Beitrag gestoßen. Genau so etwas habe ich gesucht.
Ich habe es kurz angetestet und es sieht echt super aus.

Mir ist nur aufgefallen, dass man nur ganze Minutenwerte eingeben darf, sonst bleibt der Wert nach Ablauf bei einem negativen Wert stehen.
Ist mir z.B. bei "set_on-for-timer 110" aufgefallen.
Für meine Zwecke ist Deine Version genau richtig. Ich möchte die Restzeit meiner Spülmaschine anzeigen lassen.

Grüße Tim
FHEM5.9@RaspPi.3B|HMLAN|CUL868V3|1Wire|HUE|FritzBox|BotVacDconnected|3xKindleDisplay|
FHEM2FHEM|
FHEM5.9@RaspPi.2B|nanoCul868|TCM310|JeeLinkClone|RFXTRX433E|ZWave|Zigbee|xiaomi
RaspberryMatic@RaspPi.3B+ in Planung

wkarl

Hallo Tim,

Danke für Dein feedback. Siehe Änderungen in meinem ersten post.

Zitat von: Timmy.m am 30 Juli 2015, 20:12:15
Mir ist nur aufgefallen, dass man nur ganze Minutenwerte eingeben darf, sonst bleibt der Wert nach Ablauf bei einem negativen Wert stehen.
Ist mir z.B. bei "set_on-for-timer 110" aufgefallen.
Grüße Tim

ciao walter
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

Timmy.m

Hallo Walter.

Habe den geänderten Code getestet.
Bei "set_on-for-timer 90" läuft der Counter 2 Minuten und endet mit "0".
Für mich ist dies vollkommen in Ordnung. Ich danke Dir für die klasse Lösung!

Grüße Tim
FHEM5.9@RaspPi.3B|HMLAN|CUL868V3|1Wire|HUE|FritzBox|BotVacDconnected|3xKindleDisplay|
FHEM2FHEM|
FHEM5.9@RaspPi.2B|nanoCul868|TCM310|JeeLinkClone|RFXTRX433E|ZWave|Zigbee|xiaomi
RaspberryMatic@RaspPi.3B+ in Planung

octek0815

#4
Hallo Walter,

vielen Dank für das tolle script! Funktionert prima.
Ich habe nun den "define" Teil im Script mit der Option -temporary ergänzt.
Dadurch ist FHEM nicht mehr der Meinung das die Konfig gespeichert werden muss.

Grüße
Oliver

kvo1

Hallo Walter,

danke , muss ich mir mal ansehen / testen, hätte da paar Anwendungen  ;)
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

christian-ruh

#6
Hallo,
das mit der Restzeitanzeige ist genial.
Hab alles wie beschrieben eingerichtet, stell mich nun aber ziemlich dumm an.
Wie kann ich die Restzeit im Tablet UI anzeigen lassen?
Es geht um eine Steckdose von AVM / Fritz (FBDECT_18).
So hab ich das eingebunden:
attr FBDECT_18 userReadings usrCountDown:set_on-for-timer.* { CountDown($name, ReadingsVal($name,"state","off"));; }
Danke für Infos.
Gruß
Christian

bjbrill

Hallo, von mir auch ein Riesen Dank für den Countdown.

Den habe ich auch für meine Bewässerung verwendet (Nur in der Standard WEB Oberfläche)
Leider hab ich auch das Problem das jedes mal "Save config ?" erscheint und
jetzt verstehe ich nicht ganz wo ich das -temporary in dem Skript einfügen muss.

Über einen Tipp würde ich mich riesig freuen.

Schöne Grüße Björn

Zitat von: octek0815 am 10 September 2015, 15:11:16
Hallo Walter,

vielen Dank für das tolle Skript! Funktionert prima.
Ich habe nun den "define" Teil im Script mit der Option -temporary ergänzt.
Dadurch ist FHEM nicht mehr der Meinung das die Konfig gespeichert werden muss.

Grüße
Oliver
Ubuntu-Server, Dect200, Jeelink, Unifi, ESP32, Alexa, Tasmota, zigbee2mqtt, OpenDTU.

octek0815

Hallo Björn,

den - temporary Parameter packst du direkt hinter dem define Befehl.

Beispiel:

define -temporary xyz ...

Grüße
Oliver

bjbrill

Ubuntu-Server, Dect200, Jeelink, Unifi, ESP32, Alexa, Tasmota, zigbee2mqtt, OpenDTU.

n4rrOx

Hi,

ist das auch mit IT möglich??
ein einfaches "set sz_Nachtleuchte on-for-timer 300" funktioniert....leider wird aber bei mir kein usrCountDown unter Readings erstellt, wenn ich den Befehl absetze.

99_MyUtils.pm ist ergänzt und FHEM neugestartet.

Btw.... wie kann ich die restliche Zeit im FTUI anzeigen lassen, aber nur in dem Fall das ein Timer gesetzt wurde (ansonsten keine Anzeige)?

KölnSolar

ZitatFür das device für das der Countdown gelten soll wird ein userReading angelegt
soll wohl heißen: ..... muss ein userReading angelegt werden. Kein Automatismus, sondern manuell
Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

wkarl

Zitat von: KölnSolar am 23 April 2016, 22:09:30
soll wohl heißen: ..... muss ein userReading angelegt werden. Kein Automatismus, sondern manuell
Grüße Markus

Siehe erstes post erster Punkt der Anweisungsliste.

ciao Walter
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

justme1968

kurz zur info:

es gibt inzwischen für fs20 und alle devices die on- und off-for-timer über die SetExtensions implementieren ein neues internal TIMED_OnOff. in diesem hash stehen start zeitpunkt, dauer und kommando explizit drin.

d.h. man kann sich einen solchen countdown geräte unabhängig jetzt z.b. auch für dummy, IT, HUE,... bauen (hier gibt es keinen -for-timer state) und auch dann wenn das event über eventMap verändert wurde.

bei HM muss man (noch) wie oben über das event gehen. martin mag das neue internal leider nicht.

gruss
  andre

ps: wenn das -for-timer über die SetExtensions implementiert wurde gibt es jetzt auch ein SetExtensionsCancel um den timer abzubrechen. das sollte zwar eigentlich von jeweiligen modul verwendet werden, bis das überall der fall ist ist es aber vielleicht auch direkt nützlich.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

jorge

Danke, funktioniert gut für HM.

Wenn ich einen OWSWITCH (DS2408) über ReadingsProxy steuern will wird leider kein Reading angezeigt.
Kann es sein, dass set_on-for-timer.* bei ReadingsProxy nicht generiert wird?

Jorge
FHEM.RaspberryPi 2 (HM, 1Wire, Callmonitor.FB 7490, GPIO, I2C, MQTT-Server, MCP23018)
FHEM.RaspberryPi  (FHEM2FHEM, CUL, FS20)
FHEM.RPiZeroW (I2C, 1Wire, python.api, XiaomiBTLESens.MQTT)
FHEM.Win7 (FHEM2FHEM,DBLOG.MySql)
ESPEasy (WEMOSD1, I2C, Analog, 1Wire), Sonoff_T1_3ch, Mobotix QM25, robonect