CENTRAL-LINK von IP-Geräten löschen per Script (aka ReportValueUsage() bei HM Geräten)

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

Moderator: Co-Administratoren

Benutzeravatar
Baxxy
Beiträge: 10850
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 610 Mal
Danksagung erhalten: 2230 Mal

CENTRAL-LINK von IP-Geräten löschen per Script (aka ReportValueUsage() bei HM Geräten)

Beitrag von Baxxy » 24.10.2022, 19:18

Vorwort:
Nutzer externer Steuerungen (ioBroker / NodeRed / Homeassistant) kennen das.
Damit sie z.B. auf einen Tastendruck eines HmIP-Tasters reagieren können müssen sie auf der Zentrale einmalig ein "Dummy-Programm" anlegen welches den Tastendruck als Trigger hat. Anschließend wird die Konfiguration auf den Taster übertragen und danach kann das Programm gelöscht werden.

Hierbei wird ein (so von mir genannter) CENTRAL-LINK angelegt, quasi eine Direktverknüpfung vom IP-Tasterkanal zu einem (unsichbaren) "Zentralengerät".
Daraus folgt das nun die Zentrale die Events des Tasters mitbekommt und diese an die Schnittstellen für die externen Steuerungen durchreicht.
Gute Sache... eigentlich.

Der "Haken" an der Sache ist folgender:
Der Taster sendet nun sein Event und erwartet ein "Ack" nicht nur vom Verknüpfungpartner (IP-Aktor), sondern auch von der Zentrale.
Solange die Zentrale läuft merkt man kaum was, ist sie aber aus dann wird die eigentlich schnelle und nützliche DV zum Verknüpfungspartner "zäh", bzw. funktioniert teilweise gar nicht mehr. Wie sich das genau auswirkt hatte ich mal >> hier beschrieben <<.
Für ein Userproblem aus einem anderen Thread habe ich mal untersucht wie sich "ReportValueUsage" (aktiviert bei einem Sender [WRC6]) auf eine Direktverknüpfung bei "ausgefallener" Zentrale auswirkt.

Testsetup: HmIP-PSM <DV> HmIP-WRC6 (Schalter ein / aus)
Ohne "ReportValueUsage" des Senders (Taster) funktioniert die DV problemlos wenn die Zentrale down ist.
Mit "ReportValueUsage" funktioniert sie auch, aber äußerst zäh. Und wie erwartet ist der Sender freudig gelb mit anschließendem rot am blinken. Der erste Befehl wird zwar instant ausgeführt, für den nächsten muss man aber das rote leuchten abwarten. Das kann gefühlt fast eine Minute dauern und macht keinen Spaß.
Dieser CENTRAL-LINK wird aber auch bei allen möglichen anderen Triggern angelegt, z.B....
Wenn IP-Fensterkontakt = offen, oder WENN IP-Thermostat = 20°C usw.
Bei laufender Zentrale kein Problem, aber wehe die ist mal aus.
Beim WTH-2 gibt es damit z.B. das skurille Problem das dieses selbst bei laufender Zentrale u.U. kein "ack" bekommt und damit munter vor sich hinblinkt. Nachzulesen >> hier <<.

Den CENTRAL-LINK loswerden:
  • Bisherige Lösung:
Bisher war es nicht möglich diesen CENTRAL-LINK, welcher wissentlich oder unabsichtlich angelegt wurde, ohne "eQ-3-Holzhmmer-Metode" loszuwerden. Soll heißen, das IP-Gerät musste komplett aus der Zentrale gelöscht und anschließend neu angelernt werden.
  • Neue Lösung:
Heute wurde eine Möglichkeit gefunden und getestet wie man diesen CENTRAL-LINK auch per Homematic-Script löschen kann.
(getestet aktuell nur auf RaspberryMatic)

Vorgehensweise:
Ihr geht in die Geräteübersicht (> Einstellungen > Geräte), pickt euch euer IP-Gerät raus und nutzt den Button "Programme" um euch alle Programme anzeigen zu lassen die dieses Gerät als Trigger enthalten, dann...
  • A: ihr löscht das Gerät in den WENN/Sonst, wenn... Blöcken der Programme
  • B: ihr löscht die Programme komplett
Anschließend öffnet ihr "Script testen" und nutzt folgendes Script:
("kanalname" natürlich anpassen!)

Code: Alles auswählen

!- CENTRAL-LINK zwischen IP-Aktorkanal und Zentrale löschen
!- by @Baxxy
!- v1.0 24.10.22
!- coding support by @Black's SDV
!- mental support by @jp112sdl

!- Vorgehensweise:
!- Gerätekanal/Datenpunkt aus allen Programmen im WENN-Bereich entfernen...
!- oder...
!- alle Programme die den Gerätekanal/Datenpunkt im WENN-Bereich enthalten löschen

!- erst dann macht es Sinn auch den CENTRAL-LINK zu löschen!!!

string kanalname = "Fensterkontakt BX: SWDM-B2:1 - Fensterstatus"; !- Kanalnamen wie in der WebUI zu sehen eintragen, bspw: Fenstersensor Badezimmer
boolean testmode = false; 										   !- true/false; im Testmode wird der Befehl zum löschen des Links nicht ausgeführt

!- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
!- ab hier möglichst Finger weg... ;-)
string stdErr; string stdOut;
object oCHANNEL= dom.GetObject (ID_CHANNELS).Get (kanalname);
if (oCHANNEL) {
 integer channel_id = dom.GetObject(oCHANNEL).ID();
 string programIds  = dom.GetObject(channel_id).ChnEnumDPUsagePrograms();
 if (programIds.Length() == 0) {
      WriteLine("Kanal: "# kanalname #" gefunden, Prüfung auf Benutzung in Programmen ergab 0.\n");
      object oIFace= dom.GetObject (oCHANNEL.Interface ());
      string sTCL = ^puts [xmlrpc ^ #oIFace.InterfaceUrl()# ^/ removeLink [list string \"^#oCHANNEL.Address()#^\"] [list string \"CENTRAL_DEVICE:63\"]]^;
      if (testmode) {WriteLine("Testmodus aktiv - Befehl zur Löschung des CENTRAL-LINK wird nicht ausgeführt!\n");}
      if (!testmode) { system.Exec ("/bin/sh -c 'echo \"load tclrpc.so; " # sTCL # "\" |tclsh'",&stdOut,&stdErr); }
      !WriteLine("Ausgabe: "# stdErr);
      string ausgabe = "CENTRAL-LINK zum Kanal: "# kanalname #" wurde gelöscht!";
       if (stdErr.Contains("-10")) { ausgabe = "CENTRAL-LINK zum Kanal: "# kanalname #" wurde gelöscht, Konfiguration muss noch übertragen werden."; }
       elseif (stdErr.Contains("-1")) { ausgabe = "CENTRAL-LINK zum Kanal: "# kanalname #" existiert nicht."; }
       elseif (stdErr.Contains("-9")) { ausgabe = "Fehler! - Das Gerät ist nicht in Reichweite."; }
       elseif (stdErr.Contains("-8")) { ausgabe = "Fehler! - Es steht nicht genug Duty-Cycle zur Verfügung."; }
       elseif (stdErr.Contains("-7")) { ausgabe = "Fehler! - Das Interface ist nicht in der Lage eine Update durchzuführen."; }
       WriteLine("Ausgabe: "# ausgabe);
}
else {
  string liste; integer count = 0;
   foreach (liste, programIds) {
     count = count + 1; }
      WriteLine("Kanal: "# kanalname #" wird noch in > "# count #" < Programmen genutzt!\nDer CENTRAL-LINK wird nicht gelöscht!\n\nProgrammauflistung:\n");
       foreach (liste, programIds) {
        WriteLine(dom.GetObject (ID_PROGRAMS).Get (liste).Name()); }
}}
else { WriteLine("Kanal: "# kanalname #" nicht gefunden!"); }
Das Script hat ein paar Absicherungen, zum Einen muss der Gerätekanal namentlich existieren und zum Anderen darf der Gerätekanal in keinem Programm mehr genutzt werden. Ist mindestens eine der beiden Bedingungen nicht gegeben wird der eigentliche "Link-Lösch-Befehl" nicht ausgeführt.

Beispielausgaben von meinem Testsystem:
A: "Fensterkontakt BX: SWDM-B2:1 - Fensterstatus" in 3 Programme integriert, ergo CENTRAL-LINK aktiv

Code: Alles auswählen

Kanal: Fensterkontakt BX: SWDM-B2:1 - Fensterstatus wird noch in > 3 < Programmen genutzt!
Der CENTRAL-LINK wird nicht gelöscht!

Programmauflistung:

A_Test_SWDM_A
A_Test_SWDM_B
A_Test_SWDM_C
B: alle 3 Programme die den SWDM enthielten wurden gelöscht, CENTRAL-LINK bleibt aktiv

Code: Alles auswählen

Kanal: Fensterkontakt BX: SWDM-B2:1 - Fensterstatus gefunden, Prüfung auf Benutzung in Programmen ergab 0.

Ausgabe: CENTRAL-LINK zum Kanal: Fensterkontakt BX: SWDM-B2:1 - Fensterstatus wurde gelöscht, Konfiguration muss noch übertragen werden.
Nachwort:
Das ist jetzt primär was für User die wissen worum es geht und was sie tun, kann aber natürlich auch von anderen genutzt werden die wissentlich oder unabsichtlich diesen CENTRAL-LINK aktiviert haben und ihn (ohne löschen / neuanlernen des IP-Gerätes) wieder loswerden wollen.

Auch wenn es heißt "...keine Fragen!" dürft ihr natürlich fragen. :wink:

Viel Erfolg!

Benutzeravatar
Henke
Beiträge: 1526
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 141 Mal
Danksagung erhalten: 306 Mal

Re: CENTRAL-LINK von IP-Geräten löschen per Script (aka ReportValueUsage() bei HM Geräten)

Beitrag von Henke » 25.10.2022, 03:51

Ich habe mal mit einem Script alle Channels kontrolliert und dabei festgestellt, das die Anzahl der Elemente in ChnEnumDPUsagePrograms teilweise vom Wert ChnDPUsageCount abweicht.
Sind das Leichen oder mische ich gerade Äpfel und Birnen?

Code: Alles auswählen

string itemId;
integer anzahl = 0;
integer iUsageSum = 0;

foreach(itemId, dom.GetObject(ID_CHANNELS).EnumUsedIDs())
{
    object item = dom.GetObject(itemId);

    string programIds = item.ChnEnumDPUsagePrograms();
    integer iUsage = item.ChnDPUsageCount();
    iUsageSum = iUsageSum + iUsage;

    if (programIds || iUsage) {
        !WriteLine(item.FullName() # " " # programIds);

        string liste; integer count = 0;

        foreach(liste, programIds) {
            count = count + 1;
            anzahl = anzahl + 1;
        }
        Write("Kanal: "# item.Name() #" wird noch in "# count #" Programmen genutzt!\n ");
        foreach(liste, programIds) {
            !WriteLine(programIds);
            Write(dom.GetObject(ID_PROGRAMS).Get(liste).Name() # " / ");
        }
        if ((iUsage - count) > 0) {
            Write("\n Usage: " # iUsage # " Count: "  # count);
        }
        WriteLine("\n");
    }
}

WriteLine("Summe: " # anzahl # " " # iUsageSum);

jp112sdl
Beiträge: 12116
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 849 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: CENTRAL-LINK von IP-Geräten löschen per Script (aka ReportValueUsage() bei HM Geräten)

Beitrag von jp112sdl » 25.10.2022, 07:17

Henke hat geschrieben:
25.10.2022, 03:51
das die Anzahl der Elemente in ChnEnumDPUsagePrograms teilweise vom Wert ChnDPUsageCount abweicht.
Ich hab es bei mir jetzt mal mit einem Kanal nachvollzogen.
Skript-Ausgabe war: Usage: 2 Count: 1

Gefunden habe ich 1 Programm, in dem der Kanal 2x (im WENN und im SONST WENN) verwendet wird.

Count wäre in Bezug auf "noch vorhandene Programme" richtig.
Usage wäre in Bezug auf "Anzahl an Verwendungen" richtig.

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

Benutzeravatar
Baxxy
Beiträge: 10850
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 610 Mal
Danksagung erhalten: 2230 Mal

Re: CENTRAL-LINK von IP-Geräten löschen per Script (aka ReportValueUsage() bei HM Geräten)

Beitrag von Baxxy » 26.10.2022, 21:53

Da ich jetzt selbst noch ein bisschen mit der Funktion getestet habe hier noch ein paar Erkenntnisse:
  • Dieser CENTRAL-LINK wird bei jedem* IP-Gerät angelegt wenn irgendein Status/Sensorwert von diesem Gerät erstmalig als Trigger in einem Programm genutzt wird. Der CENTRAL_LINK wird dann auf den zugehörigen Kanal gesetzt. (getestet mit WTH-2; PSM; SWDM; PCBS-BAT)
Warum das so gemacht wird könnte nur eQ-3 beantworten...
...meine Spekulation dazu:

Es ist eine "Sicherheitsmaßnahme". Wenn ich eine Automatisierung mittels WebUI-Programm einrichte möchte ich sicher sein das der Trigger samt Wert registriert und "verarbeitet" wird. Das möchte nun auch der Sender und erwartet deshalb eine Bestätigung von der Zentrale. Bei Funk- oder sonstigen Problemen versucht es der Sender mehrfach bis er aufgibt, genauso wie man es von anderen DV's kennt.

Die WebUI-Programme an sich funktionieren auch ohne den CENTRAL_LINK (IP-Taster nicht getestet). Ich habe ein simples Programm mit einem SWDM ("bei Fenster offen ODER bei Fenster geschlossen" bei Änderung) angelegt, und dann den CENTRAL_LINK gelöscht. Das Programm funktioniert weiterhin, der SWDM verhält sich als wäre er frisch angelernt.

Der Nachteil sollte klar sein, den SWDM interessiert es nun nicht mehr ob seine Daten ankamen und es gibt keine Sendungswiederholung. Ging die Sendung im Funknebel unter, triggert auch nicht das Programm.

Summa sumarum also doch nützlich. :)


Was ich aber völlig unlogisch finde ist folgendes:
Der CENTRAL_LINK wird theoretisch auch angelegt wenn ich den Trigger aus dem Programm entferne oder das gesamte Programm lösche.
Bisher konnte man nicht in so eine Situation kommen, denn war der CENTRAL_LINK erstmal da wird kein zweiter gesetzt oder der erste "überschrieben".
Mit einer kleinen Änderung im obigen Script kann man aber den CENTRAL_LINK auch löschen wenn es noch genutzte Programme gibt.
Das Programm funktioniert regulär weiter (weiter oben beschrieben). Lösche ich nun das Programm wird der CENTRAL_LINK erneut angelegt.

Die Frage wozu das dann gut sein soll kann wohl auch wieder nur eQ-3 beantworten...
...meine Spekulation dazu:

Hier wurde geschlampt.
Statt wie bei HM (reportValueUsage()) zu "zählen" ob der CENTRAL_LINK noch notwendig ist und ihn dann ggf. zu löschen wird der Link theoretisch einfach nochmal angelegt.

Summa summarum... Murks. :shock:


Für die Kommandozeilenfans hier noch die "Rohbefehle". Nutzung ausdrücklich nach eigenem Ermessen und auf eigene Gefahr!
(bei mir ist nix kaputtgegangen :wink: )

CENTRAL_LINK anlegen:

Code: Alles auswählen

echo 'load tclrpc.so; puts [xmlrpc http://127.0.0.1:32010 addLink [list string 001559939592C5:1] [list string CENTRAL_DEVICE:63]]' | tclsh
CENTRAL_LINK löschen:

Code: Alles auswählen

echo 'load tclrpc.so; puts [xmlrpc http://127.0.0.1:32010 removeLink [list string 001559939592C5:1] [list string CENTRAL_DEVICE:63]]' | tclsh
Fehler/Ausgabecodes sind in der "HomeMatic XML-RPC-Schnittstellen Beschreibung" sowie in "Homematic IP Legacy API
(XML-RPC-Schnittstelle) Addendum" (downloadbar bei eQ-3) zu finden.

jp112sdl
Beiträge: 12116
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 849 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: CENTRAL-LINK von IP-Geräten löschen per Script (aka ReportValueUsage() bei HM Geräten)

Beitrag von jp112sdl » 26.10.2022, 22:12

Es könnte ja mal jemand mit originaler CCU3 Firmware, ohne Addons, Skripte oder Experten-Parameter (sind damit alle supportwürdigen Anforderungen erfüllt?) eine Anfrage stellen, warum reportValueUsage bei HmIP nicht so funktioniert, wie in der Dokumentation angeben:

4.3.22 reportValueUsage

Code: Alles auswählen

 Boolean reportValueUsage(String address, String value_id, Integer ref_counter)
Diese Methode teilt dem Interfaceprozess in ref_counter mit, wie oft der Wert value_id des Kanals address innerhalb der Logikschicht (z.B. in Programmen)
verwendet wird. Dadurch kann der Interfaceprozess die Verbindung mit der entsprechenden Komponente herstellen bzw. löschen. Diese Funktion sollte bei jeder Änderung aufgerufen werden.
https://www.eq-3.de/Downloads/eq3/downl ... pc_API.pdf
https://www.eq-3.de/downloads/download/ ... dendum.pdf

Löschen geht halt bei HmIP damit nicht.
Eindeutig ein Fehler. Entweder im HMIPServer - oder in der Dokumentation.

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

Benutzeravatar
klana
Beiträge: 1102
Registriert: 08.02.2015, 08:37
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 66 Mal
Danksagung erhalten: 27 Mal

Re: CENTRAL-LINK von IP-Geräten löschen per Script (aka ReportValueUsage() bei HM Geräten)

Beitrag von klana » 22.11.2022, 06:55

Guten Morgen Zusammen,

Mit dem Script aus dem ersten Beitrag konnte ich meine 9 Heizungsgruppen wieder "Entblinken"!! JUHUUUU :mrgreen:
Vielen Dank dafür!!

Ich habe die Wandthermostate HMIP-WTH-2 mit Kanal 1 ins Script eingetragen und dann laufen lassen.
Bei der Prüfung aller 9 HG´s blinkte es nur noch 2-4 x und endete mit Grün.
Die Heizung wurde so eingestellt wie vorgegeben, die Fensterkontakte melden auch korrekt "Fenster auf" und die Temperatur wird abgesenkt.
Also alles so wie es sein soll.

Man bin ich froh!!!

Aber mal ehrlich...Blinkende Wandthermostate, immer wieder kaputte Programme nach dem Editieren, Erstellen neues Programm aus vorhandenem ebenfalls defekt... da sollte doch mal jemand bei EQ3 draufschauen können...das gibt doch kein gutes BIld ab....ich verstehe nicht, das da nix bei denen passiert.

Ich hatte auch schon öfters Kontakt zum Support und kenne die Textbausteine...

Nochmal Danke an alle die das hier rausgefunden haben!
Gruß Klana
Es ist nett, wichtig zu sein. Aber es ist wichtiger, nett zu sein.

jp112sdl
Beiträge: 12116
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 849 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: CENTRAL-LINK von IP-Geräten löschen per Script (aka ReportValueUsage() bei HM Geräten)

Beitrag von jp112sdl » 22.11.2022, 07:12

Mit der nächsten CCU FW Version 3.67.x sollte das Problem behoben sein und der Link auch wieder ordentlich entfernt werden, wenn das Gerät in keinem Programm mehr verwendet wird.

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

Benutzeravatar
klana
Beiträge: 1102
Registriert: 08.02.2015, 08:37
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 66 Mal
Danksagung erhalten: 27 Mal

Re: CENTRAL-LINK von IP-Geräten löschen per Script (aka ReportValueUsage() bei HM Geräten)

Beitrag von klana » 22.11.2022, 07:15

Der Tag wird immer besser :mrgreen: :mrgreen: :mrgreen: :mrgreen:
Gruß Klana
Es ist nett, wichtig zu sein. Aber es ist wichtiger, nett zu sein.

BanditDD
Beiträge: 28
Registriert: 22.10.2022, 16:12
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: CENTRAL-LINK von IP-Geräten löschen per Script (aka ReportValueUsage() bei HM Geräten)

Beitrag von BanditDD » 12.01.2023, 18:44

jp112sdl hat geschrieben:
22.11.2022, 07:12
Mit der nächsten CCU FW Version 3.67.x sollte das Problem behoben sein und der Link auch wieder ordentlich entfernt werden, wenn das Gerät in keinem Programm mehr verwendet wird.
DIe 3.67.10 ist ja nun mittlerweile da - meine Evas blinken jedoch immer noch (weil ich diese in Programmen verwende). Muss man also trotz des Fixes immer noch einzelne Heizkörperregler in jeweils eine eigene Gruße packen?

Benutzeravatar
Baxxy
Beiträge: 10850
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 610 Mal
Danksagung erhalten: 2230 Mal

Re: CENTRAL-LINK von IP-Geräten löschen per Script (aka ReportValueUsage() bei HM Geräten)

Beitrag von Baxxy » 12.01.2023, 19:20

Gefixt wurde ja nur das der CENTRAL-LINK auch wieder gelöscht wird wenn das Gerät in keinem Programm mehr als Trigger steht.
Vorher musste man dazu das Gerät aus der Zentrale löschen und neu anlernen. Also bevor wir hier die Scriptlösung / ssh-Befehle hatten.

Das blinken ist wieder ein anderes Problem das halt bei IP-Thermostaten auftritt wenn sie in Programmen als Trigger verwendet werden.
Hat sich vermutlich noch niemand (oder zu wenige) bei eQ-3 darüber beschwert.
BanditDD hat geschrieben:
12.01.2023, 18:44
Muss man also trotz des Fixes immer noch einzelne Heizkörperregler in jeweils eine eigene Gruße packen?
So ist der aktuelle Workaround, ja.
Du kannst die Thermostate natürlich auch in den Programmen lassen und den CENTRAL-LINK trotzdem (selber) löschen.
Entweder mit dem Konsolenbefehl (s.o.) oder mit meinem Script.
Beim Script müsstest du die Zeile:

Code: Alles auswählen

 if (programIds.Length() == 0) { 
ändern in:

Code: Alles auswählen

 if (programIds.Length() >= 0) {
Dann wird der Link gelöscht, egal in wie vielen Programmen das Gerät benutzt wird.

Antworten

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