FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: wkarl am 13 Juli 2015, 13:15:47

Titel: Countdown-Zähler z.B. für on-for-timer
Beitrag von: wkarl am 13 Juli 2015, 13:15:47
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.
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!";
}
}


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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: Timmy.m am 30 Juli 2015, 20:12:15
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: wkarl am 02 August 2015, 09:13:47
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: Timmy.m am 12 August 2015, 20:02:50
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: octek0815 am 10 September 2015, 15:11:16
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: kvo1 am 11 September 2015, 10:16:24
Hallo Walter,

danke , muss ich mir mal ansehen / testen, hätte da paar Anwendungen  ;)
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag 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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: bjbrill am 15 März 2016, 21:23:05
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: octek0815 am 15 März 2016, 21:26:55
Hallo Björn,

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

Beispiel:

define -temporary xyz ...

Grüße
Oliver
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: bjbrill am 17 März 2016, 11:28:54
Danke Oliver,

jetzt klappt es perfekt.
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: n4rrOx am 23 April 2016, 19:15:25
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)?
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: KölnSolar am 23 April 2016, 22:09:30
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: wkarl am 08 Mai 2016, 07:41:55
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: justme1968 am 12 Mai 2016, 11:10:20
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.
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: jorge am 23 Mai 2016, 10:01:26
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag 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 notify anpassen und das TIMED_OnOff internal auswerten.

gruss
  andre
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: jorge am 24 Mai 2016, 18:13:30
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

Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: jorge am 30 Mai 2016, 16:14:11
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag 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.
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: jorge am 30 Mai 2016, 18:52:40
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.
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: justme1968 am 31 Mai 2016, 00:46:35
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: n4rrOx am 31 Mai 2016, 12:05:19
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! :)
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: justme1968 am 31 Mai 2016, 12:07:18
was genau ist denn nicht klar?

gruss
andre
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: n4rrOx am 31 Mai 2016, 12:38:26
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. ^^
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: justme1968 am 31 Mai 2016, 12:47:55
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: n4rrOx am 31 Mai 2016, 13:08:42
Danke für die Erläuterungen!

Habe das gerade mal versucht anhand von folgender Erklärung https://wiki.selfhtml.org/wiki/Perl/Hashes (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.
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: Chaos am 06 Juni 2016, 13:32:39
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



Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: jorge am 07 Juni 2016, 10:57:50
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag 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;
              }                               
}
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: jorge am 09 Juni 2016, 08:48:06
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: justme1968 am 09 Juni 2016, 10:04:34
ist dein fhem aktuell ?

was sagt das version kommando?

gruss
  andre
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: jorge am 09 Juni 2016, 10:18:19
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: justme1968 am 09 Juni 2016, 12:01:57
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: jorge am 09 Juni 2016, 15:28:28
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: justme1968 am 09 Juni 2016, 15:39:43
zu DOIF kann ich dir nichts sagen.

was daran eleganter sein soll weiss ich auch nicht.

gruss
  andre
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: mani am 22 Juni 2017, 20:36:53
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: justme1968 am 22 Juni 2017, 21:09:08
was genau willst du denn erreichen?
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: mani am 22 Juni 2017, 22:19:06
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag 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')

Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: rhoffm34 am 01 Juli 2017, 16:00:33
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?
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: wkarl am 24 Juli 2017, 11:53:45
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: wkarl am 24 Juli 2017, 11:57:05
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')
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: Wasserwerk33 am 06 August 2017, 13:36:04
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag 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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: Grafkox am 13 August 2017, 16:36:49
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>
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: wkarl am 27 August 2017, 11:19:44
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: Grafkox am 27 August 2017, 13:28:13
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: Grafkox am 27 August 2017, 14:22:54
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: neo_28 am 04 Mai 2018, 14:44:29
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: Rudibarani am 22 Mai 2018, 14:56:01
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
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: tarum am 23 Mai 2018, 14:47:49
Hallo,

das Reading wird nur bei Homematic erzeugt, also es geht mit FBDECT nicht.
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: Rudibarani am 23 Mai 2018, 15:47:55
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?
Titel: Antw:Countdown-Zähler z.B. für on-for-timer
Beitrag von: TiPpFeHlEr am 08 April 2020, 08:14:39
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