das altbekannte Problem der Kommunikationsfehlermeldungen temporär deaktvierter Module, z. B. wegen einer saisonale Trennung vom Stromnetz, hatte m. W. bisher noch keine befriedigende Lösung, da insbesondere der Status "UNREACH" spezifikationsgemäß nur durch eine erfolgreiche Kommunikation mit dem fraglichen Modul zurückgesetzt wird. Bis dahin blinkt die Info-LED, wodurch leider andere, wichtigere Servicemeldungen nicht mehr auffallen.
An dieser Stelle https://www.christian-luetgens.de/homem ... dungen.htm gibt es einen Vorschlag für ein automatisches Löschen der Servicemeldung "Gerätekommunikation war gestört" (entspricht dem Flag "STICKY_UNREACH") und einer periodischen Status-Abfrage des betroffenen Moduls, wodurch auch das Flag "UNREACH" zurückgesetzt würde, wenn die Kommunikation wiederhergestellt ist. Das löst zwar befriedigend die Behandlung kurzfristiger Störungen, nicht aber deaktivierter Geräte, insbesondere bei saisonalen Pausen.
Versuche, die zugehörigen Datenpunkte (bzw. deren Abbild in der CCU) zurückzusetzen gelingen weder mit HM-Skript noch über die XML-Api, wie Versuche zeigen, was allerdings nicht erstaunt, da diese Datenpunkte als "RE" definiert sind, also nicht beschreib- oder setzbar.
Mit HM-Skript lassen sich zwar beide Fehlermeldung löschen, die LED blinkt jedoch weiterhin. Mit CCU-Jack von Martin Dzionsko gelingt es, auch die LED zum Verlöschen zu bringen, allerdings ist es als eine out-of-spec-Methode zu verstehen, was bedeutet, dass es in Zukunft möglicherweise auch nicht mehr funktioniert. Da CCU-Jack außer dem MQTT-Server auch eine REST-API anbietet, kann das nötige Kommandos auch über http, z.B. mit curl übermittelt werden. Das folgende Programm und Skript leisten nun das gewünschte. Eine Liste von Device-Adressen beschränkt die Funktion auf bestimmte Geräte und lässt die Meldungen zur gestörten Gerätekommunikation bei allen übrigen unbeeinflusst.
Das zugehörige Skript ist wie folgt:
Code: Alles auswählen
!- 2022-03-13 _mDisableUnreach Elimination von Fehlermeldungen inaktiver Geräte
!- Benötigt CCU-Jack von Mathias Dzionsko (https://github.com/mdzio/ccu-jack)
!- Liste der Geräteaddressen, können z.B.mit "," getrennt werden, eine Systemvariable wäre auch möglich.
string addresses = "ABC#######";
string lGetErr; !- Nimmt Fehler-Meldungen von system.Exec() entgegen
string lGetOut; !- Nimmt Ausgabe von system.Exec() entgegen
string itemID; !- Variable für Iteration über alle Geräte
string address; !- Variable für Adresse des aktuellen Geräts
object aldp_obj; !- Objektvariable für Alarm-Datenpunkte UNREACH und STICKY_UNREACH
!- Iteration über alle Geräte
foreach(itemID, dom.GetObject(ID_DEVICES).EnumUsedIDs()) {
address = dom.GetObject(itemID).Address();
!- Nur Geräte aus der obigen Adressenliste werden behandelt
if (addresses.Contains(address)) {
aldp_obj = dom.GetObject("AL-" # address # ":0.UNREACH");
!- Falls UNREACH gesetzt ist:
if (aldp_obj) {
if (aldp_obj.Value()) {
!- Über die REST-Api von CCU-Jack läst sich über UNREACH die blinkende LED tatsächlich (!) zurücksetzen
system.Exec("curl -X PUT -d \'{\"v\":false}\' http://192.168.2.223:2121/device/" + address + "/0/UNREACH/~pv", &lGetOut, &lGetErr);
aldp_obj.State(false); !- Löscht die Servicemeldung "Gerätekommunikation gestört"
}
}
aldp_obj = dom.GetObject("AL-" # address # ":0.STICKY_UNREACH");
!- Falls STICKY_UNREACH gesetzt ist:
if (aldp_obj) {
if (aldp_obj.Value()) {
aldp_obj.State(false); !- Löscht die Servicemeldung "Gerätekommunikation war gestört"
}
}
}
}
VG,
Peter