57_Calendar.pm: beta-Test der neuen Version

Begonnen von Dr. Boris Neubert, 10 Januar 2016, 16:48:46

Vorheriges Thema - Nächstes Thema

Init

Hallo zusammen,

hier die Logs

FileLog liefert leider nur das:
2016-01-31_15:13:28 myCalendar update
2016-01-31_15:13:35 myCalendar retrieved
2016-01-31_15:14:18 myCalendar lastUpdate: 2016-01-31 15:13:28
2016-01-31_15:14:18 myCalendar nextUpdate: 2016-01-31 18:13:28
2016-01-31_15:14:18 myCalendar triggered
2016-01-31_15:14:18 myCalendar nextWakeup: 2016-01-31 18:13:28


fhemLog:
2016.01.31 15:13:28.959 5: Cmd: >set myCalendar update<
2016.01.31 15:13:28.963 4: Calendar myCalendar: Updating...
2016.01.31 15:13:28.969 4: Calendar myCalendar: Getting data from URL <hidden>
2016.01.31 15:13:28.970 5: Triggering myCalendar (1 changes)
2016.01.31 15:13:35.392 5: Triggering myCalendar (1 changes)
2016.01.31 15:13:35.393 5: Notify loop for myCalendar retrieved
2016.01.31 15:13:35.461 4: Calendar myCalendar: parsing data
2016.01.31 15:14:17.486 4: Calendar myCalendar: merging data
2016.01.31 15:14:18.032 4: Calendar myCalendar: 330 records processed, 0 new, 330 known, 0 modified, 0 changed.
2016.01.31 15:14:18.035 4: Calendar myCalendar: creating calendar events
2016.01.31 15:14:18.146 5: Triggering myCalendar (2 changes)
2016.01.31 15:14:18.148 5: Notify loop for myCalendar lastUpdate: 2016-01-31 15:13:28


Viele Grüße
Marc

Dr. Boris Neubert

Nanu? Die Zeit wird beim Parsen verbracht.

Kannst Du bitte mal im Dir vorliegenden Code von 57_Calendar in der

sub parseSub($$$) {
...
}

ab Zeile 900 die # vor den Debug-Anweisungen main::Debug  wegmachen.

Dann bitte reload 57_Calendar und nochmal den Teil von fhemLog zeigen, den Du gerade gezeigt hast. Der sollte dann Zeilen mit DEBUG> en masse enthalten.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Init

#47
Hallo,

das Log folgt gleich als Datei.

Gruß
Marc


Dr. Boris Neubert

Hallo,

hast Du den Rest bitte auch noch, also bis zu der Zeile:

Calendar myCalendar: 330 records processed, 0 new, 330 known, 0 modified, 0 changed.

Am besten als Anhang.

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Init

#49
Hallo,

hier die Datei...

VG
Marc

Dr. Boris Neubert

OK, Danke.

Das Parsen braucht bei Dir ca. 1 Sekunde pro 200 Zeilen. Bei fast 10.000 Zeilen in der Datei ergibt sich dann die beobachtete Gedenkminute.

Ich muss mir in Ruhe anschauen, wie ich den Durchsatz optimieren kann.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

Zitat von: Dr. Boris Neubert am 31 Januar 2016, 16:19:34
Ich muss mir in Ruhe anschauen, wie ich den Durchsatz optimieren kann.

Das Parsen im nonblocking Teil ausführen? So mache ich das zumindest in meinem GDS Modul, wo ich zeitweise auch recht große Datenmengen verarbeiten muss.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Zitat von: betateilchen am 31 Januar 2016, 16:34:34
Das Parsen im nonblocking Teil ausführen? So mache ich das zumindest in meinem GDS Modul, wo ich zeitweise auch recht große Datenmengen verarbeiten muss.

Die ganze Verarbeitung erfolgt im Callback des Nonblocking-Teils.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

Genau das ist aber das Problem:

callback => \&Calendar_ProcessUpdate,

Calendar_ProcessUpdate() wird doch selbst nicht mehr nonblocking ausgeführt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Zitat von: betateilchen am 31 Januar 2016, 16:46:03
Genau das ist aber das Problem:

callback => \&Calendar_ProcessUpdate,

Calendar_ProcessUpdate() wird doch selbst nicht mehr nonblocking ausgeführt.

Das ist kein Problem. Bevor ich die Auswertung des Kalenders nebenläufig zum Rest des Geschehens mache und mir dabei alle möglichen Konfliktpotentiale einhandele, optimiere ich erst mal die Ablaufgeschwindigkeit der Übersetzung von ical in die interne Struktur (parse).
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Zitat von: Dr. Boris Neubert am 31 Januar 2016, 16:19:34
Das Parsen braucht bei Dir ca. 1 Sekunde pro 200 Zeilen. Bei fast 10.000 Zeilen in der Datei ergibt sich dann die beobachtete Gedenkminute.

Die Anlage jedes VEVENTs in der internen Struktur dauert bei Dir 70ms. Erstaunlich lange.

Bitte versuche es einmal mit der beiliegenden Version. Die habe ich darauf getrimmt, VEVENTs schneller anzulegen und Properties, die mit X- beginnen, zu ignorieren.

Bitte hänge wieder das Log mit den DEBUG-Meldungen an. Dazu musst Du bitte die Debug-Anweisungen wieder aktivieren durch Entfernen der # in parseSub().

Vor dem Release der offiziellen Version werde ich nicht mehr an dieser Aufgabe arbeiten.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Init

Hallo Boris,

anbei das neue LogFile.

Ist es ein großes Problem nach dem Release das Parsing im HttpUtils_NonblockingGet laufen zu lassen?

VG
Marc

betateilchen

Zitat von: Init am 31 Januar 2016, 21:57:52
Ist es ein großes Problem nach dem Release das Parsing im HttpUtils_NonblockingGet laufen zu lassen?

Ja, denn das geht nicht. HttpUtils_NonblockingGet() selbst ist keine Funktion des Calendar-Moduls, deshalb kann darin auch kein Parsen von Kalenderdaten stattfinden, sondern es werden dabei nur die Daten nonblocking vom Server geholt.

Um auch das Parsen nonblocking durchzuführen, ist ein (weiterer) größerer Umbau im Calendar-Modul erforderlich. Da habe ich schon Verständnis für Boris, wenn er sagt, dass er das vor dem offiziellen Release nicht mehr machen wird.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Gerold

Hallo,
Ich nutze einen Kalender des örtlichen Entsorgerbetriebs, der in Auzügen wie folgt aufgebaut ist:


BEGIN:VCALENDAR
PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
VERSION:2.0
METHOD:PUBLISH
X-WR-CALNAME:EBM-Abfuhrtermine
X-WR-TIMEZONE:Europe/Berlin
BEGIN:VTIMEZONE
TZID:Europe/Berlin
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
CREATED:20151215T142544Z
LAST-MODIFIED:20151215T142544Z
DTSTAMP:20151227T200602Z
UID:14512467621@muellmax.de
SUMMARY:EB Restabfall-Tonne
RRULE:FREQ=WEEKLY;UNTIL=20170101T000000Z;INTERVAL=2;BYDAY=TH
RDATE;VALUE=DATE:20151230
RDATE;VALUE=DATE:20160212
RDATE;VALUE=DATE:20160323
RDATE;VALUE=DATE:20160506
RDATE;VALUE=DATE:20160520
RDATE;VALUE=DATE:20161007
RDATE;VALUE=DATE:20161104
EXDATE;VALUE=DATE:20151231
EXDATE;VALUE=DATE:20160211
EXDATE;VALUE=DATE:20160324
EXDATE;VALUE=DATE:20160505
EXDATE;VALUE=DATE:20160519
EXDATE;VALUE=DATE:20161006
EXDATE;VALUE=DATE:20161103
DTSTART;VALUE=DATE:20151231
DTEND;VALUE=DATE:20160101


Termine des Kalenders, welche mit "RDATE" eingefügt sind, werden auch in der neuen Version nicht berücksichtigt.

VG
Gerold

zweiundzwanzig

Zitat von: Dr. Boris Neubert am 28 Januar 2016, 20:06:58
ungetestet:

attr CKalendar onCreateEvent { $e->{alarm}= $e->{start}-AttrVal($e->{location}, "Vorheizzeit", 0) }

$e ist ein Referenz auf ein Hash, welches den Termin darstellt. $e-> dereferenziert das Hash $e->{foo} gibt den Wert zum Schlüssel foo im Hash zurück.

Danke, jetzt habe ich das mit dem Hash verstanden. Wird hier auch ganz gut erklärt:https://wiki.selfhtml.org/wiki/Perl/Hashes Ich dachte immer an sowas wie Prüfsummen.  :o

Kann es sein, dass man so wie in deinem Beispiel gar nicht aus dem onCreateEvent auf AttrVal zugreifen kann? Ich bekomme:
2: Erronenous onCreateEvent { $e->{alarm}= $e->{start}-AttrVal($e->{location}, "Vorheizzeit", 0) }: Undefined subroutine &ICal::Entry::AttrVal called at (eval 5294) line 1.
2x MAX CuBe mit a-culf im Moritzbetrieb
1x MAX CuBe mit a-culf im Homematicbetrieb
60x MAX Heizkörperthermostat plus | 2x HM Schaltaktoren | 1x MAX Wandthermostat
1x FHEM Ubuntu Server auf VMWare
24 Räume, die durch ical Kalender geheizt werden