[gelöst] Wie die Tage jetzt ohne Komma ?

Begonnen von TomLee, 24 August 2019, 15:31:52

Vorheriges Thema - Nächstes Thema

Otto123

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

TomLee

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.


Otto123

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

TomLee

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.

TomLee

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

Otto123

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

TomLee

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



Otto123

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

TomLee

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

Otto123

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

TomLee

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

TomLee

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.

TomLee

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

Otto123

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

TomLee

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