FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: TomLee am 02 April 2018, 18:02:47

Titel: [gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 02 April 2018, 18:02:47
Hallo,

kann mir wer sagen wie ich den Jahreswert in time_str2num in das aktuelle Jahr ($year) ändere ?

Lilly {(int((time_str2num("2018-04-06")-time())/86400))}

so einfach

Lilly {(int((time_str2num("$year-04-06")-time())/86400))}

oder so gehts nämlich nicht

Lilly {(int((time_str2num("{$year}-04-06")-time())/86400))}


Gruß

Thomas
Titel: Antw:Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Otto123 am 02 April 2018, 18:28:22
Hi,

also beide Ausdrücke
{(int((time_str2num("2018-04-06")-time())/86400))}
{(int((time_str2num("$year-04-06")-time())/86400))}
liefern mir in der Kommandozeile 3 zurück.

Wie ich aber gestern gelernt habe (https://forum.fhem.de/index.php/topic,86493.msg789207.html#msg789207) sind die FHEM Variablen wie $year nicht überall verfügbar. Du musst sie selbst erzeugen.

Probier mal nur zum Test das prinzipiell die Schreibweise stimmt Lilly {my $year=2018 ;;(int((time_str2num("$year-04-06")-time())/86400))}

Gruß Otto
Titel: Antw:Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: CoolTux am 02 April 2018, 18:35:08
Zitat von: TomLee am 02 April 2018, 18:02:47
Hallo,

kann mir wer sagen wie ich den Jahreswert in time_str2num in das aktuelle Jahr ($year) ändere ?

Lilly {(int((time_str2num("2018-04-06")-time())/86400))}

so einfach

Lilly {(int((time_str2num("$year-04-06")-time())/86400))}

oder so gehts nämlich nicht

Lilly {(int((time_str2num("{$year}-04-06")-time())/86400))}


Gruß

Thomas

Wo brauchst Du das $year denn. Wie Otto schon sagt gibt es die globale Variable nicht überall. So zum Beispiel in myUtils Funktionen nicht.
Titel: Antw:Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 02 April 2018, 18:36:39
Lily {my $year=2018 ;;(int((time_str2num("$year-04-06")-time())/86400))}

Das klappt in einem userreading. So ist's aber ja nicht immer das aktuelle Jahr.

denke du hast mich schon verstanden das ich das so in der Art gemeint habe:

Mia {my @jahr = $year;(int((time_str2num("$jahr-11-09")-time())/86400))}

gehg aber auch nicht.
Titel: Antw:Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Otto123 am 02 April 2018, 18:42:36
Ich habe dich verstanden, aber Du mich nicht. Hast Du meinen Link gelesen?
Titel: Antw:Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 02 April 2018, 18:52:09
Jetzt schon und gestern abend auch schon  ; ;D. Aber nicht kombiniert (nachgedacht).
Unklar ist doch aber jetzt immer noch wie es in einem userreading geht, wenn's nur aus der Kommandozeile, at und notify funktioniert. Oder steh ich immer noch auf dem Schlauch ?
Titel: Antw:Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Otto123 am 02 April 2018, 19:09:00
Ebene Perl
- es gibt localtime aber kein $year
+Ebene FHEM
-- es gibt immer noch localtime aber kein $year
++Ebene userreadings
-- es gibt immer noch localtime aber kein $year
++Modul notify
---hier ist $year definiert und zwar in etwa so
---{my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;; $year=$year+1900}
++FHEMWEB
---hier ist $year definiert und zwar aus ....

Alles klar?  ;D

Ob es eleganter geht als es in jedes Userreadings zu schreiben muss Dir Cooltux sagen ;)
Titel: Antw:Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: CoolTux am 02 April 2018, 19:17:17

Lilly { my (undef,undef,undef,undef,undef,$year,undef,undef,undef) = localtime(gettimeofday()); $year+=1900; int((time_str2num("$year-04-06")-time())/86400) }


Schau mal bitte ob das so stimmen kann. Ist für ein userReadings gedacht.


Quelle:
http://perldoc.perl.org/functions/localtime.html
Titel: Antw:Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 02 April 2018, 19:29:17
Funktioniert. Danke Otto für die Hilfe/Infos und ein Danke an Leon mal wieder für die Lösung und Info.

So nutz ich das jetzt:

Internals:
   CFGFN     
   DEF        ([00:00])
   NAME       doif_Feierlichkeiten
   NR         5595
   NTFY_ORDER 50-doif_Geburtstag_Mia
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2018-04-02 22:40:23   Lilly           460
     2018-04-02 22:40:23   Mama            347
     2018-04-02 22:40:23   Mia             526
     2018-04-02 22:40:23   Papa            290
     2018-04-02 22:40:23   cmd             1
     2018-04-02 22:40:23   cmd_event       set_cmd_1
     2018-04-02 22:40:23   cmd_nr          1
     2018-04-01 13:50:05   mode            enabled
     2018-04-02 22:40:23   next_date       290
     2018-04-02 22:40:23   state           cmd_1
     2018-04-02 00:00:00   timer_01_c01    03.04.2018 00:00:00
   Regex:
   condition:
     0          DOIF_time_once($hash,0,$wday)
   days:
   devices:
   do:
     0:
       0         
     1:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      timer_1
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev   
     timerevent timer_1
     timereventsState
     triggerDev
     timerevents:
       timer_1
     triggerEvents:
       timer_1
   internals:
   interval:
   itimer:
   localtime:
     0          1522706400
   readings:
   realtime:
     0          00:00:00
   time:
     0          00:00:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1522706400:
       localtime  1522706400
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   userReadings Mama { my (undef,undef,undef,undef,undef,$year,undef,undef,undef) = localtime(gettimeofday()); (int((time_str2num("$year-03-16")-time())/86400) >= 0 ? $year+=1900 : $year+=1901); int((time_str2num("$year-03-16")-time())/86400) },
Papa { my (undef,undef,undef,undef,undef,$year,undef,undef,undef) = localtime(gettimeofday()); (int((time_str2num("$year-01-18")-time())/86400) >= 0 ? $year+=1900 : $year+=1901); int((time_str2num("$year-01-18")-time())/86400) },
Lilly { my (undef,undef,undef,undef,undef,$year,undef,undef,undef) = localtime(gettimeofday()); (int((time_str2num("$year-07-07")-time())/86400) >= 0 ? $year+=1900 : $year+=1901); int((time_str2num("$year-07-07")-time())/86400) },
Mia { my (undef,undef,undef,undef,undef,$year,undef,undef,undef) = localtime(gettimeofday()); (int((time_str2num("$year-11-09")-time())/86400) >= 0 ? $year+=1900 : $year+=1901); int((time_str2num("$year-09-11")-time())/86400) },
next_date {minNum( ReadingsNum("$name","Mia",""), ReadingsNum("$name","Lilly",""), ReadingsNum("$name","Mama",""), ReadingsNum("$name","Papa","")) }
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: CoolTux am 02 April 2018, 21:33:57

Mama { my (undef,undef,undef,undef,undef,$year,undef,undef,undef) = localtime(gettimeofday()); (int((time_str2num("$year-03-16")-time())/86400) >= 0 ? $year+=1900 : $year+=1901); int((time_str2num("$year-03-16")-time())/86400) }
Titel: Antw:Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Damian am 02 April 2018, 23:12:24
Zitat von: TomLee am 02 April 2018, 19:29:17
Funktioniert. Danke Otto für die Hilfe/Infos und ein Danke an Leon mal wieder für die Lösung und Info.

So nutz ich das jetzt:

Internals:
   CFGFN     
   DEF        ([00:00])
   NAME       doif_Feierlichkeiten
   NR         5595
   NTFY_ORDER 50-doif_Geburtstag_Mia
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2018-04-02 22:40:23   Lilly           460
     2018-04-02 22:40:23   Mama            347
     2018-04-02 22:40:23   Mia             526
     2018-04-02 22:40:23   Papa            290
     2018-04-02 22:40:23   cmd             1
     2018-04-02 22:40:23   cmd_event       set_cmd_1
     2018-04-02 22:40:23   cmd_nr          1
     2018-04-01 13:50:05   mode            enabled
     2018-04-02 22:40:23   next_date       290
     2018-04-02 22:40:23   state           cmd_1
     2018-04-02 00:00:00   timer_01_c01    03.04.2018 00:00:00
   Regex:
   condition:
     0          DOIF_time_once($hash,0,$wday)
   days:
   devices:
   do:
     0:
       0         
     1:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      timer_1
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev   
     timerevent timer_1
     timereventsState
     triggerDev
     timerevents:
       timer_1
     triggerEvents:
       timer_1
   internals:
   interval:
   itimer:
   localtime:
     0          1522706400
   readings:
   realtime:
     0          00:00:00
   time:
     0          00:00:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1522706400:
       localtime  1522706400
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   userReadings Mama { my (undef,undef,undef,undef,undef,$year,undef,undef,undef) = localtime(gettimeofday()); (int((time_str2num("$year-03-16")-time())/86400) >= 0 ? $year+=1900 : $year+=1901); int((time_str2num("$year-03-16")-time())/86400) },
Papa { my (undef,undef,undef,undef,undef,$year,undef,undef,undef) = localtime(gettimeofday()); (int((time_str2num("$year-01-18")-time())/86400) >= 0 ? $year+=1900 : $year+=1901); int((time_str2num("$year-01-18")-time())/86400) },
Lilly { my (undef,undef,undef,undef,undef,$year,undef,undef,undef) = localtime(gettimeofday()); (int((time_str2num("$year-07-07")-time())/86400) >= 0 ? $year+=1900 : $year+=1901); int((time_str2num("$year-07-07")-time())/86400) },
Mia { my (undef,undef,undef,undef,undef,$year,undef,undef,undef) = localtime(gettimeofday()); (int((time_str2num("$year-11-09")-time())/86400) >= 0 ? $year+=1900 : $year+=1901); int((time_str2num("$year-09-11")-time())/86400) },
next_date {minNum( ReadingsNum("$name","Mia",""), ReadingsNum("$name","Lilly",""), ReadingsNum("$name","Mama",""), ReadingsNum("$name","Papa","")) }


Wenn du schon ein DOIF nutzt, dann wäre diese Definition etwas kürzer:

DOIF {if ([00:00]) {
set_Reading("Mama",int((time_str2num("$year-03-16 00:00:00")-time())/86400),1);
set_Reading("Papa",int((time_str2num("$year-01-18 00:00:00")-time())/86400),1);
set_Reading("Lilly",int((time_str2num("$year-07-07 00:00:00")-time())/86400),1);
set_Reading("Mia",int((time_str2num("$year-11-09 00:00:00")-time())/86400),1);
set_Reading ("next_date",min([$SELF:Mama],[$SELF:Papa],[$SELF:Lilly],[$SELF:Mia]),1);
}


DOIF im Perlmodus ohne weitere Attribute ;)
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: CoolTux am 02 April 2018, 23:14:42
Sieht doch gut aus  :D
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 03 April 2018, 00:20:23
Danke.

Jetzt komm ich ja um ein update nicht mehr rum. DOIF-PERL und die Angst davor das eines meiner bestehenden DOIF'S nicht mehr danach geht, ist eigentlich der Grund weshalb ich die Tage keines gemacht habe.
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Damian am 03 April 2018, 08:20:10
Zitat von: TomLee am 03 April 2018, 00:20:23
Danke.

Jetzt komm ich ja um ein update nicht mehr rum. DOIF-PERL und die Angst davor das eines meiner bestehenden DOIF'S nicht mehr danach geht, ist eigentlich der Grund weshalb ich die Tage keines gemacht habe.

Die Angst ist unbegründet, die anfänglichen Erkennungsprobleme wurden behoben, es ist jetzt unerheblich, ob Kommentare, Zeilenumbrüche oder Sonstiges sich in der Definition befindet.

Nach dem Update kannst du mit list MODEL=Perl nachschauen, ob alles gut gegangen ist - es sollte keine Einträge geben.
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 03 April 2018, 09:59:29
Danke.

Es gibt jetzt genau ein Ergebnis mit MODEL=Perl. Nämlich das hier (https://forum.fhem.de/index.php/topic,86533.msg789745.html#msg789745).  ;D

In dem Beispiel fehlt übrigens die letzte geschweifte Klammer.
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Damian am 03 April 2018, 11:03:12
Zitat von: TomLee am 03 April 2018, 09:59:29
Danke.

Es gibt jetzt genau ein Ergebnis mit MODEL=Perl. Nämlich das hier (https://forum.fhem.de/index.php/topic,86533.msg789745.html#msg789745).  ;D

In dem Beispiel fehlt übrigens die letzte geschweifte Klammer.

na, dann :)
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Damian am 03 April 2018, 11:07:54
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 ;)
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag 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


Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: CoolTux am 04 April 2018, 18:56:42
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.
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Damian am 04 April 2018, 19:00:02
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.
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 04 April 2018, 19:31:27
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 ?

Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: CoolTux am 04 April 2018, 19:34:49
muss ich also erstmal nichts weiter machen sagst  ;D
Schaltjahr habe ich leider noch keine Lösung
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 04 April 2018, 21:16:47
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)")};

Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Damian am 04 April 2018, 22:40:08
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);
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 05 April 2018, 01:32:14
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);}
}

Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Damian am 05 April 2018, 08:45:44
Da fehlt noch eine Klammer zu :

my $mama=int((time_str2num("$year-03-16 00:00:00")-time())/86400);
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 05 April 2018, 12:26:19
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.



Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Damian am 05 April 2018, 12:39:08
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 ;)
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 05 April 2018, 12:56:04
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);
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: Damian am 05 April 2018, 12:57:30
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.?
Titel: Antw:[gelöst] Wie Jahreswert in time_str2num als Variable $year?
Beitrag von: TomLee am 05 April 2018, 13:21:49
Upps Kopierfehler

So meinte ich das

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

geht ja aber wie du erwähnt (und ich gerade festgestellt habe) hast nicht.