FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: TomLee am 24 August 2019, 15:31:52

Titel: [gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 24 August 2019, 15:31:52
nextWastedays {
my $var =fhem('get Kalender events timeFormat:"%Y-%m-%d %H:%M:%S" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - time();
$substr/86400}


Hallo,

an dem Punkt weiß ich jetzt nicht wie ich es weiter angehen soll das ich eine Ganzzahl erhalte. Mir als Laien fallen nur 2 Möglichkeiten ein:
Runden ginge, mag ich aber nicht.
Bei $var die Zeit durch Nullen ersetzen und schauen wie ich aus time() oder sonstwie Heute 00:00 Uhr bekomme.
Kann man das so machen ?
Kann jemand einen kleinen Tipp geben in welche Richtung es jetzt geht ?

Gruß

Thomas

Thomas
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 24 August 2019, 17:30:00
Hallo Thomas,

du meinst sowas? Also einfach den ganzzahligen Anteil? Die Tage der Vorfreude ohne Bruchteile?  ;D
{int((time_str2num("2019-09-04 00:00:00")-time())/86400)}
also
{
my $var =fhem('get Kalender events timeFormat:"%Y-%m-%d %H:%M:%S" format:custom="$T1" limit:count=1');
int((time_str2num($var)-time())/86400)
}


Gruß Otto
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 24 August 2019, 17:43:12
Glaub nicht, jetzt aber keine Zeit mehr.

In time_str2num($var) steht doch dann nicht 2019-09-04 00:00:00 sondern bspw. bei Startzeitpunkt 06:00 Uhr 2019-09-04 06:00:00

int() mein ich so verstanden zu haben das dann ohne die Komma (Hundertstel oder was das sind) beim UNIX-Timestamp gerechnet wird.
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 24 August 2019, 17:59:49
Naja deine Formel liefert die Zeit in Tagen bis zum Event den Du ausliest (ob da jetzt 6:00 oder 00:00 drin steht hängt ja vom Event ab)
Du bekommst also als Ergebnis 10,2 Tage willst aber nur 10 Tage wissen. So wie man das auch sagen würde: es sind noch 10 Tage bis zum Geburtstag.
int() ermittelt einfach den Ganzzahl Anteil von 10,2 ob das jetzt Tage sekunden oder Euro sind ist int() völlig egal.

Ansonsten musst Du Deine Frage nochmal formulieren in dem Du neben Dich trittst :) ich habe es mehrfach lesen müssen um halbwegs eine Idee zu bekommen.

Gruß Otto
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 24 August 2019, 20:08:21
Zitat von: Otto123 am 24 August 2019, 17:59:49
Du bekommst also als Ergebnis 10,2 Tage willst aber nur 10 Tage wissen. So wie man das auch sagen würde: es sind noch 10 Tage bis zum Geburtstag.
int() ermittelt einfach den Ganzzahl Anteil von 10,2 ob das jetzt Tage sekunden oder Euro sind ist int() völlig egal.

Das hat mich jetzt schonmal weiter gebracht.

int((time_str2num($var)-time())/86400)

Ist nix anderes (denk ich, bringt nämlich einen HASH... Fehler) wie

my $substr = time_str2num($var) - time();
return int($substr/86400);


Mein Fehler war bloß das ich es so versucht hatte.

return int($substr)/86400;


Die Lösung kommt aber dem Runden gleich, nachdem ich versucht habe neben mich zu treten.

An deinem Beispiel mit 2019-09-04 sind es für mich Heute bis 24 Uhr 11 Tage und keine 10 Tage.

Daher mein Gedanke nicht mit Jetzt also time() sondern (glaube jetzt gelesen zu haben man macht es mit localtimetimelocal()) mit -noch keine Ahnung wie- 2019-08-24 00:00:00 und nicht mit der vorgegeben Startzeit von  $T1 2019-09-04 00:06:00 aus dem Kalender sondern ersetzt diese vor dem rechnen mit 2019-09-04 00:00:00.

Damit wäre immer mit vollen 24 Stunden gerechnet und ich erhoffe mir bis 24 Uhr eine 11.







Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 24 August 2019, 22:23:38
Ups, Denkfehler.

{(timelocal(0, 0, 0, 4, 9, 2019) - timelocal(0, 0, 0, 24, 8, 2019))/86400}
10


und eine Angabe von 24 bei Stunden out of range 0...23
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 25 August 2019, 11:14:36
Moin,

int() hat mit runden nichts zu tun. Wenn Bei Dir 11 und bei mir 10 rauskommt kann es nur daran liegen, dass Du in einer anderen Zeitzone wohnst :)

Versuch ein paar low Level Beispiele:
{int(10.8)}
{int(10.2)}


Jetzt liefert mir mein fixes Beispiel
{int((time_str2num("2019-09-04 00:00:00")-time())/86400)}übrigens 9 :)
und (es ist 11:14:00)
{int((time_str2num("2019-09-04 11:16:00")-time())/86400)}
wieder 10 :)
Gruß Otto
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 25 August 2019, 12:22:39
ZitatMoin,

int() hat mit runden nichts zu tun. Wenn Bei Dir 11 und bei mir 10 rauskommt kann es nur daran liegen, dass Du in einer anderen Zeitzone wohnst 

Ich sagte ich erwarte eine 11 und hatte aber nachdem ich die Syntax von timelocal verstanden hatte mit

{(timelocal(0, 0, 0, 4, 9, 2019) - timelocal(0, 0, 0, 24, 8, 2019))/86400}

erfahren dürfen das ich einen Denkfehler hatte.

ZitatJetzt liefert mir mein fixes Beispiel

Code: [Auswählen]

{int((time_str2num("2019-09-04 00:00:00")-time())/86400)}übrigens 9 
und (es ist 11:14:00) 

Code: [Auswählen]

{int((time_str2num("2019-09-04 11:16:00")-time())/86400)}wieder 10 
Gruß Otto

Das ist auch klar die 10 hast du aber nur noch zwei Minuten bis 11:16 dann wirds wieder eine 9 und ich will bis 24 Uhr eine 10.

Das ist das was ich meinte mit

ZitatDamit wäre immer mit vollen 24 Stunden gerechnet und ich erhoffe mir bis 24 Uhr eine 11.

Nach einer Nacht drüber schlafen wäre das auch umsetzbar in dem man den Startzeitpunkt (nur zum rechnen) auf 24 Uhr stellt/ersetzt:

{((time_str2num("2019-09-04 24:00:00") - timelocal(0, 0, 0, 24, 8, 2019))/86400}




Mag sein das ich hier mit 10 oder 11 einfach auch auf dem Holzweg bin.
Mein Gedanke war, miete ich bspw. einen Raum oder ein Hotelzimmer von 24.08.2019 bis 04.09.2019, dann zahle ich 11 Tagesmieten und nicht 10.




Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 25 August 2019, 13:19:47
ZitatMein Gedanke war, miete ich bspw. einen Raum oder ein Hotelzimmer von 24.08.2019 bis 04.09.2019, dann zahle ich 11 Tagesmieten und nicht 10.

Der Satz trägt jetzt mal bei mir dazu bei, zu verstehen was Du willst  :D
Ich hatte alle Deine Einwände quasi anders herum verstanden :)

Du willst quasi ungeachtet der wirklich Event "Tageszeit" einfach Tage betrachten? Dann lies doch einfach auch nur den Tag aus dem Event und den Tag von heute und setze die Zeit auf 00:00:00 oder irgendwas anderes (Zimmer im Hotel gelten ja meist von 14:00 bis 11:00)
Heutiger Tag:
{strftime('%F',localtime(time))}
Beim Kalender analog:
get Kalender events timeFormat:"%F" format:custom="$T1" limit:count=1

Denn dies hier sind doch wieder zwei unterschiedliche Dinge!  :o
Dein letztes Beispiel im direkten Vergleich:
{(time_str2num("2019-09-04 00:00:00")-time_str2num("2019-08-24 00:00:00"))/86400}
{(time_str2num("2019-09-04 24:00:00")-timelocal(0, 0, 0, 24, 8, 2019))/86400}

Man muss dabei beachten:
Die von timelocal zurückgegebene Monatsangabe hat die Ganzzahlwerte 0 bis 11 für Januar bis Dezember.
timelocal für gestern ist also timelocal(0, 0, 0, 24, 7, 2019) und nicht timelocal(0, 0, 0, 24, 8, 2019) !!!

Gruß Otto
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 25 August 2019, 13:38:40
HaHa,

bald hab ichs:

ZitatnextWastedays {
my $var =fhem('get Google_Abfallkalender events timeFormat:"%Y-%m-%d 24:00:00" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - time();
return int($substr/86400)
}

ergibt 3.


ZitatnextWastedays {
my $var =fhem('get Google_Abfallkalender events timeFormat:"%Y-%m-%d 00:00:00" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - time();
return int($substr/86400)
}

ergibt 2.


eigentlich und das verstehe ich noch nicht und muss das int mal rausnehmen um genau zu verstehen was gerechnet wird, möchte/muß ich doch (auch wenns noch klappt) aber nicht time() also Jetzt verwenden sondern timelocal(0, 0, 0, 25, 8, 2019)

nextWastedays {
my $var =fhem('get Google_Abfallkalender events timeFormat:"%Y-%m-%d 24:00:00" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - timelocal(0, 0, 0, 25, 8, 2019);
return int($substr/86400);

}



ergibt plötzlich aber -27.
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 25 August 2019, 13:41:10
Zitat von: TomLee am 25 August 2019, 13:38:40
ergibt plötzlich aber -27.
Du hast meinen Post in der aktuelle Version noch nicht gelesen!
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 25 August 2019, 13:46:13
JaJaJa,

sry hatte den letzten Beitrag nicht gelesen, so langsam versteh ich auch und muss es jetzt erstmal verarbeiten. :)


ZitatDie von timelocal zurückgegebene Monatsangabe hat die Ganzzahlwerte 0 bis 11 für Januar bis Dezember.
timelocal für gestern ist also timelocal(0, 0, 0, 24, 7, 2019) und nicht timelocal(0, 0, 0, 24, 8, 2019) !!!

Und da ist ja auch die Antwort auf die letzte Frage, irgendwann wär ich auch selbst drauf gekommen  ;D
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 25 August 2019, 13:57:16
Der hier ist übrigens gut: timeFormat:'%F 08:00:00'
Nach sowas einfachen hatte ich gesucht, danke dafür!

Der geht dann auch hier:{strftime('%F 11:00:00',localtime(time))}

%F ist die Kurzform für %Y-%m-%d  8)

Gruß Otto
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 25 August 2019, 14:03:16
Bin noch am verarbeiten ;), aber Danke schon mal für die Unterstützung, sehe schon das das jetzt was wird.

ZitatDann lies doch einfach auch nur den Tag aus dem Event und den Tag von heute und setze die Zeit auf 00:00:00 oder irgendwas anderes

Hatte ich doch gleich im ersten Post gefragt ob man das so macht/machen kann. ;D

Zitat von: TomLee am 24 August 2019, 15:31:52
nextWastedays {
my $var =fhem('get Kalender events timeFormat:"%Y-%m-%d %H:%M:%S" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - time();
$substr/86400}


Mir als Laien fallen nur 2 Möglichkeiten ein:

Bei $var die Zeit durch Nullen ersetzen und schauen wie ich aus time() oder sonstwie Heute 00:00 Uhr bekomme.
Kann man das so machen ?
Titel: Antw:Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 25 August 2019, 14:21:27
nextWastedays {
my $var =fhem('get Kalender events timeFormat:"%F 24:00:00" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - time_str2num(strftime('%F 00:00:00',localtime(time)));
return int($substr/86400);
}


Sieht so bis jetzt gut aus.  :P



ZitatBei $var die Zeit durch Nullen ersetzen und schauen wie ich aus time() oder sonstwie Heute 00:00 Uhr bekomme.
Kann man das so machen ?


Damit war genau das gemeint :

Zitat{strftime('%F 11:00:00',localtime(time))}


DANKE
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 25 August 2019, 15:37:32
Ich dachte auch es geht um was anderes als die geliebte Tonne :)
BTW:
Ich frage einfach jeden Tag einmal den Kalender auf morgen ab:
get Kalender events limit:from=0,to=1d
Dann weiß ich ob Morgen eine Tonne raus muss. Das reicht mir.
Der Mülltermin steht als Tages Termin drin, ab 00:00:00 damit funktioniert diese Abfrage bis 23:59:59

Alternative zu deiner Lösung
Edit: Achtung, diese Formel ist falsch, siehe diesen Beitrag (https://forum.fhem.de/index.php/topic,103238.msg973665.html#msg973665).
Man könnte den Zeitraum bis zum nächsten (Tages)Termin in Tagen auch so abfragen:
{(int((fhem('get AbfallKalender events format:custom="$t1" limit:from=0,count=1')-time())/86400)+1)}

'get AbfallKalender events format:custom="$t1" limit:from=0,count=1' liefert die Zeit des nächsten Termins in sec (epoch)
time() die aktuelle Zeit in sec (epoch)
Der int Wert der Tage ist dann immer um 1 zu klein und wird entsprechend korrigiert.

Da hab ich jetzt ne Menge gelernt ;)

Schönen Sonntag noch
Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 25 August 2019, 16:01:21
Einfach 1 dazuzählen weil man weiß das das Ergebnis zu klein ist auch ne Lösung und sogar viel kürzer. ;D

Zitat{(int((fhem('get AbfallKalender events format:custom="$t1" limit:from=0,count=1')-time())/86400)+1)}

liefert aber 3, meine Lösung 4 für Abholungstag Mittwoch.

Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 25 August 2019, 16:24:53
naja ich würde aber so zählen:  ::)
Mittwoch Termin
Mittwoch noch 0 Tage
Dienstag noch 1 Tag
Montag noch 2 Tage
Sonntag (heute) 3 Tage

Du zählst ja quasi durch die Angabe 24:00:00 bei der Abfrage noch einen Tag auf den Termin drauf. Du kannst natürlich auch +2 machen
Edit: Achtung, diese Formel ist falsch, siehe diesen Beitrag (https://forum.fhem.de/index.php/topic,103238.msg973665.html#msg973665).
{(int((fhem('get AbfallKalender events format:custom="$t1" limit:from=0,count=1')-time())/86400)+2)}

Würde ich fürs Hotel gelten lassen, weil da habe ich das Zimmer ja bis zum nächsten Morgen und wenn ich jetzt ein Zimmer buche zahle ich 4 Nächte. Beim Müll sehe ich das anders wenn der bis 24 Uhr nicht weg ist hat was nicht gestimmt. Aber das kann man sicher auch sehen wie mal will ;)
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 25 August 2019, 17:05:07
Um ehrlich zu sein, ist es mir persönlich völlig Wurscht ob nun +1 oder 2, Hauptsache ich weiß was gemeint ist.

Die Entscheidung das es die +1 Variante werden sollte hat mir in der letzten halbe Stunde -Gott sei Dank (hätte mich nicht entscheiden können  ;D)- der Blick in meinen  FTUI-Code verraten. Der war angepasst auf das Abfallmodul das ich auf meiner neuen Installation aber nicht mehr installiert hab und jetzt halt selbst die entsprechenden Readings selbst bereitstellen möchte.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 26 August 2019, 12:16:17
Hallo nochmal,

weiß noch nicht wo mich der Weg hinführt, bin einfach nur am testen.

Der Code ist jetzt irrelevant es geht mir nur um den setreading Befehl, es ist ein userReading in dem Device Kalender:

nextWastedays {
my $var1 =fhem('get Kalender events limit:count=1 timeFormat:"%d.%m.%Y" format:custom="$S" ');
my $var2 =(int((fhem('get Google_Abfallkalender events format:custom="$t1" limit:from=0,count=1')-time())/86400)+1);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
#return $nwd;
fhem("setreading du_Abfall wwstt $nwd");
}


Nach update des Kalenders wird problemlos das Reading im Dummy du_Abfall erstellt.

sub test {
my $var1 =fhem('get Kalender events limit:count=1 timeFormat:"%d.%m.%Y" format:custom="$S" ');
my $var2 =(int((fhem('get Google_Abfallkalender events format:custom="$t1" limit:from=0,count=1')-time())/86400)+1);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
#return $nwd;
fhem("setreading du_Abfall wwstt $nwd");
oder
fhem("setreading Kalender wwstt $nwd");
}


Auch kein Problem, nach Aufruf der Funktion aus einer myUtils.pm werden die Readings erstellt.

nextWastedays {
my $var1 =fhem('get Kalender events limit:count=1 timeFormat:"%d.%m.%Y" format:custom="$S" ');
my $var2 =(int((fhem('get Google_Abfallkalender events format:custom="$t1" limit:from=0,count=1')-time())/86400)+1);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
#return $nwd;
fhem("setreading Kalender wwstt $nwd");
}



Wieder das userReading im Device Kalender. Also aus dem userReading soll ein setreading in das gleiche Device erfolgen.
Nach update des Kalenderdevice hab ich 100 % CPU Auslastung, nur ein stoppen und neustart bringt Abhilfe.

Normal ? Weil kein Mensch versucht aus einem userReadings ein neues Reading zu erstellen ?

Gruß

Thomas
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 26 August 2019, 16:13:29
ZitatAlso aus dem userReading soll ein setreading in das gleiche Device erfolgen.
Nach update des Kalenderdevice hab ich 100 % CPU Auslastung, nur ein stoppen und neustart bringt Abhilfe.

Normal ? Weil kein Mensch versucht aus einem userReadings ein neues Reading zu erstellen ?
Ohne den Code anzuschauen oder versuchen zu verstehen will ich auf deine Idee im letzten Satz antworten:
Das was ich sage muss nicht stimmen, aber es ist meine Vorstellung!
1. Das Setzen eines Readings triggert das Device.
2. userreadings werden beim Triggern des Device neu erstellt.
3. Setzt ein userreading ein Reading im gleichen Device -> gehe wieder zu 1.

Klassisches Hazard / Wettlauf / Schleifen Konstrukt -> Das System geht auf Vollast, die CPU wird heiß.

Ich würde diesen Ansatz verwerfen!

Eventuell kann man das mit dem trigger beim userreadings verhindern.
ZitatuserReadings
A comma-separated list of definitions of user-defined readings. Each definition has the form:
<reading>[:<trigger>] [<modifier>] { <perl code> }
After a single or bulk readings update, the user-defined readings are set by evaluating the perl code { <perl code> } for all definitions and setting the value of the respective user-defined reading <reading> to the result. If <trigger> is given, then all processing for this specific user reading is only done if one of the just updated "reading: value" combinations matches <trigger>, which is treated as a regexp.

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 27 August 2019, 11:04:58
ZitatIch würde diesen Ansatz verwerfen!

Es sind ja auch einfach nur Spielereien gewesen. Deine Erklärung hört sich für mich logisch an.




Für das geliebte Thema Tonne habe ich jetzt sehr lange gebraucht es ohne Zusatzmodul über eine eigene Funktion incl. FTUI (darum gings ja letztendlich) umzusetzen.
Was mir einfach noch nicht in den Kopf will: Um die Funktion bspw. täglich 00:01 h aufzurufen muss ich wieder ein AT anlegen.
Ich spare mir auf der einen Seite eine Definition (das Zusatzmodul) und brauch dann doch wieder eine um meine Funktion aufzurufen. Gibts noch andere Wege ?

Oder sollte ich die Denkweise ändern, das das AT auch künftige ähnlich gelagerte Anwendungsvorfälle (dann zeitversetzt) für  andere Funktionsaufrufe oder andere Aufgaben übernehmen kann ?

Oder macht man sich wirklich für jeden Funktionsaufruf ein AT der Übersicht wegen ?

Gruß

Thomas


Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 27 August 2019, 11:22:48
Hallo Thomas,

das mit dem at würde eher Zeit bezogen gruppieren. Klar kann man dann in einem at mehrere Funktionsaufrufe abhandeln.

Hab ich auch so. Nachmitttag 17:00 Uhr ob morgen Tonne abfragen, früh um 5 Uhr Sonos auf Guten Morgen Radio vorbereiten usw...

Aber es gibt viele Wege :)

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 27 August 2019, 12:23:55
das mit dem at würde eher Zeit bezogen gruppieren

Da hast mich wieder nicht verstanden :P

Sowas meinte ich, mag mir bloss gerade nicht gelingen, der 2. und 3. Befehl werden nicht ausgeführt und steht auch nix im Log, komm ich aber noch drauf:

defmod at_Test at *12:13:00 backup ;;;;\
defmod b2 at +12:14:00 set MQTT2_Mi_Wecklicht on ;;;;\
defmod b3 at +12:15:00 set MQTT2_Mi_Wecklicht off


ZitatAber es gibt viele Wege :)

scheinbar
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 27 August 2019, 12:47:09
Naja at im at, da muss man mitdenken, ich mach es mal für die FHEM Kommandozeile:
define at_Test at *12:13:00 backup ;;define b2 at +12:14:00 set MQTT2_Mi_Wecklicht on ;;;; define b3 at +12:15:00 set MQTT2_Mi_Wecklicht off

Siehe auch das Beispiel hier:https://commandref.fhem.de/#command
ZitatFor every further indirection you need to double the semicolons:, e.g. to switch on every day 2 devices at 7:00 for 10 minutes you have to write:
define onAt at 07:00 set Lamp1 on;;set Lamp2 on;; define offAt at +00:10 set Lamp1 off;;;;set Lamp2 off

Wobei ich nicht denke dass Du die Zeit in deinem Beispiel ernst meinst,, ich denke Du willst die Folgebefehle eher nach 1 oder 2 min als nach über 12 Stunden?
define at_Test at *12:13:00 backup ;;define b2 at +00:01 set MQTT2_Mi_Wecklicht on ;;;; define b3 at +00:01 set MQTT2_Mi_Wecklicht off

Einfacher geschrieben wäre das so, das Ergebnis ist das Gleiche:
define at_Test at *12:13:00 backup;;sleep 60;;set MQTT2_Mi_Wecklicht on;;sleep 60;;set MQTT2_Mi_Wecklicht off

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 28 August 2019, 19:23:11
ZitatNaja at im at, da muss man mitdenken,
Wahre Worte  ;D

Zitat von: Otto123 am 27 August 2019, 12:47:09

Wobei ich nicht denke dass Du die Zeit in deinem Beispiel ernst meinst

Doch, war aber -gestern-  wie du erkannt hast ein Denkfehler von mir. 1. das +, 2. die Semikolon.
Heute nicht mehr  :P

*23:45:00 update ;
define a1 at {my $var=ReadingsVal('Google_Abfallkalender','nextUpdate',0);
$var =~ s/.* /*/;return $var} sleep 60;; {waste()}


Mein update AT gibts schon "immer", und den Funktionsaufruf braucht man ja kurz nach dem Endzeitpunkt  (nextUpdate) des Termins.
Ich weiß nicht obs schon klappt (getestet hab ich genug) aber ich gehe davon aus. :P


Gruß

Thomas
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 29 August 2019, 05:18:40
Oh Mann gar nicht so einfach.

So könnte es klappen.
Der Code ist aus der DEF.
*04:57:45 set Decke on ;{my $var=ReadingsVal('Google_Abfallkalender','nextUpdate',0);; $var =~ s/.* /*/;; fhem("define b2 at $var sleep 60;;;;{waste()}")}

Doch wie bekomme ich jetzt die Semikolon zwischen sleep 60 und {waste} verdoppelt, denn  füge ich jetzt noch zwei hinzu wird {waste ()} im angelegten AT abgeschnitten.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 29 August 2019, 14:48:21
Hab eine Lösung gefunden, keine zwei zusätzliche zwei Semikolon in der DEF waren nötig sondern 4 also insgesamt 8 :o

Das sind jetzt Raw Definitionen.

Dieses AT

defmod at_Test at *14:40:00 set Decke on ;;{my $var=ReadingsVal('Google_Abfallkalender','nextUpdate',0);;;; $var =~ s/.* /*/;;;;fhem("define b2 at $var sleep 60;;;;;;;;;;;;;;;;{waste()}")}
attr at_Test room Test

setstate at_Test Next: 14:40:00
setstate at_Test 2019-08-29 14:40:00 state Next: 14:40:00


hat nun dieses AT erstellt:

defmod b2 at *17:01:44 sleep 60;;;;{waste()}

setstate b2 Next: 17:01:44
setstate b2 2019-08-29 14:40:00 state Next: 17:01:44
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 29 August 2019, 20:02:17
Also schön das Du eine Lösung hast, den Sinn verstehe ich nicht  :o

Irgendwas versucht Du aus dem nextUpdate Reading zu zaubern  :-\

Mal ganz nebenbei: Der Calendar erzeugt selbst Events, also Du kannst einen Termin eintragen und mit dem entsprechenden notify wird exakt zu diesem Termin (oder einen daraus erzeugten Alarm) getriggert.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 29 August 2019, 21:58:27
Zitat von: Otto123 am 29 August 2019, 20:02:17
Also schön das Du eine Lösung hast, den Sinn verstehe ich nicht  :o

Irgendwas versucht Du aus dem nextUpdate Reading zu zaubern  :-\

Mal ganz nebenbei: Der Calendar erzeugt selbst Events, also Du kannst einen Termin eintragen und mit dem entsprechenden notify wird exakt zu diesem Termin (oder einen daraus erzeugten Alarm) getriggert.

Na du sagst es ja selbst, also wieder ein zusätzliches Device (notify) um die Funktion aufzurufen, das meine Readings nextWasteday und nextWastedays im Kalender erstellt/aktualisiert.

Wie war das: "es gibt viele Wege". Die Frage die ich mir stellte war, wie ohne zusätzliche Definition die Readings nextWaste und nextWastedays in das Kalendermodul kommen.
Angeboten hat sich dann meine bereits bestehende  AT-Definition (backup), diese hab nun einfach erweitert und brauch kein notify mehr.

*23:45:00 update;{my $var=ReadingsVal('Google_Abfallkalender','nextUpdate',0);; $var =~ s/.* /*/;; (fhem("define b2 at $var sleep 60;;;;;;;;{waste()}"))}

Das AT macht ein update um 23:45 h und erstellt ein weiteres AT das sich den Zeitpunkt aus nextUpdate holt. Das AT erwartet aber ein HH:MM:SS Format in nextUpdate stehts aber als  YYYY-MM-DD HH:MM:SS, also ersetze ich alles vorm Leerzeichen durch einen Stern (stelle gerade fest wieder Denkfehler nicht jeden Tag sondern nur einmal also s/.* //).
Weil das update ein paar Sekunden dauert warte ich einfach eine Zeit (hier bspw. 60 Sekunden) und rufe dann erst die Funktion auf.
Somit hab ich immer direkt nachdem sich der Kalender "aktualisiert" die Readings fürs FTUI, so meine Theorie.


Die Möglichkeit das AT zu einem absolutem Datum auszuführen, hab ich jetzt erst entdeckt.
define Licht_25_Januar_an at 2011-01-25T07:15:00 set Licht1 on



Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 30 August 2019, 12:09:29
ZitatMal ganz nebenbei: Der Calendar erzeugt selbst Events, also Du kannst einen Termin eintragen und mit dem entsprechenden notify wird exakt zu diesem Termin (oder einen daraus erzeugten Alarm) getriggert.

Nochmal darüber geschlafen ist mir heute klar das mein Vorgehen umständlich ist und ja auch ein zusätzliches (das AT) benötigt. Mit einem kurzen notify auf das Event (aber doch mit kurzer Verzögerung ? bis der Kalender aktualisiert ist) muss man scheinbar leben und gut ist.

Gruß

Thomas
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 10 September 2019, 19:58:22
Hallo Thomas,

in meinem Kopf war da noch so eine Idee, jetzt habe ich sie mal ausformuliert:
Zwei Zeilen für den AbfallKalender:
Edit: Formel korrigiert, siehe diesen Beitrag (https://forum.fhem.de/index.php/topic,103238.msg973665.html#msg973665).
attr AbfallKalender onCreateEvent { $e->{alarm}= $e->{start}-43200 }
attr AbfallKalender userReadings nextWasteDays {int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1') + 86399 - time)/86400)}, \
     Tonne {fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1')}

Kein Dummy, kein at, kein notify zusätzlich :)

Hoffentlich habe ich nichts übersehen, hab es jetzt noch nicht über Tage getestet.

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 10 September 2019, 21:58:11
ZitatHoffentlich habe ich nichts übersehen, hab es jetzt noch nicht über Tage getestet.

Völlig Schnurz ob das onCreateEvent wirklich funzt (muss ja, wenn du es schon schreibst, werde es testen),  du beantwortest mir mit dem zusätzlichen Alarm eine Frage die mir seit Tagen (unbewusst) durch den Kopf geht. DANKE.

Kein zusätzliches Device ist voll und ganz erfüllt, ein userReadings stört mich grundsätzlich auch nicht, die Aussage eines  :P Users hier aus dem Forum generell ohne userReadings auszukommen beschäftigt mich jetzt erst recht weiterhin  ???
Oder bleibt in dem Falle dann wirklich nur notify und die Funktion in eine MyUtils.pm auszulagern ?

Gruß

Thomas
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 10 September 2019, 22:03:47
Zitat von: TomLee am 10 September 2019, 21:58:11
du beantwortest mir mit dem zusätzlichen Alarm eine Frage die mir seit Tagen (unbewusst) durch den Kopf geht. DANKE.
Hier meine Notiz und Beispiel (https://heinz-otto.blogspot.com/2019/01/kalender-in-fhem-auf-bestimmte-termine.html) dazu.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 11 September 2019, 14:49:09
Ich muss meine Formel noch mal revidieren. Die Idee erst int() zu machen und dann einen ganzen Tag dazu zu zählen ist nicht richtig. Dabei passiert folgendes:
Termin Datum nochTage
13       11       2
13       12       1
13       13       1 <- falsch hier müsste 0 kommen!

das liegt daran, dass int(+0.irgendwas) und int(-0.irgendwas) jeweils null ergibt! Mann muss den Tag also vor int dazu zählen. Damit das Ganze bei Ganztages Terminen auch schon 00:00:00 und nicht erst 00:00:01 funktioniert würde ich 86399 (sec) dazu addieren.
Also Tage bis zum nächsten Termin:
{int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400)}

Wichtig! zwischen dem minus und time muss ein Leerzeichen, wenn man -time schreibt bekommt man diesen Fehler:
Zitat2019.09.12 13:37:09 1: PERL WARNING: Ambiguous use of -time resolved as -&time() at (eval 1919) line 1.
2019.09.12 13:37:09 3: eval: {int((fhem('get AbfallKalender events format:custom="$t1" limit:from=0,count=1')+86399-time)/86400)}
Um das Logging des get Befehls zu unterdrücken habe ich noch die ,1 eingefügt -> fhem('get Befehl',1)

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 11 September 2019, 15:25:28
ZitatTermin Datum nochTage
13       11       1
13       12       1
13       13       1 <- falsch hier müsste 0 kommen!

Bei mir war heute Abholungstag und vor drei Tagen stand bei mir eine 1 keine 2. Hab mich aber, im Gegensatz zu dir,  nicht weiter mit beschäftigt.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 11 September 2019, 23:10:30
ZitatMeine Abfalltermine sind Ganztages ...

Was heißt das genau, in $T1 steht bei dir 00:00 und in $T2 auch, $D also 24h ?
Hast dir dazu manuell den Kalender angepasst oder bekommst den so vom VerEntsorger ?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 11 September 2019, 23:35:27
Zitat von: TomLee am 11 September 2019, 23:10:30
Was heißt das genau, in $T1 steht bei dir 00:00 und in $T2 auch, $D also 24h ?
So ist es.
Der Kalender meines Versorgers ist schön zum anschauen, die Termine darin sind aus meiner Sicht unbrauchbar.
3 Tonnen sind 3 Serientermine und 3-5 Terminverschiebungen im Jahr. Das dauert wenige Minuten am Jahresende. Und kostet keine grauen Haare wenn beim Versorger die Applikation oder der Praktikant für Webdesign wechselt. Das man nicht einfach die Uhr stellt sondern auch die richtige Zeitzone braucht haben ja auch nicht wirklich alle verstanden.
;)
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 15 September 2019, 15:08:27
Das mit der Tonne hab ich mit einer Funktion in einer myUtils.pm umgesetzt, mit einem anderen Kalender spiel ich aber mit deinem letzten userReadings-Beispiel und da fällt auf das es im Log genauso viele get-Abfragen wie Events beim update gibt, das ja normal bei einem userReadings.
Gabs deswegen den Vorschlag das Logging des get Befehls zu unterdrücken (das mans nicht sieht ;D) oder nimmst du mit event-on-change-reading oder sonstwie noch Einfluss darauf das der get Befehl nur einmal ausgeführt wird. Es gibt insgesamt 7 Events bei einem update.

Gruß

Thomas
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 15 September 2019, 20:37:18
Hallo Thomas,

event-on-change-reading habe ich im Kalender nicht gesetzt. Wenn es einmal funktioniert, unterdrücke ich dann immer das logging der get Befehle. Das ist übrigens nicht Calendar Device spezifisch.

Du kannst beim userReadings ja auch noch einen trigger setzen.

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 20 Oktober 2019, 13:04:40
Hallo Otto,

mir ist jetzt aufgefallen das nach jedem shutdown restart der Kalender erstmal nicht gelesen werden kann:

2019.10.20 12:36:48 0: Featurelevel: 5.9
2019.10.20 12:36:48 0: Server started with 200 defined entities (fhem.pl:20318/2019-10-06 perl:5.024001 os:linux user:fhem pid:32456)
...
2019.10.20 12:37:07 1: Calendar Google_Foodkalender: retrieval failed with error message <hidden>: Can't connect(2) to https://calendar.google.com:443:  SSL connect attempt failed
2019.10.20 12:37:07 1: Calendar Google_Foodkalender: retrieved no or empty data
2019.10.20 12:37:07 1: Calendar Google_Abfallkalender: retrieval failed with error message <hidden>: Can't connect(2) to https://calendar.google.com:443:  SSL connect attempt failed


Daraus resultieren etliche Meldungen im Log:

2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 276) line 2.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 276) line 4.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 277) line 2.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 277) line 4.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $result in string at (eval 277) line 5.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:37:07 1: Calendar Google_Abfallkalender: retrieved no or empty data
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 278) line 2.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 278) line 4.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 279) line 2.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 279) line 4.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $result in string at (eval 279) line 5.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 280) line 2.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 280) line 4.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 281) line 2.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 281) line 4.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $result in string at (eval 281) line 5.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 282) line 2.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 282) line 4.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 283) line 2.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 283) line 4.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:37:07 1: PERL WARNING: Use of uninitialized value $result in string at (eval 283) line 5.
2019.10.20 12:37:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}


Nach einem manuellen set Google_Abfallkalender update nach etwa 4 Minuten wieder:

2019.10.20 12:41:06 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 1970) line 2.
2019.10.20 12:41:06 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:41:06 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 1970) line 4.
2019.10.20 12:41:06 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:41:06 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 1971) line 2.
2019.10.20 12:41:06 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:41:06 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 1971) line 4.
2019.10.20 12:41:06 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:41:06 1: PERL WARNING: Use of uninitialized value $result in string at (eval 1971) line 5.
2019.10.20 12:41:06 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:41:07 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 1974) line 2.
2019.10.20 12:41:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:41:07 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 1974) line 4.
2019.10.20 12:41:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
return $result}
2019.10.20 12:41:07 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 1975) line 2.
2019.10.20 12:41:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:41:07 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 1975) line 4.
2019.10.20 12:41:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}
2019.10.20 12:41:07 1: PERL WARNING: Use of uninitialized value $result in string at (eval 1975) line 5.
2019.10.20 12:41:07 3: eval: {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin|in|Buxtehude| am \d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd;}


Erst wenn ich ein set Google_Abfallkalender reload ausführe (oder scheinbar irgendwann von selbst, nach einem shutdown restart) verbindet sich das Modul mit Google und die Meldungen bleiben aus.

Hast du eventuell eine Erklärung dafür ?

Gruß

Thomas
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 20 Oktober 2019, 17:13:35
Hallo Thomas,

also solche Meldungen, dass der Googlekalender nicht geladen werden kann beim Start hatte ich noch nie. Und eigentlich habe ich in mehreren Instanzen zum Teil mehrere Kalender eingebunden, habe ich  gerade kontrolliert.
Die Meldung klingt ja so, als ob er nach dem Start Probleme hat ins Internet zu kommen/ den Namen aufzulösen?

Die Meldungen das die userReadings nach dem Start beim ersten mal nicht laufen, fallen mir jetzt auch auf. Das muss ich mal untersuchen, ist aber bei mir einmal und dann nicht mehr.

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 07 Januar 2020, 16:08:44
Hallo Otto,

nochmal zur obigen Warnung.

Den Code hab ich mal auf nextWaste beschränkt, es klappt auch ohne $result und nutze zum testen ein userreadings.

Könnte die .ics bearbeiten, zb. wie in dem Abfallmodul-Thread zuletzt mit Notepad beschrieben oder wie du schon erwähnt hast 3-4 Serientermine mit Anpassungen am Ende des Jahres erstellen, ich würde aber gerne sehen das es auch so geht.


Macht man zwar nie aber ich habs halt ausprobiert: jedes Mal wenn man in der DEF ist und mit modify Google_Abfallkalender abschliesst gibts die u.a. Warnungen im Log

Nach jedem Neustart (macht man auch so gut wie nie, ich weiß) gibts die Warnungen im Log, es stört mich aber.

Nach einem manuellem update oder dem automatischen auslesen nach intervall gibts keine Warnungen.


nextWaste {my $var1 =fhem ('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $regex = qr/Abfuhrtermin.|.in|.Buxtehude|.am.\d{1,2}\.\d{1,2}\.\d{4}/p;
$var1 =~ s/$regex//g;
return $var1}


2020.01.07 15:37:45 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 390777) line 3.
2020.01.07 15:37:45 3: eval: {my $var1 =fhem ('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $regex = qr/Abfuhrtermin.|.in|.Buxtehude|.am.\d{1,2}\.\d{1,2}\.\d{4}/p;
$var1 =~ s/$regex//g;
return $var1}
2020.01.07 15:37:45 1: stacktrace:
2020.01.07 15:37:45 1:     main::__ANON__                      called by (eval 390777) (3)
2020.01.07 15:37:45 1:     (eval)                              called by fhem.pl (4687)
2020.01.07 15:37:45 1:     main::readingsEndUpdate             called by fhem.pl (4928)
2020.01.07 15:37:45 1:     main::readingsSingleUpdate          called by ./FHEM/57_Calendar.pm (2656)
2020.01.07 15:37:45 1:     main::Calendar_ProcessUpdate        called by FHEM/HttpUtils.pm (634)
2020.01.07 15:37:45 1:     main::__ANON__                      called by fhem.pl (753)
2020.01.07 15:37:46 1: PERL WARNING: Use of uninitialized value $var1 in substitution (s///) at (eval 390778) line 3.
2020.01.07 15:37:46 3: eval: {my $var1 =fhem ('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $regex = qr/Abfuhrtermin.|.in|.Buxtehude|.am.\d{1,2}\.\d{1,2}\.\d{4}/p;
$var1 =~ s/$regex//g;
return $var1}
2020.01.07 15:37:46 1: stacktrace:
2020.01.07 15:37:46 1:     main::__ANON__                      called by (eval 390778) (3)
2020.01.07 15:37:46 1:     (eval)                              called by fhem.pl (4687)
2020.01.07 15:37:46 1:     main::readingsEndUpdate             called by fhem.pl (4928)
2020.01.07 15:37:46 1:     main::readingsSingleUpdate          called by ./FHEM/57_Calendar.pm (2840)
2020.01.07 15:37:46 1:     main::Calendar_UpdateCalendar       called by ./FHEM/57_Calendar.pm (2773)
2020.01.07 15:37:46 1:     main::Calendar_PollChild            called by fhem.pl (3306)
2020.01.07 15:37:46 1:     main::HandleTimeout                 called by fhem.pl (679)
2020.01.07 15:38:19 3: [Twilight] got no weather info from yahoo. Error code: gethostbyname query.yahooapis.com failed


Fällt dir vielleicht noch was ein was man an dem ersetzen noch anders machen könnte das die Warnungen nicht mehr kommen ?

Gruß

Thomas
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 08 Januar 2020, 11:54:05
Hallo Thomas,

es ist offenbar so, das im Moment der Initialisierung des Kalenders die userReadings angestoßen werden, aber der Kalender selbst keine Daten liefert.
Ich habe mal einfach verbose 5 gemacht:
2020.01.08 11:29:55 4: Calendar AbfallKalender: Wakeup
2020.01.08 11:29:55 4: Calendar AbfallKalender: Updating...
2020.01.08 11:29:55 4: Calendar AbfallKalender: Getting data from URL <hidden>
2020.01.08 11:29:55 5: Calendar AbfallKalender: HTTP response code 200
2020.01.08 11:29:55 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 1869) line 1.
2020.01.08 11:29:55 3: eval: {my $day = int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time)/86400);
                  $day?eval{$day>1?$day:"morgen"}:"heute"}
2020.01.08 11:29:55 4: Calendar AbfallKalender: parsing data asynchronously (PID= 30952)
2020.01.08 11:29:55 5: Calendar AbfallKalender: control passed back to main loop.
2020.01.08 11:29:56 4: Calendar AbfallKalender: got result from asynchronous parsing.
2020.01.08 11:29:56 4: Calendar AbfallKalender: asynchronous parsing finished.
2020.01.08 11:29:56 1: PERL WARNING: Use of uninitialized value in addition (+) at (eval 1876) line 1.
2020.01.08 11:29:56 3: eval: {my $day = int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time)/86400);
                  $day?eval{$day>1?$day:"morgen"}:"heute"}
2020.01.08 11:29:56 4: Calendar AbfallKalender: merging data
2020.01.08 11:29:56 4: Calendar AbfallKalender: 38 records processed, 38 new, 0 known, 0 modified, 0 changed.
2020.01.08 11:29:56 4: Calendar AbfallKalender: creating calendar events
2020.01.08 11:29:57 4: Calendar AbfallKalender: Checking times...
2020.01.08 11:29:57 4: Calendar AbfallKalender: process ended.

Offenbar werden die userReadings beim Start von Calendar dreimal angestossen, beim dritten mal klappt es dann. Das ist aber meine Mutmaßung.

Wenn ich meinen Code so abändere kommt kein Fehler:
nextWasteDays {my $zeit=fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1);
               if (!defined $zeit) {$zeit=0}
       my $day = int(($zeit + 86399 - time)/86400);
               $day?eval{$day>1?$day:"morgen"}:"heute"},
Tonne {fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1)}


Geht vielleicht eleganter, ich brauche bei Perl immer etwas ;)
Ich werde Boris mal fragen, ob er dazu noch eine Idee hat. Weil warum werden die userReadings so oft angestossen beim define?

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 30 Januar 2020, 12:50:50
Hey Otto,

OT aber mein Thread  :P

Die Tonnenleerungen sind jetzt dran, dazu kann es bei meiner jetzigen Lösung (via DOIF -weil dann auch gleich die Zähler-Readings mit Alexa gesetzt werden können- und setreading) zu jeder Abfallart ein Reading ( also max. 4 Stück Restabfall/Wertstoffe, Bioabfall, Schadstoffmobil und Hecken und Baumschnitt) mit der Anzahl der Leerungen im Calendar-Device geben .
Am Ende des Jahres will man diese ja leeren und das am besten automatisiert nicht von Hand.
Mein erster Gedanke wäre zu schauen alle Abfallart-Readings (also die max. vier) in ein Array zu bekommen um mittels einer Schleife jedes Reading auf 0 zurücksetzen zu können. Die Schleife würd ich, denk ich, auch hinbekommen.

Ob und wie man die Abfallart-Readings jetzt in ein Array bekommt ist mir einfach aus mangelnden Perlkentnissen unklar, hast du vielleicht mal wieder einen Tip ?

Gruß

Thomas

edit:

Nach der Fragestellung ist man immer schlauer ;D
Jedem Abfallart-Reading was eindeutiges anhängen wäre ein Weg bspw. L_BIOABFALL, L_Restabfall/Wertstoffe
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 30 Januar 2020, 15:31:35
Geht relativ simpel :)
https://forum.fhem.de/index.php/topic,106368.msg1002167.html#msg1002167

Aber eigentlich kennst Du ja die Readings.
dann kannst Du die Namen einfach in ein Array schreiben, so wie hier etwa:
https://forum.fhem.de/index.php/topic,107449.msg1015141.html#msg1015141

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 30 Januar 2020, 16:43:29
Wenn man drauf gestossen wird ist alles ganz klar ::)

Da muss ich viermal ReadingsVal verwenden, hab noch nicht auf L_-Readings umgestellt aber kürzer wäre der Code am Ende wenn es eine Funktion gebe,  die mir -wie ich im edit schon angemerkt habe- den Inhalt aus allen L_.*-Readings in eines schreibt  8)

Gibts diese Funktion ?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 30 Januar 2020, 16:48:01
bei Readings funktioniert normalerweise kein .* oder so.

Warum viermal ReadingsVal? Schleife über Array?

ich habe aber dein eigentliches Problem nicht verstanden. Was ist schlimm an den Readings? Hast Du ein Beispiel?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 30 Januar 2020, 17:10:30
defmod doif_Muelll_Count DOIF ($SELF eq "on") ({ \
my $val = "Google_Abfallkalender";;;;\
my $val1 = (ReadingsVal("Google_Abfallkalender","nextWaste","0"));;;;\
$val1 =~ s/_.*//;;;;\
my $val2 =(ReadingsVal("Google_Abfallkalender","$val1","0")+1);;;;\
fhem("setreading $val $val1 $val2")})\
DOELSEIF\
({ \
my $val = "Google_Abfallkalender";;;;\
my $val1 = (ReadingsVal("Google_Abfallkalender","nextWaste","0"));;;;\
$val1 =~ s/_.*//;;;;\
my $val2 =(ReadingsVal("Google_Abfallkalender","$val1","0")-1);;;;\
fhem("setreading $val $val1 $val2")})\
DOELSE\
({\
my @array = ("ReadingsVal("Google_Abfallkalender","Restabfall/Wertstoffe","0")","ReadingsVal("Google_Abfallkalender","Bioabfall","0")","ReadingsVal("Google_Abfallkalender","Schadstoffe","0")","ReadingsVal("Google_Abfallkalender","Hecken und Baumschnitt","0")");;;; foreach my $Aa (@array){fhem ("setreading Google_Abfallkalender $Aa 0")} })\
\

attr doif_Muelll_Count alexaName tonnenleerung
attr doif_Muelll_Count cmdState on|off
attr doif_Muelll_Count devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr doif_Muelll_Count do always
attr doif_Muelll_Count room Sprachsteuerung
attr doif_Muelll_Count setList on off


Der dritte Ausführungsteil ist nicht fertig, und klappt auch noch nicht, du frägst zu früh.
Hoffe man kann nachvollziehen was ich vorhabe.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 30 Januar 2020, 17:21:54
Sry zweimal falschen code geposted jetzt passts.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 30 Januar 2020, 17:38:09
ganz auf Schnelle ;;;; -> ;; zwei reichen normal :)
Wobei ich nicht weiß, wie man Perl Code in ein DOIF schreibt  ::)

ich würde nur die ReadingsNamen in das Array packen und dann ReadingsVal( "Google_Abfallkalender", $Aa,0)

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 30 Januar 2020, 18:08:34
es sind zwei ; in der DEF




ja ja wenn mans richtig macht, frag mich nicht was ich mir dabei gedacht hatte.
Mit der Readingname Angabe klappts.

Wo ich ReadingsVal( "Google_Abfallkalender", $Aa,0) einsetzen soll komm ich noch nicht mit.

So kann mans machen und es funzt:
({
my @array = ("Restabfall/Wertstoffe","Bioabfall","Schadstoffe");;
foreach my $Aa (@array)
{fhem ("setreading Google_Abfallkalender $Aa 0")}})


Und um auf die ursprüngliche Frage zurückzukommen, die Angabe der Readingnamen in Wort und Schrift wollte ich mir sparen.
Wenn ich jedem Readingname ein L_verpasse, wie bekomme ich diese dann ins Array ?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 30 Januar 2020, 21:42:40
In der DEF braucht es nur ein ;  ;)

ReadingsNamen: ich habe keine Idee Idee mit dem L_ - geht eventuell irgendwie ...
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Damian am 31 Januar 2020, 11:17:14
Ich benutze für den Abfallkalender (Modul ABFALL) Aggregationsfunktionen, um die nächste Leerung zu bestimmen:

z. B.

attr Abfall DOIF_Readings bio:[#min:"^abfall$":"Bioabfall.*_days$"], GelberSack:[#min:"^abfall$":"GelberSack.*_days$"], Gruenschnitt:[#min:"^abfall$":"Gruenschnitt.*_days$"]

siehe: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzahl_der_Tage_bis_zur_Abfall-Entsorgung
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 31 Januar 2020, 16:13:43
Danke, mir gehts aber darum das Abfall-Modul nicht nutzen zu müssen.


Man muss es gar nicht so kompliziert, die Readings werden doch mit setreading eh wieder neu gesetzt, einfach mit deletereading löschen  :P

defmod doif_Muelll_Count DOIF ($SELF eq "on") ({ \
my $val = "Google_Abfallkalender";;\
my $val1 = (ReadingsVal("$val","nextWaste","0"));;\
$val1 =~ s/_.*//;;\
$val1 = "L_"."$val1";;\
my $val2 =(ReadingsVal("Google_Abfallkalender","$val1","0")+1);;\
fhem("setreading $val $val1 $val2")})\
DOELSEIF\
({ \
my $val = "Google_Abfallkalender";;\
my $val1 = (ReadingsVal("$val","nextWaste","0"));;\
$val1 =~ s/_.*//;;\
$val1 = "L_"."$val1";;\
my $val2 =(ReadingsVal("Google_Abfallkalender","$val1","0")-1);;\
fhem("setreading $val $val1 $val2")})\
DOELSEIF\
(deletereading Google_Abfallkalender L_.*)\
\

attr doif_Muelll_Count cmdState on|off
attr doif_Muelll_Count devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr doif_Muelll_Count do always
attr doif_Muelll_Count room Sprachsteuerung


@Damian
sobald ich cmd3 mit rein nehme wird cmd2 nicht mehr ausgeführt, nehm ich cmd3 raus klappt wieder cmd1 und cmd2.
War der Meinung den cmd3 nehm ich dann mit DOELSE auf, dann gibts aber einen error, der Befehl wird aber ausgeführt.
Nehm ich DOELSEIF für cmd3 gibts keinen error und wird auch ausgeführt.
Hast du bitte einen Tipp ?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 31 Januar 2020, 17:24:43
So klappt jetzt alles, es gibt aber weiter das error-Reading zu cmd3 obwohl er ausgeführt wird:

error deletereading Google_Abfallkalender L_.*: Deleted reading L_Bioabfall for device Google_Abfallkalender

defmod doif_Muelll_Count DOIF ($SELF eq "on") ({ \
my $val = "Google_Abfallkalender";;\
my $val1 = (ReadingsVal("$val","nextWaste","0"));;\
$val1 =~ s/_.*//;;\
$val1 = "L_"."$val1";;\
my $val2 =(ReadingsVal("Google_Abfallkalender","$val1","0")+1);;\
fhem("setreading $val $val1 $val2")})\
DOELSEIF\
($SELF eq "off")\
({ \
my $val = "Google_Abfallkalender";;\
my $val1 = (ReadingsVal("$val","nextWaste","0"));;\
$val1 =~ s/_.*//;;\
$val1 = "L_"."$val1";;\
my $val2 =(ReadingsVal("Google_Abfallkalender","$val1","0")-1);;\
fhem("setreading $val $val1 $val2")})\
DOELSE\
(deletereading Google_Abfallkalender L_.*)\
\

attr doif_Muelll_Count cmdState on|off|reset
attr doif_Muelll_Count devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr doif_Muelll_Count do always
attr doif_Muelll_Count room Sprachsteuerung
attr doif_Muelll_Count setList on off
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Damian am 31 Januar 2020, 17:34:04
Error gibt es immer dann, wenn der Befehl etwas ungleich 0 zurück liefert. Das wird wohl bei deletereading  der Fall sein. Du kannst dahinter eine leere Befehlsausführung dranhängen um die Fehlermeldung zu beseitigen

(deletereading Google_Abfallkalender L_.*)()
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 31 Januar 2020, 17:36:47
Danke
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 01 Februar 2020, 14:47:51
Was läuft denn jetzt schief ?

Ich kopiere mir die funktionierende Raw Definition aus dem Test-System und füge sie über das Plus am Haupt-Server ein oder kopiere einfach die DEF.
Hier wird nicht mehr addiert/subtrahiert, es wird je nach Kommando der Wert (1/-1) in das Reading geschrieben, cmd_3 wird korrekt ausgeführt
Beide System sind up to date.

defmod doif_Muell_Count DOIF ($SELF eq "on") ({ \
my $val = "Google_Abfallkalender";;\
my $val1 = (ReadingsVal("$val","nextWaste","0"));;\
$val1 =~ s/_.*//;;\
$val1 = "L_"."$val1";;\
my $val2 =(ReadingsVal("Google_Abfallkalender","$val1","0")+1);;\
fhem("setreading $val $val1 $val2")})\
DOELSEIF\
($SELF eq "off")\
({ \
my $val = "Google_Abfallkalender";;\
my $val1 = (ReadingsVal("$val","nextWaste","0"));;\
$val1 =~ s/_.*//;;\
$val1 = "L_"."$val1";;\
my $val2 =(ReadingsVal("Google_Abfallkalender","$val1","0")-1);;\
fhem("setreading $val $val1 $val2")})\
DOELSE\
(deletereading Google_Abfallkalender L_.*)()
attr doif_Muell_Count cmdState on|off|reset
attr doif_Muell_Count devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr doif_Muell_Count do always
attr doif_Muell_Count room Sprachsteuerung
attr doif_Muell_Count setList on off
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 01 Februar 2020, 15:39:36
was gibt denn dies in der FHEM Kommandozeile zurück?
{ReadingsVal("Google_Abfallkalender","state","geht nicht")}

Entweder der Kalender existiert nicht oder die Readings :)
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 01 Februar 2020, 16:11:28
Natürlich existiert der Kalender, ich schiebe doch die DEF die letzten drei Tage hin und her, das ist bisher bis auf heute kein Problem gewesen und funzte ganz normal. Jetzt wo ich im FTUI an den Switches rumspiele die dort auch die Befehle ausführen sollen können bemerk ich diese Kuriosität und finde den Fehler nicht. Hab doch alles 1:1 auf jedem Server
Unter jedem Gerät steht bei Probably associated with ja auch das richtige Gerät und die Readings existieren, der Zeitstempel ändert sich ja auch wenn jetzt eine 1 bei cmd_1 und eine -1 bei cmd_2 in das Reading geschrieben wird.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 02 Februar 2020, 12:52:59
Auf dem Hauptsystem hat es was mit der Variablen $val1 zu tun.
Wenn ich zum testen L_Bioabfall verwende wird wieder gerechnet.
Kann es was mit der jeweils verwendeten Perl-Version zu tun haben ? Das Testsystem läuft mit Buster, das Hauptsystem mit Stretch.


($SELF eq "on") ({
my $val = "Google_Abfallkalender";
my $val1 = (ReadingsVal("$val","nextWaste","0"));
$val1 =~ s/_.*//;
$val1 = "L_"."$val1";
my $val2 =(ReadingsVal("$val","L_Bioabfall","0")+1);
fhem("setreading $val L_Bioabfall $val2")})
DOELSEIF
($SELF eq "off")
({
my $val = "Google_Abfallkalender";
my $val1 = (ReadingsVal("$val","nextWaste","0"));
$val1 =~ s/_.*//;
$val1 = "L_"."$val1";
my $val2 =(ReadingsVal("$val","L_Bioabfall","0")-1);
fhem("setreading $val L_Bioabfall $val2")})
DOELSE
(deletereading Google_Abfallkalender L_.*)()
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 02 Februar 2020, 14:39:37
Es gibt in jeder Programmiersprache Entwicklungen, oft wird dabei der Syntax bereinigt. Ich sehe das bei deinem Code nicht. Außerdem wird bei Perl auch das "Meckersystem" immer besser :) d.h. Du solltest Warnungen oder Fehler im Log haben.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 02 Februar 2020, 14:44:56
Nichts, keine Meldungen, keine Fehler. Gleiche DEF, in einem System (Test) wird gerechnet, im anderen (Haupt) 1 bzw. -1 -je nach Befehl- ins Reading geschrieben.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 02 Februar 2020, 14:49:58
Es klappt auch nicht wenn man ReadingsNum verwendet.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 02 Februar 2020, 14:56:01
Mein Tipp: schreib den Code nicht in ein DOIF sondern in die 99_myUtils.pm (Es gab mal irgendwo hier die Aussage: Mehr als eine Codezeile gehören dort hin) :D

Jetzt bist Du: in der Runden Klammer / in der Perl Klammer / im DOIF - ich weiß nicht was und an welcher Stelle da etwas passieren kann. :-[
Eigentlich braucht man die nicht: "$val" -> $val - ich weiß aber auch, manchmal braucht man sie, manchmal macht es keinen Unterschied. Der Variablen Name muss durch Inhalt ersetzt werden, wer macht das, wann macht er das ...

Im Zweifel musst Du in jeder Zeile einfach eine Zeile ins Log schreiben, damit Du siehst was gerade mit deinem Code passiert.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 02 Februar 2020, 16:44:50
Auch wenn ich eine myUtils nehme ändert das nichts.

Fakt ist :

Auf beiden System steht in L_Bioabfall 4

Aus der Kommandozeile auf dem Test-System kommt mit
{ my $val = "Google_Abfallkalender";; my $val1=(ReadingsVal($val,"nextWaste","0"));;$val1 =~ s/_.*//;;$val1 = "L_"."$val1";; my $val2 =(ReadingsNum($val,$val1,"0"));;return $val2 }
eine korrekte 4 zurück deshalb klappt auch alles.

Und auf dem Hauptsystem mit der gleichen Zeile eine 0.
Da kann ich soviel Logausgaben machen wie ich will, es bleibt bei der Erkenntnis aus Post #61, die Variable $val1 in dem ReadingsNum von val2 wird egal ob mit " oder ohne nicht übergeben/erkannt wie auch immer.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 02 Februar 2020, 16:53:13
Mal eine Stelle in deinem Code reduziert:
{my $a="L_Bioabfall";;$a =~ s/_.*//;;return $a}
Da kommt L raus ?

Und im nächsten Schritt machst daraus L_L ;)

Oder ich habe es nicht verstanden.  :-[
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 02 Februar 2020, 17:07:08
Nee, nee ist schon richtig oder ich versteh dich jetzt falsch.

In nextWaste hängen die verbeibenden Tage noch  mit _ hinten daran -Bioabfall_4- die entferne ich erstmal und hänge dann an Bioabfall ein L_ an.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 02 Februar 2020, 17:40:51
Na ok, Du wirst es wissen. Mir ist dieses Gefummel eh zu hoch ;)
Ich habe ein Reading da steht die nächste Tonnenart drin und ein Reading da stehen die Tage drin bis es soweit ist. Das ist immer aktuell - auch zum Jahreswechsel.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 02 Februar 2020, 18:03:15
Und was spricht dagegen wenn ich das mit einem Reading gelöst habe in der die Tonnenart und die Tage gemeinsam dargestellt werden -auch zum Jahreswechsel ?

Du hast schon verstanden das es um das zählen der rausgestellten Tonnen geht ?

Warum das jetzt Fummelei sein soll den Inhalt aus nextWaste in ein neues Reading zu bekommen, um dort dann die Anzahl der rausgestellten Tonnen reinzuschreiben verstehe ich nicht  :-[
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 02 Februar 2020, 18:25:27
Nö ehrlich ich habe es nicht verstanden :) aber ich habe immer versucht mit zu denken. 😇
Aber Du musst zugeben Du fummelst jetzt schon seit dem Jahreswechsel am Reset der Readings rum. ;)

Manchmal muss ja auch neu drüber nachdenken.

Warum fummelst Du hinten was ab und vorne was dran, warum hältst Du die Daten nicht getrennt und fügst sie immer aktuell zusammen?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 02 Februar 2020, 19:00:43
Jahreswechsel ? seit Dienstag-Mittwoch, gefragt hatte ich am Freitag.

https://forum.fhem.de/index.php/topic,103238.msg1018939.html#msg1018939 (https://forum.fhem.de/index.php/topic,103238.msg1018939.html#msg1018939)

ZitatWarum fummelst Du hinten was ab und vorne was dran, warum hältst Du die Daten nicht getrennt und fügst sie immer aktuell zusammen?

Meine (https://forum.fhem.de/index.php/topic,79990.msg1011864.html#msg1011864) Ftui-Lösung, mit nur einem Reading.

Mit dem DOiF würden zu meiner Abfalllösung eigentlich nur noch zwei Readings dazukommen (raus stelle ich den Restabfall und Bioabfall), wo man die Leerungen hinschreibt ist ja egal ich hab mich dazu entschieden wie bei den Abholtagen in das Calendar-Device.

Mit der DOIF Lösung könnte ich am Abholtag Alexa sagen Tonnenleerung an (über eine Routine) oder im Ftui nach Tipp auf die Tonnenart in dem aufgehenden Popup via Switch und das entsprechende Reading zu nextwaste würde um eins hochgezählt.

Am Jahresende könnte man über cmd_3 die entsprechenden Readings wieder löschen .

Das macht doch alles schon:

defmod doif_Muell_Count DOIF ($SELF eq "on") ({ \
my $val = "Google_Abfallkalender";;\
my $val1 = (ReadingsVal("$val","nextWaste","0"));;\
$val1 =~ s/_.*//;;\
$val1 = "L_"."$val1";;\
my $val2 =(ReadingsVal("$val","$val1","0")+1);;\
fhem("setreading $val $val1 $val2")})\
DOELSEIF\
($SELF eq "off")\
({ \
my $val = "Google_Abfallkalender";;\
my $val1 = (ReadingsVal("$val","nextWaste","0"));;\
$val1 =~ s/_.*//;;\
$val1 = "L_"."$val1";;\
my $val2 =(ReadingsVal("$val","$val1","0")-1);;\
fhem("setreading $val $val1 $val2")})\
DOELSE\
(deletereading Google_Abfallkalender L_.*)()
attr doif_Muell_Count cmdState on|off|reset
attr doif_Muell_Count devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr doif_Muell_Count do always
attr doif_Muell_Count room Sprachsteuerung
attr doif_Muell_Count setList on off
attr doif_Muell_Count alexaName tonnenleerung


Bloß nicht auf dem Server wo ichs brauch  ;D

Ich möchte dich bitten das mal nachzuvollziehen.
Nimm statt Google_Abfallkalender einen Dummy Google_Abfallkalender und verpasse diesem ein Reading nextWaste mit dem Wert Bioabfall_4.

cmd_1 des DOIF sollte beim ersten Mal ein Reading L_Bioabfall erstellen mit einer 1 als Wert jedes weitere cmd_1 erhöht das Reading um eins, jedes cmd_2 zieht eins ab, cmd_3 löscht das Reading L_Bioabfall.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Damian am 02 Februar 2020, 20:58:10
Ich habe mir jetzt mal calendar genauer angeschaut. Es ist mit wenigen Zeilen möglich, ohne zusätzliche Abfall-Module, die Tage zur Leerung in Readings zu packen und zu visualisieren, mein Code:

defmod myabfall DOIF subs {\
  sub days \
  {\
    my ($event)=@_;;\
    set_Reading($event,fhem('get cal events timeFormat:"%j" filter:field(summary)=~"'.$event.'" limit:count=1,from=0 format:custom="$T1"')-::strftime ('%j', localtime()))\
  }\
}\
init {[00:05];;fhem("set cal reload");;days("Altpapier");;days("Restmüll");;days("Bio");;days("Gelber");;days("Grünschnitt");;\
}
attr myabfall uiTable {\
  $TC{0..4}="align='center'";;\
  $SHOWNOSTATE=1;;\
}\
IMPORT ./contrib/DOIF/my_uiTable.tpl\
bin("yellow",[$SELF:Gelber])|bin("blue",[$SELF:Altpapier])|bin("grey",[$SELF:Restmüll])|bin("green",[$SELF:Bio])|bin("greengreen",[$SELF:Grünschnitt])


Um Mitternacht wird der Kalender aktualisiert und die entsprechenden Readings mit der Anzahl der Tage für die verschiedenen Abfallsorten erstellt. Zusätzlich habe ich sie noch über uiTable visualisiert. Die Funktion "bin" stellt die Eimer mit dem Counter dar.

Ergebnis im Anhang:
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 02 Februar 2020, 21:41:08
Mich interessiert nur der nächste Termin und den gibts mit folgendem userreadings im Calendar-Device das aus diesem Thread entstanden ist.

nextWaste {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin.|in.|Buxtehude.|am.\d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd}


Eine Anzeige in FHEMWEB brauch ich nicht, mir reicht das Reading für den nächsten Termin im FTUI, das Thema ist seit letzten September -dank Otto- gegessen.

Mir gehts jetzt um das zählen der Leerungen, dazu hab ich mir zu meiner userreadings-Lösung das DOIF ausgedacht, sry wenn ich dazu keinen neuen Thread aufgemacht habe.

Nochmal:Das Doif funkioniert ja, nur nicht -bis jetzt- in meiner Haupt-Instanz.

Aussehen soll das am Ende im FTUI ähnlich wie im Anhang gezeigt wenn man auf Bioabfall tippt und dort wird auch nur eine Tonne angezeigt und zwar die die auf dem userreadings basiert.


Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 02 Februar 2020, 22:11:30
Zitat von: TomLee am 02 Februar 2020, 19:00:43
Ich möchte dich bitten das mal nachzuvollziehen.
Nimm statt Google_Abfallkalender einen Dummy Google_Abfallkalender und verpasse diesem ein Reading nextWaste mit dem Wert Bioabfall_4.

cmd_1 des DOIF sollte beim ersten Mal ein Reading L_Bioabfall erstellen mit einer 1 als Wert jedes weitere cmd_1 erhöht das Reading um eins, jedes cmd_2 zieht eins ab, cmd_3 löscht das Reading L_Bioabfall.
Hab ich gemacht - er tut es wie Du sagst. System ist Jessie ... und auch unter einem zweiten System mit buster.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 02 Februar 2020, 22:21:32
Dann hab ich keine Ahnung mehr was ich machen soll, zu doof die Raw Definition oder DEF zu übertragen bin ich nicht.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 02 Februar 2020, 22:37:23
Versuch es doch wie ich  mal  mit einem Dummy und nicht mit dem Calendar Modul...
Und beobachte den Eventmonitor während Du testest.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 02 Februar 2020, 22:59:32
Unglaublich, wollte schon schreiben was soll das bringen im Test-System (Buster) klappts doch auch im Calendar-Device.

Bei einem Dummy klappen die Befehle (cmd_1-3) :o, aber das erstellte Reading heißt jetzt nicht L_Bioabfall sondern L_0 ::)

Es muss hiermit was nicht stimmen:

my $val1 = (ReadingsVal("$val","nextWaste","0"));
$val1 =~ s/_.*//;
$val1 = "L_"."$val1";


Darf/Kann man das wirklich so machen ?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 02 Februar 2020, 23:10:27
klingt vielleicht komisch aber nimm doch mal andere Variablen Namen. Nenn sie willi und willi1 :)
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 02 Februar 2020, 23:35:45
In du_Testy steht in nextwaste Bioabfall_4, aus der Kommandozeile ergibt {  my $val = "du_Testy";; my $val1 = (ReadingsVal("$val","nextWaste","0"));;$val1 =~ s/_.*//;;return $val1} 0

Ich will nicht mehr  ;D
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 03 Februar 2020, 00:31:16
Habs.

in dem userreadings im Calendar-Device war (wieder) ein Leerzeichen zwischen Bioabfall und _4.
Das hatte ich schon korrigiert, hab aber scheinbar (meine Erklärung jetzt) später irgendwann wieder ein vorheriges Backup eingespielt, sonst wäre die korrekte Calendar-Device-Definition letzte Woche nicht auf dem Test-System gelandet  8)

Hier ist das Leerzeichen rot hervorgehoben  ;D:
ZitatnextWaste {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin.|in.|Buxtehude.|.am.\d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd}
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: carlos am 10 Februar 2020, 10:50:10
Zitat von: Damian am 02 Februar 2020, 20:58:10
Ich habe mir jetzt mal calendar genauer angeschaut. Es ist mit wenigen Zeilen möglich, ohne zusätzliche Abfall-Module, die Tage zur Leerung in Readings zu packen und zu visualisieren, mein Code:

defmod myabfall DOIF subs {\
  sub days \
  {\
    my ($event)=@_;;\
    set_Reading($event,fhem('get cal events timeFormat:"%j" filter:field(summary)=~"'.$event.'" limit:count=1,from=0 format:custom="$T1"')-::strftime ('%j', localtime()))\
  }\
}\
init {[00:05];;fhem("set cal reload");;days("Altpapier");;days("Restmüll");;days("Bio");;days("Gelber");;days("Grünschnitt");;\
}
attr myabfall uiTable {\
  $TC{0..4}="align='center'";;\
  $SHOWNOSTATE=1;;\
}\
IMPORT ./contrib/DOIF/my_uiTable.tpl\
bin("yellow",[$SELF:Gelber])|bin("blue",[$SELF:Altpapier])|bin("grey",[$SELF:Restmüll])|bin("green",[$SELF:Bio])|bin("greengreen",[$SELF:Grünschnitt])


Um Mitternacht wird der Kalender aktualisiert und die entsprechenden Readings mit der Anzahl der Tage für die verschiedenen Abfallsorten erstellt. Zusätzlich habe ich sie noch über uiTable visualisiert. Die Funktion "bin" stellt die Eimer mit dem Counter dar.

Ergebnis im Anhang:

Das gefällt mir gut.
Würde das auch mit dem neuen SSCal module funktionieren?
Und wo gibt's die bin Funktion?
my_uitable.tpl gibt es zur Zeit nicht in .\contrib\DOIF  sonder nur  uiTable.tpl und da ist keine bin Funktion drin.

Gruß

Carlos
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Damian am 10 Februar 2020, 11:09:20
Ich werde bald eine allgemeinere Funktion für die Counter-Darstellung ins DOIF einbauen, solange kannst du diese Datei mit der bin-Funktion nehmen.

Edit: Es funktioniert mit jedem Kalender, du musst nur die entsprechende Anzahl der Tage in ein Reading bekommen, damit du es über die bin-Funktion darstellen kannst. In meinem Beispiel ermittelt die days-Funktion die Anzahl der Tage bis zum Ereignis aus dem Calendar-Modul im Beispiel namens cal.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: cotecmania am 23 Februar 2020, 14:26:39
Zitat von: TomLee am 02 Februar 2020, 21:41:08
Mich interessiert nur der nächste Termin und den gibts mit folgendem userreadings im Calendar-Device das aus diesem Thread entstanden ist.

nextWaste {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $regex = qr/Abfuhrtermin.|in.|Buxtehude.|am.\d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd}



Danke für die Anregung. Mit 6 Userreadings das komplette ABFALL-Modul ersetzt für meine Zwecke :
nextBlaueTonneDays {return int((fhem('get '.$name.' events filter:field(summary)=~"Blaue Tonne" format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400)},
nextGelberSackDays {return int((fhem('get '.$name.' events filter:field(summary)=~"Gelber Sack" format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400)},
nextRestmuellDays {return int((fhem('get '.$name.' events filter:field(summary)=~"Restmüll" format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400)},
nextRestmuellWeekDay  { my @days = qw/So Mo Di Mi Do Fr Sa/;
                        my $date = fhem('get '.$name.' events filter:field(summary)=~"Restmüll" format:custom="$T1" limit:from=0,count=1');
                        my @date = split /\./,$date;
                        return $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
  },
nextGelberSackWeekDay { my @days = qw/So Mo Di Mi Do Fr Sa/;
                        my $date = fhem('get '.$name.' events filter:field(summary)=~"Gelber Sack" format:custom="$T1" limit:from=0,count=1');
                        my @date = split /\./,$date;
                        return $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
  },
nextBlaueTonneWeekDay { my @days = qw/So Mo Di Mi Do Fr Sa/;
                       my $date = fhem('get '.$name.' events filter:field(summary)=~"Blaue Tonne" format:custom="$T1" limit:from=0,count=1');
                       my @date = split /\./,$date;
                       return $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
  }
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 23 Februar 2020, 14:37:05
Beachte mal noch Beitrag #43, sonst bekommst Du Fehlermeldungen beim Start von FHEM.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Damian am 23 Februar 2020, 20:10:37
siehe auch https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzahl_der_Tage_bis_zur_Abfall-Entsorgung

jetzt ohne zusätzliche externe Funktionen bzw. Module. Es reicht die Definition eines Kalenders (im Beispiel 'cal') mit Hilfe des Moduls calendar.

Die Bestimmung der Tage erfolgt zeitverzögert (60 Sekunden) über einen Timer, damit beim Start der Kalender Zeit bekommt seine Einträge zu aktualisieren.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 09 April 2021, 21:05:17
Hey Otto,

ich hab einen lichten Moment, bisher hab ich den Code aus #34 genutzt (der war nicht wirklich korrekt mein ich),  bestimmt konnt ich auch nicht immer folgen, mir gehts jetzt auch nicht mehr um die Tonne (ist aber das gleiche), mit {int((fhem('get cal_example events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400)} bekommt man wenn es Heute noch einen Termin gäbe die 1 zurück.

Wenn man immer von 00:00 bis 00:00 Uhr rechnet (wie am Anfang des Threads der Ansatz war) eine 0 (ohne int), für die Kommandozeile:

{my $t = fhem('get cal_example events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=0,count=1');;$t=(time_str2num($t) - time_str2num(strftime('%F 00:00:00',localtime(time))))/86400;;return $t;;}

Verstehst du mich, übersehe ich was, meinst du/siehst du die Möglichkeit es ginge weniger umständlich umzusetzen wenn ich richtig liege ?


edit:

Ich mags jetzt universeller ohne zusätzlich einen Startzeitpunkt anzugeben.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 09 April 2021, 21:34:54
Also mein userReadings zeigt die Zahl 4
nextWasteDays {my $zeit=fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1);
             if (!defined $zeit) {$zeit=0}
my $day = int(($zeit + 86399 - time)/86400);
             $day?eval{$day>1?$day:"morgen"}:"heute"},

Dein Code zeigt auch die Zahl 4

Aber ich  finde die Format hin und her Rechnerei umständlich. Am Ende bekommst Du das Gleiche. Was ist schlimm an dem int()?

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 09 April 2021, 21:55:42
Wir reden aneinander vorbei, ich muss überlegen was ich sage, dein Code gibt morgen aus (meiner 0, wie gewünscht) obwohl jetzt noch ein Termin um 22:00 Uhr ist. Ich meld mich später oder morgen/die Tage.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 09 April 2021, 22:14:49
Ja ich habe es verstanden :) Meine Termine sind ja immer ganze Tage. ich denke nochmal drüber nach.

Meine Methode berechnet eigentlich nur die Zeit zum Termin in Sekunden und bildet dann Tage daraus. 00:00 spielt keine Rolle. Das ist natürlich nicht korrekt.

Deine Methode berechnet wirklich die Tage auf 00:00 Uhr bezogen. Ich habe verstanden...
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 09 April 2021, 22:39:53
Zitatich denke nochmal drüber nach.

Zur Hilfe/Unterstützung, macht genau das was ich will (ich weiß da war der Hinweis es mit einem notify umzusetzen falls du mitgelesen hast):

defmod cal_example Calendar ical file ./beispiel.ics 86400
attr cal_example defaultFormat "$T1 $S"
attr cal_example hideOlderThan 0
attr cal_example room Kalender
attr cal_example userReadings t_001_summary:lastUpdate:.* {pc_ce2r($NAME,'0')},\
t_002_summary:lastUpdate:.* {pc_ce2r($NAME,'1')},\
t_003_summary:lastUpdate:.* {pc_ce2r($NAME,'2')},\
t_004_summary:lastUpdate:.* {pc_ce2r($NAME,'3')},\
t_005_summary:lastUpdate:.* {pc_ce2r($NAME,'4')},\
t_001_btime:lastUpdate:.* {pc_cb2r($NAME,'1','1')},\
t_002_btime:lastUpdate:.* {pc_cb2r($NAME,'2','3')},\
t_003_btime:lastUpdate:.* {pc_cb2r($NAME,'3','5')},\
t_004_btime:lastUpdate:.* {pc_cb2r($NAME,'4','7')},\
t_005_btime:lastUpdate:.* {pc_cb2r($NAME,'5','9')},\
t_001_bdate:lastUpdate:.* {pc_cd2r($NAME,'1','0')},\
t_002_bdate:lastUpdate:.* {pc_cd2r($NAME,'2','2')},\
t_003_bdate:lastUpdate:.* {pc_cd2r($NAME,'3','4')},\
t_004_bdate:lastUpdate:.* {pc_cd2r($NAME,'4','6')},\
t_005_bdate:lastUpdate:.* {pc_cd2r($NAME,'5','8')},\
t_001_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'0')},\
t_002_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'1')},\
t_003_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'2')},\
t_004_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'3')},\
t_005_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'4')},\
test {my $zeit=fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1);;\
             if (!defined $zeit) {$zeit=0}\
my $day = int(($zeit + 86399 - time)/86400);;\
             $day?eval{$day>1?$day:"morgen"}:"heute"},

setstate cal_example triggered
setstate cal_example 2021-04-09 22:32:44 lastUpdate 2021-04-09 22:32:42
setstate cal_example 2021-04-09 22:32:44 nextUpdate 2021-04-10 04:32:42
setstate cal_example 2021-04-09 22:32:44 nextWakeup 2021-04-09 23:00:00
setstate cal_example 2021-04-09 22:32:44 state triggered
setstate cal_example 2021-04-09 22:32:44 t_001_bdate 09.04.2021
setstate cal_example 2021-04-09 22:32:44 t_001_btime 22:00
setstate cal_example 2021-04-09 22:32:44 t_001_daysleft 0
setstate cal_example 2021-04-09 22:32:44 t_001_summary Löffel
setstate cal_example 2021-04-09 22:32:44 t_002_bdate 10.04.2021
setstate cal_example 2021-04-09 22:32:44 t_002_btime 14:00
setstate cal_example 2021-04-09 22:32:44 t_002_daysleft 1
setstate cal_example 2021-04-09 22:32:44 t_002_summary Badeschaum
setstate cal_example 2021-04-09 22:32:44 t_003_bdate 11.04.2021
setstate cal_example 2021-04-09 22:32:44 t_003_btime 12:00
setstate cal_example 2021-04-09 22:32:44 t_003_daysleft 2
setstate cal_example 2021-04-09 22:32:44 t_003_summary Sonntag
setstate cal_example 2021-04-09 22:32:44 t_004_bdate 15.04.2021
setstate cal_example 2021-04-09 22:32:44 t_004_btime 15:00
setstate cal_example 2021-04-09 22:32:44 t_004_daysleft 6
setstate cal_example 2021-04-09 22:32:44 t_004_summary Kadur
setstate cal_example 2021-04-09 22:32:44 test heute


##############################################
# $Id: Abfall_myUtils.pm 7900 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;

sub Calendar_Utils_Initialize {
  my $hash = shift//return;
  return;
}

# Enter you functions below _this_ line.

sub au_nwd {
my $NAME = shift;
my $var1 = int((fhem('get '.$NAME.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
return $var1;
}

sub au_nwf {
my $NAME = shift;
my $var1 = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 = int((fhem('get '.$NAME.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my @tonne = split (/ /,$var1);
my $nwd = "$tonne[1]"."_"."$var2";
return $nwd;
}

sub au_nw {
my $NAME = shift;
my $var1 = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=1',1);
my @tonne = split (/ /,$var1);
return $tonne[1];
}

sub au_nwda {
my $NAME = shift;
my $var1 = fhem('get '.$NAME.' events format:custom="$T1" limit:from=0,count=1',1);
my @dat = split (/ /,$var1);
return $dat[0];
}

sub au_fh {
my $NAME = shift;
my $var1 = ReadingsVal($NAME,"nextWaste","0") =~ "Restabfall/Wertstoffe|Bioabfall"?"1":"0";
return $var1;
}

sub pc_ce2r {
    my $NAME = shift;
    my $index = shift;
    my $t = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=5',1);
    my @a= split("\n",$t);
    my $ii = sprintf("t_%03.0f", $index + 1);
    if (!defined $a[$index]) {
       fhem("deletereading $NAME ".$ii."_summary");
       return;
    }
    return $a[$index];
}

sub pc_cb2r {
    my $NAME = shift;
    my $ii = shift;
my $aindex = shift;
$ii = sprintf("t_%03.0f", $ii);
    my $t = fhem('get '.$NAME.' events format:custom="$T1" limit:from=0,count=5',1);
$t =~ s/\n/ /g;
    my @a = split (/ /,$t);
    if (!defined $a[$aindex]) {
       fhem("deletereading $NAME ".$ii."_btime");
       return;
    }
    return $a[$aindex];
}

sub pc_cd2r {
    my $NAME = shift;
    my $ii = shift;
my $aindex = shift;
$ii = sprintf("t_%03.0f", $ii);
    my $t = fhem('get '.$NAME.' events format:custom="$T1" limit:from=0,count=5',1);
$t =~ s/\n/ /g;
    my @a = split (/ /,$t);
    if (!defined $a[$aindex]) {
       fhem("deletereading $NAME ".$ii."_bdate");
       return;
    }
    return $a[$aindex];
}

sub pc_cnd2r {
    my $NAME = shift;
my $index = shift;
my $t = fhem('get '.$NAME.' events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=0,count=5',1);
    my @a = split (/\n/,$t);
    my $ii = sprintf("t_%03.0f", $index + 1);
    if (!defined $a[$index]) {
       fhem("deletereading $NAME ".$ii."_daysleft");
       return;
    }
return (time_str2num($a[$index]) - time_str2num(strftime('%F 00:00:00',localtime(time))))/86400;
}
1;


Es geht nur um pc_cnd2r ganz unten in der myUtils.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 09 April 2021, 22:55:02
Ich hatte noch eine Idee
{my $t = fhem('get AbfallKalender events format:custom="$t1" limit:from=0,count=1');;$t=int($t/86400) - int(time/86400);;return $t}
aber das funktioniert nur bei UTC.
Deine Variante bezieht Zeitzone und Sommerzeit ein: korrekt und ich denke geht nicht kürzer. Warum auch, ist doch nachvollziehbar. ;)
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 12 April 2021, 20:02:01
Zitateinen lichten Moment

aber nur was das rechnen anging (von 00:00 bis 00:00 Uhr), was die wirklich verbleibenden Tage angeht muss man wieder einen Tag abziehen  8):

Zitatsub pc_cnd2r {
    my $NAME = shift;
   my $index = shift;
   my $t = fhem('get '.$NAME.' events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=0,count=5',1);
    my @a = split (/\n/,$t);
    my $ii = sprintf("t_%03.0f", $index + 1);
    if (!defined $a[$index]) {
       fhem("deletereading $NAME ".$ii."_daysleft");
       return;
    }
   return (time_str2num($a[$index]) - time_str2num(strftime('%F 00:00:00',localtime(time))-86400))/86400;
}

edit: stimmt nicht, ich hab immer noch irgendwas nicht verstanden
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 12 April 2021, 20:28:01
jetzt kann ich Dir nicht folgen, Du willst die Tage bis zu den nächsten 5 Terminen ermitteln?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 12 April 2021, 22:32:21
Das macht ja schon die myUtils die ich gezeigt habe.

Mein Verständnisproblem liegt (meine Vermutung und werd ich mich mit beschäftigen) am Aktualisierungsintervall (hier 86400), das, so wie ich meine bisher verstanden zu haben (aber ich gebe zu noch nicht wirklich nachvollzogen/verstanden zu haben) dann auch kurz nach/um 00:00 Uhr zu erfolgen hat und nicht 86400 Sekunden nach der Definition ?

Vermute onCreateEvent könnte Abhilfe schaffen, habs aber noch nicht ausprobiert/auch noch nicht verstanden  8) ? => wie gesagt werd mich mit befassen.

Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 12 April 2021, 23:13:44
Das Aktualisierungsintervalll hat nichts mit dem Kalender zu tun - wenn er sich nicht ändert. Im Falle Abfall lese ich nur einmal.
Wenn allerdings nichts passiert (im Kalender) dann gibt es auch keine Events und es wird nichts neu berechnet. Das aber mit der Aktualisierung zu umschiffen finde ich "dünn"  :D
Wenn man täglich was aktualisieren muss, muss man es triggern und dabei den Zeitpunkt richtig wählen.
Wenn man früh um 4 neu berechnet muss es für den Tag stimmen.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 13 April 2021, 15:04:41
ZitatIm Falle Abfall lese ich nur einmal.

Und wie machst du das nur einmal lesen ?

In der Doku steht:
ZitatDer optionale Parameter interval bestimmt die Zeit in Sekunden zwischen den Updates. Default-Wert ist 3600 (1 Stunde).
Eine Intervallangabe von 0 ist nicht erlaubt. Diese wird automatisch durch den Standardwert 3600 ersetzt und im Log protokolliert.

=> versteh ich so: wenn ich den Parameter weglasse alle Stunde gelesen wird. Nur einmal im Jahr kann ich mir nach meinem bisherigen Verständnis mit einem Wert größer als  Jahr (31536000) vorstellen, weil dann wird nur einmal gelesen bei der Definition, macht bei der Tonne aber ja auch keinen Sinn, den erstellst ja nach etwa einem Jahr neu ?

ZitatWenn man täglich was aktualisieren muss, muss man es triggern und dabei den Zeitpunkt richtig wählen.
Wenn man früh um 4 neu berechnet muss es für den Tag stimmen.

trigger für nextWakeup ist doch immer der Startzeitpunkt des nächsten Termin, mein ich bis jetzt so verstanden zu haben, dann gibts doch auch Events für die Berechnung (von bspw. userReadings). Für normale Termine doch ausreichend oder nicht, da gibts doch keinen Bedarf den richtigen Zeitpunkt für einen trigger zu wählen.
Und beim Abfall musss man sich dazu doch auch keine Gedanken machen wenn der Startzeitpunkt um 00:00 gesetzt ist (oder sagen wir zw. 00:00-04:00).

Und was meine Aussage mit dem abziehen eines Tages  betrifft kann ich das dooferweise heute nicht wieder nachvollziehen, Fakt ist am FTUI-Tablet (das hat ab und an WLAN-Probleme, darum Wert evt. nicht aktualisiert) wurden gestern 3 verbleibende Tage angezeigt bis zum Mittwoch, statt zwei, was mich gewundert hatte.
Dann bin ich wsl. gleich in die myUtils um einen Tag abzuziehen, statt zuvor mal im Calendardevice zu schauen was dort steht.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 13 April 2021, 23:44:45
sorry - ich habe gelogen. Aber: Ich habe Tagestermine und erzeuge einen halben Tag vorher einen Alarm Event:
attr AbfallKalender onCreateEvent { $e->{alarm}= $e->{start}-43200 }
mit dem Attribute kann man ein update doch komplett verhindern? Wollte ich mal einbauen/testen - wirklich ;)
update none|onUrlChanged
Wird dieses Attribut auf none gesetzt ist, wird der Kalender überhaupt nicht aktualisiert.
Wird dieses Attribut auf onUrlChanged gesetzt ist, wird der Kalender nur dann aktualisiert, wenn sich die URL seit dem letzten Aufruf verändert hat, insbesondere nach der Auswertung von wildcards im define.


Intervall steht bei mir derzeit auf 86400

Ansonsten bin ich immer noch der Meinung: Deine Berechnung stimmt und geht nicht kürzer - habe noch eine andere Methode ausprobiert wird aber viel länger (Zeitzone "berechnen")
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 14 April 2021, 12:46:30
Popcorn-Zeit vorbei, meine es jetzt endlich verstanden zu haben.

Im Rhein-Pfalz-Kreis gibts die Möglichkeit sich die ical-File zu konfigurieren (https://www.rhein-pfalz-kreis.de/kv_rpk/Verwaltung%20&%20Region/Eigenbetrieb%20Abfallwirtschaft/Service%20und%20Beratung/Abfallkalender/)

Mein Fehler war das ich von 0 Uhr bis 0 Uhr ausgewählt hatte, das bedeutet Startzeitpunk war auch Endzeitpunkt  ::)

Wenn ich von 0 Uhr bis 13 Uhr einstelle hab ich das Verhalten was ich möchte, mit der Berechnung die ich vorgeschlagen habe.

Bis 13 Uhr (Endzeitpunkt) bekomme ich Heute (Bioabfall) noch eine 0 zurück (das FTUI-Icon dreht sich bei 0) nach 13 Uhr (nextWakeup) die 7 für Restabfall nächste Woche Mittwoch.

Ich konnts bis jetzt noch nicht testen (weil noch keine 13 Uhr)  :P und ich noch nicht weiß wie man dieses Zeitformat 20211123T230000Z nennt und selbst berechnen kann, im Konfigurator sind nur volle Stunden auswählbar.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 14 April 2021, 12:54:16
Zitat von: TomLee am 14 April 2021, 12:46:30
ich noch nicht weiß wie man dieses Zeitformat 20211123T230000Z nennt
Das ist doch ISO8601 ? Edit: nein nur fast oder so ähnlich  ::) oder doch? Variante
Kann auch beim at verwendet werden https://fhem.de/commandref_DE.html#at
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 14 April 2021, 13:02:41
Nehmen wir die Angaben in der ics vom 21.04.2021

DTSTART:20210420T220000Z
DTEND:20210421T110000Z


Wenn das (YYYY-MM-DDTHH:MM:SS) sein soll, dann komm ich nicht mit, es ist ein Startzeitpunkt von 0 Uhr und Endzeitpunkt von 13 Uhr koniguriert und wird mir auch so in Calendar angezeigt:

21.04.2021 00:00 21.04.2021 13:00 Abfuhrtermin Restabfall/Wertstoffe am 21.04.2021


edit: es wird mir doch weiterhin Bioabfall angezeigt  :-X
Doch es klappt, weiß der Teufel was schon wieder schiefging ich hatte extra FHEMWEB zweimal aktualisiert.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 14 April 2021, 13:08:04
Z steht für UTC :) mit unserer Sommerzeit zwei Stunden zurück

Wird ja aber in Deiner Formel (die ich mal probiert hatte) durch localtime berücksichtigt!
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 14 April 2021, 14:05:11
Ich habe mal noch folgende (schräge?) Idee probiert:
das userReadings erweitert:
TomLee:trigger:.trigger {my $t = fhem('get '.$name.' events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=0,count=1');
return (time_str2num($t) - time_str2num(strftime('%F 00:00:00',localtime(time))))/86400}


Wenn man jetzt ein
setreading AbfallKalender trigger trigger absetzt, wird genau zu diesem Zeitpunkt das Reading neu berechnet. Der Kalender selbst muss dazu nicht reload oder update machen. 

Edit:
Man kann ein paar Dinge einfach weglassen :)
{return (time_str2num(fhem('get '.$name.' events timeFormat:"%F" format:custom="$T1" limit:from=0,count=1',1)) - time_str2num(strftime '%F',localtime))/86400}
Gerade bemerkt: update none bewirkt nicht, dass nicht im eingestellten Intervall getriggert wird. Eventuell wird der Kalender nicht gelesen?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 14 April 2021, 14:09:09
Ich probiers heute Abend, die Tage an, jetzt kann ich nicht mehr.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 16 April 2021, 17:40:00
Ich habe mir das alles nochmal in Ruhe angeschaut und dabei folgendes ermittelt/getestet:
Wesentlich finde ich die Aussage in der Doku:
ZitatEvents
Wenn der Kalendar neu geladen oder aktualisiert oder eine Alarm-, Start- oder Endzeit erreicht wurde, wird ein FHEM-Event erzeugt:
triggered
Man kann sich darauf verlassen, dass alle Readings des Kalenders in einem konsistenten und aktuellen Zustand befinden, wenn dieses Event empfangen wird.
Das Attribute update hatte ich falsch verstanden, es funktioniert wörtlich wie in der Doku, meint aber Änderungen im Kalender - der Kalender wird quasi nicht mehr eingelesen.
ZitatWird dieses Attribut auf none gesetzt ist, wird der Kalender überhaupt nicht aktualisiert.
Ein set ... update im eingestellten Intervall ist davon nicht betroffen. d.h. steht das Intervall auf 3600 wird weiterhin stündlich getriggert.
Da ich im Abfallkalender lediglich eine Darstellung haben will, werte ich keine Terminevents aus, sondern lese nur Termine aus. Ich will am nachmittag 15:00 Uhr und am Morgen 6:00 einen aktuellen Stand wegen "heute/morgen" haben, der Start des Intervalls ist ja zufällig. Kann man jetzt überlegen und einfach das Intervall auf 4 Stunden setzen, dann passt es immer. Oder man setzt einmal am Tag und synchronisiert mit einem "manuellem" set update (ein at jeden Tag 5:00 Uhr). Mit Abfrage damit es nicht doppelt passiert?
Für die Anzeige habe ich zwei userReadings gemacht:
attr TestKalender userReadings Tonne:triggered {fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1)},\
nextWasteDays:triggered {my $day=(time_str2num(fhem('get '.$name.' events timeFormat:"%F" format:custom="$T1" limit:from=0,count=1',1)) - time_str2num(strftime '%F',localtime))/86400;;\
$day>1?$day:$day?"morgen":"heute"}
mit dieser Abfrage ist aus jetzt egal ob der Termin ein Tagestermin oder ein Stundentermin mitten am Tag ist. Es wird zuverlässig der Abstand in Kalendertagen ermittelt. 1 und 0 werden durch morgen und heute ersetzt.

Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 16 April 2021, 18:16:57
ZitatIch habe mir das alles nochmal in Ruhe angeschaut

Ich noch nicht, ich beschäftige mich damit, Lust aber gleich wieder verloren, weil die Aussage
ZitatDoch es klappt, weiß der Teufel was schon wieder schiefging ich hatte extra FHEMWEB zweimal aktualisiert.
schon wieder Stuss war.
Zitat
Kann man jetzt überlegen und einfach das Intervall auf 4 Stunden setzen,
Ja, vermute das wäre dann die Lösung (bloß keine zusätzliche Definition  ;D)

ZitatIch will am nachmittag 15:00 Uhr und am Morgen 6:00 einen aktuellen Stand wegen "heute/morgen" haben
Wir verstehen uns schon  ;), muss mich aber erst wieder "packen", ich hab eh keine Ruhe bevor ichs nicht irgendwann begriffen habe, das "packen" bleibt aber gerade aus, auch wenn die Lösung wsl. schon präsentiert hast.

Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 17 April 2021, 00:19:59
Zitat von: TomLee am 16 April 2021, 18:16:57
(bloß keine zusätzliche Definition  ;D)
Ich weiß nicht ob man das darf? :) noch ein userReadings ;)
sync:triggered {my $t='05:00:00';if (ReadingsVal($name,'nextUpdate','') !~ $t) {fhem("defmod a_$name at $t set $name update");'define'} else {'done'}}
Die Idee dahinter: Zu einem beliebigen Zeitpunkt wird der Kalender definiert und ein initiales update gemacht (neustart fhem) dadurch wird ein einmaliges at zum festgelegten Zeitpunkt ($t='05:00:00') definiert und dadurch ein update zu dieser Zeit ausgeführt. Ab da triggert der Kalender selbständig zu diesem Zeitpunkt einmal am Tag (86400).
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 17 April 2021, 23:37:09
Immer noch nicht wirklich mit beschäftigt  8), mir ist aber nebenbei aufgefallen dass das Array gar nicht nötig ist in den pc_...-Funktionen aus #91.

Was ich gerne dazu wüsste wie man den Vergleich eq undef richtig macht ?

Sowas klappt bspw. problemlos, hab ich geprüft:

{return fhem(q(get cal_example events format:custom="$S" limit:from=1,count=1)) eq undef ? 'ja' : 'nein'}

Bin mir aber wie gesagt unsicher ob der Vergleich mit dem Operator eq korrekt umgesetzt wäre ?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 18 April 2021, 00:20:15
Naja was auch cool ist, dafür den // Operator zu verwenden:
{my $zeit=ReadingsVal('global','willi',undef) // 0}

{fhem(q(get cal_example events format:custom="$S" limit:from=1,count=1)) // 'ja' }
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 18 April 2021, 00:25:20
Klappt aber nicht (Kommandozeile);
{my $NAME = 'cal_example';;
my $index = '1';;
my $t = fhem('get '.$NAME.' events format:custom="$S" limit:from='.$index.',count='.$index,1);;
my $ii = sprintf("t_%03.0f", $index);;
if ($t // undef) {fhem("deletereading $NAME ".$ii."_summary");;
return;;}
return $t;;}


Meine Variante mit eq schon:

{my $NAME = 'cal_example';;
my $index = '1';;
my $t = fhem('get '.$NAME.' events format:custom="$S" limit:from='.$index.',count='.$index,1);;
my $ii = sprintf("t_%03.0f", $index);;
if ($t eq undef) {fhem("deletereading $NAME ".$ii."_summary");;
return;;}
return $t;;}


edit: Ok, da war ich zu schnell und habs nicht richtig nachvollzogen das natürkich Quatsch $t // undef und du hast mich nicht verstanden
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 18 April 2021, 00:51:17
Mir war nicht klar ob Dir ja oder nein wichtig war  ;D ;D ;D
Für ja ist meine Lösung gut, für nein nicht ;)
Aber ich denke sowas geht ?
{my $NAME = 'cal_example';;
my $index = '1';;
my $ii = sprintf("t_%03.0f", $index);;
my $t = fhem('get '.$NAME.' events format:custom="$S" limit:from='.$index.',count='.$index,1) // fhem("deletereading $NAME ".$ii."_summary");;
return $t}

Zumindest funktioniert das:
{my $zeit=ReadingsVal('global','willi',0) // fhem("list global state")}
{my $zeit=ReadingsVal('global','willi',undef) // fhem("list global state")}


Logical Defined-Or hier suchen https://perldoc.perl.org/perlop
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 18 April 2021, 12:10:50
Mein Gedanke war ich kann mir in diesem Code (der macht was er soll) das Array sparen:

t_001_summary:triggered {pc_ce2r($NAME,'0')},
t_002_summary:triggered {pc_ce2r($NAME,'1')},
t_003_summary:triggered {pc_ce2r($NAME,'2')},
t_004_summary:triggered {pc_ce2r($NAME,'3')},
t_005_summary:triggered {pc_ce2r($NAME,'4')}


sub pc_ce2r {
    my $NAME = shift;
    my $index = shift;
    my $t = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=5',1);
    my @a= split("\n",$t);
    my $ii = sprintf("t_%03.0f", $index + 1);
    if (!defined $a[$index]) {
       fhem("deletereading $NAME ".$ii."_summary");
       return;
    }
   return $a[$index];
}


Ergebnis ist bei einem vorhandenen Termin ein Reading:
setstate cal_example 2021-04-18 11:55:24 t_001_summary Jalousie


Dein Beispiel mit // mal aussen vor, warum werden mit

t_001_summary:triggered {pc_ce2r($NAME,'1')},
t_002_summary:triggered {pc_ce2r($NAME,'2')},
t_003_summary:triggered {pc_ce2r($NAME,'3')},
t_004_summary:triggered {pc_ce2r($NAME,'4')},
t_005_summary:triggered {pc_ce2r($NAME,'5')}


sub pc_ce2r {
my $NAME = shift;
my $index = shift;
my $t = fhem('get '.$NAME.' events format:custom="$S" limit:from='.$index.',count='.$index,1);
my $ii = sprintf("t_%03.0f", $index);
if ($t eq undef) {fhem("deletereading $NAME ".$ii."_summary");
return;}
return $t;}


5 Readings mit dem einen Termin erstellt ?

setstate cal_example 2021-04-18 11:58:43 t_001_summary Jalousie
setstate cal_example 2021-04-18 11:58:43 t_002_summary Jalousie
setstate cal_example 2021-04-18 11:58:43 t_003_summary Jalousie
setstate cal_example 2021-04-18 11:58:43 t_004_summary Jalousie
setstate cal_example 2021-04-18 11:58:43 t_005_summary Jalousie


Das return; in dem if Zweig
if ($t eq undef) {fhem("deletereading $NAME ".$ii."_summary");
return;}

sollte doch ? verhindern das nichts gemacht wird wenn nicht vorhanden und return $t; nicht mehr ausgeführt wird !?

Es kann nicht daran liegen das $index nicht korrekt übergeben wird, hier mein ich:
my $t = fhem('get '.$NAME.' events format:custom="$S" limit:from='.$index.',count='.$index,1);
weil wenn ich den Termin lösche (kein Termin mehr vorhanden) dann werden die fünf Readings wie gewollt gelöscht.

Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 18 April 2021, 13:21:56
Denkfehler, war der Meinung mit

format:custom="$S" limit:from=1,count=1
format:custom="$S" limit:from=2,count=2
format:custom="$S" limit:from=3,count=3
format:custom="$S" limit:from=4,count=4
...


bekomme ich den 1. den 2. den 3. usw. Termin zurück, da hab ich mich nicht richtig mit beschäftigt.

Und zu dem Vergleich ($var eq undef) wie man den richtig macht mein ich jetzt festgestellt zu haben das man das genauso macht wie in der Funktion mit dem Array nämlich !defined ($t).
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 18 April 2021, 13:32:15
limit:from ist Zeit!
from=[+|-]<timespec> zeigt nur Termine die nach einer Zeitspanne <timespec> ab jetzt enden; Minuszeichen für Termine in der Vergangenheit benutzen; <timespec> wird weiter unten im Attribut-Abschnitt beschrieben.
Aber mit format:custom="$S" limit:from=0,count=5 bekommst Du doch ein Array?
Hast Du doch auch so?
    my $t = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=5',1);
    my @a= split("\n",$t);


Und leere Termine kommen doch dabei nicht zurück? Aber ich verstehe dein gesamt Konstrukt nicht. Ich denke in meinem Kalender genau bis zur nächsten Tonne  ;D
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 18 April 2021, 13:50:35
ZitatAber ich verstehe dein gesamt Konstrukt nicht. Ich denke in meinem Kalender genau bis zur nächsten Tonne

bei den pc_...-Funktionen (#91) gehts auch nicht um die Tonne sondern um die nächsten fünf Termine eines anderen Kalender.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 18 April 2021, 13:56:21
Ok die nächsten 5 sind aber immer 5 es sei den es gibt nur noch weniger.
Das Array hat also 5 Elemente, da kommt ja ein undef gar nicht vor?
Diese Funktion pc_ce2r  - die löscht sich quasi selbst - also das reading welches ermittelt wird?
Warum wird der index Handgesetzt - ein Array kennt doch sein Grenzen.

Steht schon irgendwo was Du erreichen wolltest?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 18 April 2021, 14:38:52
ZitatWarum wird der index Handgesetzt - ein Array kennt doch sein Grenzen.

Weil ich dann für fünf Readings keine fünf Funktionen brauche sondern nur eine, es sollen auch nicht irgendwann mal mehr werden sondern immer nur die nächsten fünf.

Probiers halt aus, was ich mir in #91 ausgedacht habe:

defmod cal_example Calendar ical file ./beispiel.ics 86400
attr cal_example defaultFormat "$T1 $S"
attr cal_example hideOlderThan 0
attr cal_example room Kalender
attr cal_example userReadings t_001_summary:lastUpdate:.* {pc_ce2r($NAME,'0')},\
t_002_summary:lastUpdate:.* {pc_ce2r($NAME,'1')},\
t_003_summary:lastUpdate:.* {pc_ce2r($NAME,'2')},\
t_004_summary:lastUpdate:.* {pc_ce2r($NAME,'3')},\
t_005_summary:lastUpdate:.* {pc_ce2r($NAME,'4')},\
t_001_btime:lastUpdate:.* {pc_cb2r($NAME,'1','1')},\
t_002_btime:lastUpdate:.* {pc_cb2r($NAME,'2','3')},\
t_003_btime:lastUpdate:.* {pc_cb2r($NAME,'3','5')},\
t_004_btime:lastUpdate:.* {pc_cb2r($NAME,'4','7')},\
t_005_btime:lastUpdate:.* {pc_cb2r($NAME,'5','9')},\
t_001_bdate:lastUpdate:.* {pc_cd2r($NAME,'1','0')},\
t_002_bdate:lastUpdate:.* {pc_cd2r($NAME,'2','2')},\
t_003_bdate:lastUpdate:.* {pc_cd2r($NAME,'3','4')},\
t_004_bdate:lastUpdate:.* {pc_cd2r($NAME,'4','6')},\
t_005_bdate:lastUpdate:.* {pc_cd2r($NAME,'5','8')},\
t_001_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'0')},\
t_002_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'1')},\
t_003_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'2')},\
t_004_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'3')},\
t_005_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'4')}


package main;

use strict;
use warnings;

sub Calendar_Utils_Initialize {
  my $hash = shift//return;
  return;
}


# Enter you functions below _this_ line.

sub pc_ce2r {
    my $NAME = shift;
    my $index = shift;
    my $t = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=5',1);
    my @a= split("\n",$t);
    my $ii = sprintf("t_%03.0f", $index + 1);
    if (!defined $a[$index]) {
       fhem("deletereading $NAME ".$ii."_summary");
       return;
    }
    return $a[$index];
}

sub pc_cb2r {
    my $NAME = shift;
    my $ii = shift;
my $aindex = shift;
$ii = sprintf("t_%03.0f", $ii);
    my $t = fhem('get '.$NAME.' events format:custom="$T1" limit:from=0,count=5',1);
$t =~ s/\n/ /g;
    my @a = split (/ /,$t);
    if (!defined $a[$aindex]) {
       fhem("deletereading $NAME ".$ii."_btime");
       return;
    }
    return $a[$aindex];
}

sub pc_cd2r {
    my $NAME = shift;
    my $ii = shift;
my $aindex = shift;
$ii = sprintf("t_%03.0f", $ii);
    my $t = fhem('get '.$NAME.' events format:custom="$T1" limit:from=0,count=5',1);
$t =~ s/\n/ /g;
    my @a = split (/ /,$t);
    if (!defined $a[$aindex]) {
       fhem("deletereading $NAME ".$ii."_bdate");
       return;
    }
    return $a[$aindex];
}

sub pc_cnd2r {
    my $NAME = shift;
my $index = shift;
my $t = fhem('get '.$NAME.' events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=0,count=5',1);
    my @a = split (/\n/,$t);
    my $ii = sprintf("t_%03.0f", $index + 1);
    if (!defined $a[$index]) {
       fhem("deletereading $NAME ".$ii."_daysleft");
       return;
    }
return (time_str2num($a[$index]) - time_str2num(strftime('%F 00:00:00',localtime(time))))/86400;
}
1;


ZitatSteht schon irgendwo was Du erreichen wolltest?

Na in #91 und nicht "erreichen wollte" sondern das klappt so wie vorgesehen schon länger.

Ich dachte halt nur zum Zeitpunkt #108 man könnte sich das ersetzen und splitten des beim Array sparen, aber falsch gelegen.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 21 April 2021, 22:42:46
Hallo Thomas,

ich weiß Du willst keine extra DEF - aber ist das wirklich entscheidend?
Ich habe mal, das was Dein wildes Konstrukt aus userReadings und Sub macht, als Kommando zusammen gefasst. Erstmal einfach steif dreimal untereinander, damit man die Beziehung noch sieht - da wäre also jede Menge Optimierung möglich. ;)
Macht das, das wo Deine Routine macht?
Ich habe nämlich nicht verstanden, warum Du umständlich löschst, man kann doch einfach überschreiben?
Edit: my raus für Warnung weg und Readings vorher löschen.
{
fhem("deletereading TestKalender t00.*");;
my $t = fhem('get TestKalender events format:custom="$S" limit:from=0,count=5',1);;
my @a= split("\n",$t);;
my $i=0;;
for (@a) {fhem("setreading TestKalender t00".$i."_summary $_");;
          $i++;;}

$t = fhem('get TestKalender events format:custom="$T1" limit:from=0,count=5',1);;
@a= split("\n",$t);;
$i=0;;
for (@a) {fhem("setreading TestKalender t00".$i."_btime ".(split ' ' ,$_)[1]);;
          fhem("setreading TestKalender t00".$i."_bdate ".(split ' ' ,$_)[0]);;
          $i++;;}

$t = fhem('get TestKalender events timeFormat:"%F" format:custom="$T1" limit:from=0,count=5',1);;
@a= split("\n",$t);;
$i=0;;
for (@a) {fhem("setreading TestKalender t00".$i."_daysleft ".(time_str2num($_) - time_str2num(strftime('%F',localtime(time))))/86400);;
          $i++;;}
}


Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 21 April 2021, 22:59:49
ZitatIch habe nämlich nicht verstanden, warum Du umständlich löschst, man kann doch einfach überschreiben?

Und wenns keinen keinen ersten, zweiten dritten Termin usw.  gibt ? was dann ? dann sollen die Readings erhalten bleiben ? dann gibts ja auch nix zu überschreiben, deswegen löschh ich sie wieder wenn nicht vorhanden.

Hast den Code (https://forum.fhem.de/index.php/topic,120517.msg1150564.html#msg1150564) mal ausprobiert ?

Da wird bisher nichts gelöscht, aber darum gehts mir ja auch gerade, kein Termin -> kein Reading
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 21 April 2021, 23:18:27
Dein letzter Code

{
my $t = fhem('get cal_example1 events format:custom="$S" limit:from=0,count=5',1);;
my @a= split("\n",$t);;
my $i=0;;
for (@a) {fhem("setreading cal_example1 t00".$i."_summary $_");;
          $i++;;}

my $t = fhem('get cal_example1 events format:custom="$T1" limit:from=0,count=5',1);;
my @a= split("\n",$t);;
my $i=0;;
for (@a) {fhem("setreading cal_example1 t00".$i."_btime ".(split ' ' ,$_)[1]);;
          fhem("setreading cal_example1 t00".$i."_bdate ".(split ' ' ,$_)[0]);;
          $i++;;}

my $t = fhem('get cal_example1 events timeFormat:"%F" format:custom="$T1" limit:from=0,count=5',1);;
my @a= split("\n",$t);;
my $i=0;;
for (@a) {fhem("setreading cal_example1 t00".$i."_daysleft ".(time_str2num($_) - time_str2num(strftime('%F',localtime(time))))/86400);;
          $i++;;}
}


ergibt die Meldung im Log:

2021.04.21 23:13:54 1: PERL WARNING: "my" variable $t masks earlier declaration in same scope at (eval 278681) line 1.
2021.04.21 23:13:54 3: eval: { my $t = fhem('get cal_example1 events format:custom="$S" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_summary $_");           $i++;}  my $t = fhem('get cal_example1 events format:custom="$T1" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_btime ".(split ' ' ,$_)[1]);           fhem("setreading cal_example1 t00".$i."_bdate ".(split ' ' ,$_)[0]);           $i++;}  my $t = fhem('get cal_example1 events timeFormat:"%F" format:custom="$T1" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_daysleft ".(time_str2num($_) - time_str2num(strftime('%F',localtime(time))))/86400);           $i++;} }
2021.04.21 23:13:54 1: PERL WARNING: "my" variable @a masks earlier declaration in same scope at (eval 278681) line 1.
2021.04.21 23:13:54 3: eval: { my $t = fhem('get cal_example1 events format:custom="$S" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_summary $_");           $i++;}  my $t = fhem('get cal_example1 events format:custom="$T1" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_btime ".(split ' ' ,$_)[1]);           fhem("setreading cal_example1 t00".$i."_bdate ".(split ' ' ,$_)[0]);           $i++;}  my $t = fhem('get cal_example1 events timeFormat:"%F" format:custom="$T1" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_daysleft ".(time_str2num($_) - time_str2num(strftime('%F',localtime(time))))/86400);           $i++;} }
2021.04.21 23:13:54 1: PERL WARNING: "my" variable $i masks earlier declaration in same scope at (eval 278681) line 1.
2021.04.21 23:13:54 3: eval: { my $t = fhem('get cal_example1 events format:custom="$S" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_summary $_");           $i++;}  my $t = fhem('get cal_example1 events format:custom="$T1" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_btime ".(split ' ' ,$_)[1]);           fhem("setreading cal_example1 t00".$i."_bdate ".(split ' ' ,$_)[0]);           $i++;}  my $t = fhem('get cal_example1 events timeFormat:"%F" format:custom="$T1" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_daysleft ".(time_str2num($_) - time_str2num(strftime('%F',localtime(time))))/86400);           $i++;} }
2021.04.21 23:13:54 1: PERL WARNING: Use of uninitialized value $t in split at (eval 278681) line 1.
2021.04.21 23:13:54 3: eval: { my $t = fhem('get cal_example1 events format:custom="$S" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_summary $_");           $i++;}  my $t = fhem('get cal_example1 events format:custom="$T1" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_btime ".(split ' ' ,$_)[1]);           fhem("setreading cal_example1 t00".$i."_bdate ".(split ' ' ,$_)[0]);           $i++;}  my $t = fhem('get cal_example1 events timeFormat:"%F" format:custom="$T1" limit:from=0,count=5',1); my @a= split("\n",$t); my $i=0; for (@a) {fhem("setreading cal_example1 t00".$i."_daysleft ".(time_str2num($_) - time_str2num(strftime('%F',localtime(time))))/86400);           $i++;} }


Hab mich nicht weiter mit beschäftigt :-\
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 21 April 2021, 23:21:01
Ok, irgendwo stand in meinem Kopf es geht immer um 5 Termine - falsch verstanden.

Dann einfach ein deletereading TestKalender t00.* in der Runde vornweg? Nicht schön, aber wenn es mal mehr und weniger sind muss es ja sein.

Ja mit der Warnung, da muss einfach das my wieder raus - habe ja gesagt:
ZitatErstmal einfach steif dreimal untereinander, damit man die Beziehung noch sieht

Habe es oben editiert :)
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 21 April 2021, 23:38:44
ZitatDann einfach ein deletereading TestKalender t00.* in der Runde vornweg?

Genau nur das fällt mir zu dem letzten verlinkten Code ein, steif immer löschen und wieder neu anlegen. Aber macht man das so ?

Mit dem deletereading bei dem userReadings-Beispiel war ich bisher der Meinung dass das so korrekt gelöst war, es werden nur die Readings gelöscht zu denen es auch kein Termin mehr gibt.  :-\


Schon irgendwo merkwürdig das wir uns hier Gedanken machen zu einem Thema was mMn. viele gerne hätten aber dann einfach zu CalView greifen, hat sich denn noch nie jemand mit diesem Thema beschäftigt ? Die Tonne ist doch das gleiche, alle greifen aber auf das Modul zurück.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 21 April 2021, 23:49:27
Naja, sicher geht das mit ein paar Zeilen mehr etwas sanfter.  Calview ist doch auch ok? Ich hatte noch nie den Bedarf den Kalender in FHEM darzustellen. Ich will nur Termine verarbeiten.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 01 Mai 2021, 20:50:53
Zitat von: Otto123 am 17 April 2021, 00:19:59
Ich weiß nicht ob man das darf? :) noch ein userReadings ;)
sync:triggered {my $t='05:00:00';if (ReadingsVal($name,'nextUpdate','') !~ $t) {fhem("defmod a_$name at $t set $name update");'define'} else {'done'}}
Die Idee dahinter: Zu einem beliebigen Zeitpunkt wird der Kalender definiert und ein initiales update gemacht (neustart fhem) dadurch wird ein einmaliges at zum festgelegten Zeitpunkt ($t='05:00:00') definiert und dadurch ein update zu dieser Zeit ausgeführt. Ab da triggert der Kalender selbständig zu diesem Zeitpunkt einmal am Tag (86400).

Danke, Otto. Ob man das darf oder nicht, mir passt das ganz  genauso und nicht anders.


Hatte mir jetzt 1 1/2 Tage über das Thema Gedanken gemacht und zu dem Zeitpunkt deines Post nicht registriert wie das gemeint war (dauert immer etwas länger bei mir  ;D  und gestern erst nochmal die letzten Posts gelesen), rd. 1 1/2 Jahre (nach Eröffnung dieses Threads) später hab ich das Gefühl <- ;D das jetzt alles passt.

defmod cal_Abfallkalender Calendar ical file ./Abfall.ics 86400
attr cal_Abfallkalender defaultFormat "$T1 $T2 $S"
attr cal_Abfallkalender devStateIcon 1.Restabfall/Wertstoffe:muelltonne@grey 1.Bioabfall:muelltonne@brown 1.Schadstoffmobil:muelltonne@red 1.Hecken-undBaumschnitt:muelltonne@green
attr cal_Abfallkalender hideOlderThan 1
attr cal_Abfallkalender room Kalender
attr cal_Abfallkalender stateFormat 1:nextWaste\
nextWaste am nextWastedate
attr cal_Abfallkalender userReadings nextWaste:triggered {au_nw($NAME)},\
nextWastedate:triggered {au_nwda($NAME)},\
nextWastedays:triggered {au_nwd($NAME)},\
nextWaste_ftui:triggered {au_nwf($NAME)},\
ftui-hide:triggered {au_fh($NAME)},\
sync:triggered {my $t='05:00:00';;if (ReadingsVal($name,'nextUpdate','') !~ $t) {fhem("defmod a_$name at $t set $name update");;'defined'} else {'done'}}

setstate cal_Abfallkalender 1:Restabfall/Wertstoffe\
Restabfall/Wertstoffe am 05.05.2021
setstate cal_Abfallkalender 2021-05-02 05:00:02 ftui-hide 1
setstate cal_Abfallkalender 2021-05-02 05:00:01 lastUpdate 2021-05-02 05:00:00
setstate cal_Abfallkalender 2021-05-02 05:00:01 nextUpdate 2021-05-03 05:00:00
setstate cal_Abfallkalender 2021-05-02 05:00:02 nextWakeup 2021-05-03 05:00:00
setstate cal_Abfallkalender 2021-05-02 05:00:02 nextWaste Restabfall/Wertstoffe
setstate cal_Abfallkalender 2021-05-02 05:00:02 nextWaste_ftui Restabfall/Wertstoffe_3
setstate cal_Abfallkalender 2021-05-02 05:00:02 nextWastedate 05.05.2021
setstate cal_Abfallkalender 2021-05-02 05:00:02 nextWastedays 3
setstate cal_Abfallkalender 2021-05-02 05:00:02 state triggered
setstate cal_Abfallkalender 2021-05-02 05:00:02 sync done


Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: fiedel am 02 Mai 2021, 09:42:19
Hallo ihr Zwei,

ich hab jetzt hier nicht alles verstanden, aber öfter gelesen "eine Stunde zu viel" und verwendet wurde immer "localtime".
Da dämmert mir was aus der Erinnerung an die Kalenderwoche: Man musste statt localtime gmtime verwenden.
Hilft euch das ggf?  ;)
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 22 Mai 2021, 11:47:03
Otto, das sync userreadings soll jetzt auch ausgelagert werden, mit if /else klappt das problemlos, kannst du mir sagen wie die Syntax genau sein müsste wenn ich es mit dem ternären Operator-if umsetzen wollte, wenn da das defined noch zurückgegeben werden soll?

So:

sub au_sync {
my $NAME = shift;
my $rnu = shift;
my $t='05:00:00';
$rnu !~ $t ? return fhem("defmod a_$NAME at $t set $NAME update"); 'defined' : return 'done';
#if ($rnu !~ $t)
#{fhem("defmod a_$NAME at $t set $NAME update");'defined'}
#else {'done'}
}

kommts beim speichern zu
ERROR:
syntax error at ./FHEM/99_Calendar_Utils.pm line 58, near ");"

Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 22 Mai 2021, 16:57:15
ehrlich gesagt, habe ich da auch schon viel versucht. Mir ist es bisher nur gelungen etwas zurückzugeben. Einen Anweisungsblock ausführen ist mir noch nicht gelungen, ein einzelner Befehl funktioniert.
Wie war das mit der anonymen sub?
Sowas probiert in der Kommandozeile:
{my $ref_sub = sub { my $t = 4+5 ;; return "wahr" };; 1 ? &$ref_sub : 'falsch'}

Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Beta-User am 22 Mai 2021, 18:26:21
Wieso in dem Fall per ternärem Operator?
Match passt => return 'done', sonst einfach weiter....?
Geht doch um Lesbarkeit...
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 22 Mai 2021, 19:21:16
Weiß ich selbst nicht genau.

Seitdem ich das mit dem auslagern (und generell mehr mit Perl beschäftigt habe) gelernt habe und jetzt mal kurz alles überfliege was ich bisher umgesetzt habe (das ist nicht die Welt), gibts, mein ich, nicht einmal die Variante mit if/else.

Entweder ist es mit einem Hash umgesetzt worden oder es ist die if (..){...} if (..){...}-Variante oder die  return ... if ...; return ... if ...;-Variante.

Da ist die ? :- Variante die kürzeste oder ? Evt. war ich erstmal -unbewusst- irritiert von der Else und wollte es darum erstmal damit umsetzen wollte,
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 08 Januar 2022, 18:26:47
Hey Otto oder jeder der weiterhelfen kann/mag,

beim Start von FHEM hab ich noch diese zwei Meldungen, hab ich heute erst bemerkt:

2022.01.08 17:46:12 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.01.08 17:46:12 3: eval: {au_nwd($NAME)}


In der 99_Utils.pm steht das an der Stelle:

14 sub
15 time_str2num($)
16 {
17   my ($str) = @_;
18   my @a;
19   return time() if(!$str);
20   @a = split("[T: -]", $str); # 31652, 110545,
21   return mktime($a[5],$a[4],$a[3],$a[2],$a[1]-1,$a[0]-1900,0,0,-1);
22 }


Im Calendar-Device erfolgt ja der Aufruf der Sub in einem userReadings:

nextWastedays:triggered {au_nwd($NAME)}

Die Definition der Sub:

sub au_nwd {
my $NAME = shift;
my $t = fhem('get '.$NAME.' events timeFormat:"%F" format:custom="$T1" limit:from=0,count=1',1);
my $day=(time_str2num(fhem('get '.$NAME.' events timeFormat:"%F" format:custom="$T1" limit:from=0,count=1',1)) - time_str2num(strftime '%F',localtime))/86400;
return $day;
}


Ich meine das es nicht an der zu frühen Initialisierung des Kalenders liegt wie es hier der Fall war : https://forum.fhem.de/index.php/topic,103238.msg1010494.html#msg1010494 (https://forum.fhem.de/index.php/topic,103238.msg1010494.html#msg1010494)

Ich hab das umgebaut:
sub au_nwd {
my $NAME = shift;
my $t = fhem('get '.$NAME.' events timeFormat:"%F" format:custom="$T1" limit:from=0,count=1',1);
if (!defined $t) {$t=0};
$t=(time_str2num($t) - time_str2num(strftime '%F',localtime))/86400;
# my $day=(time_str2num(fhem('get '.$NAME.' events timeFormat:"%F" format:custom="$T1" limit:from=0,count=1',1)) - time_str2num(strftime '%F',localtime))/86400;
return $t;
}


und die zwei Meldungen kommen weiterhin, kann es mit localtime zusammenhängen das die zu dem Zeitpunkt nicht abgerufen werden kann ?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 08 Januar 2022, 18:45:09
Hi,

ich kann erstmal bestätigen, ich habe die Meldung auch  :-[ mit direktem Verweis auf mein userReadings
Zitat2021.12.06 15:21:29 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2021.12.06 15:21:29 3: eval: {my $day=(time_str2num(fhem('get '.$name.' events timeFormat:"%F" format:custom="$T1" limit:from=0,count=1',1)) - time_str2num(strftime '%F',localtime))/86400;
$day>1?$day:$day?"morgen":"heute"}
ich begebe mich dann mal auf die Suche ...
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 08 Januar 2022, 19:35:37
Nur mal so zur Info, weiß nicht obs was bringt.
Ich hab mal das auf Null setzen bei einer Funktion rausgenommen das die Meldung wieder kommt, mein FHEM braucht etwa 2 Minuten zum starten, das sind die letzten 9 Sekunden:

2022.01.08 19:21:44 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.01.08 19:21:44 3: eval: {au_nwd($NAME)}
2022.01.08 19:21:46 3: SIGNALESP: SimpleWrite_XQ, disable receiver (XQ)
2022.01.08 19:21:46 3: SIGNALESP: StartInit, get version, retry = 0
2022.01.08 19:21:46 2: SIGNALESP: CheckVersionResp, initialized v3.4.4
2022.01.08 19:21:46 3: SIGNALESP: CheckVersionResp, enable receiver (XE)
2022.01.08 19:21:47 2: AttrTemplates: got 256 entries
2022.01.08 19:21:48 2: sduino: CheckVersionResp, initialized v3.4.4
2022.01.08 19:21:48 3: sduino: CheckVersionResp, enable receiver (XE)
2022.01.08 19:21:51 3: sduino: CheckCcpatableResponse, patable: 84
2022.01.08 19:21:52 2: After sleep: done
2022.01.08 19:21:52 1: PERL WARNING: Use of uninitialized value $t in substitution (s///) at ./FHEM/99_Calendar_Utils.pm line 103.
2022.01.08 19:21:52 3: eval: {pc_cb2r($NAME,'1','1')}
2022.01.08 19:21:52 1: PERL WARNING: Use of uninitialized value $t in split at ./FHEM/99_Calendar_Utils.pm line 104.
2022.01.08 19:21:52 3: eval: {pc_cb2r($NAME,'1','1')}
2022.01.08 19:21:53 3: SIGNALESP: CheckCcpatableResponse, patable: 84


Die jetzt angesprochene Meldung kommt also schon 8 Sekunden vor der anderen (sprich vor der Initialisierung des Kalenders).
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 08 Januar 2022, 21:26:42
wenn ich mit attr delay den Kalender um 30 sec verzögere dann kommt die Meldung 30 sec nach "Server started". Sonst kommt sie 10 sec nach "Server started".
Da müsste doch die Utils längst geladen sein?
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 08 Januar 2022, 23:14:03
Kann ich leider nicht so bestätigen, bei mir sinds merkwürdigerweise immer rd. 30 Sekunden ohne viel zu erklären sieht das stark gekürzt bei mir so aus, ich hab extra drei mal getestet und nein ich hab nicht zwischendurch vergessen zu speichern.

# ohne delay 30
2022.01.08 22:45:42 0: Server shutdown
2022.01.08 22:46:39 0: Server started with 451 defined entities (fhem.pl:25359/2021-12-20 perl:5.028001 os:linux user:fhem pid:16712)
2022.01.08 22:47:10 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.01.08 22:47:10 3: eval: {au_nwd($NAME)}
2022.01.08 22:47:18 1: PERL WARNING: Use of uninitialized value $t in substitution (s///) at ./FHEM/99_Calendar_Utils.pm line 103.
2022.01.08 22:47:18 3: eval: {pc_cb2r($NAME,'1','1')}
2022.01.08 22:47:18 1: PERL WARNING: Use of uninitialized value $t in split at ./FHEM/99_Calendar_Utils.pm line 104.
2022.01.08 22:47:18 3: eval: {pc_cb2r($NAME,'1','1')}


# mit delay 30
2022.01.08 22:48:33 1: Server shutdown
2022.01.08 22:49:28 0: Server started with 451 defined entities (fhem.pl:25359/2021-12-20 perl:5.028001 os:linux user:fhem pid:16781)
2022.01.08 22:49:59 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.01.08 22:49:59 3: eval: {au_nwd($NAME)}
2022.01.08 22:50:06 1: PERL WARNING: Use of uninitialized value $t in substitution (s///) at ./FHEM/99_Calendar_Utils.pm line 103.
2022.01.08 22:50:06 3: eval: {pc_cb2r($NAME,'1','1')}
2022.01.08 22:50:06 1: PERL WARNING: Use of uninitialized value $t in split at ./FHEM/99_Calendar_Utils.pm line 104.
2022.01.08 22:50:06 3: eval: {pc_cb2r($NAME,'1','1')


# ohne delay 30
2022.01.08 22:50:48 1: Server shutdown
2022.01.08 22:51:45 0: Featurelevel: 6.1
2022.01.08 22:51:45 0: Server started with 451 defined entities (fhem.pl:25359/2021-12-20 perl:5.028001 os:linux user:fhem pid:16831)
2022.01.08 22:52:15 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.01.08 22:52:15 3: eval: {au_nwd($NAME)}
2022.01.08 22:52:24 1: PERL WARNING: Use of uninitialized value $t in substitution (s///) at ./FHEM/99_Calendar_Utils.pm line 103.
2022.01.08 22:52:24 3: eval: {pc_cb2r($NAME,'1','1')}
2022.01.08 22:52:24 1: PERL WARNING: Use of uninitialized value $t in split at ./FHEM/99_Calendar_Utils.pm line 104.
2022.01.08 22:52:24 3: eval: {pc_cb2r($NAME,'1','1')}


# mit delay 30
2022.01.08 22:53:36 1: Server shutdown
2022.01.08 22:54:31 0: Server started with 451 defined entities (fhem.pl:25359/2021-12-20 perl:5.028001 os:linux user:fhem pid:16904)
2022.01.08 22:55:02 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.01.08 22:55:02 3: eval: {au_nwd($NAME)}
2022.01.08 22:55:09 1: PERL WARNING: Use of uninitialized value $t in substitution (s///) at ./FHEM/99_Calendar_Utils.pm line 103.
2022.01.08 22:55:09 3: eval: {pc_cb2r($NAME,'1','1')}
2022.01.08 22:55:09 1: PERL WARNING: Use of uninitialized value $t in split at ./FHEM/99_Calendar_Utils.pm line 104.
2022.01.08 22:55:09 3: eval: {pc_cb2r($NAME,'1','1')}


# ohne delay 30
2022.01.08 22:55:45 1: Server shutdown
2022.01.08 22:56:48 0: Server started with 451 defined entities (fhem.pl:25359/2021-12-20 perl:5.028001 os:linux user:fhem pid:16952)
2022.01.08 22:57:18 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.01.08 22:57:18 3: eval: {au_nwd($NAME)}
2022.01.08 22:57:27 1: PERL WARNING: Use of uninitialized value $t in substitution (s///) at ./FHEM/99_Calendar_Utils.pm line 103.
2022.01.08 22:57:27 3: eval: {pc_cb2r($NAME,'1','1')}
2022.01.08 22:57:27 1: PERL WARNING: Use of uninitialized value $t in split at ./FHEM/99_Calendar_Utils.pm line 104.
2022.01.08 22:57:27 3: eval: {pc_cb2r($NAME,'1','1')}


# mit delay 30
2022.01.08 22:59:11 1: Server shutdown
2022.01.08 23:00:49 0: Server started with 451 defined entities (fhem.pl:25359/2021-12-20 perl:5.028001 os:linux user:fhem pid:17024)
2022.01.08 23:01:18 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.01.08 23:01:18 3: eval: {au_nwd($NAME)}
2022.01.08 23:01:26 1: PERL WARNING: Use of uninitialized value $t in substitution (s///) at ./FHEM/99_Calendar_Utils.pm line 103.
2022.01.08 23:01:26 3: eval: {pc_cb2r($NAME,'1','1')}
2022.01.08 23:01:26 1: PERL WARNING: Use of uninitialized value $t in split at ./FHEM/99_Calendar_Utils.pm line 104.
2022.01.08 23:01:26 3: eval: {pc_cb2r($NAME,'1','1')}
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 09 Januar 2022, 11:41:52
Moin,

das Problem ist wieder
my $t = fhem('get '.$NAME.' events timeFormat:"%F" format:custom="$T1" limit:from=0,count=1',1);
Der get Befehl liefert beim Calendar Start irgendwas ungültiges und damit kommt der Fehler.
Ich habe mal $t = '2022-01-12 00:00:00';hinter die Zeile gesetzt und der fehler ist weg.

Man müsste also irgendwie verzögern oder einen Ersatzwert machen  :-[ ???

Edit: Wobei ich gerade wieder nicht verstehe. Beim Start liefert der get Befehl eigentlich den richtigen Wert:
Zitatget AbfallKalender events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=43200,count=1 : 2022-01-12 00:00:00
Edit: Ich bin ein Trollo, ich hatte zwei ähnliche Definitionen, die zweite gelöscht und die Meldung ist weg. Ich weiß allerdings jetzt auch nicht mehr woher sie wirklich kam. Ich behaupte mal, der Code liefert keine Fehler:
attr AbfallKalender userReadings nextWasteDays:triggered {\
  my $t = fhem('get '.$name.' events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=43200,count=1',1);;\
  my $day = (time_str2num($t) - time_str2num(strftime('%F 00:00:00',localtime(time))))/86400;;\
  $day? ($day>1 ? $day:"morgen"):"heute"},\
Tonne:triggered {fhem('get '.$name.' events format:custom="$S" limit:from=43200,count=1',1)}


Gruß Otto
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 09 Januar 2022, 12:40:51
Zitat$t = '2022-01-12 00:00:00';

Das kann ich schon wieder bei mir so nicht nachvollziehen, wenn ich das bei mir mache:
if (!defined $t) {$t='2022-01-12 00:00:00'};


Kommt die Meldung mit Zeile 21 weiterhin.

Ich hab jetzt einfach mal zwei Debug-Ausgaben eingebaut, die erste zeigt das in $t sehr wohl der richtige Wert drin steht aber die von localtime wird nicht ins Log geschrieben.
Mach ich was falsch oder ist es bei dir auch so ?

sub au_nwd {
my $NAME = shift // return;
my $t = fhem('get '.$NAME.' events timeFormat:"%F" format:custom="$T1" limit:from=0,count=1',1);
if (!defined $t) {$t=0};
Debug 'hier:'.$t;
my $day=(time_str2num($t) - time_str2num(strftime '%F',localtime))/86400;
Debug 'hierlocaltime'.localtime
# my $day=(time_str2num(fhem('get '.$NAME.' events timeFormat:"%F" format:custom="$T1" limit:from=0,count=1',1)) - time_str2num(strftime '%F',localtime))/86400;
return $day;
}


2022.01.09 12:22:14 0: Server started with 451 defined entities (fhem.pl:25359/2021-12-20 perl:5.028001 os:linux user:fhem pid:32241)
2022.01.09 12:22:46 1: DEBUG>hier:2022-01-12
2022.01.09 12:22:46 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.01.09 12:22:46 3: eval: {au_nwd($NAME)}
2022.01.09 12:22:53 1: PERL WARNING: Use of uninitialized value $t in substitution (s///) at ./FHEM/99_Calendar_Utils.pm line 105.
2022.01.09 12:22:53 3: eval: {pc_cb2r($NAME,'1','1')}
2022.01.09 12:22:53 1: PERL WARNING: Use of uninitialized value $t in split at ./FHEM/99_Calendar_Utils.pm line 106.
2022.01.09 12:22:53 3: eval: {pc_cb2r($NAME,'1','1')}


edit:

Fehler schon erkannt, fehlendes Semikolon, ich teste nochmal.
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 09 Januar 2022, 12:47:17
Beide Werte sind eigentlich vorhanden  ;D

2022.01.09 12:44:13 0: Server started with 451 defined entities (fhem.pl:25359/2021-12-20 perl:5.028001 os:linux user:fhem pid:32656)
2022.01.09 12:44:42 1: DEBUG>hier2022-01-12
2022.01.09 12:44:42 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.01.09 12:44:42 3: eval: {au_nwd($NAME)}
2022.01.09 12:44:42 1: DEBUG>hierlocaltimeSun Jan  9 12:44:42 2022
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: TomLee am 09 Januar 2022, 15:19:04
ZitatIch behaupte mal, der Code liefert keine Fehler:

Einmal noch, dann hab ich auch erstmal keine Lust mehr.

Startest du FHEM auch neu oder machst nur einen reload ?

Hab das jetzt ohne Sub probiert, direkt im userReadings, genauso wie du es gemacht hast, bei mir bleibt die Meldung  :'(

Zitatdefmod cal_Abfallkalender Calendar ical file ./Abfall.ics 86400
attr cal_Abfallkalender comment sync:triggered {my $t='05:00:00';;;;if (ReadingsVal($name,'nextUpdate','') !~ $t) {fhem("defmod a_$name at $t set $name update");;;;'defined'} else {'done'}}\
\
nextWaste:triggered {au_nw($NAME)},\
nextWastedate:triggered {au_nwda($NAME)},\
nextWastedays:triggered {au_nwd($NAME)},\
nextWaste_ftui:triggered {au_nwf($NAME)},\
ftui-hide:triggered {au_fh($NAME)},\
sync:triggered {au_sync($NAME,ReadingsVal($name,'nextUpdate',''))}
attr cal_Abfallkalender defaultFormat "$T1 $T2 $S"
attr cal_Abfallkalender devStateIcon 1.Re.*:muelltonne@grey 1.Bi.*:muelltonne@brown 1.Sch.*:muelltonne@red 1.He.*:muelltonne@green
attr cal_Abfallkalender hideOlderThan 1
attr cal_Abfallkalender room Kalender
attr cal_Abfallkalender stateFormat 1:nextWaste\
nextWaste am nextWastedate
attr cal_Abfallkalender userReadings nextWaste:triggered {au_nw($NAME)},\
nextWastedate:triggered {au_nwda($NAME)},\
nextWaste_ftui:triggered {ReadingsVal($name,'nextWaste','').'_'.ReadingsVal($name,'nextWastedays','')},\
ftui-hide:triggered {au_fh($NAME)},\
sync:triggered {au_sync($NAME,ReadingsVal($name,'nextUpdate',''))},\
test:triggered {my $ctd = fhem('get '.$NAME.' events format:custom="$T1" timeFormat:"%d.%m.%Y" filter:field(summary)=~"Bioabfall"',1);;\
return $ctd;;},\
nextWasteDaysOtto:triggered {my $t = fhem('get '.$name.' events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=0,count=1',1);;\
   Debug 'hier'.$t;;\
   my $day=(time_str2num($t) - time_str2num(strftime ('%F',localtime(time))))/86400;;\
   Debug 'hierlocaltime'.localtime(time);;\
   return $day;;\
   }

setstate cal_Abfallkalender 1:Restabfall/Wertstoffe\
Restabfall/Wertstoffe am 12.01.2022
setstate cal_Abfallkalender 2022-01-09 15:15:11 ftui-hide 1
setstate cal_Abfallkalender 2022-01-09 15:15:11 lastUpdate 2022-01-09 15:15:05
setstate cal_Abfallkalender 2022-01-09 15:15:11 nextUpdate 2022-01-10 15:15:05
setstate cal_Abfallkalender 2022-01-09 15:15:11 nextWakeup 2022-01-10 15:15:05
setstate cal_Abfallkalender 2022-01-09 15:15:11 nextWaste Restabfall/Wertstoffe
setstate cal_Abfallkalender 2022-01-09 15:15:11 nextWasteDaysOtto 3
setstate cal_Abfallkalender 2022-01-09 15:15:11 nextWaste_ftui Restabfall/Wertstoffe_3
setstate cal_Abfallkalender 2022-01-09 15:15:11 nextWastedate 12.01.2022
setstate cal_Abfallkalender 2022-01-09 14:31:51 nextWastedays 3
setstate cal_Abfallkalender 2022-01-09 15:15:11 state triggered
setstate cal_Abfallkalender 2022-01-09 15:15:11 sync defined
setstate cal_Abfallkalender 2022-01-09 15:15:11 test 19.01.2022\
02.02.2022\
16.02.2022\
02.03.2022\
16.03.2022\
30.03.2022\
13.04.2022\
27.04.2022\
11.05.2022\
25.05.2022\
09.06.2022\
22.06.2022\
06.07.2022\
20.07.2022\
03.08.2022\
17.08.2022\
31.08.2022\
14.09.2022\
28.09.2022\
12.10.2022\
26.10.2022\
09.11.2022\
23.11.2022\
07.12.2022\
21.12.2022

2022.01.09 15:15:11 1: DEBUG>hier2022-01-12 00:00:00
2022.01.09 15:15:11 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.01.09 15:15:11 3: eval: {my $t = fhem('get '.$name.' events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=0,count=1',1);
Debug 'hier'.$t;
my $day=(time_str2num($t) - time_str2num(strftime ('%F',localtime(time))))/86400;
Debug 'hierlocaltime'.localtime(time);
return $day;
}
Titel: Antw:[gelöst] Wie die Tage jetzt ohne Komma ?
Beitrag von: Otto123 am 09 Januar 2022, 16:14:51
Zitat von: TomLee am 09 Januar 2022, 15:19:04
Startest du FHEM auch neu oder machst nur einen reload ?
Ich starte FHEM neu.

Ich weiß vor allem nicht was an meinem Code im anderen Calendar wirklich anders war ...