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

justme1968

#15
ja. readingsProxy verwendet die setExtensions und es gilt das im beitrag vor deinem gesagten. du musst das notify anpassen und das TIMED_OnOff internal auswerten.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

jorge

Zitat von: justme1968 am 23 Mai 2016, 13:36:34
ja. readingsProxy verwendet die setExtensions und es gilt das im beitrag vor deinem gesagten. du musst das noticy auswerten und das TIMED_OnOff internal auswerten.

gruss
  andre

Danke für die Info, Andre. Und wie werte ich das Internal aus?

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

jorge

Trotz intensiver Bemühungen bekomme ich es nicht hin, den CountDown - Zähler im ReadingProxy anzuzeigen (s.o). Da fehlt mir wohl der entscheidende Link...

Vielleicht kann mir jemand auf die Sprünge helfen?

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

marvin78

Wenn du uns an deinen intensiven Bemühungen teil haben lassen würdest, könnte man ggf. die Fehler finden. Da du das nicht machst, ist es schwer, dir zu helfen.

jorge

Zitat von: marvin78 am 30 Mai 2016, 16:49:35
Wenn du uns an deinen intensiven Bemühungen teil haben lassen würdest, könnte man ggf. die Fehler finden. Da du das nicht machst, ist es schwer, dir zu helfen.

Mein Problem ist wohl, dass ich es nicht hinbekomme, in der CountDown($$) den Wert von TIMED_OnOff an die Varibale $ctTime zu übergeben.
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

justme1968

#20
das sollte z.b. etwa so gehen: if( my $helper = InternalVal($dev,'helper',undef) ) {
  if( my $TIMED_OnOff = $helper->{TIMED_OnOff} ) {
    $ctTime = $TIMED_OnOff->{DURATION};
  }                               
}


gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

n4rrOx

Hallo Andre,

bitte um Erklärung folgender Zeile:
Zitat von: justme1968 am 31 Mai 2016, 00:46:35
[...]
$ctTime = $TIMED_OnOff->{DURATION} if( $TIMED_OnOff );


Vielen Dank vorab! :)

justme1968

was genau ist denn nicht klar?

gruss
andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

n4rrOx

In der ersten Zeile wird der Variable $TIMED_OnOff der Wert von helper vom Device zugewiesen.
Was wird in der zweiten Zeile gemacht? Der Variable $ctTime wird etwas zugewiesen.
1. Wenn $TIMED_OnOff geändert wird?
2. Was bewirkt folgender Ausdruck: $TIMED_OnOff->{DURATION} ?

Sry für meine Unwissenheit...bin erst seit kurzem bei FHEM und versuche zu verstehen, statt einfach zu kopieren. ^^

justme1968

ich habe den code oben noch mal korrigiert.

zeile 1 hole den internal helper
zeile 2 schaut ob es darin ein TIMED_OnOff gibt
zeile 3 holt daraus den wert DURATION.

helper und TIMED_OnOff sind jeweils keine einfachen werte sondern ein perl hash.

Sry für meine Unwissenheit...bin erst seit kurzem bei FHEM und versuche zu verstehen, statt einfach zu kopieren. ^^dafür muss man sich nicht entschuldigen und verstehen wollen ist sehr löblich :)

deine fragen beziehen sich nicht mehr auf die fhem ebene sondern auf perl und datenstrukturen. am besten schaust du dich dort mal speziell zu hashes um.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

n4rrOx

Danke für die Erläuterungen!

Habe das gerade mal versucht anhand von folgender Erklärung https://wiki.selfhtml.org/wiki/Perl/Hashes nachzuvollziehen, aber die Syntax scheint ein wenig anders zu sein.
Das Perl/hases Beispiel der Seite ist einfacher zu verstehen ^^

Werde mir da wohl noch ein paar andere Quellen durchlesen müssen.

Chaos

Ahoi,

könnte mir jemand unter die Arme greifen.
Das Ganze funktioniert mit einem HM-Taster (HM-LC-SW2-FM), aber ich würde den Countdown gerne auf einem Dummy haben.
Nach meiner Recherche geht das nicht, da dummy keine setextensions unterstützt. Ist das noch so weil es ja useSetExtensions 1 gibt?

Als nächstes hab ichs mit Readingsproxy versucht, nach folgendem Schema:
define define TIMER1 dummy
define Countdown1 readingsProxy TIMER1:state
attr Countdown1 userReadings usrCountDown:set_on-for-timer.* { CountDown($name, ReadingsVal($name,"state","off"));; }


Aber auch hier wird kein at bei bspw.set TIMER1 on-for-timer 250 angelegt, vermutlich weil ich das mit dem von Andre geposteten "Helper" nicht kapier. Also wo ich den einfügen muss.

Besten Dank
Manuel




jorge

Danke, Andre, für die Korrekturen. Habe den Code in folgendermaßen eingebaut:

sub CountDown($$)
{
   my ($dev,$devState) = @_;
   my ($dummy,$ctTime) = split(/ /,$devState);
   $ctTime = sprintf("%.0f",$ctTime/60);

#Added Code from andre*****************************************
        if( my $helper = InternalVal($dev,'helper',undef) )
           {
            if( my $TIMED_OnOff = $helper->{TIMED_OnOff} )
              {
              $ctTime = $TIMED_OnOff->{DURATION};
              }                               
           }
#************************************************************

   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!";
   }
}


Aufgerufen wird das in den userReadings (TYPE: readingsProxy) mit:

usrCountDown { CountDown($name, ReadingsVal($name,"state","off"));; }

Angezeigt wird in den Readings:
usrCountDown   Error: value has to be greater than 60s!

Also wird $TIMED_OnOff wohl nicht gesetzt...

LG
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

justme1968

bau den teil mal so um:


Log 1, Dumper $devState;
        if( my $helper = InternalVal($dev,'helper',undef) )
           {
Log 1, Dumper $helper;
            if( my $TIMED_OnOff = $helper->{TIMED_OnOff} )
              {
Log 1, Dumper $TIMED_OnOff;
              $ctTime = $TIMED_OnOff->{DURATION};
Log 1, Dumper $ctTime;
              }                               
}
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

jorge

Zitat von: justme1968 am 07 Juni 2016, 19:31:02
bau den teil mal so um:


Log 1, Dumper $devState;
        if( my $helper = InternalVal($dev,'helper',undef) )
           {
Log 1, Dumper $helper;
            if( my $TIMED_OnOff = $helper->{TIMED_OnOff} )
              {
Log 1, Dumper $TIMED_OnOff;
              $ctTime = $TIMED_OnOff->{DURATION};
Log 1, Dumper $ctTime;
              }                               
}


Habe ich in die sub CountDown($$) eingebaut. In das Logfile wird

2016.06.09 08:14:34 1: $VAR1 = 'ON';
2016.06.09 08:14:33 1: $VAR1 = 'ONX';

geschrieben, das ist wohl der Inhalt von $devState;
also scheint $helper für das readingsProxy Device wohl nicht definiert zu sein.

set <device> on-for-timer <sec> funktioniert einwandfrei.

LG

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

justme1968

ist dein fhem aktuell ?

was sagt das version kommando?

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

jorge

Zitat von: justme1968 am 09 Juni 2016, 10:04:34
ist dein fhem aktuell ?

was sagt das version kommando?

gruss
  andre

Hab sicherheitshalber noch ein update gemacht: Gleiches Verhalten.
Latest Revision: 11634
LG 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

justme1968

sorry. mein fehler.

die von rudi eingecheckte version verwendet nicht helper wie ursprünglich vorgeschlagen sondern TIMED_OnOff direkt.

der code muss also so aussehen:if( my $TIMED_OnOff = InternalVal($dev, 'TIMED_OnOff', undef) ) {
  $ctTime = $TIMED_OnOff->{DURATION}
}



gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

jorge

Zitat von: justme1968 am 09 Juni 2016, 12:01:57

der code muss also so aussehen:if( my $TIMED_OnOff = InternalVal($dev, 'TIMED_OnOff', undef) ) {
  $ctTime = $TIMED_OnOff->{DURATION}
}



Danke, andre, so geht´s.

Habe mir dann Gedanken gemacht, wie man das Runterzählen eleganter mit DOIF lösen kann:

sub CountDownDOIF($$)
{
   my ($dev,$devState) = @_;
   my ($dummy,$ctTime) = split(/ /,$devState);
        if( my $TIMED_OnOff = InternalVal($dev, 'TIMED_OnOff', undef) )
        {
        $ctTime = $TIMED_OnOff->{DURATION}
        }
        my count = $ctTime;
        fhem
        (
        'define -temporary '.$dev.'_CountDown DOIF
        ({$ctTime >0})
        ({$count -= 1;fhem(setreading '.$dev.' usrCountDown $count');if($count == 0){fhem("delete ".$dev."_CountDown")}})'
        );
        fhem('attr '.$dev.'_CountDown repeatcmd 1');
        fhem('attr '.$dev.'_CountDown repeatsame'.$ctTime);
}


... krieg das aber mit meinen rudimentären syntaktischen Fähigkeiten nicht hin...

LG

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

justme1968

zu DOIF kann ich dir nichts sagen.

was daran eleganter sein soll weiss ich auch nicht.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

mani

Hallo,


würde gerne diesen Code
if( my $TIMED_OnOff = InternalVal($dev, 'TIMED_OnOff', undef) ) {
  $ctTime = $TIMED_OnOff->{DURATION}
}

anwenden nur wie..... :o

Habe einen Dummy Timer eingerichtet


setList on off
deleteattr useSetExtensions 1
deleteattr userReadings ctTime --> würde dieses Reading befüllt werden?


Bitte um Hilfe Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

mani

Möchte die restliche Zeit aus meinem Dummy im Progress Widget angezeigt bekommen, dazu brauch ich ein Reading welche diese anzeigt.

Das Dummy wird per notify für 30 Sekunden (on-for-timer 30) gestartet(Ausgangszeit nach Scharfschalten der Alarmanlage).
wie muss ich nun dein Codeschnipsel einbauen?mmh


Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

mani

Hallo,

hab den Code nun in der 99_myUtils.pm....aber ich schaff es nicht in das userReadings zu schreiben. Es kommt immer der

Fehler:  usrCountDown Unknown command }, try help.

ich verwende diesen Code der Zeitwert aus dem Dummy wird übergeben aber das ist ein fixer oder? bitte um Hilfe.

Mfg Mani



sub CountDown($$)
{
   my ($dev,$devState) = @_;
   my ($dummy,$ctTime) = split(/ /,$devState);
 
   $ctTime = sprintf("%.0f",$ctTime/60);

   if( my $TIMED_OnOff = InternalVal($dev, 'TIMED_OnOff', undef) ) {
  $ctTime = $TIMED_OnOff->{DURATION}
  }

     if ($ctTime < 1){
        fhem ("delete ".$dev."_CountDown");
        }

     elsif ($ctTime >= 1)
                     
                        {   
        fhem ("define -temporary ".$dev."_CountDown at +*00:00:01 {
              fhem ('setreading ".$dev." usrCountDown $ctTime'); } ");
         }
      }

-------------------------------------------------------
DEF   
+*00:00:01 {
              fhem ('setreading Timer usrCountDown 44')

RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

rhoffm34

Ok. Nach langem hin und her lesen.....ich kapier es nicht...

Zitat aus den Anleitung:

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

Wo? Wie rufe ich den auf? wo ist das userreading?

- In 99_MyUtils.pm hab ich den code gespeichert
- shutdown restart

und weiter?

wkarl

Hallo,

ZitatFü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"));; }

auch das umgesetzt?

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

wkarl

Hallo Mani,

wenn Du das so in 99_myUtils.pm stehen hast, dann fehlen die '\'. Sieh Dir den code aus dem ersten post an.

Zitat von: mani am 25 Juni 2017, 21:22:46
Hallo,

hab den Code nun in der 99_myUtils.pm....aber ich schaff es nicht in das userReadings zu schreiben. Es kommt immer der

Fehler:  usrCountDown Unknown command }, try help.

ich verwende diesen Code der Zeitwert aus dem Dummy wird übergeben aber das ist ein fixer oder? bitte um Hilfe.

Mfg Mani



sub CountDown($$)
{
   my ($dev,$devState) = @_;
   my ($dummy,$ctTime) = split(/ /,$devState);
 
   $ctTime = sprintf("%.0f",$ctTime/60);

   if( my $TIMED_OnOff = InternalVal($dev, 'TIMED_OnOff', undef) ) {
  $ctTime = $TIMED_OnOff->{DURATION}
  }

     if ($ctTime < 1){
        fhem ("delete ".$dev."_CountDown");
        }

     elsif ($ctTime >= 1)
                     
                        {   
        fhem ("define -temporary ".$dev."_CountDown at +*00:00:01 {
              fhem ('setreading ".$dev." usrCountDown $ctTime'); } ");
         }
      }

-------------------------------------------------------
DEF   
+*00:00:01 {
              fhem ('setreading Timer usrCountDown 44')
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

Wasserwerk33

Hallo

Kann mir vielleicht einer helfen??

Und zwar habe ich den Code eingefügt.
Internals:
   DEF        0F0F00FFFF 0F F0
   IODev      nanoCUL
   NAME       Brennstuhl_A
   NR         71
   STATE      off
   STILLDONETIME 0
   TYPE       IT
   XMIT       0f0f00ffff
   XMITdimdown 00
   XMITdimup  00
   XMIToff    f0
   XMITon     0f
   CODE:
     1          0f0f00ffff
   READINGS:
     2017-07-24 17:02:39   protocol        V1
     2017-08-06 13:31:23   state           off
Attributes:
   IODev      nanoCUL
   room       steckdose
   userReadings usrCountDown:set_on-for-timer.* { CountDown($name, ReadingsVal($name,"state","off")); }


Wie bekomme ich es nun hin das mir der Countdown in Tablet ui angezeigt wird.
Danke
schönes Wochenende noch

Grafkox

Hallo Walter,

zunächst einmal Danke für Deinen Countdownzähler und Deine Anzeige im Tablet UI zur Bewässerungssteuerung.

Dieser funktionieren beide auch sehr gut.

Allerdings habe ich einen kleinen "Schönheitsfehler" in der Anzeige wenn kein Countdown läuft und in der ersten Minute des Countdowns, hier werden die Minuten mit 00:00 bzw. z.B. 30:00 im Reading und somit im Tablet UI angezeigt.

Gibt es ggf. eine Lösung, dass auch diese Werte ohne :00 angezeigt werden?

Danke und Gruß

Thorsten
Raspberry Pi 3 mit Fhem 5.9, Tablet UI 2.6, SIGNALduino, Somfy RTS, Fritzbox 7490, IT-Steckdosen, Hikvision Kameras, Xiaomi Sensoren, Tecalor THZ, E3/DC

Grafkox

Zitat von: Wasserwerk33 am 06 August 2017, 13:36:04
Hallo

Kann mir vielleicht einer helfen??

Und zwar habe ich den Code eingefügt.

Wie bekomme ich es nun hin das mir der Countdown in Tablet ui angezeigt wird.
Danke
schönes Wochenende noch

ich hab es so eingebunden:
<div class="cell inline big blue" data-type="label"
data-device="Bewaesserung_Vorgarten"
data-get="usrCountDown"
data-unit="min">
</div>
Raspberry Pi 3 mit Fhem 5.9, Tablet UI 2.6, SIGNALduino, Somfy RTS, Fritzbox 7490, IT-Steckdosen, Hikvision Kameras, Xiaomi Sensoren, Tecalor THZ, E3/DC

wkarl

Hallo Thorsten,

Zitat von: Grafkox am 13 August 2017, 16:34:49
Hallo Walter,

zunächst einmal Danke für Deinen Countdownzähler und Deine Anzeige im Tablet UI zur Bewässerungssteuerung.

Dieser funktionieren beide auch sehr gut.

Allerdings habe ich einen kleinen "Schönheitsfehler" in der Anzeige wenn kein Countdown läuft und in der ersten Minute des Countdowns, hier werden die Minuten mit 00:00 bzw. z.B. 30:00 im Reading und somit im Tablet UI angezeigt.

Gibt es ggf. eine Lösung, dass auch diese Werte ohne :00 angezeigt werden?

Danke und Gruß

Thorsten

Hm, bei mir ist im usrCountDown immer die Zeit ein- oder zweistellig. Setz mal in Tablet-UI für das device 'data-part = "^(\d\d?)"' - bin zwar kein RegEx Guru, aber der online RegEx Tester sagt dass das richtig ist.

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

Grafkox

#46
Hallo Walter,

danke für Deine Antwort.

leider führt Dein Vorschlag nicht zum gewünschten Ergebnis, da es in der ersten Minute nun gar keinen Wert im TabletUI ausgibt (s. Bild 1)  :(.

Das Problem, wenn kein Timer läuft habe ich heute mit einer Anpassung in der 99_MyUtils.pm gelöst, indem ich die stellen an denen usrCountDown 00:00 stand, auf usrCountDown 00 geändert habe.

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\");; \\
fhem (\"delete ".$dev."_CountDown\") \\
\} \\
elsif ( \$count > 0 ) \{ \\
\$count -= 1;; \\
fhem (\"setreading ".$dev." usrCountDown \$count\") \\
\} \\
else \{ \\
fhem (\"setreading ".$dev." usrCountDown 00\");; \\
fhem (\"delete ".$dev."_CountDown\") \} \\
}");
return sprintf("%02d:%02d",$ctTime,"00");
}
else {
return "Error: Wert muss größer als 60s sein!";
}
}


Wie wird denn Deine erste Minute im Reading in FHEM ausgegeben? Ich denke hier ist eine Anpassung erforderlich, finde aber im Forum keinen Ansatz um das entsprechend anzupassen.

Vielen Dank für Deine Unterstützung.

Viele Grüße

Thorsten
Raspberry Pi 3 mit Fhem 5.9, Tablet UI 2.6, SIGNALduino, Somfy RTS, Fritzbox 7490, IT-Steckdosen, Hikvision Kameras, Xiaomi Sensoren, Tecalor THZ, E3/DC

Grafkox

#47
kleine Ergänzung: im Log kommt auch immer bei Ausführen eines Countdown das nachfolgende Warning:

PERL WARNING: Argument "02:00" isn't numeric in numeric gt (>) at
Raspberry Pi 3 mit Fhem 5.9, Tablet UI 2.6, SIGNALduino, Somfy RTS, Fritzbox 7490, IT-Steckdosen, Hikvision Kameras, Xiaomi Sensoren, Tecalor THZ, E3/DC

neo_28

Hallo,

und vielen Dank für den Countdown.

Leider funktioniert der Countdown bei mir nur in den HM-Devices und nicht bei FBDECT.

Ist das so korrekt oder habe ich etwas falsch verstanden oder falsch konfiguriert?

Viele Grüße

neo_28

Rudibarani

Lieber Walter,
ich bin neu mit FHEM unterwegs und würde gerne Deinen Countdown-Timer bei mir einbauen.
Dabei habe ich vermutlich einen Typo in Deiner Anleitung entdeckt:

Zitat von: wkarl am 13 Juli 2015, 13:15:47
  • 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"));; }

Ich denke, es müsste "userReadings" heißen, oder?

Wenn ich das "s" hinzufüge, erscheint bei meinem FBDECT-Schalter auch das Attribut
userReadings
usrCountDown set_on-for-timer.* { CountDown($name, ReadingsVal($name,"state","off")); }
deleteattr
.
Ein Reading wird aber nicht angezeigt - auch nicht, wenn ich (nach einem Neustart von FHEM) die Steckdose mit
set FBDECT_FritzBox_SmartHome_08761_0507248 on-for-timer 180
einschalte. Hast Du einen Rat für mich, was ich falsch mache?

Vielen Dank!
Phillip

tarum

Hallo,

das Reading wird nur bei Homematic erzeugt, also es geht mit FBDECT nicht.
Linux Server 20.04 CUL 868+433, CCU3, Homematic, Intertechno, FritzDect 200, JeeLink+LaCrosse, Duofern Stick+Rollotron Gurtwickler,smartVISU-3.0.0

Rudibarani

Danke für den Hinweis. Das war mir garnicht klar, denn ich hatte durch diesen Post den Eindruck, dass es geht:

Zitat von: christian-ruh am 12 März 2016, 18:23:24
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

Wie kann man denn den Countdown-Timer so abwandeln, dass er auch für FBDECT-Steckdosenschalter funktioniert?

TiPpFeHlEr

Hi,

ich bin auf der Suche nach einem Countdown Timer für GPIO.

geht der code auch dafür?
GPIO hat ja ein eigenen on-for-timer, 99_myUtils ist angepasst
############################# timer ################################
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!";
}
}


userreadings ist hinzugefügt
attr SSR7 userReadings usrCountDown:set_on-for-timer.* { CountDown($name, ReadingsVal($name,"state","off"));;;; }


es gibt aber kein reading, und das absetzen des Befehls
set SSR7 set_on-for-timer 60
gibt folgenden Fehler
Unknown argument set_on-for-timer, choose one of off on toggle intervals on-till blink on-for-timer off-till off-for-timer off-till-overnight on-till-overnight

mache ich etwas falsch oder geht GPIO nicht?

MfG Maik