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

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

Vorheriges Thema - Nächstes Thema

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