Zum Inhalt

Anwendungsbeispiele

Mail bei niedriger Batterieladung

In diesem Beispielskript wird gezeigt, wie eine tägliche Prüfung der Batterien der Geräte auf der CCU durchgeführt und das Ergebnis als HTML zugeschickt werden kann.

Zunächst muss ein neues Programm angelegt werden, welches über das Zeitmodul so konfiguriert werden sollte, dass es täglich einmal ausgeführt wird. In den Dann-Block muss das unten stehende Skript eingefügt werden.

Note

Damit die Prüfung korrekt erfolgen kann, muss auf der Zentrale ein Gewerk mit dem Namen Batterie betrieben angelegt werden, welchem alle Batterie betriebenen Geräte hinzugefügt werden müssen.

! Warnung über niedrige Batterieladung

! Lösung basierend auf einem Skript von "saschahb"
! http://www.homematic-inside.de/tecbase.html?view=item&item_id=138

var myAssembly = dom.GetObject("Batterie betrieben");
string itemID;
string text = "";
integer counter = 0;

foreach(itemID, myAssembly.EnumUsedIDs())
{
    var item = dom.GetObject(itemID);
    var device = dom.GetObject(item.Device());
    var interface = dom.GetObject(item.Interface());
    string interface_name = interface.Name();
    string device_address = device.Address();
    device_address = device_address.StrValueByIndex(":", 0);

    string channel_name = interface_name # "." # device_address # ":0.LOWBAT";
    string channel_name2 = interface_name # "." # device_address # ":0.LOW_BAT";

    var channel = dom.GetObject(channel_name);
    var channel2 = dom.GetObject(channel_name2);

    if ( (channel.State() == true) && (channel.Value() == true) ) {
        text = text # "- " # item.Name() # "\\r\\n";
        counter = counter + 1;
    }

    if ( (channel2.State() == true) && (channel2.Value() == true) ) {
        text = text # "- " # item.Name() # "\\r\\n";
        counter = counter + 1;
    }
}

if ( counter > 0 ) {
    string MailEmpfaenger = "IhreZielAdresse@gmx.de";
    string MailBetreff = "Batterie - Warnung";
    string MailText;
    string sDate = system.Date("%d.%m.%Y");

    MailText = "Prüfung des Ladestandes der Batterien vom " # sDate # ".\\r\\n";
    MailText = MailText # "Der Ladezustand folgender Batterien ist niedrig: \\r\\n\\r\\n" # text;
    MailText = MailText # "\\r\\nBitte tauschen Sie die Batterien zeitnah aus.";

    string stdout;
    string stderr;
    string teilstr;
    string sendmail = "";
    string sendbetreff = "";
    string mailto = "";

    foreach(teilstr, MailBetreff.Split(" ")) {
        sendbetreff = sendbetreff # "+" # teilstr;
    }

    foreach(teilstr, MailText.Split(" ")) {
        sendmail = sendmail # "+" # teilstr;
    }

    foreach(teilstr, MailEmpfaenger.Split(" ")) {
        mailto = mailto # "+" # teilstr;
    }

    system.Exec ("/bin/sh /etc/config/addons/mh/email.sh "# sendbetreff # " " # sendmail # " " # mailto, &stdout, &stderr);
}

Benachrichtigung bei Servicemeldungen

! Servicemeldungen auslesen, verarbeiten und per Nachricht versenden
! v2.0 (c) by EASY SmartHome GmbH
! https://homematic-forum.de/forum/viewtopic.php?f=31&t=24618&hilit=servicemeldung+all+in+one

!++++++ SETUP ++++++
! Bitte in Ruhe die naechsten Zeilen durcharbeiten

! WITHTIME - Wenn ja, wird die Zeit der Servicemeldung versendet
var WITHTIME = "ja";
! ACCK - Wenn ja, werden Meldungen "Kommunikation war gestoert" bestaetigt
var ACCK = "nein";
! BLOCK - Hier koennen Sie Seriennummern von Geraeten eintragen, welche von diesem Skript ignoriert werden sollen
var BLOCK = "";

!+++++++ Setup CloudMatic Benachrichtigungen ++++++
! ONLYNEW - Wenn ja, werden Benachrichtigungen nur bei neuen Servicemeldungen versendet
var ONLYNEW = "ja";

! USE_EASY_MAIL - Wenn ja, werden die Servicemeldungen per Mail gesendet
var USE_EASY_MAIL = "ja";
! MAIL_EMPFAENGER - Hier die Mail-Adresse angeben, an welche die Meldungen ggf. gesendet werden sollen
string MAIL_EMPFAENGER = "mailadresse@provider.com";

! USE_EASY_PUSH - Wenn ja, werden die Servicemeldungen per Push gesendet
var USE_EASY_PUSH = "ja";
! API_KEY1, API_KEY2, API_KEY3 - Hier die API-Keys der Geraete angeben, an welche die Meldungen ggf. gesendet werden sollen
var API_KEY1 = "GCM-B34D99C1-51C1-4B23-9C48-E473FCDC8F20-1";
var API_KEY2 = "";
var API_KEY3 = "";

!+++++++ Systemvariablen Setup ++++++
! Zum Speichern der Servicemeldungen in eine Systemvariable benoetigt
! Soll diese Funktion genutzt werden, muss auf der Zentrale eine Systemvariable vom Typ "Zeichenkette" angelegt werden

! USE_SYSVAR - Wenn ja, werden die Servicemeldungen in einer Systemvariable gespeichert
var USE_SYSVAR = "ja";
! SYSVAR_NAME - Hier die Bezeichnung der Systemvariable angeben, in welcher die Meldungen ggf. gespeichert werden sollen
var SYSVAR_NAME = "CustomService";

!+++++++ Eigentlich schon fertig mit dem Setup +++++++++++
!+++++ Batteriezuweisungen inklusive Anzahl - Bitte helfen und fehlende Geraete posten ++++++++++++++++
!+++++ Noch nicht integrierte Geraete werden mit unbekannt ausgegeben ++++++++++++++++
string cr2016 = "HM-RC-4\tHM-RC-4-B\tHM-RC-Key3\tHM-RC-Key3-B\tHM-RC-P1\tHM-RC-Sec3\tHM-RC-Sec3-B";
string cr2032 = "HM-PB-2-WM\tHM-PB-4-WM\tHM-PBI-4-FM\tHM-SCI-3-FM\tHM-Sec-TiS\tHM-SwI-3-FM\tHM-Sec-TiS";
string lr14x2 = "HM-Sec-Sir-WM\tHM-OU-CFM-TW";
string lr44x2 = "HM-Sec-SC\tHM-Sec-SC2\tHM-Sec-SC-2\tHM-Sec-RHS";
string lr6x2 = "HM-CC-VD\tHM-CC-RT-DN\tHM-Sec-WDS\tHM-Sec-WDS-2\tHM-CC-TC\tHM-Dis-TD-T\tHB-UW-Sen-THPL-I\tHM-TC-IT-WM-W-EU\tHM-WDS40-TH-I\tHM-WDS40-TH-I-2\tHM-WDS10-TH-O\tHmIP-SMI\tHMIP-eTRV\tHM-WDS30-OT2-SM-2\tHmIP-SMO\tHmIP-SMO-A\tHmIP-SPI\tHmIP-STHD";
string lr6x3 = "HM-Sec-MDIR\tHM-Sec-MDIR-2\tHM-Sec-SD\tHM-Sec-Key\tHM-Sec-Key-S\tHM-Sec-Key-O\tHM-Sen-Wa-Od\tHM-Sen-MDIR\tHM-Sen-MDIR-O\tHM-Sen-MDIR-O-2\tHM-WDS100-C6-O\tHM-WDS100-C6-O-2\tHM-WDS100-C6-O-2\tHmIP-ASIR";
string lr6x4 = "HM-CCU-1\tHM-ES-TX-WM\tHM-WDC7000";
string lr3x1 = "HM-RC-4-2\tHM-RC-4-3\tHM-RC-Key4-2\tHM-RC-Key4-3\tHM-RC-Sec4-2\tHM-RC-Sec4-3\tHM-Sec-RHS-2\tHM-Sec-SCo\tHmIP-KRC4\tHmIP-KRCA\tHmIP-RC8\tHmIP-SRH\tHMIP-SWDO";
string lr3x2 = "HM-Dis-WM55\tHM-Dis-EP-WM55\tHM-PB-2-WM55\tHM-PB-2-WM55-2\tHM-PB-6-WM55\tHM-PBI-2-FM\tHM-RC-8\tHM-Sen-DB-PCB\tHM-Sen-EP\tHM-Sen-MDIR-SM\tHM-Sen-MDIR-WM55\tHM-TC-IT-WM-W-EU\tHM-WDS30-T-O\tHM-WDS30-OT2-SM\tHmIP-STH\tHMIP-WRC2\tHMIP-WRC6\tHMIP-WTH\tHMIP-WTH-2";
string lr3x3 = "HM-PB-4Dis-WM\tHM-PB-4Dis-WM-2\tHM-RC-Dis-H-x-EU\tHM-Sen-LI-O";
string lr3x3a = "HM-RC-19\tHM-RC-19-B\tHM-RC-12\tHM-RC-12-B\tHM-RC-12-W";
string block9 = "HM-LC-Sw1-Ba-PCB\tHM-LC-Sw4-PCB\tHM-MOD-EM-8\tHM-MOD-Re-8\tHM-Sen-RD-O\tHM-OU-CM-PCB\tHM-LC-Sw4-WM";
string fixed = "HM-Sec-SD-2\tHMIP-SWSD";
string recharge = "HM-Sec-Win\tHM-Sec-SFA-SM";

!+++++++++ Setup nun aber wirklich zu Ende - ab hier Finger weg ;-) ++++++++++++++++++
string stdout;
string stderr;
system.Exec("logger -t script -p user.debug [CloudMatic Servicemeldung Skript Start]", &stdout, &stderr);

string TITLE = "Servicemeldungen";
boolean GO = true;
string slist = "";

if(ONLYNEW == "ja") {
if(!(dom.GetObject(41).Value() > dom.GetObject(41).LastValue())) { GO = false; }
TITLE = "Neue Servicemeldung";
}

object oTmpArray = dom.GetObject(ID_SERVICES);

if(oTmpArray) {
string sTmp;
string sdesc;
string stest;

foreach(sTmp, oTmpArray.EnumIDs()) {
object oTmp = dom.GetObject(sTmp);

    if(oTmp) {
      if(oTmp.IsTypeOf(OT_ALARMDP) && (oTmp.AlState() == asOncoming)) {
        boolean collect = true;
        object trigDP = dom.GetObject(oTmp.AlTriggerDP());
        object och = dom.GetObject((trigDP.Channel()));
        object odev = dom.GetObject((och.Device()));
        var ival = trigDP.Value();
        time sftime = oTmp.AlOccurrenceTime(); ! erste Meldezeit
        time sltime = oTmp.LastTriggerTime(); ! letze Meldezeit
        var sdesc = trigDP.HssType();
        var sserial = odev.Address();

        if((sdesc == "STICKY_UNREACH") && (ACCK == "ja")) {
          oTmp.AlReceipt(); collect = false;
        }

        if((BLOCK.Find(sserial) < 0) && (collect)) {
          ! Uebersetzen der Fehlermeldungen
          if(sdesc == "CONFIG_PENDING") { sdesc = "Konfigurationsdaten stehen zum Transfer an"; }
          if(sdesc == "LOWBAT") { sdesc = "Batteriestand niedrig"; }
          if(sdesc == "STICKY_UNREACH") { sdesc = "hatte Kommunikationsfehler"; }
          if(sdesc == "UNREACH") { sdesc = "hat Kommunikationsfehler"; }
          if(sdesc == "DEVICE_IN_BOOTLOADER") { sdesc = "Device startet neu"; }
          if(sdesc == "UPDATE_PENDING") { sdesc = "Update verfuegbar"; }
          if(sdesc == "U_SOURCE_FAIL") { sdesc = "Netzteil ausgefallen"; }
          if(sdesc == "USBH_POWERFAIL") { sdesc = "USB-Host deaktiviert"; }
          if(sdesc == "ERROR_SABOTAGE") { sdesc = "Sabotage"; }
          if(sdesc == "STICKY_SABOTAGE") { sdesc = "hatte Sabotagemeldung"; }
          if(sdesc == "ERROR_REDUCED") {sdesc = "Temperatur kritisch (Lastabsenkung)"; }

          ! Sonderfehler
          if(sdesc == "ERROR") {
            if((odev.HssType() == "HM-Sec-RHS") || (odev.HssType() == "HM-Sec-SC") || (odev.HssType() == "HM-Sec-SC-2") || (odev.HssType() == "HM-Sec-SCo") || (odev.HssType() == "HM-Sec-MD") || (odev.HssType() == "HM-Sec-MDIR") || (odev.HssType() == "HM-Sec-MDIR-2") || (odev.HssType() == "HM-Sec-Sir-WM")) {
              if(ival == 7) { sdesc = "Sabotage"; }
            }

            if((odev.HssType() == "HM-Sec-Key") || (odev.HssType() == "HM-Sec-Key-S") || (odev.HssType() == "HM-Sec-Key-O")) {
              if(ival == 1) { sdesc = "Einkuppeln fehlgeschlagen"; }
              if(ival == 2) { sdesc = "Motorlauf abgebrochen"; }
            }

            if(odev.HssType() == "HM-CC-VD") {
              if(ival == 1) { sdesc = "Ventil Antrieb blockiert"; }
              if(ival == 2) { sdesc = "Ventil nicht montiert"; }
              if(ival == 3) { sdesc = "Stellbereich zu klein"; }
              if(ival == 4) { sdesc = "Batteriestand niedrig"; }
            }
          }

          if(sdesc == "FAULT_REPORTING") {
            if(odev.HssType() == "HM-CC-RT-DN") {
              if(ival == 1) { sdesc = "Ventil blockiert."; }
              if(ival == 2) { sdesc = "Einstellbereich Ventil zu gross"; }
              if(ival == 3) { sdesc = "Einstellbereich Ventil zu klein"; }
              if(ival == 4) { sdesc = "Kommunikationsfehler"; }
              if(ival == 6) { sdesc = "Batteriestand niedrig"; }
              if(ival == 7) { sdesc = "Fehlstellung Ventil"; }
            }
          }

          if(sdesc == "Batteriestand niedrig") {
            string batlink = "unbekannt";
            string index;

            foreach(index, cr2016) {
              if(index == odev.HssType()) { batlink = "1x leere CR2016"; }
            }

            foreach(index, cr2032) {
              if(index == odev.HssType()) { batlink = "1x leere CR2032"; }
            }

            foreach(index, lr14x2) {
              if(index == odev.HssType()) { batlink = "2x leere LR14"; }
            }

            foreach(index, lr44x2) {
              if(index == odev.HssType()) { batlink = "2x leere LR44/AG13"; }
            }

            foreach(index, lr6x2) {
              if(index == odev.HssType()) { batlink = "2x leere LR6/AA"; }
            }

            foreach(index, lr6x3) {
              if(index == odev.HssType()) { batlink = "3x leere LR6/AA"; }
            }

            foreach(index, lr6x4) {
              if(index == odev.HssType()) { batlink = "4x leere LR6/AA"; }
            }

            foreach(index, lr3x1) {
              if(index == odev.HssType()) { batlink = "1x leere LR3/AAA"; }
            }

            foreach(index, lr3x2) {
              if(index == odev.HssType()) { batlink = "2x leere LR3/AAA"; }
            }

            foreach(index, lr3x3) {
              if(index == odev.HssType()) { batlink = "3x leere LR3/AAA"; }
            }

            foreach(index, lr3x3a) {
              if(index == odev.HssType()) { batlink = "3x leere AAA Akkus - bitte laden"; }
            }

            foreach(index, block9) {
              if(index == odev.HssType()) { batlink = "9Volt Block leer oder unbestimmt"; }
            }

            foreach(index, fixed) {
              if(index == odev.HssType()) { batlink = "Festbatterie leer"; }
            }

            foreach(index, recharge) {
              if(index == odev.HssType()) { batlink = "Akku entladen - bitte aufladen"; }
            }

            slist = slist # odev.Name() # ": " # batlink;

            if(WITHTIME == "ja") {
              slist = slist # " seit: " # sftime.Format("%d.%m.%y %H:%M");
            }
          }
          else {
            slist = slist # odev.Name() # ": " # sdesc;

            if(WITHTIME == "ja") {
              slist = slist # " seit: " # sftime.Format("%d.%m.%y %H:%M");
            }
          }
        }
      }
    }
}

if(slist.Length() == 20) {
string stdout;
string stderr;
system.Exec("logger -t script -p user.debug [CloudMatic Servicemeldung Skript Abbruch BLOCK]", &stdout, &stderr);
quit;
}

! Verarbeiten der Daten zum Versand
if(GO) {
if(USE_EASY_MAIL == "ja") {
string stdout;
string stderr;
string teilstr;
string sendmail = "";
string sendbetreff = "";
string mailto = "";

      foreach(teilstr, TITLE.Split(" ")) {
        sendbetreff = sendbetreff # "+" # teilstr;
      }

      foreach(teilstr, slist.Split(" ")) {
        sendmail = sendmail # "+" # teilstr;
      }

      foreach(teilstr, MAIL_EMPFAENGER.Split(" ")) {
        mailto = mailto # "+" # teilstr;
      }

      system.Exec("logger -t script -p user.debug [CloudMatic Servicemeldung Skript - MAIL text " # slist # "]", &stdout, &stderr);
      system.Exec("logger -t script -p user.debug [CloudMatic Servicemeldung Skript - MAIL title " # sendbetreff # "]", &stdout, &stderr);
      system.Exec("logger -t script -p user.debug [CloudMatic Servicemeldung Skript - MAIL to " # mailto # "]", &stdout, &stderr);
      system.Exec("/bin/sh /etc/config/addons/mh/email.sh " # sendbetreff # " " # sendmail # " " # mailto, &stdout, &stderr);
    }

    if(USE_EASY_PUSH == "ja") {
      string stdout;
      string stderr;
      string teilstr;
      string sendtext = "";
      string sendevent = "";

      foreach(teilstr, TITLE.Split(" ")) {
        sendevent = sendevent # "+" # teilstr;
      }

      foreach(teilstr, slist.Split(" ")) {
        sendtext = sendtext # "+" # teilstr;
      }

      system.Exec("logger -t script -p user.debug [CloudMatic Servicemeldung Skript - PUSH wird gesendet]", &stdout, &stderr);
      if(API_KEY1 != "") { system.Exec("/bin/sh /etc/config/addons/mh/prowl.sh " # "ESY:" # API_KEY1 # " " # sendevent # " " # sendtext, &stdout, &stderr); }
      if(API_KEY2 != "") { system.Exec("/bin/sh /etc/config/addons/mh/prowl.sh " # "ESY:" # API_KEY2 # " " # sendevent # " " # sendtext, &stdout, &stderr); }
      if(API_KEY3 != "") { system.Exec("/bin/sh /etc/config/addons/mh/prowl.sh " # "ESY:" # API_KEY3 # " " # sendevent # " " # sendtext, &stdout, &stderr); }
    }
}

if((USE_SYSVAR == "ja") && (dom.GetObject(ID_SYSTEM_VARIABLES)).Get(SYSVAR_NAME)) {
(dom.GetObject(ID_SYSTEM_VARIABLES)).Get(SYSVAR_NAME).State(slist);
}
}

WriteLine(slist);