[gelöst] Wie Jahreswert in time_str2num als Variable $year?

Begonnen von TomLee, 02 April 2018, 18:02:47

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: TomLee am 03 April 2018, 09:59:29
Danke.

Es gibt jetzt genau ein Ergebnis mit MODEL=Perl. Nämlich das hier;D

In dem Beispiel fehlt übrigens die letzte geschweifte Klammer.

na, dann :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#16
Noch als Tipp, da DOIF-Perl keinen Status setzt, kannst du zwecks Übersicht gleich statt:

set_Reading ("next_date",min([$SELF:Mama],[$SELF:Papa],[$SELF:Lilly],[$SELF:Mia]),1);

set_Reading ("state",min([$SELF:Mama],[$SELF:Papa],[$SELF:Lilly],[$SELF:Mia]),1);

setzen.

Edit: Wenn die Daten stimmen, haben wir bei den Namen drei, beim Datum eine Übereinstimmung ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

Hallo,

Leon sagte zwar er schaut nochmal, kanns aber auch net lassen selbst Hand anzulegen und es mindestens zu versuchen.

Den vergangenen Terminen würd ich jetzt gerne noch ein Jahr hinzu addieren.

Das es möglich ist in der Anweisung des if nochmals ein if-else auszuführen hab ich gesehen.

Nur die Syntax ist mir unklar. Wenn ich mir im Wiki die if-condition anschaue, steht die Fhem-Anweisung in runden Klammer (fhem()), diese wiederum in geschweiften .

Damians Doif-Perl-Beispiel kommt wiederum ohne Angabe von fhem() bei den setreadings aus.

So in der Art stell ich mir das vor:


{if ([17:46]) {
if (int((time_str2num("$year-03-16 00:00:00")-time())/86400) =< 0) {set_Reading("Mama",int((time_str2num("$year-03-16 00:00:00")-time())/86400) + 365 ,1)} else {set_Reading("Mama",int((time_str2num("$year-01-18 00:00:00")-time())/86400),1)};
}


Das einzige was hier allerdings funktioniert ist das Addieren der 365 Tage.

int((time_str2num("$year-03-16 00:00:00")-time())/86400) + 365

Beim Vergleich ob der Wert gleich kleiner 0 ist gibts egal in welcher Variante immer Operatorfehler.


Kann mir wer was zur richtigen Syntax sagen ?

Gruß

Thomas



CoolTux

Zitat von: TomLee am 04 April 2018, 18:54:02
Hallo,

Leon sagte zwar er schaut nochmal, kanns aber auch net lassen selbst Hand anzulegen und es mindestens zu versuchen.

Den vergangenen Terminen würd ich jetzt gerne noch ein Jahr hinzu addieren.

Das es möglich ist in der Anweisung des if nochmals ein if-else auszuführen hab ich gesehen.

Nur die Syntax ist mir unklar. Wenn ich mir im Wiki die if-condition anschaue, steht die Fhem-Anweisung in runden Klammer (fhem()), diese wiederum in geschweiften .

Damians Doif-Perl-Beispiel kommt wiederum ohne Angabe von fhem() bei den setreadings aus.

So in der Art stell ich mir das vor:


{if ([17:46]) {
if (int((time_str2num("$year-03-16 00:00:00")-time())/86400) =< 0) {set_Reading("Mama",int((time_str2num("$year-03-16 00:00:00")-time())/86400) + 365 ,1)} else {set_Reading("Mama",int((time_str2num("$year-01-18 00:00:00")-time())/86400),1)};
}


Das einzige was hier allerdings funktioniert ist das Addieren der 365 Tage.

int((time_str2num("$year-03-16 00:00:00")-time())/86400) + 365

Beim Vergleich ob der Wert gleich kleiner 0 ist gibts egal in welcher Variante immer Operatorfehler.


Kann mir wer was zur richtigen Syntax sagen ?

Gruß

Thomas

Ohje, ich dachte Damians Beispiel war für Dich okay. Sorry. Ich schaue heute Abend Mal wegen der Erweiterung. Kann ja nur was kleines sein.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Zitat von: TomLee am 04 April 2018, 18:54:02
Hallo,

Leon sagte zwar er schaut nochmal, kanns aber auch net lassen selbst Hand anzulegen und es mindestens zu versuchen.

Den vergangenen Terminen würd ich jetzt gerne noch ein Jahr hinzu addieren.

Das es möglich ist in der Anweisung des if nochmals ein if-else auszuführen hab ich gesehen.

Nur die Syntax ist mir unklar. Wenn ich mir im Wiki die if-condition anschaue, steht die Fhem-Anweisung in runden Klammer (fhem()), diese wiederum in geschweiften .

Damians Doif-Perl-Beispiel kommt wiederum ohne Angabe von fhem() bei den setreadings aus.

So in der Art stell ich mir das vor:


{if ([17:46]) {
if (int((time_str2num("$year-03-16 00:00:00")-time())/86400) =< 0) {set_Reading("Mama",int((time_str2num("$year-03-16 00:00:00")-time())/86400) + 365 ,1)} else {set_Reading("Mama",int((time_str2num("$year-01-18 00:00:00")-time())/86400),1)};
}


Das einzige was hier allerdings funktioniert ist das Addieren der 365 Tage.

int((time_str2num("$year-03-16 00:00:00")-time())/86400) + 365

Beim Vergleich ob der Wert gleich kleiner 0 ist gibts egal in welcher Variante immer Operatorfehler.


Kann mir wer was zur richtigen Syntax sagen ?

Gruß

Thomas

Alles außerhalb der DOIF-Syntax in eckigen Klammern ist reines Perl.

kleiner gleich ist <= und nicht =<  , das ist halt Perl.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

Ich glaubs net, =< in <= geändert und es geht.

Das hatte ich auch schon probiert, allerdings waren die Anweisungen da nicht in geschweiften Klammern.

Hat jetzt jemand noch ne Lösungsvorschlag für das Schaltjahr ?


CoolTux

muss ich also erstmal nichts weiter machen sagst  ;D
Schaltjahr habe ich leider noch keine Lösung
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

TomLee

Aktualisiertes funtionierendes DOIF:

Geht aber noch weiter ;D

Internals:
   CFGFN     
   DEF        {if ([21:07]) {
if (int((time_str2num("$year-03-16 00:00:00")-time())/86400) <= 0) {set_Reading("Mama",int((time_str2num("$year-03-16 00:00:00")-time())/86400) + 365 ,1)} else {set_Reading("Mama",int((time_str2num("$year-01-18 00:00:00")-time())/86400),1)};
if (int((time_str2num("$year-01-18 00:00:00")-time())/86400) <= 0) {set_Reading("Papa",int((time_str2num("$year-01-18 00:00:00")-time())/86400) + 365 ,1)} else {set_Reading("Papa",int((time_str2num("$year-01-18 00:00:00")-time())/86400),1)};
if (int((time_str2num("$year-07-07 00:00:00")-time())/86400) <= 0) {set_Reading("Lilly",int((time_str2num("$year-07-07 00:00:00")-time())/86400) + 365 ,1)} else {set_Reading("Lilly",int((time_str2num("$year-07-07 00:00:00")-time())/86400),1)};
if (int((time_str2num("$year-11-09 00:00:00")-time())/86400) <= 0) {set_Reading("Mia",int((time_str2num("$year-11-09 00:00:00")-time())/86400) + 365 ,1)} else {set_Reading("Mia",int((time_str2num("$year-11-09 00:00:00")-time())/86400),1)};
set_Reading ("state",min([$SELF:Mama],[$SELF:Papa],[$SELF:Lilly],[$SELF:Mia]),1);}
}
   MODEL      Perl
   NAME       doif_Feierlichkeiten
   NR         669
   NTFY_ORDER 50-doif_Feierlichkeiten
   STATE      218
   TYPE       DOIF
   OLDREADINGS:
   READINGS:
     2018-04-04 21:07:00   Lilly           93
     2018-04-04 21:07:00   Mama            346
     2018-04-04 21:07:00   Mia             218
     2018-04-04 21:07:00   Papa            289
     2018-04-04 21:07:00   block_01        executed
     2018-04-04 21:06:32   mode            enabled
     2018-04-04 21:07:00   state           218
     2018-04-04 21:07:00   timer_01_c01    05.04.2018 21:07:00
   Regex:
   condition:
     0          if (DOIF_time_once($hash,0,$wday)) {
if (int((time_str2num("$year-03-16 00:00:00")-time())/86400) <= 0) {readingsSingleUpdate($hash,"Mama",int((time_str2num("$year-03-16 00:00:00")-time())/86400) + 365 ,1)} else {readingsSingleUpdate($hash,"Mama",int((time_str2num("$year-01-18 00:00:00")-time())/86400),1)};
if (int((time_str2num("$year-01-18 00:00:00")-time())/86400) <= 0) {readingsSingleUpdate($hash,"Papa",int((time_str2num("$year-01-18 00:00:00")-time())/86400) + 365 ,1)} else {readingsSingleUpdate($hash,"Papa",int((time_str2num("$year-01-18 00:00:00")-time())/86400),1)};
if (int((time_str2num("$year-07-07 00:00:00")-time())/86400) <= 0) {readingsSingleUpdate($hash,"Lilly",int((time_str2num("$year-07-07 00:00:00")-time())/86400) + 365 ,1)} else {readingsSingleUpdate($hash,"Lilly",int((time_str2num("$year-07-07 00:00:00")-time())/86400),1)};
if (int((time_str2num("$year-11-09 00:00:00")-time())/86400) <= 0) {readingsSingleUpdate($hash,"Mia",int((time_str2num("$year-11-09 00:00:00")-time())/86400) + 365 ,1)} else {readingsSingleUpdate($hash,"Mia",int((time_str2num("$year-11-09 00:00:00")-time())/86400),1)};
readingsSingleUpdate($hash,"state",min(ReadingValDoIf($hash,'doif_Feierlichkeiten','Mama'),ReadingValDoIf($hash,'doif_Feierlichkeiten','Papa'),ReadingValDoIf($hash,'doif_Feierlichkeiten','Lilly'),ReadingValDoIf($hash,'doif_Feierlichkeiten','Mia')),1);}

   days:
   devices:
     0           doif_Feierlichkeiten
     all         doif_Feierlichkeiten
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      timer_1
     globalinit 1
     last_timer 1
     sleeptimer -1
     triggerDev
     triggerEvents:
       timer_1
   internals:
   interval:
   itimer:
   localtime:
     0          1522955220
   perlblock:
     0         
   readings:
     0           doif_Feierlichkeiten:Mama doif_Feierlichkeiten:Papa doif_Feierlichkeiten:Lilly doif_Feierlichkeiten:Mia
     all         doif_Feierlichkeiten:Mama doif_Feierlichkeiten:Papa doif_Feierlichkeiten:Lilly doif_Feierlichkeiten:Mia
   realtime:
     0          21:07:00
   time:
     0          21:07:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1522955220:
       localtime  1522955220
       hash:
   uiState:
   uiTable:
Attributes:
   comment    if(int((time_str2num("$year-03-16 00:00:00")-time())/86400) < 0) { fhem("set_Reading("Mama",int((time_str2num("$year-03-16 00:00:00")-time())/86400),1)")+ 5 } else { fhem("set_Reading("Mama",int((time_str2num("$year-03-16 00:00:00")-time())/86400),1)")};


Damian

ohne den Quellcode auf Korrektheit geprüft zu haben, kannst du zumindest durch Nutzung von Variablen, die Programmierung effizienter gestalten:

z. B.
my $mama=int((time_str2num("$year-03-16 00:00:00")-time())/86400;
$mama+=365 if ($mama<=0);
set_Reading("Mama",$mama,1);
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

Zitatmy $mama=int((time_str2num("$year-03-16 00:00:00")-time())/86400;
$mama+=365 if ($mama<=0);
set_Reading("Mama",$mama,1);

Bin fasziniert.

Hab keine Ahnung von Perl, ist das erste mal das ich mich mit beschäftige, kann auch den effizienteren  Vorschlag, mein ich,  voll und ganz nachvollziehen.

Trotzdem gibt's bei der Umsetzung im DOIF, bei der ich der Meinung bin keinen Fehler zu machen, Probleme:
( die alten Readings hab ich jetzt nicht entfernt)

Internals:
   CFGFN     
   DEF        {if ([00:51]) {
my $mama=int((time_str2num("$year-03-16 00:00:00")-time())/86400;
$mama+=365 if ($mama<=0);
set_Reading("Mama",$mama,1);}}
   MODEL      Perl
   NAME       doif_Feierlichkeiten
   NR         669
   NTFY_ORDER 50-doif_Feierlichkeiten
   STATE      initialized
   TYPE       DOIF
   OLDREADINGS:
   READINGS:
     2018-04-04 21:07:00   Lilly           93
     2018-04-04 21:07:00   Mama            346
     2018-04-04 21:07:00   Mia             218
     2018-04-04 21:07:00   Papa            289
     2018-04-05 00:51:00   block_01        condition c01: syntax error at (eval 707139) line 2, at EOF
Global symbol "$mama" requires explicit package name at (eval 707139) line 3.
Global symbol "$mama" requires explicit package name at (eval 707139) line 3.

     2018-04-05 00:50:47   mode            enabled
     2018-04-05 00:50:47   state           initialized
     2018-04-05 00:51:00   timer_01_c01    06.04.2018 00:51:00
   Regex:
   condition:
     0          if (DOIF_time_once($hash,0,$wday)) {
my $mama=int((time_str2num("$year-03-16 00:00:00")-time())/86400;
$mama+=365 if ($mama<=0);
readingsSingleUpdate($hash,"Mama",$mama,1);}
   days:
   devices:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      timer_1
     globalinit 1
     last_timer 1
     sleeptimer -1
     triggerDev
     triggerEvents:
       timer_1
   internals:
   interval:
   itimer:
   localtime:
     0          1522968660
   perlblock:
     0         
   readings:
   realtime:
     0          00:51:00
   time:
     0          00:51:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1522968660:
       localtime  1522968660
       hash:
   uiState:
   uiTable:
Attributes:
   comment    {if ([21:07]) {
if (int((time_str2num("$year-03-16 00:00:00")-time())/86400) <= 0) {set_Reading("Mama",int((time_str2num("$year-03-16 00:00:00")-time())/86400) + 365 ,1)} else {set_Reading("Mama",int((time_str2num("$year-01-18 00:00:00")-time())/86400),1)};
if (int((time_str2num("$year-01-18 00:00:00")-time())/86400) <= 0) {set_Reading("Papa",int((time_str2num("$year-01-18 00:00:00")-time())/86400) + 365 ,1)} else {set_Reading("Papa",int((time_str2num("$year-01-18 00:00:00")-time())/86400),1)};
if (int((time_str2num("$year-07-07 00:00:00")-time())/86400) <= 0) {set_Reading("Lilly",int((time_str2num("$year-07-07 00:00:00")-time())/86400) + 365 ,1)} else {set_Reading("Lilly",int((time_str2num("$year-07-07 00:00:00")-time())/86400),1)};
if (int((time_str2num("$year-11-09 00:00:00")-time())/86400) <= 0) {set_Reading("Mia",int((time_str2num("$year-11-09 00:00:00")-time())/86400) + 365 ,1)} else {set_Reading("Mia",int((time_str2num("$year-11-09 00:00:00")-time())/86400),1)};
set_Reading ("state",min([$SELF:Mama],[$SELF:Papa],[$SELF:Lilly],[$SELF:Mia]),1);}
}


Damian

Da fehlt noch eine Klammer zu :

my $mama=int((time_str2num("$year-03-16 00:00:00")-time())/86400);
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

Danke.

Geht weiter ...

hier

set_Reading("Mama",$mama,1);

kann ich so

set_Reading("Mama"," Mama: $mama",1);

noch einen Text davor setzen.

Ist ja aber Quatsch das in jedem Reading zu haben, im state ist das ja völlig ausreichend.

Im state ist mir aber die Syntax wieder nicht klar, denke es geht in die Richtung:

set_Reading ("state","Mama min([$SELF:Mama],[$SELF:Papa],[$SELF:Lilly],[$SELF:Mia]",1);

aber egal ob in eckigen, runden und gar keinen Klammern oder auch mit Punkt (Mama . min([$SELF:Mama]) es kommt zum Fehler.




Damian

Die Syntax wäre

set_Reading ("state","Mama: ".min([$SELF:Mama],[$SELF:Papa],[$SELF:Lilly],[$SELF:Mia]),1);

ist aber nicht sinnvoll, denn es ist ja nicht immer Mama ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

Danke

Hab auch eher an sowas gedacht, sollte doch gehen.

set_Reading ("state","Mama: ".min([$SELF:Mama],"Papa: ".[$SELF:Papa],"Lilly: ".[$SELF:Lilly],"Mia: ".[$SELF:Mia]),1);

Damian

Zitat von: TomLee am 05 April 2018, 12:56:04
Hab auch eher an sowas gedacht, sollte doch gehen.

set_Reading ("state","Mama: ".min([$SELF:Mama],"Papa: ".[$SELF:Papa],"Lilly: ".[$SELF:Lilly],"Mia: ".[$SELF:Mia]),1);

eher nicht, was ist denn Minimum von "Papa...", "Mama...", usw.?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF