Script-Hilfe / Ideen bezüglich Ausgabe der Kanalnamen eines Gerätes anhand der Seriennummer gesucht

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Antworten
Benutzeravatar
Baxxy
Beiträge: 10819
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 607 Mal
Danksagung erhalten: 2223 Mal

Script-Hilfe / Ideen bezüglich Ausgabe der Kanalnamen eines Gerätes anhand der Seriennummer gesucht

Beitrag von Baxxy » 23.11.2020, 15:44

Ich versuche mich gerade an einem Script was mir anhand der Seriennummer des Gerätes dessen Kanalnamen ausgibt. Das klappt mit einem kleinen Umweg auch ganz gut.
Script:

Code: Alles auswählen

string device_ser = "INT0000008"; !- Seriennummer eintragen
string device_fam = "VirtualDevices"; !- Gerätekategorie eintragen - Optionen: HmIP-RF | BidCos-RF | CUxD | VirtualDevices
object o_Device; object o_Channel; string s_liste;

o_Device= xmlrpc.GetObjectByHSSAddress (interfaces.Get (device_fam), device_ser);
if (o_Device) {
WriteLine("Gerätename: "# o_Device.Name());
foreach (s_liste,o_Device.Channels() ){o_Channel= dom.GetObject (s_liste);
if (o_Channel) {
if (o_Channel.Type() == OT_CHANNEL) {
WriteLine ("\tKanal "# o_Channel.ChnNumber() #" heißt:   "# o_Channel.Name());
!WriteLine ("\tKanal "# o_Channel.ChnNumber() #" heißt:  "# o_Channel.Name() #"\n\tSichtbarkeit: "# o_Channel.Visible() #" | Intern: "#o_Channel.Internal());
}}}}
Ausgabe:

Code: Alles auswählen

Gerätename: IP-Heizgruppe INT08 - Virt Device
	Kanal 0 heißt:   IP-Heizgruppe INT08:0 - Service
	Kanal 1 heißt:   IP-Heizgruppe INT08:1 - Bedienung
	Kanal 2 heißt:   IP-Heizgruppe INT08:2 - 2PunktLink
	Kanal 3 heißt:   IP-Heizgruppe INT08:3 - Fensterkontakt
	Kanal 4 heißt:   IP-Heizgruppe INT08:4 - Schaltausgang
	Kanal 5 heißt:   IP-Heizgruppe INT08:5 - Taster
Den Umweg (hier string device_fam;) die "Gerätefamilie" händisch einzutragen würde ich gerne einsparen.
Daher suche ich einen Weg als erstes anhand der Seriennummer die "Gerätefamilie" zu ermitteln.


Gegen alternative Vorschläge die zum Ziel führen habe ich natürlich auch nichts einzuwenden. :wink:

Ein Versuch mit...

Code: Alles auswählen

string s_DevId; object o_Dev;
foreach(s_DevId, root.Devices().EnumUsedIDs())
{
  o_Dev = dom.GetObject(s_DevId);
  WriteLine("Name: "# o_Dev #" | Interface: "# o_Dev.Interface() #" | Serial: "# o_Dev.Address());
} 
gibt mir nur den Integer-Wert aus. Der scheint zwar bei den Standart-Protokollen immer gleich zu sein, aber zumindest bei CUxD ist der Wert bei verschiedenen Zentralen unterschiedlich.
Zentrale A:

Code: Alles auswählen

Name: CuxD-TransformDevice | Interface: 1391 | Serial: CUX9000001
Name: Fensterkontakt-Test: HmIP-SWDO | Interface: 1009 | Serial: 0000D8A99794D9
Name: HM-ES-PMSw1-Pl LEQ0529290 | Interface: 1007 | Serial: LEQ0529290
Name: HM-Heizgruppe INT0000009 | Interface: 1008 | Serial: INT0000009
Zentrale B:

Code: Alles auswählen

Name: CUxD-Device-Transform: CCU Status | Interface: 1239 | Serial: CUX9000004

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

Re: Script-Hilfe / Ideen bezüglich Ausgabe der Kanalnamen eines Gerätes anhand der Seriennummer gesucht

Beitrag von jp112sdl » 23.11.2020, 16:04

Such doch das Gerät ohne Interface

Code: Alles auswählen

string device_ser = "ABCDEF0000"; !- Seriennummer eintragen

string a="";
object o = dom.GetObject(ID_DEVICES);
foreach (a, o.EnumUsedIDs()) {
  object o_Device = dom.GetObject(a); 
  var addr = o_Device.Address();
  if (addr == device_ser) {
    object o_Channel; string s_liste;
    WriteLine("Gerätename: "# o_Device.Name());
    foreach (s_liste,o_Device.Channels() ){o_Channel= dom.GetObject (s_liste);
    if (o_Channel) {
    if (o_Channel.Type() == OT_CHANNEL) {
    WriteLine ("\tKanal "# o_Channel.ChnNumber() #" heißt:   "# o_Channel.Name());
    !WriteLine ("\tKanal "# o_Channel.ChnNumber() #" heißt:  "# o_Channel.Name() #"\n\tSichtbarkeit: "# o_Channel.Visible() #" | Intern: "#o_Channel.Internal());
    }}}  
  }
}

VG,
Jérôme ☕️

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


Benutzeravatar
Black
Beiträge: 5480
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: Script-Hilfe / Ideen bezüglich Ausgabe der Kanalnamen eines Gerätes anhand der Seriennummer gesucht

Beitrag von Black » 23.11.2020, 16:49

@Baxxy,

mit deiner Version hättest du auch in die Doku des SDV schauen können und dabei gefunden:

Interface.JPG

heisst, GetObjectByHSSAdress hat zwar Interface in der Parametrierung, filtert aber nicht danach, es muss nur ein Gültiges interface sein.
es würde also reichen, wenn du
GetObjectByHSSAdress (interfaces.GetAt(0),....... als parameter angibst, damit ist BEI DIESER METHODE aus dem xmlrpc Namensraum immer ein gültiges Interfaces indiziert.

Black

(den Typo hab ich grade im Quellcode berichtigt)
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

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

Re: Script-Hilfe / Ideen bezüglich Ausgabe der Kanalnamen eines Gerätes anhand der Seriennummer gesucht

Beitrag von Baxxy » 23.11.2020, 17:00

Black hat geschrieben:
23.11.2020, 16:49
hättest du auch in die Doku des SDV schauen
Tatsächlich hatte ich dort auch geschaut und mir Inspiration durch das SDV-Script zur Namenswiederherstellung von Geräten + Kanälen geholt.
:wink:
Aber das "Kleingedruckte" hatte ich nicht so recht verstanden.
Danke für's aufklären! :)

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Script-Hilfe / Ideen bezüglich Ausgabe der Kanalnamen eines Gerätes anhand der Seriennummer gesucht

Beitrag von alchy » 24.11.2020, 11:02

Baxxy hat geschrieben:
23.11.2020, 15:44
Ich versuche mich gerade an einem Script was mir anhand der Seriennummer des Gerätes dessen Kanalnamen ausgibt.
Neben den schon angesprochenen

Code: Alles auswählen

WriteLine((xmlrpc.GetObjectByHSSAddress(interfaces.GetAt(0),"INT0000001")).Name());
oder eben

Code: Alles auswählen

WriteLine((xmlrpc.GetObjectByHSSAddress(interfaces.GetAt(0),"INT0000001:1")).Name());


Baxxy hat geschrieben:
23.11.2020, 15:44
Ein Versuch mit...
gibt mir nur den Integer-Wert aus.
das kannst du natürlich auch ändern mit :

Code: Alles auswählen

string s_DevId; object o_Dev;object iface;
foreach(s_DevId, root.Devices().EnumUsedIDs())
{
  o_Dev = dom.GetObject(s_DevId);
  iface = dom.GetObject(o_Dev.Interface());
  WriteLine("Name: "# o_Dev.Name() #" | Interface: "# iface.Name() #" | Serial: "# o_Dev.Address());
}
oder auch gleich mit .EnumUsedNames()

Code: Alles auswählen

string s_DevId; object o_Dev;object iface;
foreach(s_DevId, root.Devices().EnumUsedNames())
{
  o_Dev = dom.GetObject(s_DevId);
  iface = dom.GetObject(o_Dev.Interface());
  WriteLine("Name: "# o_Dev #" | Interface: "# iface #" | Serial: "# o_Dev.Address());
}

der Wege gibt es viele.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Antworten

Zurück zu „HomeMatic allgemein“