Analysescript für genutzte Funk-Adressen, Funkmodul-Hardware und Zentralen Hardware
Verfasst: 27.10.2020, 17:00
Bei meiner Analyse zum Vererben der "Zentralen-Funk-Adressen" beim Backup einspielen... und anschließendem Aufdecken eines ziemlich miesen Bugs, bei dem CCU3 / RaspberryMatic das Funkmodul (RPI-RF-MOD) nicht korrekt auslasen und somit alle mit der gleichen Adresse funkten, ist ein Script entstanden welches ich hier nochmal in leicht überarbeiteter Form zur Verfügung stelle.
Hier mal ein Beispielhaftes Ergebnis der Ausgabe (im Script testen ausgeführt):
Beispielausgabe:
Info:
... bitte im Herkunfts-Thread posten.
Das Script:
Edit: auf Version 2.1 aktualisiert - Inkompatibilität mit RegaHSS=R1.00.0388.0217 (CCUx und Derivate) beseitigt
Edit: auf Version 2.3 aktualisiert - kleinere Optimierungen / Beispielausgabe aktualisiert
Edit: auf Version 2.5 aktualisiert - Ausgabe verbundener Klienten (ioBroker, Homeassistant, NodeRED, Homematic Manager usw.) eingebaut
Edit: auf Version 2.6 aktualisiert - BidCos-Interface Abfrage optimiert, Info-Ausgabe erweitert, Beispielausgabe aktualisiert
Edit: auf Version 2.7 aktualisiert - kleinere Optimierungen / Beispielausgabe aktualisiert
Hier mal ein Beispielhaftes Ergebnis der Ausgabe (im Script testen ausgeführt):
Beispielausgabe:
Code: Alles auswählen
Auflistung der gefundenen BidCos-Adressen:
BidCoS-Adresse der HM-RCV-50 (nutzt das Analyzer-Script für seine Anzeige): 16770025
BidCoS-Adresse aus /etc/config/ids (die aktuell genutzte Adresse): 16770025
BidCoS-Adresse aus /var/ids (beim Systemstart ausgelesene Adresse): 0xFFE3E9
Zentralen-Hardware: ova-KVM
VERSION=3.71.12.20231104
PRODUCT=raspmatic_ova
PLATFORM=ova
RegaHSS=R1.00.0388.0235
Gefundene Geräte:
SN: PEQ0532930 | Typ: HMLGW2 | DutyCycle: 0%
SN: SEQ0896344 | Typ: CCU | DutyCycle: 1%
Funkmodul-Daten des aktuellen Moduls:
Funkmodul Typ: HMIP-RFUSB
Funkmodul Firmware: 4.4.18
Funkmodul Seriennummern: SEQ0896344 | 1D89971558
Funkmodul Anschluss: eQ-3HmIP-RFUSB@usb-0000:02:1b.0-1
Funkmodul-Daten des initialen Moduls:
Funkmodul Seriennummer.: n/a
Auswertung:
Deine Zentrale funkt mit einer unikalen BidCos-Adresse (16770025), also alles gut!
Wenn du diese Adresse in dezimal umrechnest
(z.B. mittels https://www.rapidtables.com/convert/number/hex-to-decimal.html)
sollte die vom Analyzer genutzte Adresse (16770025) dabei herauskommen.
Info:
Deine Zentrale hatte beim ersten Start kein direkt verbundenenes Funkmodul,
daher konnten keine alten Funkmodul-Daten ausgelesen werden.
- für CCU3 ab 3.53.34 (und deren Derivate) sowie RaspberryMatic ab 3.53.30.20201024
- nicht getestet mit CCU2
- die Ausgaben können sich zwischen CCU3 und RaspberryMatic geringfügig unterscheiden
- CCU3 liest den Anschluss-Typ nicht aus, aber da geht je eh nur RPI-RF-MOD auf GPIO
... bitte im Herkunfts-Thread posten.
Das Script:
Code: Alles auswählen
!- Analysescript für genutzte Funk-Adressen, Funkmodul-Hardware, Zentralen Hardware und verbundene Klienten
!- by Baxxy (powered by Black)
!- v2.7 - 05.11.23
!- für CCU3 ab 3.53.34 (und deren Derivate) sowie RaspberryMatic ab 3.53.30.20201024 | nicht getestet mit CCU2
!- https://homematic-forum.de/forum/viewtopic.php?f=31&t=62096#p614148
string modul_data = "ja"; !- ["ja"] oder ["nein"] eintragen um sensible Funkmoduldaten auszugeben
string crypt_data = "ja"; !- Infos zum Sicherheitsschlüssel-Status ausgeben ["ja"] oder eben nicht ["nein"]
string client_data = "ja"; !- Infos zu Klienten, die an den Schnittstellen hängen, anzeigen. z.B. ioBroker, Homeassistant, nodeRed, Homematic-Manager ["ja"] oder ["nein"]
!----------------------------------------------------------------------------------------
string sDevId; string ids_address; string start_address; string hmip_firmw; string rf_serial = ""; string hmip_serial; string old_serial; string rf_hw; string sys_hw;
string data; string dc_value = "-"; string stdOut; string stdErr; object oInterface; string sInterfaceURL;
foreach(sDevId, root.Devices().EnumUsedIDs()) {
var dev= dom.GetObject(sDevId);
if (dev.Address() == "BidCoS-RF") {
string desc = dev.MetaData("DEVDESC");
integer anfang = desc.Find("RF_ADDRESS:");
integer ende = desc.Find(",ROAMING");
string analyzer_address = desc.Substr(anfang + 11, ende - anfang + 11).Trim();
WriteLine("Auflistung der gefundenen BidCos-Adressen:");
WriteLine("BidCoS-Adresse der HM-RCV-50 (nutzt das Analyzer-Script für seine Anzeige): "# analyzer_address);
}}
system.Exec("grep -i BidCoS-Address /etc/config/ids | tr -d '[:space:]' | cut -d= -f2", &ids_address);
ids_address = ids_address.Trim();
WriteLine("BidCoS-Adresse aus /etc/config/ids (die aktuell genutzte Adresse): "# ids_address);
system.Exec("grep -i BidCoS-Address /var/ids | tr -d '[:space:]' | cut -d= -f2", &start_address);
WriteLine("BidCoS-Adresse aus /var/ids (beim Systemstart ausgelesene Adresse): "# start_address.Trim() #"\n");
system.Exec("grep HM_HOST= /var/hm_mode | tr -d '[:space:]' | cut -d= -f2", &sys_hw);
WriteLine("Zentralen-Hardware: "# sys_hw.Replace("'","").Trim() #"\n");
system.Exec("cat /boot/VERSION", &data);
WriteLine(data.Trim());
WriteLine("RegaHSS="# dom.BuildLabel() #"\n");
if (modul_data == "ja"){
oInterface = interfaces.Get ("BidCos-RF");
if (oInterface) {
sInterfaceURL = oInterface.InterfaceUrl();
string sTCL= ^puts [xmlrpc ^ # sInterfaceURL # ^/ listBidcosInterfaces]^;
system.Exec ("/bin/sh -c 'echo \"load tclrpc.so; " # sTCL # "\" |tclsh'",&stdOut,&stdErr);
if (stdOut) {
!- 3 Test-Zeilen fürs Debugging
!stdOut = "{ADDRESS NEQ1694194 CONNECTED 1 DEFAULT 0 DESCRIPTION {} DUTY_CYCLE 100 FIRMWARE_VERSION 1.4.1 TYPE HMLGW2} {ADDRESS QEQ0682647 CONNECTED 1 DEFAULT 1 DESCRIPTION {} DUTY_CYCLE 77 FIRMWARE_VERSION 4.2.6 TYPE CCU2} {ADDRESS LEQ1694195 CONNECTED 1 DEFAULT 0 DESCRIPTION {} DUTY_CYCLE 22 FIRMWARE_VERSION 1.4.1 TYPE HMLGW2}";
!stdOut = "{ADDRESS PEQ0532930 CONNECTED 1 DEFAULT 0 DESCRIPTION {} DUTY_CYCLE 1 FIRMWARE_VERSION 2.8.6 TYPE HMLGW2} {ADDRESS SEQ0896344 CONNECTED 1 DEFAULT 1 DESCRIPTION {} DUTY_CYCLE 1 FIRMWARE_VERSION 4.4.18 TYPE CCU2}";
!Write("Out: "# stdOut);
string s = stdOut.Replace("{ADDRESS",";").Substr(2);
WriteLine("Gefundene Geräte:");
integer n = 0;
string Serials = "";
while (n <= web.webGetValueListCount(s) -1) {
string l = web.webGetValueFromList(s,n);
string sType = l.Substr(l.Find("TYPE ")+ 5,6).Replace("}","").Trim();
string sAddr = l.Substr(0,l.Find("CONNECTED"));
sAddr.Trim();
string dc_value = l.Substr(l.Find("CYCLE") + 6, l.Find("FIRMWARE") - l.Find("CYCLE") + 6).Trim();
if (sType.Contains("CCU")) {
if ((Serials) && (Serials.StartsWith(";"))) {Serials = sAddr #";"# Serials;} else {Serials = sAddr;}
rf_serial = Serials;
WriteLine("SN: "# Serials.Trim() #" | Typ: "# sType.Substr(0,3) #" | DutyCycle: "# dc_value #"%");
}
else {
if ((Serials) && (Serials.StartsWith(";"))) {Serials = Serials #";"# sAddr;} else {Serials = sAddr;}
WriteLine("SN: "# Serials.Trim() #" | Typ: "# sType #" | DutyCycle: "# dc_value #"%");
}
n = n + 1;
}}
else {
WriteLine("Fehler beim auslesen der Seriennummern...\nFehlermeldung: "# stdErr.Trim() #"\nAlternative Auslesemethode wird genutzt...");
system.Exec("cat /var/rf_board_serial", & rf_serial);
}}
else {
WriteLine("BidCos-Interface zum auslesen der Daten nicht gefunden...\nAlternative Auslesemethode wird genutzt...");
system.Exec("cat /var/rf_board_serial", & rf_serial);
}
WriteLine("\nFunkmodul-Daten des aktuellen Moduls:");
system.Exec("grep HM_HMIP_DEV= /var/hm_mode | tr -d '[:space:]' | cut -d= -f2", &rf_hw);
WriteLine("Funkmodul Typ: "# rf_hw.Replace("'","").Trim());
system.Exec("cat /var/hmip_firmware_version", &hmip_firmw);
WriteLine("Funkmodul Firmware: "# hmip_firmw.Trim());
system.Exec("cat /var/hmip_board_serial", &hmip_serial);
WriteLine("Funkmodul Seriennummern: "# rf_serial.Trim() #" | "# hmip_serial.Trim());
system.Exec("grep HM_HMIP_DEVTYPE= /var/hm_mode | tr -d '[:space:]' | cut -d= -f2", &rf_hw);
WriteLine("Funkmodul Anschluss: "# rf_hw.Replace("'","").Trim() #"\n");
WriteLine("Funkmodul-Daten des initialen Moduls:");
system.Exec("grep -i SerialNumber /etc/config/ids | tr -d '[:space:]' | cut -d= -f2", &old_serial);
string old_serial_sn = "n/a";
old_serial = old_serial.Trim();
if (old_serial) { old_serial_sn = old_serial; }
WriteLine("Funkmodul Seriennummer.: "# old_serial_sn #"\n");
}
if (crypt_data =="ja"){
string cmd = "/bin/sh -c 'crypttool -g'";
system.Exec(cmd, &stdOut, &stdErr);
if (stdOut){
WriteLine("Schlüsselanalyse:\n"# stdOut);
}
else {
WriteLine("Fehler in Schlüsselanalyse:\n "# stdErr);
}}
if (client_data =="ja"){
string rfd_handlers; string virt_dev_handlers; string ip_handlers;
system.Exec("cat /var/LegacyService.handlers", & ip_handlers);
system.Exec("cat /var/RFD.handlers", & rfd_handlers);
system.Exec("cat /var/HMSERVER.handlers", & virt_dev_handlers);
ip_handlers = ip_handlers.Substr(ip_handlers.Find("CET ")+ 9,1000);
WriteLine("verbundene Klienten:");
WriteLine("- HmIP Schnittstelle:\n"# ip_handlers.Trim() #"\n\n- BidCos-RF Schnittstelle:\n"# rfd_handlers.Trim() # "\n\n- Virt.-Devices Schnittstelle:\n"# virt_dev_handlers.Trim() #"\n");
}
WriteLine("Auswertung:");
if ((ids_address != 65535 ) && (ids_address != 0 )){
WriteLine("Deine Zentrale funkt mit einer unikalen BidCos-Adresse (" # ids_address # "), also alles gut!
Wenn du diese Adresse in dezimal umrechnest
(z.B. mittels https://www.rapidtables.com/convert/number/hex-to-decimal.html)
sollte die vom Analyzer genutzte Adresse ("# analyzer_address #") dabei herauskommen.\n");
}
else {
WriteLine("Deine Zentrale funkt nicht mit einer unikalen BidCos-Adresse ("# ids_address #")!!!
Du solltest den ganzen Thread lesen und selbst entscheiden
ob du was (dagegen) unternehmen möchtest.\n");
}
if (old_serial_sn == "n/a") {
WriteLine("Info:\nDeine Zentrale hatte beim ersten Start kein direkt verbundenenes Funkmodul,\ndaher konnten keine alten Funkmodul-Daten ausgelesen werden."); }
elseif (!((hmip_serial.Trim() == old_serial.Trim()) || (rf_serial.Trim() == old_serial.Trim()))) {
WriteLine("Info:\nDeine Zentrale läuft mit dem Backup einer anderen Zentrale\noder das Funkmodul wurde irgendwann gewechselt."); }
Edit: auf Version 2.3 aktualisiert - kleinere Optimierungen / Beispielausgabe aktualisiert
Edit: auf Version 2.5 aktualisiert - Ausgabe verbundener Klienten (ioBroker, Homeassistant, NodeRED, Homematic Manager usw.) eingebaut
Edit: auf Version 2.6 aktualisiert - BidCos-Interface Abfrage optimiert, Info-Ausgabe erweitert, Beispielausgabe aktualisiert
Edit: auf Version 2.7 aktualisiert - kleinere Optimierungen / Beispielausgabe aktualisiert