HowTo - Pushover/Telegram bei schwachen Batterien

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
Benutzeravatar
Sanweb
Beiträge: 93
Registriert: 11.08.2020, 09:50
System: CCU
Hat sich bedankt: 20 Mal
Danksagung erhalten: 9 Mal

HowTo - Pushover/Telegram bei schwachen Batterien

Beitrag von Sanweb » 31.08.2025, 06:11

Hallo,

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!");
  }
}
Mein HomeMatic Zoo: 51 Geräte | 372 Kanäle
Auszug: 1x HM-ES-TX-WM, 5x HmIP-HEATING, 1x HM-LC-Sw1PBU-FM, 1x HM-RCV-50, 1x HmIP-CCU3, 1x HmIP-DSD-PCB, 5x HmIP-eTRV-2, 1x HmIP-FSI16, 1x HmIP-HAP, 1x HmIP-PCBS, 3x HmIP-PS-2 9YM, 1x HmIP-PS-2, 1x HmIP-RCV-50, 4x HmIP-SCI, 1x HmIP-SLO, 2x HmIP-SPI, 3x HmIP-STE2-PCB, 5x HmIP-STHD, 1x HmIP-STHO-A, 2x HmIP-SWDO-I, 7x HmIP-SWDO-PL, 1x HmIP-WKP, 2x HMIP-WRC2

Benutzeravatar
Baxxy
Beiträge: 14767
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Berlin
Hat sich bedankt: 948 Mal
Danksagung erhalten: 3346 Mal

Re: HowTo - Pushover/Telegram bei schwachen Batterien

Beitrag von Baxxy » 31.08.2025, 22:52

Ich gucke mir solche Arbeiten ja gerne genauer an, generell um die Funktionalität zu prüfen, um zu gucken wie andere "das so machen" und natürlich auch um vielleicht selbst noch was zu lernen.

Im Großen und Ganzen gefällt's mir auch wenn ich hier und da etwas anders (straffer/kürzer) gemacht hätte.

Leider hast du aber auch einen ziemlichen Patzer drin, oder anders gesagt nicht weit genug gedacht.
Du gehst davon aus das der gemeine User den Kanal:0 seiner Geräte nicht umbenennt, der Kanalname also z.B.
'00095A499AA137:0' lautet.
Ich benenne auch die 0er Kanäle um und damit läuft das Script hier...

Code: Alles auswählen

! Lese den Batteriestatus vom Wartungskanal (:0)
   object maintenanceChannel = dom.GetObject(device.Address() # ":0");
   WriteLine("MT-Chn: "#maintenanceChannel);

   if (maintenanceChannel) {
... ins Leere.

Verbesserungsvorschlag:

Code: Alles auswählen

object maintenanceChannel = device.Channels().GetAt(0);
Aber trotzdem gute Arbeit. :)

Benutzeravatar
Sanweb
Beiträge: 93
Registriert: 11.08.2020, 09:50
System: CCU
Hat sich bedankt: 20 Mal
Danksagung erhalten: 9 Mal

Re: HowTo - Pushover/Telegram bei schwachen Batterien

Beitrag von Sanweb » 31.08.2025, 23:54

Hallo,

in der Tat bin ich nicht davon ausgegangen, dass der Name des Wartungskanals auch noch umbenannt wird (was ja eigentlich mit setzen eines Haken an bestimmter Stelle ja dennoch automatisch geschieht), sodass ich da tatsächlich nicht weit genug gedacht habe. Zumal eine Veröffentlichung ja eigentlich zum Zeitpunkt der Erstellung des Skriptes gar nicht angedacht war. Der eigentliche Patzer war der Tatsache geschuldet, dass ich bei Veröffentlichung auch nicht mehr daran gedacht habe, funktionierte ja ... bei mir ... :lol:

Werde es bei einem eventuellen Update aber berücksichtigen ... :!:
Baxxy hat geschrieben:
31.08.2025, 22:52
Im Großen und Ganzen gefällt's mir auch wenn ich hier und da etwas anders (straffer/kürzer) gemacht hätte.
Dafür hatte ich ja den Hinweis gegeben: "- Ein jeder darf es gerne verwenden und für sich persönlich anpassen ..." :wink: :)
Baxxy hat geschrieben:
31.08.2025, 22:52
Aber trotzdem gute Arbeit. :)
Danke ... :)
Mein HomeMatic Zoo: 51 Geräte | 372 Kanäle
Auszug: 1x HM-ES-TX-WM, 5x HmIP-HEATING, 1x HM-LC-Sw1PBU-FM, 1x HM-RCV-50, 1x HmIP-CCU3, 1x HmIP-DSD-PCB, 5x HmIP-eTRV-2, 1x HmIP-FSI16, 1x HmIP-HAP, 1x HmIP-PCBS, 3x HmIP-PS-2 9YM, 1x HmIP-PS-2, 1x HmIP-RCV-50, 4x HmIP-SCI, 1x HmIP-SLO, 2x HmIP-SPI, 3x HmIP-STE2-PCB, 5x HmIP-STHD, 1x HmIP-STHO-A, 2x HmIP-SWDO-I, 7x HmIP-SWDO-PL, 1x HmIP-WKP, 2x HMIP-WRC2

Benutzeravatar
UwePa
Beiträge: 396
Registriert: 26.08.2015, 06:27
System: CCU
Wohnort: Berlin (Speckgürtel)
Hat sich bedankt: 43 Mal
Danksagung erhalten: 4 Mal

Re: HowTo - Pushover/Telegram bei schwachen Batterien

Beitrag von UwePa » 02.06.2026, 15:50

Hallo,

ich möchte den Zweig hier nicht unnötig vollmüllem, da es ja auch heißt keine Fragen.(dann bitte löschen)
Das Script funktioniert bei mir ganz gut, ich bekomme jeden Tag um 9 Uhr die Meldung das es kein Gerät mit leerer oder schwacher Batterie gibt.

Da ich keine Ahnung von Programmieren habe, wie muss es gemacht werden, dass die Meldung nur kommt, wenn ein Gerät mit schwacher Batterie gefunden wird?
Vielleicht einmal im Monat, auch die Meldung das alle Batterien ausreichend Energie haben. So als "Das Programm läuft noch"

Danke und beste Grüße
Mit freundlichen Grüßen

Uwe

--------------////////-------------
Seit 2026 Open CCU und fast nur noch HMIP

Mutter gibt es wirklich sowas, wie den perfekten Mann?
Sicher Kind, sie werden Biker genannt ;-)

Benutzeravatar
Baxxy
Beiträge: 14767
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Berlin
Hat sich bedankt: 948 Mal
Danksagung erhalten: 3346 Mal

Re: HowTo - Pushover/Telegram bei schwachen Batterien

Beitrag von Baxxy » 02.06.2026, 16:54

UwePa hat geschrieben:
02.06.2026, 15:50
dass die Meldung nur kommt, wenn ein Gerät mit schwacher Batterie gefunden wird?
Füge mal vor:

Code: Alles auswählen

    ! --- Push-Benachrichtigungen senden ---
    if (send_notifications) {
folgende Codezeile ein:

Code: Alles auswählen

if ((!lowBatteryCount) && (localtime.Format("%d").ToInteger() != 1)) { send_notifications = false; }
Damit wird grundsätzlich nicht gesendet wenn keine leeren Batterien erkannt wurden.
Ausnahme ist "jeder 01. eines Monats", hier wird immer gesendet auch wenn keine leeren Batterien erkannt wurden. Also quasi dein "Lebenszeichen".

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“