Optimierung meiner Kalendar für TabletUI Darstellung gesucht

Begonnen von sTaN, 20 April 2020, 18:32:22

Vorheriges Thema - Nächstes Thema

sTaN

Hallo liebe Community,

ich wollte mich erst bei diesem Thema einklinken, da ich in den letzten Tagen versucht habe meine FHEM Installation zu optimieren und Engpässe zu lokalisieren, habe mich aber doch für einen eigenen Thread entschieden, da es ggf. doch sehr umfangreich ist. Ich hoffe es schreckt nicht ab zu Supporten, da ich es auch gleich als Anleitung für Andere dienen soll.

Ich hatte vor ein paar Tagen perfmon angeschmissen und musste feststellen, dass mein Calendar Modul neben Sonos und Max der größte Knackpunkt ist und für diverse Timeouts und weitere Probleme sorgt.

Zum Beispiel immer Nachts um 2 Uhr ist es besonders tragisch und sorgt dafür, dass z.B. mein harmonyhub und huebridge auf disconnect gehen bzw. nicht erreichbar sind. Was um die Uhrzeit nicht weiter dramatisch ist aber teilweise der Harmony Hub ab diesem Zeitpunkt immer wieder auf disconnect geht (ca. alle 3-20 Minuten) und demzufolge mein Logfile zu müllt:

2020.04.20 02:04:31 1: Perfmon: possible freeze starting at 02:04:28, delay is 3.406
2020.04.20 02:01:28 2: hueBridge1: http request failed: http://192.168.188.204/api/07d74638e634312ffe0e26c1d2bf5e3f/sensors/2: empty answer received
2020.04.20 02:01:28 1: Timeout for WOL_Ping reached, terminated process 25465
2020.04.20 02:01:28 1: Perfmon: possible freeze starting at 02:01:24, delay is 4.034
2020.04.20 02:01:23 1: Perfmon: possible freeze starting at 02:00:10, delay is 73.801
2020.04.20 02:01:23 2: harmonyhub: disconnect
2020.04.20 01:57:35 1: Perfmon: possible freeze starting at 01:57:32, delay is 3.423


Man muss dazu sagen, dass ich die Kalender vor längerer Zeit >3 Jahre eingerichtet habe und deshalb kurz meine Anforderung, wie ich es aktuell einsetze und mein Ziel detailliert aufführen möchte:

Anforderungen:
- privater, beruflicher und gemeinsamer Familien Kalender (alles Google) soll auf einem iPad an der Wand in TabletUI dargestellt werden und nach Möglichkeit auch Terminänderung (gerade berufliche) halbwegs aktuell halten
- Anzeige von Startzeit, Endzeit Termin mit farblicher Unterscheidung
- Daten von heute, morgen und die nächsten 10 Tage (je nach Platz auf dem iPad)
- separate Abfallkalendar Darstellung

aktuelle Umsetzung:
In FHEM existieren 3 Hauptkalender (privater-, beruflicher-, gemeinsamer Google Kalender mit privater ics URL) nach folgender Definition:
define KalenderName Calendar ical url https://calendar.google.com/calendar/ical/.....basic.ics 9999999999
Attributes:
   event-on-change-reading .*
   group      Kalender
   hideLaterThan 10d
   hideOlderThan 1d


Für die 3 Kalender gibt es jeweils ein Notify nach folgendem Schema:
UpdateKalendarNameCalendar at *02:00:00 set KalendarName update

Wobei der größte Kalender, der berufliche Kalender mit vielen Terminen um 02:00 Uhr nachts aktualisiert, der private um 04:00 Uhr Nachts und der gemeinsame Kalender um 05:00 Uhr. Das hatte ich damals nur gemacht, weil es ansonsten immer mein FHEM während der Nutzung lahm legt und hat den für mich großen Nachteil, dass Terminänderungen immer nur einmalig Nachts aktualisiert werden.
Scheinbar ist auch genau das Notify der Knackpunkt, da perfmon immer um 02:00, 04:00 und 05:00 Uhr folgendes signalisiert:

2020.04.20 02:01:23 1: Perfmon: possible freeze starting at 02:00:10, delay is 73.801
2020.04.20 04:00:12 1: Perfmon: possible freeze starting at 04:00:04, delay is 8.132
2020.04.20 04:00:12 1: Perfmon: possible freeze starting at 05:00:06, delay is 10.268


Dann habe ich je Kalender Definition ein CALVIEW device:
defmod vKalenderName CALVIEW KalendarName next 3600
attr vKalenderName maxreadings 10
attr vKalenderName modes next
attr vKalenderName room Kalender
attr vKalenderName timeshort 0


Sowie ein calview_all device um alle Kalendar Einträge für TabletUI in einem device zusammenzufassen:
defmod calview_all CALVIEW KalenderNameBeruflich,KalenderNamePrivat,KalenderNameFamilie next 3600
attr calview_all maxreadings 12
attr calview_all modes next
attr calview_all room Kalender
attr calview_all sourcecolor KalenderNameFamilie:#3fdfe7, KalenderNameBeruflich:#4986e7,KalenderNamePrivat:#16a765
attr calview_all timeshort 1


In TabletUI sieht die Definition wie folgt aus (Tablet Kalender Darstellung siehe Anhang):
<li data-row="2" data-col="1" data-sizex="5" data-sizey="2" class="">
          <header><div data-type="label" class="normal">Termine</div></header>
            <div
                data-type="calview"
                data-device="calview_all"
                data-get="today"
                data-max="5"
                data-detail='["bdate","timeshort","summary","sourcecolor"]'
        data-detailwidth='["20","30","80"]'
        data-dateformat="short"
        data-timeformat="short"
        data-sourcecolor="yes"
                data-showempty="true"
                data-oneline="yes"
                data-class="left-align large top-narrow-10">
            </div>
            <div
                data-type="calview"
                data-device="calview_all"
                data-get="tomorrow"
                data-max="5"
                data-detail='["bdate","timeshort","summary","sourcecolor"]'
        data-detailwidth='["20","30","80"]'
        data-dateformat="short"
        data-timeformat="short"
        data-sourcecolor="yes"
                data-showempty="true"
                data-oneline="yes"
                data-class="left-align large top-narrow-10">
            </div>
            <div
                data-type="calview"
                data-device="calview_all"
                data-get="all"
                data-max="12"
                data-detail='["bdate","timeshort","summary","sourcecolor"]'
        data-detailwidth='["20","30","80"]'
        data-dateformat="short"
        data-timeformat="short"
        data-sourcecolor="yes"
                data-start="notomorrow"
                data-oneline="yes"
                data-class="left-align large top-narrow-10">
            </div>
        </li>


Der Abfall Kalendar hat folgende Definition
define Abfall Kalendar ical url https://calendar.google.com/calendar/ical/.....basic.ics
Attributes:
   event-on-change-reading .*
   group      Kalender
   hideOlderThan 2d
   room       Kalender


Für den Abfall Kalender gibt es ein Notify:
define notAbfalltermine notify Abfall:triggered { Abfalltermine() }

sowie ein Dummy, der für die TabletUI Darstellung verwendet wird:
defmod MuellterminDummy dummy
attr MuellterminDummy room Kalender


Dieser Dummy wird über folgende Funktionen in meiner 99_myUtils.pm gefüttert:
#
# Hilfsfunktion für Kalenderauswertungen
#

sub
KalenderDatum($$)
{
   my ($KalenderName, $KalenderUid) = @_;
   # my $dt = fhem("get $KalenderName start uid=$KalenderUid 1");
   my $dt = fhem('get '.$KalenderName.' events format:custom="$T1" filter:uid=="'.$KalenderUid.'" limit:count=1',1);
   my $ret = time - (2*86400);  #falls kein Datum ermittelt wird Rückgabewert auf "vorgestern" -> also vergangener Termin;

   if ($dt and $dt ne "")
   {
      my @SplitDt = split(/ /,$dt);
      my @SplitDate = split(/\./,$SplitDt[0]);
      $ret = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
   }

   return $ret;
}


#
# Abfall Kalender auswerten / Google Kalender: "Abfall"
#

sub
Abfalltermine()
{
   my $t  = time;
   my @Tonnen = ("GrueneTonne", "GelbeTonne", "Restmuell", "BioTonne");
   my @SuchTexte = (".*Papier.*", ".*Wertstoff.*", ".*Restmüll.*", ".*Bio.*");
   my $uid;
   my $dayDiff;
 
   for(my $i=0; $i<4; $i++)
   {
      $dayDiff = -1; #BUG behoben
      my @uids = split(/;/,fhem("get Abfall find $SuchTexte[$i]"));
       
      # den nächsten Termine finden
      foreach $uid (@uids)
      {
         my $eventDate = KalenderDatum('Abfall', $uid);
         my $dayDiffNeu = floor(($eventDate - $t) / 60 / 60 / 24 + 1);
         if ($dayDiffNeu >= 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1)) #BUG behoben
         {
            $dayDiff = $dayDiffNeu;
         }
      }
       
      fhem("setreading MuellterminDummy $Tonnen[$i] $dayDiff");
   }
}

1;


In TabletUI sieht die Definition wie folgt aus (Tablet Darstellung siehe Anhang):
<li data-row="4" data-col="6" data-sizex="4" data-sizey="1" class="">
          <header><div data-type="label" class="normal">Abfall</div></header>
        <div class="inline top-space large">
              <div data-type="symbol"
                  data-device="MuellterminDummy"
                  data-get="BioTonne"
                  data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
                  data-colors='["SaddleBrown","SaddleBrown"]'
                  data-get-on='["0","2"]'
                  data-background-icon="fa-circle"
                  class="large inline" >
              </div>
              <div data-type="symbol"
                  data-device="MuellterminDummy"
                  data-get="GelbeTonne"
                  data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
                  data-colors='["yellow","yellow"]'
                  data-get-on='["0","2"]'
                  data-background-icon="fa-circle"
                  class="large inline" >
              </div>
              <div data-type="symbol"
                  data-device="MuellterminDummy"
                  data-get="GrueneTonne"
                  data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
                  data-colors='["blue","blue"]'
                  data-get-on='["0","2"]'
                  data-background-icon="fa-circle"
                  class="large inline" >
              </div>
              <div data-type="symbol"
                  data-device="MuellterminDummy"
                  data-get="Restmuell"
                  data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
                  data-colors='["black","black"]'
                  data-get-on='["0","2"]'
                  data-background-icon="fa-circle"
                  class="large inline" >
              </div>
            </div>
        </li>


Ziel/Optimierung:
Wie kann ich meine viel zu hohe Auslastung und aktuell umgesetzten Definitionen und Darstellungen in TabletUI so optimieren, dass ich:
1. meine Termine möglichst noch aktueller als heute habe (aktuell nur eine Aktualisierung 1x am Tag und gerade beruflich ändert sich öfter mal etwas)
2. meine Performance auf ein Minimum reduzieren kann, ohne FHEM Nachts lahm zulegen und ggf. meine anderen Devices negativ zu beeinflussen (siehe harmonyhub und huberdige disconnects
3. meine Abfalltermin Definition optimieren, da sie mir irgendwie umständlich erscheint, da auch der Abfall Kalender eigentlich nur 1x im Jahr aktualisiert wird.

Ich wäre super dankbar für Hilfe. Eventuell hilft meine ausführliche Beschreibung auch gleich anderen für die Umsetzung und kann als Anleitung verwendet werden?

Viele Grüße
sTaN
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

Dr. Boris Neubert

Hallo,

zum einen schlage ich vor, die Verbosity der Calender-Devices auf 5 hochzudrehen und im Log zu sehen, an welcher Stelle des Ablaufs die Verzögerung entsteht. Wenn das nicht klar ersichtlich ist wegen der Verquickung mit dem Calview-Devices nimmst Du diese bitte erstmal raus.

Ich würde außerdem die Aktualisierung der Kalender auf verschiedene Zeitpunkte legen und die einschlägigen Attribute an den Calender-Devices ansehen und verwenden.

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

sTaN

Hallo Boris,

danke für die rasche Rückmeldung!

Die Kalender aktualisieren ja bereits zu unterschiedlichen Zeiten.
1. 02:00 Uhr
2. 04:00 Uhr
3. 05:00 Uhr

Habe in den Kalendern verbose = 5 gesetzt.
Ich habe noch mal fix in die commandref geschaut. Tatsächlich sind mir soeben erst die Attribute:
cutoffOlderThan <timespec>
cutoffLaterThan <timespec>
sowie
ignoreCancelled
aufgefallen  ::)

Ich habe mal die Attribute wie folgt gesetzt:
cutoffOlderThan 1d
cutoffLaterThan 10d
ignoreCancelled 1


Ich bin immer davon ausgegangen, dass die Attribute hideOlderThan 1d und hideLaterThan 10d die überflüssigen Termine von vor einem Tag und >10 Tage wegschneidet. Die scheint aber wohl nicht der Fall und ist sicher ein Grund für die lange Bearbeitungszeit, da er ja immer den ganzen Kalender lädt...
Gecancelte Termine brauche ich auch nicht.

Aber siehst du in der Art und Weise wie ich die Kalender Devices, Calview Devices, Notifys und Funktionen definiert habe als optimal an oder gibt es hier auch etwas zu optimieren?

Danke und Gruß
sTaN
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover