Homematic Skript – Automatisches Quittieren von Servicemeldungen bei Funkstörungen
Wer ein größeres Homematic-Netz bestehend aus vielen Funksendern betreibt, kennt das leidige Thema sporadisch auftretende Funkstörungen, die dazu führen, dass die LED der CCU2 für die Servicemeldungen eigentlich dauerhaft blinkt. So wird man schnell „blind“ für wichtige Meldungen, die dann im Speicher der CCU2 landen.
Dazu zählen z.B. komplette Ausfälle oder leere Batterien der Geräte. Daher zeige ich Euch heute, wie Ihr mit einem einfachen Skript diese Meldungen quittieren könnt sobald diese aufgetreten sind. Meldungen, die weiterhin aktiv sind wie z.B. „Gerätekommunikation gestört“, „Batterieladezustand gering“ oder „Konfigurationsdaten stehen zur Übertragung an“ bleiben davon unbetroffen.
Bezeichnung | Amazon | ELV-Shop | ELV-Bausatz |
4 GB SD-Karte | Link | Link | nicht verfügbar |
Powerline Adapter | Link | Link | nicht verfügbar |
Funkmodul Raspberry Pi | nicht verfügbar | nicht verfügbar | Bausatz |
Raspberry Pi 2 | Link | Link | nicht verfügbar |
Raspberry Pi3 | Link | Link | nicht verfügbar |
Es werden mit dem Skript nur die Meldungen quittiert, die Ihr sonst händisch abgearbeitet hättet wie z.B. „Gerätekommunikation war gestört“. Ein Beispiel sehr Ihr im unteren Bild. Der Button „Bestätigen“ ist nicht ausgegraut und die Meldung kann daher quittiert werden.
Um das Skript einzubinden, muss ein neues Programm erzeugt werden. Dazu klickt Ihr auf „Programme und Verknüpfungen“ —> „Programme und Zentralenverknüpfungen“ und dort auf „Neu“.
Als Bedingung: Wenn… wählt Ihr „Systemzustand“ und „Servicemeldungen“ aus. Der Wertebereich wird mit größer als 0 gewählt. Außerdem muss noch „bei Aktualisierungen auslösen“ aktiviert werden.
Dadurch wird das Programm automatisch ausgeführt, wenn eine neue Servicemeldung auftaucht. Das Quittieren übernimmt dann unser Skript, welches wir im nächsten Schritt einfügen.
Dazu wählen wir bei Aktivität: Dann… „Skript“ aus. In das Fenster für das Skript kopiert Ihr nun folgenden Text:
string itemID; string address; object aldp_obj; foreach(itemID, dom.GetObject(ID_DEVICES).EnumUsedIDs()) { address = dom.GetObject(itemID).Address(); aldp_obj = dom.GetObject(„AL-“ # address # „:0.STICKY_UNREACH“); if (aldp_obj) { if (aldp_obj.Value()) { aldp_obj.AlReceipt(); } } }
Es sollte noch eine kleine Verzögerung von 1-2 Sekunden eingesetzt werden, dann läuft das ganze zuverlässiger.
Das war es auch schon. Damit verhindert Ihr ungewollte Servicemeldungen und erhaltet ab sofort nur noch die wichtigen Meldungen, die wirklich relevant sind!
bei mir klappts nicht, wo liegt das Problem?
Error 1 at row 7 col 31 near ^- # address # :0.STICKY_UNREACH);
if (aldp_obj) {
if (aldp_obj.Value()) {
aldp_o
Error 1 at row 7 col 31 near ^- # address # :0.STICKY_UNREACH);
if (aldp_obj) {
if (aldp_obj.Value()) {
aldp_o
Parse following code failed:
string itemID;
string address;
object aldp_obj;
foreach(itemID, dom.GetObject(ID_DEVICES).EnumUsedIDs()) {
address = dom.GetObject(itemID).Address();
aldp_obj = dom.GetObject(AL- # address # :0.STICKY_UNREACH);
if (aldp_obj) {
if (aldp_obj.Value()) {
aldp_obj.AlReceipt();
}
}
}
Hallo liebe HomeMatic Freunde,
ich habe das Script von Holger eingefügt und bekomme leider diese Meldung:
Error 1 at row 7 col 27 near ^„AL-“ # address # „:0.STICKY_UNREACH“);
if (aldp_obj) {
if (aldp_obj.Val
Error 1 at row 7 col 27 near ^„AL-“ # address # „:0.STICKY_UNREACH“);
if (aldp_obj) {
if (aldp_obj.Val
Parse following code failed:
Leider bin ich nicht sehr bewandert was Scripts angeht. Ich würde mich freuen wenn ihr mit bei diesem Problem weiterhelfen könntet. Vorab vielen lieben Dank.
Kay-Uwe
bei mir hat es auch nicht auf anhieb funktionert. das Problem sind die anführungszeichen. Wenn man das skript per copy/paste in der homematic einfügt. Alle Anführungszeichen einmal löschen und neu setzen – das war’s.
Hallo Sebastian,
bitte überprüfe mal Dein Skript, leider hakt es und lief bei mir nicht durch.
Diese Variante funktioniert:
string itemID;
string address;
object aldp_obj;
foreach(itemID, dom.GetObject(ID_DEVICES).EnumUsedIDs()) {
address = dom.GetObject(itemID).Address();
aldp_obj = dom.GetObject(„AL-“ # address # „:0.STICKY_UNREACH“);
if (aldp_obj) {
if (aldp_obj.Value()) {
aldp_obj.AlReceipt();
}
}
}
Gruß
Holger
Hallo Holger,
vielen Dank! War wohl ein Tippfehler an einer Stelle. Habs mal geändert!