Signaturgenerator und Inventurliste

Zwei Scripte zum Erstellen von Zusammenfassungen über alle Geräte

In QuickAccess, meinem nicht länger verfügbaren Add-on, gab es zwei Tools, mit denen man sich eine Übersicht über die an der CCU angemeldeten Geräte verschaffen konnte. Dahinter lagen Scripte, die auch direkt ausgeführt werden können, ohne das Add-on zu installieren.

Es muss allerdings ein Parser installiert sein, zum Beispiel dieser hier. Anschließend einfach eines der beiden Scripte in das Eingabefeld kopieren und ausführen. Das Ergebnis wird jeweils im Fenster für „stdout“ angezeigt.

Variablen in HomeMatic-Scripten

Die CCU hatte früher ein Limit von maximal 200 Variablen, das mit Firmware-Version 2.29.18 aufgehoben wurde. Dieses Limit bezog sich auf alle Variablen, die in allen Scripten verwendet werden. Gemeint sind Variablen, die direkt im Script definiert werden: object x; object y; var z;

Wenn Scripte nicht mehr funktionieren und bei der Prüfung unerklärliche Syntax-Fehler auftreten, sollte versuchsweise dieses Programm wieder gelöscht oder deaktiviert werden – oder, noch besser, auf die aktuelle Firmware-Version aktualisiert werden.

Strings in HomeMatic-Scripten

Durch String-Verwendung in HomeMatic-Scripten kann die CCU fehlerhaft arbeiten, instabil werden oder sogar abstürzen. Grundsätzlich gilt: Je öfter mit Strings hantiert wird, desto eher führt dies zu Problemen.

Ich empfehle daher, nach Umsetzung dieser Anleitung die CCU unter Beobachtung zu halten.

String-Verlängerung

In den Scripten auf dieser Seite werden Strings verlängert (x = x # y). Dies führt oft zu Störungen bei der Ausführung von Programmen:

  • Scripte in Programmen werden nicht mehr ausgeführt
  • bei der Fehlerprüfung erscheinen unerklärliche Syntax-Fehler

Durch einen Neustart werden diese Probleme (vorübergehend) behoben. Auch hier hängt die Dauer, bis es zu Störungen kommt, davon ab, wie häufig diese Programmschritte ausgeführt werden.

Signaturgenerator

Die Signatur ist geradezu obligatorisch für ehemalige Mitglieder des FHZ-Forums, aber natürlich kann sie auch in anderen Foren nützlich sein, um zu zeigen, wie groß die eigene Installation ist. Das Ergbenis sieht dann in meinem Fall so aus:

213 Kanäle in 120 Geräten:

9x HM-CC-TC, 10x HM-CC-VD, 8x HM-LC-Bl1-FM, 9x HM-LC-Sw1-Pl, 12x HM-LC-Sw2-FM, 13x HM-Sec-SC, 6x HM-Sec-SD, 8x HM-Sec-Win, 7x HM-Sec-MDIR, 1x HM-WDS100-C6-O, 14x HM-LC-Sw1-FM, 2x HM-RC-4, 2x HM-LC-Sw1-Pl-2, 1x HM-WDS30-T-O, 7x HM-PBI-4-FM, 2x HM-RC-12, 1x HM-LC-Sw4-SM, 2x HM-WDS10-TH-O, 1x HM-SwI-3-FM, 1x HM-LC-Dim1L-CV, 2x HM-LC-Dim1L-Pl, 1x HM-Sec-RHS

Um das folgende Script auszuführen, bitte komplett markieren, im Script-Parser ins Eingabefeld kopieren und ausführen.

! HomeMatic-Script
! SIGNATURGENERATOR UND INVENTURLISTE
! http://www.christian-luetgens.de/homematic/programmierung/tools/inventur/Inventur.htm

string s_device;
string s_channel;
object o_device;
integer i_devices = 0;
integer i_channels = 0;

string s_typelist = "";

foreach(s_device, dom.GetObject(ID_DEVICES).EnumUsedIDs()) {
  var o_device = dom.GetObject(s_device);
  if ((o_device.Address() != "BidCoS-Wir") && (o_device.Address() != "BidCoS-RF") && 
	  (o_device.HssType() != "HM-Sec-SD-Team")) {
	i_devices = i_devices + 1;
	s_typelist = s_typelist # o_device.HssType () # "\t";
	foreach(s_channel, o_device.Channels().EnumUsedIDs()) {
	  i_channels = i_channels + 1;
	}
  }
}

WriteXML(i_channels # " Kanäle in " # i_devices # " Geräten:");
WriteLine ('');

string s_typeidx;
string s_typeidx2;
string s_typechecked = "";
integer i_subcount;
foreach (s_typeidx, s_typelist) {
  if (s_typechecked.Find(s_typeidx) == -1) {
  i_subcount = 0;
  foreach (s_typeidx2, s_typelist) {
	if (s_typeidx2 == s_typeidx) { 
	  i_subcount = i_subcount + 1; }
	}
	if (s_typechecked == "") { 
	  s_typechecked = i_subcount # "x " # s_typeidx; 
	} else { 
	  s_typechecked = s_typechecked # ", " # i_subcount # "x " # s_typeidx; 
	}
  }
}

WriteXML (s_typechecked);

WriteLine('');

!  Ende des Scripts

Inventurliste

Etwas umfangreicher ist das zweite Script, das eine vollständige Auflistung aller Geräte und Kanäle einschließlich ihrer Namen liefert. Diese Liste kann nützlich sein bei der Fehlerbehebung oder wenn nach einem Defekt viele Geräte neu angelernt werden müssen.

So sieht die Liste aus:

HM-RC-4        Wohnzimmer.HM-RC-4      1 Wohnzimmer.Handsender.2.links-oben
HM-RC-4        Wohnzimmer.HM-RC-4      2 Wohnzimmer.Handsender.2.rechts-oben
HM-RC-4        Wohnzimmer.HM-RC-4      3 Wohnzimmer.Handsender.2.links-unten
HM-RC-4        Wohnzimmer.HM-RC-4      4 Wohnzimmer.Handsender.2.rechts-unten

HM-RC-4        Dachzimmer.HM-RC-4      1 Dachzimmer.Handsender.Deckenlicht aus
HM-RC-4        Dachzimmer.HM-RC-4      2 Dachzimmer.Handsender.Deckenlicht an
HM-RC-4        Dachzimmer.HM-RC-4      3 Dachzimmer.Handsender.Stehleuchte aus
HM-RC-4        Dachzimmer.HM-RC-4      4 Dachzimmer.Handsender.Stehleuchte an

HM-LC-Sw4-SM   Schuppen.HM-LC-Sw4-SM   1 Schuppen.Wandleuchte
HM-LC-Sw4-SM   Schuppen.HM-LC-Sw4-SM   2 Carport.Licht
HM-LC-Sw4-SM   Schuppen.HM-LC-Sw4-SM   3 Vorgarten.Laterne
HM-LC-Sw4-SM   Schuppen.HM-LC-Sw4-SM   4 Carport.Steckdose

HM-LC-Dim1L-CV Windfang.HM-LC-Dim1L-CV 1 Vorgarten.Licht

[ ... ]

Auch dieses Script muss komplett in das Eingabefeld der Parsers kopiert und dann ausgeführt werden. Die Laufzeit kann bei großen Installationen mehrere Sekunden betragen.

! HomeMatic-Script
! SIGNATURGENERATOR UND INVENTURLISTE
! http://www.christian-luetgens.de/homematic/programmierung/tools/inventur/Inventur.htm

string s_device;
object o_device;
integer i_devices = 0;

string s_channel;
object o_channel;
integer i_channels = 0;

string s_typelist = "";

string s_temp;

string lst_addresses = "";
string idx_addresses;
integer i_addresses;

integer i_hss_len = 0;
integer i_name_len = 0;

foreach(s_device, dom.GetObject(ID_DEVICES).EnumUsedIDs()) {
  var o_device = dom.GetObject(s_device);
  if ((o_device.Address() != "BidCoS-Wir") && (o_device.Address() != "BidCoS-RF") && 
	  (o_device.Address().Substr (0,1) != "*")) {
	i_devices = i_devices + 1;
	lst_addresses = lst_addresses # o_device.Address() # ":" # o_device.ID() # "\t";
	if (o_device.HssType().Length() > i_hss_len) {
	  i_hss_len = o_device.HssType().Length();
	}
	if (o_device.Name().Length() > i_name_len) {
	  i_name_len = o_device.Name().Length();
	}
  }
}

string lst_dps;
string idx_dps;

string last_address = "";
string next_address = "";

integer i;
string s;

while (next_address != "ZZZZZZZZ") {
  next_address = "ZZZZZZZZ";
  foreach (idx_addresses, lst_addresses) {
	if ((idx_addresses > last_address) && (idx_addresses < next_address)) {
	  next_address = idx_addresses;
	}
  }
  if (next_address != "ZZZZZZZZ") {
	o_device = dom.GetObject(next_address.StrValueByIndex(":",1));
	lst_dps = o_device.Channels().EnumUsedIDs();
	foreach (idx_dps, lst_dps) {
	  o_channel = dom.GetObject (idx_dps);
	  s = o_device.Address();
	  i = 10 - o_device.Address().Length();
	  while (i > 0) {
		i = i - 1;
		s = s # " ";
	  }
	  s = s # " " # o_device.HssType();
	  i = i_hss_len - o_device.HssType().Length();
	  while (i > 0) {
		i = i - 1;
		s = s # " ";
	  }
	  s = s # " " # o_device.Name();
	  i = i_name_len - o_device.Name().Length();
	  while (i > 0) {
		i = i - 1;
		s = s # " ";
	  }
	  i = o_channel.Address().StrValueByIndex(":",1).ToInteger();
	  if (i < 10) {
		s = s # "  " # i;
	  } else {
		s = s # " " # i;
	  }
	  s = s # " " # o_channel.Name();
	  WriteXML (s);
	  WriteLine ('');
	}
	WriteLine ('');
	last_address = next_address;
  }
}

!  Ende des Scripts

Navigation