KNX/EIB Gruppen alle als Switch importiert

Hallo,

Ich habe gestern IPS erstanden und sogleich auf meinen Raspberry Pi 2 installiert. Soweit funktioniert auch alles, und die Kommunikation mit dem EIB Gateway ist hergestellt. Allerdings sind mir nach dem OPC Import zwei Probleme aufgefallen:

[ol]
[li]Alle schaltbaren Gruppen wurden scheinbar als „Switch“ Typ erstellt (auch Rollläden).
[/li][li]Ein Test nach dem einstellen des korrekten Typs schlägt mir der Fehlermeldung „Group is configured as Switch“ fehl.
[/li][/ol]

Gibt es dafür eine Lösung, oder muss ich alle Gruppen manuell korrigieren und über den Objektbaum testen?

PS: Hier ein paar Screenshots davon:

Moin…

… hast Du in der ETS vor dem Export den korrekten Typ der GA ausgewählt?
Ich würde Dir für Rolladen/ Jalous eh die KNX Shutter Instanz empfehlen.
Gruß,
Peter

Danke für die Antwort!

Ich muss zugeben, dass ich mir über den Typ der Gruppenadresse nie Gedanken gemacht habe, da ich dachte, dass die ETS das beim verknüpfen automatisch festlegt. Kann ich den Typ der GA überhaupt direkt beeinflussen? Falls ja, kannst du mit einen Tipp geben, wie man das macht?

Kannst du mir das mit der Shutter Instanz bitte noch genauer erklären? Wo stelle ich die ein?

Welche ETS benutzt Du?!

Ich benutze derzeit ETS 4.1.8, da ich mich noch nicht zu einem Update zur 4.2 aufraffen konnte. :wink:

Ich habe in der zwischenzeit etwas herumprobiert, und habe jetzt mal so ein Shutter Objekt angelegt:

Mir ist jetzt allerdings noch nicht ganz klar, ob ich die beiden importierten Gruppen („Schlafzimmer AUF/AB“ und „Schlafzimmer STOP“) noch brauche (also löschen kann), oder nicht?
Und muss ich das für alle Rollos manuell machen, oder gibt’s da einen Trick, der solche Objekte anlegt?

Ich danke dir vielmals für deine Antworten!

Für die Rollos musst du es leider manuell machen. Aber du kannst dann die Einzel Instanzen löschen!

paresy

Danke für die Info, paresy!

Ich habe mir jetzt ein Script gebastelt, das Einzelinstanzen („Name Auf/Ab“, „Name STOP“) durch EIB Shutter Instanzen ersetzt. Da es so gut klappt und recht praktisch ist, würde ich das Skript auch gerne der Community hier zur Verfügung stellen. Gibt es da ein Repository oder soll ich es einfach in diesem Thread posten?

Ich habe noch eine Frage zum OPC Import. Wenn ich jetzt ein neues OPC importiere oder mit den EIB Konfigurator anschaue, dann sehe ich grün unterlegte Einträge für die bereits ersetzten EIB Gruppen (und die Instanz wird als „keine“ angegeben). Gibt es da eine Möglichkeit, dass das Programm erkennt, dass diese GA in Shutter instanzen angelegt sind?

Einfach hier posten! Vielen Dank…
Peter

Hier mein Skript. Es durchsucht alle Kategorien unter einem definierten Startpunkt (SHUTTER_ROOT), und verwandelt zusammengehörige EIB Gruppen in EIB Shutter Instanzen. Die Gruppen werden nach dem erfolgreichen Anlegen gelöscht, um Variablen zu sparen und aufzuräumen. Man kann dieses Skript also beliebig oft laufen lassen, insbesondere nach einem Neuimport der OPC Datei.

Zusammengehörige EIB Gruppen werden erkannt, wenn ihre Namen mit „Auf/Ab“, „Ab/Auf“ oder „STOP“ enden, und es zwei zusammenpassende Objekte gibt. Auf Groß-/Kleinschreibung wird dabei nicht geachtet.

Beispiel: Folgende EIB Gruppen Struktur in IPS mit Kategorien

  • Erdgeschoss
  • – Rollo Wohnzimmer Auf/Ab
  • – Rollo Wohnzimmer STOP
  • Obergeschoss
  • –Rollo Schlafzimmer ab/auf
  • –Rollo Schlafzimmer stop

wird in folgende EIB Shutter Instanzen umgewandelt:

  • Erdgeschoss
  • – Rollo Wohnzimmer
  • Obergeschoss
  • –Rollo Schlafzimmer
<?

/* ***************************************************************
 * This script creates "EIB Shutter" instances out of ordinary
 * "EIB Group" instances, which for example were created when
 * importing a OPC (*.esf) file.
 * The script searches for all EIB group instances whose name
 * matches a certain pattern (see below).
 *
 * (c) Josef "Elandril" S., Austria, 2015-06-06
 * ***************************************************************/
 
/* The root path for the EIB instances which shall be converted.
 * All categories below this will be searched!
 */
define("SHUTTER_ROOT", utf8_decode("Rolläden, Jalousien"));

/* The search pattern for the EIB groups which will become shutter
 * instances.
 * By default this are names ending with 'Auf/Ab', 'Ab/Auf' or 'STOP'
 * with a case-insensitive comparison. Be careful when modifying this
 * since the matching result is used for creating the name of the final
 * EIB shutter instances! Modification also need to be taken into account
 * for the two findObject calls!
 */
define("SHUTTER_NAME_PATTERN", '#^((.+?)\s+)(Auf/Ab|Ab/Auf|STOP)$#i');

/* Utility functions */
function findModuleGUID($name) {
	foreach(IPS_GetModuleList() as $guid)
	{
		$module = IPS_GetModule($guid);
		if ($module['ModuleName'] == $name)
		   return $guid;
	}
}

function findObject($IdList, $parentId, $guess, $pattern) {
	$obj = false;
	if (is_array($guess)) {
	   foreach($guess as $name) {
	      $obj = @IPS_GetObjectIDByName($name, $parentId);
	      if ($obj !== false) return $obj;
		}
	} else {
   	$obj = @IPS_GetObjectIDByName($guess, $parentId);
   }
   if ($obj === false) {
      foreach($IdList as $id) {
         if (IPS_ObjectExists($id) && preg_match($pattern, IPS_GetName($id)) == 1)
            return $id;
      }
   } else {
      return $obj;
	}
	return false;
}

function deleteEIBGroup($instance, $withChildren = true) {
	if ($withChildren && IPS_HasChildren($instance)) {
	   foreach(IPS_GetChildrenIDs($instance) as $childId) {
	      IPS_DeleteVariable($childId);
	   }
	}
	return IPS_DeleteInstance($instance);
}

function walkTree($base, $shutterGUID, $groupGUID) {
	$cntCreate = 0;
	$cntDelete = 0;
	$cntError  = 0;
	$deleted = array();
   $children = IPS_GetChildrenIDs($base);
   foreach ($children as $childId) {
      if (in_array($childId, $deleted)) continue;
      $child = IPS_GetObject($childId);
      //print_r($child);
      if ($child['ObjectType'] == 0 && $child['HasChildren']) { // Kategorie
         $counts = walkTree($childId, $shutterGUID, $groupGUID);
         	$cntCreate += $counts[0];
				$cntDelete += $counts[1];
				$cntError  += $counts[2];
      } elseif ($child['ObjectType'] == 1) { // Instanz
         $instance = IPS_GetInstance($childId);
         if (is_array($instance) && $instance['ModuleInfo']['ModuleID'] == $groupGUID &&
					preg_match( SHUTTER_NAME_PATTERN, $child['ObjectName'], $match)==1 ) {
            //print_r(IPS_GetInstance($childId));
            if (preg_match( '#\s+STOP$#i', $child['ObjectName']) == 1) {
               $stopId = $childId;
               $moveId = findObject($children, $base, array( $match[1].'Auf/Ab', $match[1].'auf/ab',
									$match[1].'Ab/Auf', $match[1].'ab/auf'), '#^'.$match[1].'(Auf/Ab|Ab/Auf)$#i');
            } else {
               $moveId = $childId;
					$stopId = findObject($children, $base, array( $match[1].'STOP', $match[1].'stop',
									$match[1].'Stop'), '#^'.$match[1].'(STOP)$#i');
            }
            if ($moveId !== false && $stopId !== false) {
					$moveGA = array(
						IPS_GetProperty($moveId, 'GroupAddress1'),
	               IPS_GetProperty($moveId, 'GroupAddress2'),
	               IPS_GetProperty($moveId, 'GroupAddress3')
					);
					$stopGA = array(
						IPS_GetProperty($stopId, 'GroupAddress1'),
	               IPS_GetProperty($stopId, 'GroupAddress2'),
	               IPS_GetProperty($stopId, 'GroupAddress3')
					);
					if ($shutter = IPS_CreateInstance($shutterGUID)) {
					   printf("New EIB Shutter Instance %d: Move %d/%d/%d - Stop %d/%d/%d : %s
", $shutter,
							$moveGA[0], $moveGA[1], $moveGA[2], $stopGA[0], $stopGA[1], $stopGA[2], $match[2]);
						$cntCreate++;
					   if (!IPS_SetName($shutter, $match[2])) $cntError++;
					   if (!IPS_SetIcon($shutter, 'Shutter')) $cntError++;
					   if (!IPS_SetParent($shutter, $base)) $cntError++;
					   IPS_SetProperty($shutter, 'GroupMoveAddress1', $moveGA[0]);
					   IPS_SetProperty($shutter, 'GroupMoveAddress2', $moveGA[1]);
					   IPS_SetProperty($shutter, 'GroupMoveAddress3', $moveGA[2]);
					   IPS_SetProperty($shutter, 'GroupStopAddress1', $stopGA[0]);
					   IPS_SetProperty($shutter, 'GroupStopAddress2', $stopGA[1]);
					   IPS_SetProperty($shutter, 'GroupStopAddress3', $stopGA[2]);
					   if (IPS_ApplyChanges($shutter)) {
						   printf("Delete Instance %d: %s
", $moveId, IPS_GetName($moveId));
						   if (deleteEIBGroup($moveId))
		            		$cntDelete++;
							else
							   $cntError++;
		            	printf("Delete Instance %d: %s
", $stopId, IPS_GetName($stopId));
		            	if (deleteEIBGroup($stopId))
		            		$cntDelete++;
							else
							   $cntError++;
		            	array_push($deleted, $moveId, $stopId);
	            	} else
	            	   $cntError++;
					} else
						$cntError++;
            }
         }
      }
   }
   return array($cntCreate, $cntDelete, $cntError);
}

$rootId = IPSUtil_ObjectIDByPath(SHUTTER_ROOT);
$shutterGUID = findModuleGUID('EIB Shutter');
$groupGUID = findModuleGUID('EIB Group');

list($numCreated, $numDeleted, $numError) = walkTree($rootId, $shutterGUID, $groupGUID);

printf("Result: %d created, %d deleted, %d errors
", $numCreated, $numDeleted, $numError);

?>

Ich hoffe, das Skript ist für euch genauso hilfreich, wie für mich. Falls ihr noch Fragen habt oder Probleme auftreten, einfach bei mir melden.

Um noch mal auf den GA-Typ in der ETS zu kommen.

Den Aktor anwählen… dann ein Objekt markieren (anklicken) und auf Eigenschaften.
Rest siehe Screenshot.

Gruß,
Peter

Danke vielmals! Dieser Punkt ist mir noch nie aufgefallen, und ich war naiver weise davon ausgegangen, dass die ETS mit den Infos aus den Produktdatenbanken alle Typen automatisch korrekt setzt… :smiley:

Vielleicht kannst du mir noch bei einem Webfront Problem weiterhelfen: Wie kann man EIB Datums- und Uhrzeit-Werte im Webfront ordentlich formatieren? Und wie wird man die „Value“ Einträge los bzw. formatiert das angenehmer? Ich hab mal einen Screenshot davon gemacht:

Zum Webfront: Benutze unbedingt nur Links! Erstelle Dir mal ne Kategorie und leg Dir da mit weiteren Kategorien, Dummy -Instanzen und Links eine Steuktur an und schau Dir das dann mal im Webfront an. Du kannst dann auf die einzelnen Variable deiner „Nacht-Instanz“ verlinken.
Mach es gleich richtig und benutze nicht die original Instanzen!
Du kannst ne einzelne Variable oder Instanz beliebig oft verlinken und jeden Link anders benennen und ihn auch jeweils ein anderes Icon geben. Probier es aus. Gibt auch genug Themen dazu im Forum.

Das Value würdest du so nicht wegbekommen… Kannst aber anders benennen.
Aber wenn du mit den Links arbeitest hast das Problem nicht mehr!
Peter

Hey ,

Zu dem Datum und der Uhrzeit, einfach mit einem klein Script die Daten beschneiden. Anschließend dann wieder zusammen bauen !! Und in eine String Variable ablegen. So wird alles schön ! Und dann wie gesagt die Links nutzen !!

Gruß Bernd

Achso… zum Datum… ich mach das eigentlich so, das ich vom IPS-Server DATUM und UHRZEIT auf den EIB-Bus sende.
Peter