Autor Thema: Unnötige triggerung von userReadings in Calendar?  (Gelesen 154 mal)

Offline Otto123

  • Hero Member
  • *****
  • Beiträge: 14299
  • schon mal restore trainiert?
    • Otto's Technik Blog
Unnötige triggerung von userReadings in Calendar?
« am: 08 Januar 2020, 12:17:34 »
Hallo Boris,

Ausgangspunkt war diese Definition:
define AbfallKalender Calendar ical url https://calendar.google.com/calendar/ical/bumf5n64fr8s8f99vlfu06a87k%40group.calendar.google.com/private-058f78026c3b29446a489b2202aa3f53/basic.ics 604800‬
attr AbfallKalender cutoffOlderThan 0
attr AbfallKalender hideOlderThan 0
attr AbfallKalender onCreateEvent { $e->{alarm}= $e->{start}-43200 }
attr AbfallKalender room Abfall
attr AbfallKalender userReadings nextWasteDays {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"},\
Tonne {fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1)}
Damit gibt es bei jedem Neustart von FHEM oder modify zwei Perl Warnmeldungen:
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.
Das Problem scheint die Abfrage von Events zu sein. Wenn ich den Code im userReading so ab ändere:
attr AbfallKalender userReadings 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)}
sieht alles gut aus:
2020.01.08 11:47:39 4: Calendar AbfallKalender: Wakeup
2020.01.08 11:47:39 4: Calendar AbfallKalender: Updating...
2020.01.08 11:47:39 4: Calendar AbfallKalender: Getting data from URL <hidden>
2020.01.08 11:47:40 5: Calendar AbfallKalender: HTTP response code 200
2020.01.08 11:47:40 4: Calendar AbfallKalender: parsing data asynchronously (PID= 1476)
2020.01.08 11:47:40 5: Calendar AbfallKalender: control passed back to main loop.
2020.01.08 11:47:41 4: Calendar AbfallKalender: got result from asynchronous parsing.
2020.01.08 11:47:41 4: Calendar AbfallKalender: asynchronous parsing finished.
2020.01.08 11:47:41 4: Calendar AbfallKalender: merging data
2020.01.08 11:47:41 4: Calendar AbfallKalender: 38 records processed, 38 new, 0 known, 0 modified, 0 changed.
2020.01.08 11:47:41 4: Calendar AbfallKalender: creating calendar events
2020.01.08 11:47:41 4: Calendar AbfallKalender: Checking times...
2020.01.08 11:47:41 4: Calendar AbfallKalender: process ended.
Die userReadings werden mit beiden Codevarianten letztlich immer richtig gesetzt!
Mir scheint es aber, als ob die userReadings nach einem modify mindestens 3 mal getriggert werden, zweimal ohne Erfolg.
Kein wirkliches Problem, aber liegt da noch Optimierungspotential für Deinen Code?
Die Quelle für diese Frage war hier

Liebe Grüße
Otto
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Offline Dr. Boris Neubert

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 4614
  • Are we just self-replicating DNA?
Antw:Unnötige triggerung von userReadings in Calendar?
« Antwort #1 am: 08 Januar 2020, 18:58:17 »
Boah, das ist verwickelt und ich bin schon soooo müde.

Was mir auffällt, ist der rekursive Aufruf von fhem() im userReading. Um herauszufinden, wie da die Trigger-Kaskade aussieht, ist erst mal lange Codebeschau nötig.

Perliger wird das ganze, wenn man get events mit ReturnType aufruft und dann die Werte aus dem Hash pickt.

Ich nehme mir den Punkt mal auf die Merkliste.

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

Offline Otto123

  • Hero Member
  • *****
  • Beiträge: 14299
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:Unnötige triggerung von userReadings in Calendar?
« Antwort #2 am: 08 Januar 2020, 20:56:35 »
Hallo Boris,

hat aus meiner Sicht keine Eile. Und wenn Du mir sagst, wie ich das besser machen sollte wäre das auch toll :)
Ich weiß halt nicht: wie soll ich es anders machen um an die Termine zu kommen?
Ist ja eigentlich so nach Deiner "Vorgabe" ;)

Viele Grüße
Otto
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266