Hallo ,
ich habe meine iCloud Kalender über das Modul angebunden. Da ich vor kurzem Probleme beim Speicherverbrauch hatte, hatte mir Rudolf geholfen diesen zu analysieren. Das letzte Modul welches jetzt noch extrem(im vergleich zu anderen) viel Speicher verbraucht ist das Kalender Modul
Hier mal ein Auszug vom aktuellen Sepicherverbraucht
fhem> fhemdebug memusage
1. intAt 8888066
2. icloud.kalender 6644916
3. selectlist 1132615
4. CUL_HM 721385
5. HMConfig::culHmRegDefine 647302
6. Abfall 608981
7. teleBot 587734
Unter den Top 7 sind meine beiden Kalender "Abfall" und "icloud.kalender" zu finden.
Bei meiner Analyse habe ich festgestellt dass das Modul alle Ereignisse vom icloud Kalender abruft. Bei mir geht er bis ins Jahr 2015 zurück. Hierbei spielt es auch keine Rolle ob die beiden Attribute "hideLaterThan" und oder "hideOlderThan" gesetzt wurde. Die Anzahl der records processed ist immer gleich groß.
Gibt es eventuell eine andere Möglichkeit nur die Termine in den Speicher zu laden welche sich noch zwischen dem Zeitraum "hideLaterThan" und "hideOlderThan" befinden?
Verbose=5 Log
2017.07.21 10:16:09 4: Calendar icloud.kalender: Wakeup
2017.07.21 10:16:09 4: Calendar icloud.kalender: Updating...
2017.07.21 10:16:10 4: Calendar icloud.kalender: Getting data from URL <hidden>
2017.07.21 10:16:12 4: Calendar icloud.kalender: parsing data asynchronously (PID= 8271)
2017.07.21 10:16:12 5: Calendar icloud.kalender: control passed back to main loop.
2017.07.21 10:16:13 4: Calendar icloud.kalender: got result from asynchronous parsing.
2017.07.21 10:16:13 4: Calendar icloud.kalender: asynchronous parsing finished.
2017.07.21 10:16:13 4: Calendar icloud.kalender: merging data
2017.07.21 10:16:13 4: Calendar icloud.kalender: 1227 records processed, 0 new, 1227 known, 0 modified, 0 changed.
2017.07.21 10:16:13 4: Calendar icloud.kalender: creating calendar events
2017.07.21 10:16:14 4: Calendar icloud.kalender: Checking times...
2017.07.21 10:16:14 3: CALVIEW icloud.kalender.view - CALENDAR:icloud.kalender triggered, updating CALVIEW icloud.kalender.view ...
2017.07.21 10:16:15 4: Calendar icloud.kalender: process ended.
Anbei noch ein list icloud.kalender
Internals:
DEF ical url http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 600
NAME icloud.kalender
NOTIFYDEV global
NR 562
NTFY_ORDER 50-icloud.kalender
STATE triggered
TYPE Calendar
READINGS:
2017-07-21 10:22:30 calname Privat
2017-07-21 10:22:30 lastUpdate 2017-07-21 10:22:26
2017-03-14 08:37:49 modeAlarm
2017-07-21 10:00:00 modeAlarmOrStart XXXXX
2017-03-14 08:37:49 modeAlarmed
2017-07-21 10:06:14 modeChanged
2017-07-20 17:16:14 modeEnd XXXXX
2017-07-20 09:08:46 modeEnded
2017-07-21 10:00:00 modeStart XXXXX
2017-07-21 10:06:14 modeStarted
2017-07-21 10:00:00 modeUpcoming XXXXX
2017-07-21 10:22:30 nextUpdate 2017-07-21 10:32:26
2017-07-21 10:22:31 nextWakeup 2017-07-21 10:32:26
2017-07-21 10:22:30 state triggered
Attributes:
hideLaterThan 20d
hideOlderThan 10
update async
verbose 5
So ich war mal so frei und habe versucht den Speicherbedarf zu reduzieren. Bitte nicht böse sein, soll nur mal als Diskussionsgrundlage dienen.
Wenn ich den Zusatzbefehl zwischen die Zeilen(2438) hier eintrage.
foreach my $v (grep { $_->{type} eq "VEVENT" } @{$root->{entries}}) {
#main::Debug "Merging " . $v->asString();
my $found= 0;
my $added= 0; # flag to prevent multiple additions
Zusatzbefehl
if ($v->tm($v->value("DTEND")) < time() && $v->valueOrDefault("RRULE", "") eq "") {next;}
Dann sieht mein Speicherverbrauche wie folgt aus
1. intAt 2616700
2. icloud.kalender 1113998
12. Abfall 306397
Im Vergleich zu vorher richtig klein. Interessant ist auch das der Bereich "intAt" auch geschrumpft ist.
Anbei noch der komplette Code in diesem Bereich
foreach my $v (grep { $_->{type} eq "VEVENT" } @{$root->{entries}}) {
if ($v->tm($v->value("DTEND")) < time() && $v->valueOrDefault("RRULE", "") eq "") {next;}
#main::Debug "Merging " . $v->asString();
my $found= 0;
my $added= 0; # flag to prevent multiple additions
Hallo Michael,
vielen Dank, dass Du Dir diese Gedanken gemacht hast und auch eine Änderung vorschlägst. Auf den ersten Blick sieht sie plausibel aus. Mir gefällt, dass Dir aufgefallen ist, dass nicht alle Einträge mit DTEND in der Vergangenheit ignoriert werden müssen, sondern nur solche, die sich nicht mit einer Regel potentiell in die Zukunft fortpflanzen.
Kannst Du mit svn diff einen Patch erstellen und hier anfügen?
Viele Grüße
Boris
Zitat von: Dr. Boris Neubert am 24 Juli 2017, 19:21:44
Kannst Du mit svn diff einen Patch erstellen und hier anfügen?
Ich hoffe dass ich das jetzt richtig gemacht habe. Muss mich da noch etwas durch die SVN Geschichten durchkämpfen.
Um weiteren Speicher zu sparen habe ich noch ein Attribut "removevcalender" mit den Werten "0|1" erzeugt. Zusätzlich habe ich die Commandref in DE&EN erweitert und das Attribut gleich beschrieben. Dabei ist mir noch ein Fehler bei der deutschen Beschreibung aufgefallen.
Wenn Du die Änderung bezüglich dem Attribut nicht möchtest kann ich es wieder rausnehmen. Dann würde ich dir einen aktualisierten Patch bereitstellen.
Gruß
Michael
Vielen Dank, Michael.
Ich habe den Patch eingespielt, stilistisch überarbeitet und eingecheckt. Steht somit ab morgen zum Update bereit.
Viele Grüße
Boris
Seit dem heutigen Update bleibt mein Kalender leer.
2017.07.31 08:31:12.516 4 : Calendar Cal_WAB: Updating...
2017.07.31 08:31:12.517 5 : SSL verify mode set to 1
2017.07.31 08:31:12.519 4 : Calendar Cal_WAB: Getting data from URL <hidden>
2017.07.31 08:31:12.961 4 : Calendar Cal_WAB: parsing data asynchronously (PID= 9494)
2017.07.31 08:31:12.963 5 : Calendar Cal_WAB: control passed back to main loop.
2017.07.31 08:31:13.965 4 : Calendar Cal_WAB: got result from asynchronous parsing.
2017.07.31 08:31:13.966 4 : Calendar Cal_WAB: asynchronous parsing finished.
2017.07.31 08:31:13.982 4 : Calendar Cal_WAB: merging data
2017.07.31 08:31:13.982 1 : PERL WARNING: Use of uninitialized value in numeric lt (<) at ./FHEM/57_Calendar.pm line 2442.
2017.07.31 08:31:13.983 1 : stacktrace:
2017.07.31 08:31:13.983 1 : main::__ANON__ called by ./FHEM/57_Calendar.pm (2442)
2017.07.31 08:31:13.983 1 : main::Calendar_UpdateCalendar called by ./FHEM/57_Calendar.pm (2309)
2017.07.31 08:31:13.983 1 : main::Calendar_PollChild called by fhem.pl (3004)
2017.07.31 08:31:13.984 1 : main::HandleTimeout called by fhem.pl (618)
[...]
2017.07.31 08:31:14.055 4 : Calendar Cal_WAB: 0 records processed, 0 new, 0 known, 0 modified, 0 changed.
2017.07.31 08:31:14.056 4 : Calendar Cal_WAB: creating calendar events
2017-07-31 08:31:14.063 Calendar Cal_WAB calname: Mülltermine Sägewerk Gerhard\, Rennerod
2017-07-31 08:31:14.063 Calendar Cal_WAB lastUpdate: 2017-07-31 08:31:12
2017-07-31 08:31:14.063 Calendar Cal_WAB nextUpdate: 2017-08-01 08:31:12
2017.07.31 08:31:14.064 4 : Calendar Cal_WAB: Checking times...
2017-07-31 08:31:14.096 Calendar Cal_WAB triggered
2017-07-31 08:31:14.103 Calendar Cal_WAB nextWakeup: 2017-08-01 08:31:12
2017.07.31 08:31:14.103 4 : Calendar Cal_WAB: process ended.
Der Kalender enthält definitiv Termine und ist nicht leer.
Edit: Scheinbar hat Google heute Probleme. Beim Abrufen der ical-URL im Browser sagt Google Fehler beim Verarbeiten eines Feeds
Zitat von: mahowi am 31 Juli 2017, 08:39:11
Seit dem heutigen Update bleibt mein Kalender leer.
Der Kalender enthält definitiv Termine und ist nicht leer.
Edit: Scheinbar hat Google heute Probleme. Beim Abrufen der ical-URL im Browser sagt Google Fehler beim Verarbeiten eines Feeds
Hi,
um auszuschließen ob es an der Zeile 2442 liegt kannst du diese ja mal mit einem "#" auskommentieren. Dann arbeitet das Modul wieder wie früher. Wenn es danach immer noch nicht geht liegt es sicherlich an deinem Googlekalender.
Nach dem auskommentieren ein "shutdown restart" nicht vergessen
Gruß
Michael
Hallo Michael,
nach Auskommentieren der Zeile 2442 wird der Kalender wieder befüllt. Scheinbar liegt es also doch daran.
Hallo,
ich werde heute abend wieder eine Version ohne diese Zeile einchecken.
Die Zeile enthält eine Heuristik, um Termine zu identifizieren, die nicht mehr relevant sind. Es wäre interessant zu sehen, warum diese bei dem Müllkalender nicht greift.
@Mahowi: kannst Du bitte Deine ical-Datei anhängen?
Viele Grüße
Boris
Kein Problem, ich habe die Datei angehängt.
Zitat von: mahowi am 31 Juli 2017, 10:43:41
Kein Problem, ich habe die Datei angehängt.
Die Termine haben kein Enddatum, wie trägst du diese ein?
Kannst du mal die Zeile 2442 durch folgende ersetzen?
next if ($v->tm($v->valueOrDefault("DTEND"),time()) < time() && $v->valueOrDefault("RRULE", "") eq "");
Die Termine werden automatisch von unserem Abfallunternehmen übernommen. Es gibt eine App (WAB-App), über die ich die Abfalltermine mit dem Google-Kalender synchronisieren kann.
Das Abändern der Zeile hilft leider nicht, es kommen dieselben Fehlermeldungen wie vorher und es werden keine Termine abgeholt.
Zitat von: mahowi am 31 Juli 2017, 11:02:52
Die Termine werden automatisch von unserem Abfallunternehmen übernommen. Es gibt eine App (WAB-App), über die ich die Abfalltermine mit dem Google-Kalender synchronisieren kann.
Das Abändern der Zeile hilft leider nicht, es kommen dieselben Fehlermeldungen wie vorher und es werden keine Termine abgeholt.
Habe jetzt deine .ics Datei mal eingebunden Kannst du mal die Zeile 2442 durch folgendes ersetzen?
if ($v->valueOrDefault("DTEND", "") eq "") {
next if ($v->tm($v->value("DTSTART")+1) < time() && $v->valueOrDefault("RRULE", "") eq "");
}else {
next if ($v->tm($v->value("DTEND")) < time() && $v->valueOrDefault("RRULE", "") eq "");
}
Danke, damit funktioniert es jetzt. :)
Zitat von: Dr. Boris Neubert am 31 Juli 2017, 10:04:20
Hallo,
ich werde heute abend wieder eine Version ohne diese Zeile einchecken.
Die Zeile enthält eine Heuristik, um Termine zu identifizieren, die nicht mehr relevant sind. Es wäre interessant zu sehen, warum diese bei dem Müllkalender nicht greift.
@Mahowi: kannst Du bitte Deine ical-Datei anhängen?
Viele Grüße
Boris
Hi Boris,
mit folgendem Code funktioniert es auch bei dem Benutzer "Mahowi"
if ($v->valueOrDefault("DTEND", "") eq "") {
next if ($v->tm($v->value("DTSTART")+1) < time() && $v->valueOrDefault("RRULE", "") eq "");
}else {
next if ($v->tm($v->value("DTEND")) < time() && $v->valueOrDefault("RRULE", "") eq "");
}
Gruß
Michael
Hallo,
ich habe nun eine überarbeitete Version eingecheckt. Termine werden nur weggeschnitten, wenn das Attribut cutoffOlderThan gesetzt ist. Serientermine und Termine ohne Endedatum werden nicht weggeschnitten. cutoffOlderThan unterscheidet sich von hideOlderThan dadurch, dass die weggeschnittenen Termine gar nicht erst in den Kalender geladen werden, während die mit hideOlderThan versteckten Termine nur nicht angezeigt werden.
Viele Grüße
Boris
Zitat von: Dr. Boris Neubert am 01 August 2017, 20:40:06
Hallo,
ich habe nun eine überarbeitete Version eingecheckt. Termine werden nur weggeschnitten, wenn das Attribut cutoffOlderThan gesetzt ist. Serientermine und Termine ohne Endedatum werden nicht weggeschnitten. cutoffOlderThan unterscheidet sich von hideOlderThan dadurch, dass die weggeschnittenen Termine gar nicht erst in den Kalender geladen werden, während die mit hideOlderThan versteckten Termine nur nicht angezeigt werden.
Viele Grüße
Boris
Funktioniert, danke!