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

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

Vorheriges Thema - Nächstes Thema

TomLee

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

Otto123

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 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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

CoolTux

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.
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

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.

Otto123

Ich habe dich verstanden, aber Du mich nicht. Hast Du meinen Link gelesen?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

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 ?

Otto123

#6
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 ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

CoolTux


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
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

#8
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","")) }

CoolTux


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) }
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 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 ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

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

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.

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

Danke.

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

In dem Beispiel fehlt übrigens die letzte geschweifte Klammer.