[gelöst] get <Kalender> events: schreibt viele Einträge in Logfile

Begonnen von Gisbert, 21 November 2021, 12:35:30

Vorheriges Thema - Nächstes Thema

Gisbert

Hallo,

ich habe eine Weihnachtsbeleuchtung außen am Haus, die ich automatisch schalte, also nicht nur morgens und abends anhand der Uhrzeit oder Lichtverhältnisse sondern auch einige Tage vor dem 1. Advent bis zur Weihnachtsbaumsammlung - der kluge Mann baut vor :). Das funktioniert auch alles sehr schön, bis auf eine Kleinigkeit. Das folgende userReadings zum Auslesen der Weihnachtsbaumsammlung aus einem vorhandenen Kalender führt dazu, dass jede Minute 2 Einträge in den Logfile geschrieben werden:
Zitatattr <DEVICE> userReadings MuelltonnenKalenderAVEA_Weihnachtsbaumsammlung_date {fhem('get Muelltonnen.Kalender.AVEA events format:custom="$T1" timeFormat:"%d.%m.%Y" filter:field(summary)=~"Weihnachtsbaum"')}
Im Device Muelltonnen.Kalender.AVEA habe ich verbose auf eins und auch mal auf null gesetzt, es wird aber immer fleißig ins Logfile geschrieben.

Hat jemand eine Idee, ggf. work around, wie ich das Schreiben in den Logfile verhindern kann?

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

TomLee

#1
Zitatattr <DEVICE> MuelltonnenKalenderAVEA_Weihnachtsbaumsammlung_date {fhem('get Muelltonnen.Kalender.AVEA events format:custom="$T1" timeFormat:"%d.%m.%Y" filter:field(summary)=~"Weihnachtsbaum"',1)}

?

Zitat von: commandref Perl Specials
Um FHEM-Kommandos in den PERL-Ausdrücken zu verwenden, benutzen Sie bitte die Funktion fhem(), mit einem Textargument. Dieser Text wird als FHEM-Kommando interpretiert.
        Beispiel

{ fhem "set light on" }
define n1 notify piri:on { fhem "set light on" }


Bemerkung: Wenn diese Funktion einen wert zurück liefert, wird dieser in der allgemeinen Logdatei gespeichert.. Benutzen sie "1" als zweites Argument um dieses speichern zu verhindern. Sinnvoll ist dieses Argument bei der Abfrage von Werten mittels "get...".

Gisbert

Hallo TomLee,

das funktioniert schon mal:
- das Reading wird zwar nach wie vor jede Minute geschrieben (das könnte ich auch noch abfangen, ist aber hier nicht interessant)
- das Loggen unterbleibt damit

Könntest du mir kurz erklären, was ",1" macht? Ggf. eine andere Zahl?

Schon mal vielen Dank
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

TomLee

ZitatKönntest du mir kurz erklären, was ",1" macht? Ggf. eine andere Zahl?

Hab ein paar Minuten gebraucht bis ich es gefunden hatte und dann oben ergänzt.

Dass das Reading jede Minute geschrieben wird, würd ich auf jedenfall ändern, komm aber noch nicht ganz mit, weil ein userreadings hast du nicht wirklich gezeigt.

Gisbert

Hallo TomLee,

ich hab's im ersten Beitrag ergänzt.
Ein anderes Reading wird jede Minute erneuert, was dann die userReadings erneuert.

Hier mein gesamtes Konstrukt inkl. eines längeren comments:
defmod Lichterkette.Schaltzeit DOIF (([06:45|8] or [07:30|7]) and ([$SELF:Tage_bis_ersterAdvent] <= 10 or $md le [$SELF:Weihnachtsbaumsammlung]) and sunrise_abs(1130) gt $hms) \
(set Lichterkette on-till {sunrise_abs(2090)}) \
DOELSEIF (sunset_abs(-7200) le $hms and [Lichtstaerke:BH1750_Illuminance]<=15 and ([$SELF:Tage_bis_ersterAdvent] <= 10 or $md le [$SELF:Weihnachtsbaumsammlung])) \
(set Lichterkette on-till {"22:".(42+int(rand(5))).":".(10+int(rand(49)))}) \
DOELSEIF ([02:30])
attr Lichterkette.Schaltzeit alias Schaltzeit Lichterkette
attr Lichterkette.Schaltzeit comment Die Funktion "ersterAdvent" steht in der Datei 99_myUtils.pm.\
Wichtig ist, dass am Anfang "use HTTP::Date;;" definiert werden muss.\
Vorlage siehe: https://forum.fhem.de/index.php/topic,43381.msg\
Die Lichterkette wird damit 10 Tage vor dem 1. Advent eingeschaltet,\
unabhängig davon, auf welches Datum der 1. Advent fällt.\
Wenn keine Jahreszahl angegeben wird, wird das aktuelle Jahr verwendet.\
Damit wird die Differenz Tage_bis_erster_Advent nach dem 1. Advent negativ, also auch kleiner 10,\
womit die Bedingung 1 zum Einschalten der Weihnachtsbeleuchtung erfüllt ist.\
Ab dem 1.1. greift dann die Abfrage des Datum zur Weihnachtsbaumabholung,\
das aus dem Abfallkalender für das neue Jahr extrahiert wird.\
Für einen Vergleich mit $md, wird ein Format mm-dd benötigt,\
welches üblicherweise auch noch in Gänsefüßchen steht, also so: "mm-dd".\
Ein entsprechends userReading liefert mm-dd, welches in der Abfrage - wie es scheint -\
ohne Gänsefüßchen verwendet werden kann.\
Aus dem Kalender Muelltonnen.Kalender.AVEA kann man das Datum der Weihnachstbaumabholung/sammlung auslesen:\
https://forum.fhem.de/index.php/topic,117822.msg1122448.html#msg1122448\
Auf dieses Datum wurden noch 2 Tage dazu addiert, da die Nachbarschaft auch noch ihre Lichter an hatte.\
Was auch gehen würde:\
Durch timeFormat :"%m-%d" (in der Kalenderabfrage) könnte man sofort das Ergebnis mm-dd erhalten.\
Update vom 21.11.2021:\
Durch die Eventabfrage im userReading werden jede Minute 2 Einträge in den logfile geschrieben.\
Dies kann verhindert werden (https://forum.fhem.de/index.php/topic,124284.msg1188390.html#msg1188390), wenn "1" als 2. Argument benutzt.
attr Lichterkette.Schaltzeit devStateIcon .*:fts_shutter_1w_0
attr Lichterkette.Schaltzeit do always
attr Lichterkette.Schaltzeit icon FS20.off
attr Lichterkette.Schaltzeit room HomeHM
attr Lichterkette.Schaltzeit userReadings Tage_bis_ersterAdvent {round((str2time(ersterAdvent) - time)/86400,2)},\
MuelltonnenKalenderAVEA_Weihnachtsbaumsammlung_date {fhem('get Muelltonnen.Kalender.AVEA events format:custom="$T1" timeFormat:"%d.%m.%Y" filter:field(summary)=~"Weihnachtsbaum"',1)},\
Weihnachtsbaumsammlung {substr(ReadingsVal($name,'MuelltonnenKalenderAVEA_Weihnachtsbaumsammlung_date','01'),3,2)."-".\
(substr(ReadingsVal($name,'MuelltonnenKalenderAVEA_Weihnachtsbaumsammlung_date','12'),0,2)+2)}


Viele Grüße
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

TomLee

Ich hätte folgenden Vorschlag es mit setreading aus userReadings im Kalender-Device umzusetzen:

Wie das str2time(ersterAdvent) bei dir klappen soll hab nicht verstanden, musst du wissen.
Es ist alles frei raus aus dem Kopf und nicht getestet, gelernt hab ich das von/mit Otto, wenns nicht gleich klappt, bitte damit erstmal beschäftigen, wär ein Wunder bei mir das es gleich funzt und der große Erklärer bin ich auch nicht.
Wenn jemand gleich einen Denkfehler findet, dann raus damit.
Nach dem set $NAME update bin ich mir unsicher ob nicht ein sleep gebraucht wird bis die Daten da sind und dann erst die setreadings ausgeführt werden sollen oder es anders gelöst werden sollte !?

Der Kalender stell ich mir vor wird im Intervall von 86400 aktualisiert/upgedated ( auch wenn man das beim Abfallkalender eigentlich nicht braucht, aber du für täglich aktualisierte Readings in deinem DOIF).
Mit der Definition des ATs und dem nicht matchen erreicht man das jeden Tag um 5 Uhr die Readings aktualisiert werden und das nur einmal am Tag.
Eigentlich gehörts am Ende ausgelagert.


sync:triggered {
my $rnu = ReadingsVal($NAME,'nextUpdate','');
my $t = '05:00:00';
my $dn = 'Lichterkette.Schaltzeit';
my $dta = round((str2time(ersterAdvent) - time)/86400,2);
my $ctd = fhem('get '.$NAME.' events format:custom="$T1" timeFormat:"%d.%m.%Y" filter:field(summary)=~"Weihnachtsbaum"',1);
my $ct = substr($ctd,3,2)."-".(substr($ctd,0,2)+2);

if ($rnu !~ $t)

{fhem("defmod a_$NAME at $t set $NAME update; setreading $dn Tage_bis_ersterAdvent $dta;setreading $dn MuelltonnenKalenderAVEA_Weihnachtsbaumsammlung_date $ctd ;setreading $dn Weihnachtsbaumsammlung $ct");
'defined'}

else {'done'}
}

TomLee

Wenn ich weiter darüber nachdenke gefallen mir die Readings im Kalender-Device besser/dort passender:

attr Muelltonnen.Kalender.AVEA userReadings sync:triggered {\
my $rnu = ReadingsVal($NAME,'nextUpdate','');;\
my $t = '05:00:00';;\
if ($rnu !~ $t)\
{fhem("defmod a_$NAME at $t set $NAME update");;'defined'}\
else {'done'}},\
Tage_bis_ersterAdvent:triggered {\
my $dta = round((str2time(ersterAdvent) - time)/86400,2);;\
return $dta;;},\
MuelltonnenKalenderAVEA_Weihnachtsbaumsammlung_date :triggered {\
my $ctd = fhem('get '.$NAME.' events format:custom="$T1" timeFormat:"%d.%m.%Y" filter:field(summary)=~"Weihnachtsbaum"',1);;\
return $ctd;;},\
Weihnachtsbaumsammlung:triggered {\
my $ctd = fhem('get '.$NAME.' events format:custom="$T1" timeFormat:"%d.%m.%Y" filter:field(summary)=~"Weihnachtsbaum"',1);;\
my $ct = substr($ctd,3,2)."-".(substr($ctd,0,2)+2);;\
return $ct;;}

Gisbert

Hallo TomLee,

vielen Dank für deinen Vorschlag, der wahrscheinlich ergonomischer mit der Rechenzeit umgeht, allerdings bei mir ??? auslöst.
D.h. ich werde es wohl nicht versuchen umzusetzen, da für mich zu viele unbekannte Konstrukte enthalten sind, die ich später nicht mehr verstehe.
Da du dir mit einem weiteren Beitrag, während ich diesen hier am schreiben bin, Mühe gemacht hast, versuche ich es mal umzusetzen - ich werde dann berichten.

Zur Definition ersterAdvent, der in 99_myUtils.pm steht:
## Datum des 1. Adents
## Es wird das Datum des 1. Advents im laufenden Jahr im folgendem Format erhalten: Sun Nov 29 00:00:00 2020
## https://forum.fhem.de/index.php/topic,43381.msg

sub ersterAdvent {
  my ($jahr) = shift;
  $jahr //= (localtime(time))[5]+1900;
  my $time = str2time("$jahr-12-25");
  my $wday = (localtime($time))[6];
  $wday = $wday ? $wday : 7;
  $time -= ($wday+21)*86400;
  return localtime($time);
}


Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

TomLee

Zitat... versuche ich es mal umzusetzen - ich werde dann berichten.

Zum testen, die Definition aus #6, einfach so wie sie ist in die Kommandozeile werfen oder in den RAW-Editor und anschliessend einmal ein set Muelltonnen.Kalender.AVEA update ausführen, schon sollten die Reading im Kalender-Device angelegt worden sein und ab dann jeden Morgen um 5 Uhr aktualisiert werden.


Gisbert

Hallo TomLee,

es geht sogar noch etwas einfacher.
Da ich den Kalender wiederkehrend abfrage, werden userReadings dann auch neu berechnet.

Damit kann der Code dann so aussehen:
attr Muelltonnen.Kalender.AVEA userReadings Tage_bis_ersterAdvent {\
my $dta = round((str2time(ersterAdvent) - time)/86400,2);;\
return $dta;;},\
MuelltonnenKalenderAVEA_Weihnachtsbaumsammlung_date {\
my $ctd = fhem('get Muelltonnen.Kalender.AVEA events format:custom="$T1" timeFormat:"%d.%m.%Y" filter:field(summary)=~"Weihnachtsbaum"',1);;\
return $ctd;;},\
Weihnachtsbaumsammlung {\
my $ctd = fhem('get Muelltonnen.Kalender.AVEA events format:custom="$T1" timeFormat:"%d.%m.%Y" filter:field(summary)=~"Weihnachtsbaum"',1);;\
my $ct = substr($ctd,3,2)."-".(substr($ctd,0,2)+2);;\
return $ct;;}


$NAME in der 2. Hälfte und die Verknüpfung über Punkte (.) hat nicht funktioniert. Deshalb hab ich den Devicenamen eingetragen.
Der Code läuft bei mir jedenfalls so und damit werden die userReadings nur noch berechnet, wenn das Modul zyklisch (Interval) ausgeführt wird.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

TomLee

Zitat... wenn das Modul zyklisch (Interval) ausgeführt wird.

und dazu ist das sync-userReadings da, dass das zyklisch zu einem festen Zeitpunkt stattfindet (vor dem aufstehen) und nicht irgendwann (zum Zeitpunkt als man das Device mal definiert hatte oder zum Zeitpunkt nach einem restart ).

Mich interessiert trotzdem irgendwie noch was der minütliche Auslöser für die userReadings in dem DOIF war/ist und hab auch versucht das nachzustellen, liegt es daran das der Zweig mit der Abfrage des Helligkeitssensor dafür verantwortlich ist, weil der Helligkeitssensor minütlich ein Event liefert und do always gesetzt ist ?


TomLee

#11
Zum Verständnis mit dem sync-Reading, du hast dich ja offensichtlich mit beschäftigt und verstehst mich jetzt, wenn du ( mit sync-Reading) ein set Muelltonnen.Kalender.AVEA update ausführst, steht zwar erstmal im nextUpdate-Reading die Zeit +24 h (im sync-Reading defined), aber gleichzeitig wurde auch das AT (defined  ;)) definiert (das um 5 Uhr zuschlägt) und ab dann immer ausgeführt wird (im sync-Reading dann immer done steht edit: und in nextUpdate dann immer 5 Uhr).

Gisbert

Zitat von: TomLee am 21 November 2021, 20:18:38
Mich interessiert trotzdem irgendwie noch was der minütliche Auslöser für die userReadings in dem DOIF war/ist und hab auch versucht das nachzustellen, liegt es daran das der Zweig mit der Abfrage des Helligkeitssensor dafür verantwortlich ist, weil der Helligkeitssensor minütlich ein Event liefert und do always gesetzt ist ?
Ja, es war - leider - ein do always gesetzt, was natürlich quatsch ist. Den hatte ich unabhängig davon bemerkt und entfernt.

Das Kalendermodul updated sich selbst nach der gesetzten Intervalzeit. Damit werden die userReadings auch neu berechnet. Wenn das einmal am Tag passiert ist das mehr als ausreichend, denn die Tage vor dem 1. Advent sind viele Tage vorher (ich will schließlich der Erste sein, der die Weihnachtsbeleuchtung an hat) und der Tag der Weihnachtsbaumabholung ist auch ein Tag viele Tage nach Neujahr. Insgesamt kommt es auf einen halben oder ganzen Tag mehr oder weniger hier nicht an.

Ich glaube es ist insgsamt eine bessere Lösung die userReadings im Kalender-Device zu berechnen als im DOIF-Device.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

TomLee

ZitatWenn das einmal am Tag passiert ist das mehr als ausreichend, denn die Tage vor dem 1. Advent sind viele Tage vorher (ich will schließlich der Erste sein, der die Weihnachtsbeleuchtung an hat) und der Tag der Weihnachtsbaumabholung ist auch ein Tag viele Tage nach Neujahr.

Verstehe, wollte es nur erwähnt haben, andere schauen morgen aufs Wandtablet oder sonstwo und erwarten den korrekten Wert.

ZitatIch glaube es ist insgsamt eine bessere Lösung die userReadings im Kalender-Device zu berechnen als im DOIF-Device.

Auch wenns nur "glauben" ist, freut mich die Antwort zu hören (hoffentlich) zum Verständnis geholfen/beigetragen zu haben.

TomLee

Zitat$NAME in der 2. Hälfte und die Verknüpfung über Punkte (.) hat nicht funktioniert. Deshalb hab ich den Devicenamen eingetragen.

Ich kann mir nur vorstellen das hier ein merkwürdiges Zeichen mit dabei war, welches daraus resultiert wenn ich am Android Tablet Code aus der Notizen-App rauskopiere und hier geposted habe, ist mir schon öfter aufgefallen (hab die Leerzeichen in Verdacht).

Sieht genauso aus, sollte aber klappen und wäre dann auch auf Weihnachtsbaumsammlung so zu übertragen :

MuelltonnenKalenderAVEA_Weihnachtsbaumsammlung_date:triggered {my $ctd = fhem('get '.$NAME.' events format:custom="$T1" timeFormat:"%d.%m.%Y" filter:field(summary)=~"Bioabfall"',1);
return $ctd;}


Weiter frage ich mich jetzt, weil ich es eben erst bemerkt habe, warum du in deinem letzten Beispiel die von mir gezeigten trigger weggelassen hast ? Die haben ihren Grund, wenn du mir nicht glaubst, schau dir im Eventmonitor an was abgeht bei einem update, mit und ohne trigger.