vor geraumer Zeit habe ich einmal im Netz ein Script gefunden, welches einmal auf „meine-homematic.de“ (existiert nicht mehr, bzw. wird zu einer anderen Seite mittlerweile geroutet) zu finden war, was wiederum auf ein damals veröffentlichtes Script (auch nicht mehr dort verfügbar) bei „homematic-inside.de“ basierte. Der vollständigkeitshalber wollte ich das nur am Anfang erwähnt haben wollen, falls jemanden hier Teile der Konfiguration ggf. bekannt vorkommen sollten.
Anfänglich habe ich es versucht in ganzen Teilen beizubehalten, entsprach aber letztendlich nicht so meinen Vorstellungen. So haben bis zum heutigen Zeitpunkt lediglich drei String’s des o.g. Ursprung-Scripts es in der Konfiguration meiner Script Version „überlebt“, der Rest blieb leider auf der Strecke.
Was macht das vorgestellte Script?
Auch wenn es viele Ansatzpunkte im Forum hier zu finden sind bezüglich Benachrichtigungen bei schwachen Batterien, so habe ich jedenfalls keines in diesem Umfang über die Suchfunktion gefunden. Das Script wird mittels eines Programms einmal täglich über die Zeitsteuerung (Uhrzeit nach eigenem belieben) aufgerufen und prüft den Batteriestand am Datenpunkt „LOW-BAT“ bzw. „LOWBAT“ aller Geräte über den Wartungskanal „:0“, die im Gewerk „Batteriebetrieben“ sind. Das Script kann dann das Ergebnis in der Konfiguration mittels drei einstellbaren Ausgabemöglichkeiten wieder geben:
- Systemprotokoll
- Pushover
-Telegram
Das Script:
Das Script wurde meiner Ansicht nach eigentlich gut von mir kommentiert und sollte daher selbsterklärend in der Anwendung sein. Es kann sowohl mit älteren Homematic, als auch aktuellen Homematic IP Geräten umgehen, welche batteriebetrieben sind.
- Wer möchte, kann die Versionshistory bei Bedarf entfernen, jene dient nur zu Dokumentierung meiner stetigen Erweiterung/Verbesserung!
- Ein jeder darf es gerne verwenden und für sich persönlich anpassen, aber nicht als sein eigenes ausgeben!
- Die Liste der Gerätetypen ist auf die eigenen vorhandenen Geräte anzupassen, jeder vorhandene Gerätetyp nur einmal!
- ALLE batteriebetriebenen Geräte (HM & HmIP) sind in einem Gewerk Namens "Batteriebetrieben" hinzu zu fügen, der Wartungskanal (":0") der ganzen vorhandenen Geräte reicht dabei völlig aus!
Code: Alles auswählen
! =====================================================================
! Homematic IP Skript: Geräte im Gewerk "Batteriebetrieben" auflisten und bei Bedarf Pushnachricht über schwache senden
! =====================================================================
!
! Versionshistorie:
! -----------------
! V 1.0 (Konzept): Grundidee - Alle batteriebetriebenen Geräte auflisten, basierend auf Script von meine-homematic.de bzw. homematic-inside.de
! V 2.0 (Initial): Erste lauffähige Version. Listet Gerätenamen im Systemprotokoll.
! V 2.1 (Erweitert): Versionshistorie als Kommentarblock am Anfang hinzugefügt.
! V 2.2 (Geändert): Batteriestatus (Spannung in Volt) für jedes Gerät hinzugefügt.
! V 2.3 (Umgestellt): Abfrage von Betriebsspannung auf den Datenpunkt LOW_BAT (wahr/falsch) umgestellt.
! V 2.4 (Bugfix): Laufzeitfehler beim Zugriff auf den Wartungskanal behoben.
! V 2.5 (Vorbereitet): Gerätetypenlisten für AA/AAA-Batterien zur späteren Verwendung definiert.
! V 2.6 (Erweitert): Ausgabe des Batterietyps (AA, AAA, Andere) im Systemprotokoll.
! V 2.7 (Bugfix): Vergleich der Gerätetypen ignoriert nun Groß-/Kleinschreibung (.ToUpper()).
! V 2.8 (Optimiert): Logik zur Vermeidung von doppelten Einträgen für Geräte mit mehreren Kanälen.
! V 2.9 (Kompatibel): Abfrage für LOW_BAT (HmIP) und LOWBAT (HM) Datenpunkte erweitert.
! V 3.0 (Optimiert): Steuerbares Logging über die Variable 'enableLogging' eingeführt.
! V 3.1 (Erweitert): Zusammenfassung am Ende, die nur Geräte mit schwachen Batterien auflistet.
! V 3.2 (Optimiert): Die Zusammenfassung wird nun immer ausgegeben, unabhängig von der
! 'enableLogging'-Einstellung.
! V 3.3 (Vorbereitet): Vorbereitung für Push-Benachrichtigungen (Pushover/Telegram) hinzugefügt,
! inklusive Validierungslogik.
! V 3.4 (Erweitert): Implementierung des Versands von Push-Benachrichtigungen für Pushover
! und Telegram.
! V 3.5 (Aktuell): Erweiterte Validierung der Push-Einstellungen hinzugefügt. Das Skript
! prüft nun auf fehlende Token/Keys, wenn ein Dienst aktiviert ist.
!
! =====================================================================
! --- Konfiguration ---
string gewerkName = "Batteriebetrieben"; ! Groß- & Kleinschreibung beachten!
boolean enableLogging = true; ! Auf 'true' setzen, um die detaillierte Liste jedes Geräts im Systemprotoll auszugeben.
! Listen der Geraetetypen mit AA- und AAA-Batterien (Groß-& Kleinschreibweise egal) auf eigene vorhandene Geräte anpassen
string AA_DEVICES = "HMIP-eTRV-2;HmIP-STHD;HmIP-SLO;HmIP-SPI;HmIP-STHO-A;HmIP-DSD-PCB;HM-ES-TX-WM";
string AAA_DEVICES = "HmIP-SWDO-I;HmIP-SCI;HmIP-SWDO-PL;HmIP-WKP;HmIP-WRC2";
! --- KONFIGURATION FUER BENACHRICHTIGUNGEN (optional) ---
boolean send_notifications = true; ! Generell Push-Nachrichten senden (true/false)
boolean use_pushover = true; ! Pushover verwenden (true/false)
boolean use_telegram = true; ! Telegram verwenden (true/false)
! Pushover-Einstellungen
string TOKEN = ""; ! Dein Pushover Application/API Token
string USERKEY = ""; ! Dein Pushover User Key
string SOUND = "none"; ! Ton der Benachrichtigung (siehe Pushover API Doku, z.B. "pushover", "bike", "bugle")
string PRIORITY = "0"; ! Priorität der Nachricht (-2 bis 2)
string HTML = "1"; ! HTML-Formatierung in der Nachricht erlauben (0 oder 1)
! Telegram-Einstellungen
string telegram_bot_token = ""; ! Dein Telegram Bot Token
string telegram_chat_id = ""; ! Die Chat-ID des Empfängers
! --- Skript-Logik ---
! --- Validierung der Benachrichtigungseinstellungen ---
if ((send_notifications == true) && (use_pushover == false) && (use_telegram == false)) {
WriteLine("FEHLER: Benachrichtigungen sind aktiviert, aber kein Dienst (Pushover/Telegram) wurde ausgewaehlt. Skript wird beendet.");
} elseif (send_notifications == true && use_pushover == true && (TOKEN == "" || USERKEY == "")) {
WriteLine("FEHLER: Pushover ist aktiviert, aber TOKEN oder USERKEY fehlen in der Konfiguration. Skript wird beendet.");
} elseif (send_notifications == true && use_telegram == true && (telegram_bot_token == "" || telegram_chat_id == "")) {
WriteLine("FEHLER: Telegram ist aktiviert, aber Bot-Token oder Chat-ID fehlen in der Konfiguration. Skript wird beendet.");
} else {
object gewerk = dom.GetObject(gewerkName);
if (gewerk) {
if (enableLogging) { WriteLine("Folgende Geräte befinden sich im Gewerk '" # gewerkName # "' (Status V3.5):"); }
string channelId;
string processedDevices = ""; ! Liste für bereits verarbeitete Geräte
string lowBatteryDevicesList = ""; ! Sammelt Geräte mit schwachen Batterien
integer lowBatteryCount = 0; ! Zählt Geräte mit schwachen Batterien
foreach(channelId, gewerk.EnumUsedIDs()) {
object channel = dom.GetObject(channelId);
if (channel) {
object device = dom.GetObject(channel.Device());
if (device) {
string deviceAddress = device.Address();
if (processedDevices.Contains(deviceAddress)) {
continue;
}
processedDevices = processedDevices # deviceAddress # ";";
string deviceName = device.Name();
string deviceType = device.HssType();
string batteryType = "Andere";
if (AA_DEVICES.ToUpper().Contains(deviceType.ToUpper())) {
batteryType = "AA";
} elseif (AAA_DEVICES.ToUpper().Contains(deviceType.ToUpper())) {
batteryType = "AAA";
}
string output = "- " # deviceName # " [" # batteryType # "]";
! Lese den Batteriestatus vom Wartungskanal (:0)
object maintenanceChannel = dom.GetObject(device.Address() # ":0");
if (maintenanceChannel) {
object dpBattery = null;
! Prüfe zuerst auf den modernen Datenpunkt, dann auf den alten
if (maintenanceChannel.DPByHssDP("LOW_BAT")) {
dpBattery = maintenanceChannel.DPByHssDP("LOW_BAT");
} elseif (maintenanceChannel.DPByHssDP("LOWBAT")) {
dpBattery = maintenanceChannel.DPByHssDP("LOWBAT");
}
if (dpBattery) {
string statusText = "OK";
if (dpBattery.Value() == true) {
statusText = "NIEDRIG!";
! Füge das Gerät zur Liste der schwachen Batterien hinzu
lowBatteryCount = lowBatteryCount + 1;
lowBatteryDevicesList = lowBatteryDevicesList # "\n- " # deviceName # " (benötigt " # batteryType # ")";
}
output = output # " | Batteriestatus: " # statusText;
} else {
output = output # " | Batteriedatenpunkt nicht gefunden!";
}
}
if (enableLogging) { WriteLine(output); }
}
}
}
! --- Zusammenfassung ausgeben (immer sichtbar) ---
WriteLine("---");
WriteLine("Batteriestatus-Zusammenfassung:");
string notification_message = "";
if (lowBatteryCount > 0) {
notification_message = "Insgesamt " # lowBatteryCount # " Geraete mit schwacher Batterie gefunden." # lowBatteryDevicesList;
WriteLine(notification_message);
} else {
notification_message = "Keine Geraete mit schwacher Batterie gefunden. Alles in Ordnung.";
WriteLine(notification_message);
}
! --- Push-Benachrichtigungen senden ---
if (send_notifications) {
if (use_pushover && TOKEN != "" && USERKEY != "") {
string titlemsg = "Batterie-Status-Meldung";
string messagemsg = notification_message;
string TITLE = titlemsg.ToUTF8().UriEncode();
string MESSAGE = messagemsg.ToUTF8().UriEncode();
system.Exec("wget -O /dev/null --no-check-certificate --post-data='token='"#TOKEN#"'&user='"#USERKEY#"'&sound='"#SOUND#"'&priority='"#PRIORITY#"'&html='"#HTML#"'&title='"#TITLE#"'&message='"#MESSAGE#"'' http://api.pushover.net/1/messages.json");
WriteLine("INFO: Benachrichtigung wurde an Pushover gesendet.");
}
if (use_telegram && telegram_bot_token != "" && telegram_chat_id != "") {
string messagemsg = notification_message;
string MESSAGE = messagemsg.ToUTF8().UriEncode();
string TGRM_TOKEN = telegram_bot_token;
string CHATID = telegram_chat_id;
system.Exec("wget -O /dev/null --no-check-certificate --post-data='chat_id=" # CHATID # "&text=" # MESSAGE # "' 'https://api.telegram.org/bot" # TGRM_TOKEN # "/sendMessage'");
WriteLine("INFO: Benachrichtigung wurde an Telegram gesendet.");
}
}
WriteLine("--- Skriptausführung beendet (V3.5) ---");
} else {
WriteLine("FEHLER: Das Gewerk '" # gewerkName # "' wurde nicht gefunden!");
}
}