Servicemeldungen per E-Mail senden

Ein etwas komplexeres Script, um täglich Servicemeldungen per E-Mail zu erhalten

Variablen in HomeMatic-Scripten

Die CCU hatte früher ein Limit von maximal 200 Variablen, das mit Firmware-Version 2.29.18 aufgehoben wurde. Dieses Limit bezog sich auf alle Variablen, die in allen Scripten verwendet werden. Gemeint sind Variablen, die direkt im Script definiert werden: object x; object y; var z;

Wenn Scripte nicht mehr funktionieren und bei der Prüfung unerklärliche Syntax-Fehler auftreten, sollte versuchsweise dieses Programm wieder gelöscht oder deaktiviert werden – oder, noch besser, auf die aktuelle Firmware-Version aktualisiert werden.

Strings in HomeMatic-Scripten

Durch String-Verwendung in HomeMatic-Scripten kann die CCU fehlerhaft arbeiten, instabil werden oder sogar abstürzen. Grundsätzlich gilt: Je öfter mit Strings hantiert wird, desto eher führt dies zu Problemen.

Ich empfehle daher, nach Umsetzung dieser Anleitung die CCU unter Beobachtung zu halten.

String-Verlängerung

In den Scripten auf dieser Seite werden Strings verlängert (x = x # y). Dies führt oft zu Störungen bei der Ausführung von Programmen:

  • Scripte in Programmen werden nicht mehr ausgeführt
  • bei der Fehlerprüfung erscheinen unerklärliche Syntax-Fehler

Durch einen Neustart werden diese Probleme (vorübergehend) behoben. Auch hier hängt die Dauer, bis es zu Störungen kommt, davon ab, wie häufig diese Programmschritte ausgeführt werden.

Man hat ja nicht immer Zeit, die WebUI der CCU aufzurufen, um nach aktuellen Servicemeldungen zu schauen. Darum habe ich mir ein Script gebastelt, das mir täglich die offenen Servicemeldungen per E-Mail zusendet.

Das WebUI-Programm ist sehr einfach aufgebaut: Täglich um 05:05 wird das Script ausgeführt. Fertig.

Die gesamte „Intelligenz“ des Programms steckt im Script, das aufgrund der hinterlegten Meldungen etwas umfangreicher geraten ist.

! HomeMatic-Script
! SERVICEMELDUNGEN PER E-MAIL SENDEN
! http://www.christian-luetgens.de/homematic/e-mail/servicemeldungen/Servicemeldungen.htm

! PSEUDO-ARRAY FÜR GENERISCHE UND KANALSPEZIFISCHE FEHLER
! Feldtenner der Reihe nach: Tab ? ; = :

  string s_servicemeldungen =                
    "ERROR?" #
      "CLIMATECONTROL_VENT_DRIVE="                            # ".:Ventil blockiert:Ventil falsch montiert:Stellbereich zu klein:Batterie leer, Störposition angefahren;" #
      "MOTION_DETECTOR:ROTARY_HANDLE_SENSOR:SHUTTER_CONTACT=" # ".:.:.:.:.:.:.:Sabotage erkannt;" #
      "DIMMER:VIRTUAL_DIMMER="                                # ".:.:.:Lastfehler;" #
      "WINMATIC="                                             # ".:Fehler Drehgriff:Fehler Kippantrieb;" #
      "KEYMATIC="                                             # ".:Fehler einkuppeln:Abbruch Motorlauf\t" #
    "ERROR_OVERHEAT?" #
      ".="                                                    # ".:Überhitzung\t" #
    "ERROR_OVERLOAD?" #
      ".="                                                    # ".:Überlast\t" #
    "ERROR_REDUCED?" #
      ".="                                                    # ".:Last zu gering\t" #
    "ERROR_POWER?" #
      ".="                                                    # ".:Stromversorgung ausgefallen\t" #
    "ERROR_SABOTAGE?" #
      ".="                                                    # ".:Sabotage erkannt\t" #
    "ERROR_BATTERY?" #
      ".="                                                    # ".:Batterie defekt\t" #  
    "STATE?" #
      "WATERDETECTIONSENSOR="                                 # ".:Feuchtigkeit erkannt:Nässe erkannt;" #
      "SMOKE_DETECTOR_TEAM="                                  # ".:Alarm ausgelöst;" #
      "SENSOR_FOR_CARBON_DIOXIDE="                            # ".:CO2-Belastung erhöht:CO2-Belastung stark erhöht\t" #
    "U_SOURCE_FAIL?" #
      ".="                                                    # "Netzteil ausgefallen\t" #
    "USBH_POWERFAIL?" #
      ".="                                                    # "USB-Host deaktiviert\t" #
    "FAULT_REPORTING?" #
      ".="                                                    # ".:Ventil blockiert:Ventil falsch montiert:Stellbereich zu klein:Kommunikationsfehler:.:Batteriestand niedrig:" #
                                                                "Batterie leer, Störposition angefahren\t" #
    "LOWBAT?" #
      ".="                                                    # "Batteriestand niedrig\t" #
    "STICKY_UNREACH?" #
      ".="                                                    # "Kommunikation war gestört\t" #
    "UNREACH?" #
      ".="                                                    # "Kommunikation ist zur Zeit gestört\t" #
    "DEVICE_IN_BOOTLOADER?" #
      ".="                                                    # "Gerät startet neu\t" #
    "UPDATE_PENDING?" #
      ".="                                                    # "Update verfügbar\t" #
    "CONFIG_PENDING?" #
      ".="                                                    # "Konfigurationsdaten stehen zur Übertragung an";

      
! VARIABLEN ... 
! ... DURCH LISTEN ITERIEREN
    
  object o_channel;
  object o_dp;
  object o_al_item;
  string s_al_item;
  string s_error_type;
  integer i_error_param;
  string s_list_1;
  string s_list_2;
  string s_list_3;
  boolean b_found;

! ... MAIL AUFBAUEN
  
  string s_lastdevice;
  string s_device;
  string s_title;
  string s_body;
  string s_subj = "Offene Servicemeldungen";
  integer i_msgcount = dom.GetObject(41).Value();
  
! HAUPTPROGRAMM

if (i_msgcount == 0) {
  s_body = "Keine Servicemeldungen";
} else {
  s_body = i_msgcount # " Servicemeldung(en)";
}

foreach (s_al_item, dom.GetObject(ID_SERVICES).EnumUsedNames()) {
  o_al_item = dom.GetObject (s_al_item);
  if (o_al_item.AlState() == asOncoming) {
    
    s_error_type = s_al_item.StrValueByIndex (".", 1).StrValueByIndex ("-", 0);
    i_error_param = s_al_item.StrValueByIndex (".", 1).StrValueByIndex ("-", 1).ToInteger();
    o_dp = dom.GetObject(o_al_item.AlTriggerDP());
    o_channel = dom.GetObject (o_dp.Channel());
    s_device = o_channel.Name().StrValueByIndex (":", 0);
    if (s_device != s_lastdevice) {
      s_lastdevice = s_device;
      s_title = "\n\n" # s_device;
    }
    b_found = false;
    foreach (s_list_1, s_servicemeldungen) {
      s_list_2 = s_list_1.StrValueByIndex ("?", 0);
      if (s_list_2 == s_error_type) {
        foreach (s_list_2, s_list_1.StrValueByIndex("?", 1).Split(";")) {
          s_list_3 = ":" # s_list_2.StrValueByIndex("=", 0) # ":";
          if ((s_list_3 == ":.:") || (s_list_3.Find (":" # o_channel.HssType() # ":") != -1)) {
            s_list_3 = s_list_2.StrValueByIndex("=", 1).StrValueByIndex(":", i_error_param);
            b_found = (s_list_3 != "");
            if (b_found) {
              s_body = s_body # s_title # "\n  " # s_list_3;
              s_title = '';
            }
          }
        }
      }
    }
    if (!b_found) {
      s_body = s_body # s_title # "\n  " # "MESSAGE NOT DEFINED: " # s_error_type # "/" # o_channel.HssType() # "/" # i_error_param;
      s_title = '';
    }
  }
}


dom.GetObject ("E-Mail.Subject").State (s_subj);
dom.GetObject ("E-Mail.Body").State (s_body);
dom.GetObject ("E-Mail.Versand").State (2);

!  Ende des Scripts

Wenn Sie Doppelpunkte in Gerätenamen verwenden, funktioniert das Script nicht richtig.

Die CCU liefert den Gerätenamen mit Zusatzinformationen zurück, die durch einen Doppelpunkt abgetrennt sind. Das Script verwendet daher nur den ersten Teil des Gerätenamens bis zum (ersten) Doppelpunkt – egal, ob das der Doppelpunkt ist, den Sie selbst als Gerätenamen vergeben haben, oder der Doppelpunkt, den die CCU zur Trennung der Namensbestandteile verwendet.

Das Script lässt sich in vier Abschnitte aufteilen.

Definition von Fehlerzuständen und Texten

Um die Programmlogik übersichtlich zu halten, sind die möglichen Fehlerzustände in einem String definiert.

Es gibt leider keine Arrays in der HomeMatic-Scriptsprache – schon gar keine multidimensionalen. Darum wurstele ich hier mit verschiedensten Trennzeichen herum, um die Pseudo-Arrays voneinander zu trennen.

Der Aufbau ist immer gleich: Zunächst wird ein Datenpunkt definiert. Hat dieser bei verschiedenen Kanälen unterschiedliche Bedeutung, folgt die Definition der Kanäle sowie die zugehörigen Fehlertexte. Universelle Fehlermeldungen kommen ohne Kanaldefinition aus.

Variablen definieren

Variablen können in HomeMatic-Scripten überall definiert werden. Ich fasse sie der Übersichtlichkeit halber dennoch zusammen.

Hauptprogramm

Im Hauptprogramm wird der E-Mail-Text zusammengestellt.

Zunächst wird die Anzahl der Servicemeldungen zum Body hinzugefügt. Danach werden alle Servicemeldungen der Reihe nach abgearbeitet und die zugehörigen Fehlertexte herausgesucht.

Wenn kein Fehlertext gefunden wird, wird die Rohfassung der Servicemeldung ausgegeben – „MESSAGE NOT DEFINED“ in der Status-E-Mail ist ein deutlicher Hinweis darauf, dass im Pseudo-Array was fehlt.

Mailversand

Am Ende wird die E-Mail an das Mini-Framework übergeben und als Status-E-Mail versendet.

Die Servicemeldungen werden von der CCU nach Geräten sortiert – zumindest scheint das recht zuverlässig so zu sein. Ich mache mir das zu Nutze und gruppiere die Servicemeldungen entsprechend.

Bei meiner gut gefüllten CCU 2 dauert die Bearbeitung von 10 Servicemeldungen rund 3-4 Sekunden. Die CCU 1 könnte hier leicht an ihre Grenzen stoßen.

Das Script kann auch im Script-Parser getestet werden, um zu sehen, ob es in annehmbarer Zeit abgearbeitet wird.

Navigation