Apple HomeKit: Anbindung an IPS auf Basis der HomeBridge von nfarina

Interessanter Ansatz. Einfach eine „eigene“ IPS-Schnittstelle per HTTP-GET implementieren. Hat aber leider das Problem, dass du dann jedes IPS-Element manuell als Accessory anlegen müsstest. Ausserdem unterstützt die Http.js derzeit glaube ich keinen Abruf von Daten (Temperatur, etc.)

Ich versuche mich da lieber mal in der Erweiterung von Andre’s Symcon.js.

Das wäre super! Denn ich bin nicht wirklich der Programmierer… ich kann höchstens etwas anpassen was ich vorliegen habe… ja umständlich ist es aber als Workaround funktioniert es erstmal. Ich frage mich dennoch weiterhin wieso das Homematic plugin nicht funktioniert…

vlt sogar einfach die Möglichkeit Scripte zu steuern statt Devices (also zusätzlich)… über http gehts natürlich aber über die Symcon Schnittstelle? (konnte Sie ja bisher nicht nutzen da er die HM Devices leider nicht findet)

Unterstützt Homekit denn Rückmeldungen?

Hallo Andre,

kann es sein, dass bei dir ein Fehler in den node-json-rpc rpcClientOptions vorliegt?

Ich habe in der config.json die korrekten Login-Daten eingegeben (auch base64encodiert). Die Verbindung zum IP-Symcon Server habe ich manuell überprüft und sie klappt.

Zuerst dachte ich Denn bei mir werden keine Instanzen gefunden.


Loading 1 platforms...
[Symcon] Initializing Symcon platform...
[Symcon] Fetching Symcon instances...
Loading 0 accessories...
[Symcon] 0 instances found

Dann habe ich mal einen Test-Call gemacht und siehe da:


symcon.js:

function SymconPlatform(log, options) {
	this.log = log;
	this.options = options;
	this.client = new rpc.Client(this.options.rpcClientOptions);
	[b]this.client.call(
		{"jsonrpc" : "2.0", "method": "IPS_GetInstanceList", "params" : [], "id" : 0},
		function(err, res){
			if (err) { console.log(err); }
    	else { console.log(res); }
		}[/b]
	)
}

Das Ergebnis lautet:


Loading 1 platforms...
[Symcon] Initializing Symcon platform...
[Symcon] Fetching Symcon instances...
Loading 0 accessories...
[Symcon] 0 instances found
{ id: 0,
  error:
   { message: 'Invalid Username/Password for remote access!',
     code: '-32501' },
  jsonrpc: '2.0' }

Liegt das vielleicht daran, dass du die RPC über die IP 127.0.0.1 abrufst (da verlangt IPS nämlich gar keine Authentifizierung, sondern nur von externen IPs). Bei mir ist der IP-Symcon Server nicht der Homebridge-Server.

Aber ich habe noch überhaupt keine Ahnung von der Implementierung der RPC Schnittstelle. Ich finde auch keine geeignete Doku…

Wiegesagt, inzwischen meldet sich das Symcon Modul scheinbar auch gescheit an.
Der IPS Server ist ein anderer Server, also muss ich mich authentifizieren.

[Symcon] Initializing Symcon platform...
[Symcon] Fetching Symcon instances...
[Symcon] 0 instances found

Sieht doch so aus als würde die Anmeldung funktionieren.

Nicht zwangsläufig, denn die Symcon.js behandelt derzeit noch keinen Verbindungsfehler. Sie gibt einfach ein „0“ zurück.
Das kannst du testen, in dem du folgende Abfrage hinzufügst:

Original:


		var foundAccessories = [];

		async.waterfall(
			[
				function (waterfallCallback) {
					that.client.call(
						{"jsonrpc" : "2.0", "method" : "IPS_GetInstanceList", "params" : [], "id" : 0},
						function (err, res) {
							waterfallCallback(null, err, res);
						}
					);
				},

Test auf Fehler:


		var foundAccessories = [];

		async.waterfall(
			[
				function (waterfallCallback) {
					that.client.call(
						{"jsonrpc" : "2.0", "method" : "IPS_GetInstanceList", "params" : [], "id" : 0},
						function (err, res) {


//HIER FEHLER ABFANGEN
							if (err) { console.log(err); }
    					else { console.log(res); }

//ENDE DER MODIFIKATION
							waterfallCallback(null, err, res);
						}
					);
				},

Dann erhalte ich:


Loading 0 accessories...
{ id: 0,
  error:
   { message: 'Invalid Username/Password for remote access!',
     code: '-32501' },
  jsonrpc: '2.0' }
[Symcon] 0 instances found

Nachtrag: Wenn ich das Kennwort in der config.json als Plaintext hinzufüge erhalte ich endlich die InstanzIDs.
Und danach diverse Fehler.


Loading 0 accessories...
{ result:
   [ 59690,
     59367,
     58675,
     58303,
...
...
...
  10276,
     10236 ],
  id: 0,
  jsonrpc: '2.0' }
{ [Error: connect ECONNREFUSED]
  code: 'ECONNREFUSED',
  errno: 'ECONNREFUSED',
  syscall: 'connect' }
{ [Error: connect ECONNREFUSED]
  code: 'ECONNREFUSED',
  errno: 'ECONNREFUSED',
  syscall: 'connect' }
{ [Error: connect ECONNREFUSED]
  code: 'ECONNREFUSED',
  errno: 'ECONNREFUSED',
  syscall: 'connect' }

Aber immerhin komme ich der Sache näher, der Login klappt :smiley:

Also ich komme einfach nicht drauf was diesen Fehler verursacht:


{ [Error: connect ECONNREFUSED]
  code: 'ECONNREFUSED',
  errno: 'ECONNREFUSED',
  syscall: 'connect' } 

Die Verbindung klappt, es werden auch viele Instanzen ausgelesen. Ich erhalte aber niemals alle. Je nach dem ob ich die Instanzliste mit IPS_GetInstanceList für alle Instanzen oder IPS_GetInstanceList abrufe erhalte ich unterschiedliche Ergebnisse (an Geräten), aber niemals alle.

function (waterfallCallback) {
					that.client.call(	
						{"jsonrpc" : "2.0", "method" : "IPS_GetInstanceList", "params" : [], "id" : 0},
						//{"jsonrpc" : "2.0", "method" : "IPS_GetInstanceListByModuleType", "params" : [3], "id" : 0},
						function (err, res) {
							waterfallCallback(null, err, res);
						}
					);
				},

Ergebnisse sehen u.a. so aus:


{ [Error: read ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
{ [Error: read ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
{ [Error: read ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
{ [Error: read ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
// ...
// VIELE VIELE diese Econreset Fehler zuvor..... keine Ahnung wieso

[Symcon] final: MAINTENANCE,[object Object],{"Address":"HEQ0352248:0","Protocol":0,"EmulateStatus":true}
[Symcon] final: MAINTENANCE,[object Object],{"Address":"HEQ0402319:0","Protocol":0,"EmulateStatus":true}
[Symcon] final: MAINTENANCE,[object Object],{"Address":"LEQ0753319:0","Protocol":0,"EmulateStatus":true}
[Symcon] final: Profil übertragen / Profil übernehmen,[object Object],{}
[Symcon] final: MAINTENANCE,[object Object],{"Address":"HEQ0401898:0","Protocol":0,"EmulateStatus":true}
[Symcon] final: KEY 6 UV-Licht links an,[object Object],{"Address":"HEQ0352248:6","Protocol":0,"EmulateStatus":true}
[Symcon] final: KEY 11,[object Object],{"Address":"HEQ0352248:11","Protocol":0,"EmulateStatus":true}
[Symcon] final: KEY 3 Lichteffekte aus,[object Object],{"Address":"HEQ0352248:3","Protocol":0,"EmulateStatus":true}
[Symcon] final: KEY 19,[object Object],{"Address":"HEQ0352248:19","Protocol":0,"EmulateStatus":true}
[Symcon] final: Lichteffekte,[object Object],{"Address":"IEQ0050856:1","Protocol":0,"EmulateStatus":true}
[Symcon] final: Wandthermostat,[object Object],{"Address":"IEQ0242477:2","Protocol":0,"EmulateStatus":true}
[Symcon] final: Öffnen,[object Object],{"Address":"HEQ0074212:3","Protocol":0,"EmulateStatus":true}
[Symcon] final: MAINTENANCE,[object Object],{"Address":"LEQ1201055:0","Protocol":0,"EmulateStatus":true}
[Symcon] final: KEY 8 UV-Licht rechts an,[object Object],{"Address":"HEQ0352248:8","Protocol":0,"EmulateStatus":true}
[Symcon] final: Serial Port,[object Object],{"StopBits":"1","BaudRate":"115200","Parity":"None","DataBits":"8","Port":"COM3","Open":false}

Ich komme hier nicht weiter :frowning:

Hallo zusammen,

ich habe meine Anpassung der HomeBridge einmal komplett umgebaut, damit es einfacher wird, weitere Geräte hinzuzufügen und auch noch einen Überblick zu behalten.
Außerdem habe ich erneut die Änderungen von nfarina übernommen. Dadurch wurde das SubModule „HAP-NodeJS“ entfernt und wird nun über NPM hinzugefügt (das Verzeichnis lib/ wurde entfernt).
Daher müsst ihr folgende Befehle ausführen, um die neuste Version nutzen zu können:


$ git pull // meine Aktualisierungen von GitHub laden
$ npm install // HAP-NodeJS über NPM installieren

Was habe ich geändert?

Es gibt jetzt unter platforms/ weiterhin die Symcon.js-Datei. Die Datei hat folgende Funktion:

[ul]
[li]Einlesen aller Instanzen von IPS (inkl. einer angepassten Fehlererkennung)
[/li][li]Erstellen der Accessories für HomeKit
[/li][/ul]

Zusätzlich gibt es jetzt folgende weitere Dateien mit folgenden Funktionen:

[ul]
[li]SymconGenericAccessory.js
[/li][LIST]
[li]Kommunikation mit IPS über die JSON-RPC-Schnittstelle für alle Accessories
[/li][li]Definition der allgemeinen Eigenschaften einer IPS-Instanz (Name, ID, etc.)
[/li][li]Definition der allgemeinen characteristics (information, control) für HomeKit
[/li][/ul]
[li]SymconGenericSwitchAccessory.js, SymconGenericLightBulbAccessory.js, SymconGenericThermostatAccessory.js, SymconGenericGarageDoorOpenerAccessory.js
[/li][ul]
[li]Definition der spezifischen characteristics (information, control) für den bestimmten Gerätetyp
[/li][li]Funktionen, die ein spezifisches Gerät (LCN, EIB, HomeMatic, etc.) definieren muss
[/li][/ul]
[li]LcnUnitLightBulbAccessory.js, EibShutterGarageDoorOpenerAccessory.js, etc.
[/li][ul]
[li]Die spezifische Logik, um die konkreten Geräte zu schalten und abzufragen
[/li][/ul]
[/LIST]

Weitere Geräte können somit hinzugefügt werden, indem sie analog zu den vorhandenen Beispielen, die Funktionen der „Generic“-Dateien überschreiben. Ein vollständiges Beispiel (also Werte abrufen und setzen) findet ihr bei den LCN-Geräten.
Außerdem muss noch in der Symcon.js in der Funktion createSpecificAccessory „herausgefunden“ werden, was die aktuelle Instanz für ein Gerät ist (bspw. über die ModuleID, etc.) und dann ein Objekt der spezifischen Geräte (bspw. LcnUnitLightBulbAccessory) zurückgegeben werden.
Wird hier kein Objekt zurückgegeben, dann wird die Instanz ignoriert.

Schaut euch doch mal mein Versuch einer HomeMatic-Unterstützung an. Ich habe kein Gerät, um das zu testen…

Gruß,
André

@mesa: Ich habe mir dein Problem einmal angesehen. IPS hat die vielen parallelen Aufrufe beim Start teilweise blockiert. Dadurch kommen die Fehlermeldungen. Ich habe dies umgestellt, so dass nun die Aufrufe nacheinander durchgeführt werden und konnte bei mir bei einer IPS-Installation auf einem anderen Rechner keine Probleme mehr feststellen.

Bezgl. der rpcClientOptions: Da habe ich wohl aufgrund meiner lokalen Installation wohl falsche Hinweise gegeben…:rolleyes:

Hier ist die Doku zu allen verfügbaren Parametern (inkl. SSL-Unterstützung):


{
  // int port of rpc server, default 5080 for http or 5433 for https
  port: 5080,
  // string domain name or ip of rpc server, default '127.0.0.1'
  host: '127.0.0.1',
  // string with default path, default '/'
  path: '/',
  // string rpc login name, default null
  login: 'user',
  // string rpc password (clear text ! ), default null
  hash: 'pass',
  // json ssl object, default null
  ssl: {
    // array of string with ca's to use, default null
    ca: null,
    // string with private key to use, default null
    key: null,
    //  string with key, cert and ca info in PFX format, default null
    pfx: null,
    // string with the public x509 certificate to use, default null
    cert: null,
    //  boolean false to disable remote cert verification, default true
    strict: false,
    // string passphrase to be used to acces key or pfx, default null
    passphrase: null,
    // string name for Server Name Indication, default 'RPC-Server'
    sniName: 'RPC-Server',
    // string ssl protocol to use, default 'SSLv3_method'
    protocol: 'SSLv3_method'
  }
}

Das ist … der Wahnsinn!

Danke Andre! :slight_smile:

Leider habe ich jetzt nur noch das Problem, dass er einmal eingerichtet und wieder gelöschte Geräte nicht mehr findet.

Ich habe schon versucht den Namen des Geräts temporär zu ändern. Ohne Erfolg.

var instance = that.createSpecificAccessory(that.log, that.options.rpcClientOptions, instanceId, "TEST_" + name, instance, instanceConfig);

Irgendwo liegt das Geräts unter einer der eindeutigen Zuordnungen in der iPhone-Homekit Konfiguration. Über Datenschutz->Homekit->Zurücksetzen habe ich versucht, aber ohne Erfolg.

Hast du hierfür auch eine geniale Lösung / Workaround? :slight_smile:

Das Problem habe ich auch schon häufiger gehabt.
Im homebridge-Verzeichnis gibt es einen Unterordner „persist“. In dem Ordner findest du für jede Instanz eine Datei, die einen Dateinamen ähnlich einer MAC-Adresse hat.

Wenn du die HomeKit-Konfiguration zurückgesetzt hast, dann kannst du den Ordner einfach löschen. Die Dateien werden dann beim nächsten Start der HomeBridge neu angelegt.

Wenn du nur einzelne Geräte hinzugefügt und wieder gelöscht hast, dann wird es etwas umständlich:
Die Dateien enthalten einen JSON-String, der bspw. so aussehen kann:

{"signSk":{"type":"Buffer","data":[151,184,225,125,46,177,23,31,9,125,81,170,30,208,151,21,32,18,6,228,44,181,27,69,171,146,250,85,154,110,193,22,3,204,102,12,82,72,128,3,3,156,231,9,168,19,15,204,54,144,194,126,42,44,242,14,98,38,37,66,202,225,20,150]},"signPk":{"type":"Buffer","data":[3,204,102,12,82,72,128,3,3,156,231,9,168,19,15,214,54,144,194,125,43,44,242,14,98,38,37,66,22,225,204,150]},"paired":true}

Wenn du die Datei zu dem problematischen Gerät gefunden hast (bspw. über das Änderungsdatum), dann ändere einfach den Wert von „paired“ auf „false“ und das Gerät taucht wieder in der Liste der verfügbaren Geräte auf!

Wenn du Schwierigkeiten hast, die passende Datei zu finden, dann kannst du versuchen den Dateinamen herauszufinden, indem du etwas mit der Funktion herumspielst, die aus der Instanz-ID die „MAC-Adresse“ erzeugt (findest du in der app.js ganz unten):


// hier wird für den Parameter die IPS Instanz-ID übergeben
// Creates a unique "username" for HomeKit from a hash of the given string
function createUsername(str) {

    // Hash str into something like "098F6BCD4621D373CADE4E832627B4F6"
    var hash = crypto.createHash('md5').update(str).digest("hex").toUpperCase();

    // Turn it into a MAC-address-looking "username" for HomeKit
    return hash[0] + hash[1] + ":" +
           hash[2] + hash[3] + ":" +
           hash[4] + hash[5] + ":" +
           hash[6] + hash[7] + ":" +
           hash[8] + hash[9] + ":" +
           hash[10] + hash[11];
}

Danke für den Tip.

Jetzt hoffe ich nur noch auf die Möglichkeit, dass Variablen-Werte ausgelesen werden können (Status von einem Powerswitch (Licht, Steckdose, etc.) sowie Temperatur, Luftfeuchte und co von Homematic Devices)

Aber da muss ich mich vermutlich noch etwas gedulden :slight_smile:

Noch etwas: kann es sein, dass ich die Geräte nur einmal koppeln kann?
Auf einem iPhone klappt es. Auf dem zweiten erscheinen die Geräte, welche am ersten iPhone gekoppelt habe nicht mehr?

Hier ist eine kurze Anleitung, wie du die Funktionalität zum Abrufen vom Status hinzufügen kannst.
Schritte 1-4 kannst du mit einem Script in IPS durchführen


/*
	Werte abfragen, bspw. Helligkeit einer Leuchte in Prozent
*/

//	1. Ich kenne die ID der Variablen, die den gewünschten Wert bei einer bestimmten Instanz enthält
$variableId = 23488;
//	2. Ident der Variable herausfinden
// liefert u.a. : [ObjectIdent] => Intensity
print_r(IPS_GetObject($variableId));


// 3. Also bekomme ich bei allen Instanzen von dem Typ die ID über folgenden Aufruf:
$intensityId = IPS_GetObjectIDByIdent('Intensity', $instanceId);
// 4. Und kann dann den aktuellen Wert abragen
$value = GetValueInteger($intensityId);
echo $value;


// 5. Übertrag in HomeKit-Accessory.js-Datei
// Mehrere Aufrufe nacheinander werden mit async.waterfall durchgeführt, also hier: erst "IPS_GetObjectIDByIdent", dann "GetValueInteger"
// Resultat:
getBrightness : {
		value: function(callback) {
			var that = this;
			async.waterfall(
				[
					function (waterfallCallback) {
					   // Aufruf von Schritt 3
						that.callRpcMethod('IPS_GetObjectIDByIdent', ['Intensity', that.instanceId], waterfallCallback);
					},
					function (res, waterfallCallback) {
					   // Aufruf von Schritt 4 mit Eegebnis von Schritt 3
						that.callRpcMethod('GetValueInteger', [res.result], waterfallCallback);
					}
				],
				function(err, res) {
				   // Rückgabe des Wertes an HomeKit
					callback(res.result);
				}
			);
		}
	}


Und hier für das Setzen eines Wertes:


/*
	Werte setzen, bspw. Helligkeit einer Leuchte in Prozent
*/

// 1. Ich habe die Instanz-ID und den Zielwert
$instanceId = 53649;
$value = 70; // Wert in Prozent

// 2. Ich kann in einem IPS-Script damit den Wert setzen
LCN_SetIntensity($instanceId, $value, 0 /* Rampe in Sekunden (konstant)*/);

// 3. Übertrag in HomeKit-Accessory.js-Datei
// Resultat:
setBrightness : {
		value: function(value) {
			var method = 'LCN_SetIntensity'; // Aufzurufende Methode
			var params = [this.instanceId, value, 0]; // Parameter aus Schritt 2
			this.callRpcMethod(method, params);
		}
	}

Und eine kurze Anleitung, um den Typ der Instanz herauszufinden:
(ich finde dies ist der komplizierteste Teil)



/*
	Typ der Instanz herausfinden
*/

// 1. Ich habe die Instanz-ID eines bestimmten Geräts
$instanceId = 53649;

// 2. Ich habe folgende Werte zur Verfügung
$name = IPS_GetName($instanceId);
$instance = IPS_GetInstance($instanceId);
$instanceConfig = IPS_GetConfiguration($instanceId);
echo $name;
print_r($instance);
print_r($instanceConfig);


// 3. Über die Module-ID (bspw. {2D871359-14D8-493F-9B01-26432E3A710F} für LCN Unit) kenne ich den Typ der Instanz
instance.ModuleInfo.ModuleID;
// 4. Über die Konfiguration weiß ich, ob es ein Ausgang (LightBulb) oder ein Relais (Switch) ist
instanceConfig.Unit;


// 5. Anpassung der Funktion "createSpecificAccessory" in der Datei Symcon.js
case '{2D871359-14D8-493F-9B01-26432E3A710F}': // Module ID
	switch (instanceConfig.Unit) {
		case 0: // output
			return new symconAccessories.LightBulb.LcnUnitLightBulbAccessory(log, rpcClientOptions, instanceId, name, instance, instanceConfig);
		case 2: // relay
			return new symconAccessories.Switch.LcnUnitSwitchAccessory(log, rpcClientOptions, instanceId, name, instance, instanceConfig);
	}
	break;


Mit diesen Hinweisen und den Beispielen sollte es möglich sein, alle anderen in IPS unterstützten Geräte hinzuzufügen.

Edit: Noch ein Tipp aus der IPS-Doku: Hiermit bekommt ihr eine Liste mit allen Module IDs und den dazugehörigen Instanznamen:


foreach(IPS_GetModuleList() as $guid)
{
    $module = IPS_GetModule($guid);
    $pair[$module['ModuleName']] = $guid;
}
ksort($pair);
foreach($pair as $key=>$guid)
{
    echo $key." = ".$guid."
";
}

Also ich habe HomeKit mit der Insteon±App auf meinem iPhone eingerichtet.
In den Einstellungen meines „Homes“ habe ich dann als Gast die Apple-ID meiner Frau hinzugefügt, damit konnte sie dann auf die Konfiguration zugreifen. Das funktionierte aber erst nach einem Neustart des iPhones. Bei meinem iPad musste ich auch das Gerät Neustarten. Dann funktionierte auch da der Zugriff (mit der gleichen Apple-ID, wie bei meinem iPhone).

Generell ist der Zugriff mit den Geräten, die nicht die primäre Einrichtung durchgeführt haben, noch etwas buggy. Mal sehen, ob das mit iOS 9 besser wird…

Dass man die Geräte nur „1 mal koppeln kann“ habe ich doch bereits schon geschrieben. Man muss die Geräte schon in der config.json umbenennen. Nennst du ein Gerät Test und löschst es aus der App und möchtest es wieder verbinden musst du es Test1 nennen. Hier ist es sogar egal welche App du benutzt… Das scheint im iPhone verschachtelt zu sein.

@kalli: dazu habe ich in meinem Post Nr. 70 was geschrieben. Die HomeBridge entfernt beim entfernen leider nicht den “paired“-Status…
Das hat mit dem iPhone nichts zu tun.

Danke für deine Anleitung Andre,

ich mach mich dann mal dran Homematic-Adapter gem. deiner Anleitung zu schreiben.

Leider gibt es bei Homematic keine InstanceConfig.Unit.


Config Unterputz-Schalter: {"Address":"KEQ0926879:1","Protocol":0,"EmulateStatus":true}

Config Steckdose: {"Address":"HEQ0402319:1","Protocol":0,"EmulateStatus":true}

Config Thermostat: {"Address":"LEQ1072551:2","Protocol":0,"EmulateStatus":true}

Ich denke ich muss hier über das Feld Address arbeiten (in der Hoffnung dass die ersten 3 Zeichen tatsächlich den Typ des Gerätes bestimmen. Hat hier irgendwer schon mal ein offizielles Homematic Dokument zu den Adressen gesehen?

Mir fällt gerade auf, dass ich unter /api/ garnichts vorfinde. Gehe ich über Port 3777 auf mein IPS bekomme ich die Version ausgegeben… Jedoch kann ich 3777 nicht von einem anderem Rechner öffnen… Obwohl ich Fernzugriff aktiviert habe. Fehlt hier irgendwie etwas in meinem Webfront Ordner?

Nunja aufeinmal gehts: (ich habe oben nichts verändert)

[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Taste 2
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Schreibtischlampe
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Taste 1
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Deckenlicht
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Taste 4
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: HomeMatic Gerät
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Temperatur
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: VIRTUAL_KEY
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Deckenlicht
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: HomeMatic Gerät
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Flur Dimmer
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Deckenlicht Küche
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: HomeMatic Gerät
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Energieverbrauch
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Strahler
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Taste 3
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Bewegungsmelder
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Deckenlicht Dimmer
[Symcon] creating HomeMaticSwitchAccessory...
[Symcon] new instance found: Messstecker
[Symcon] 19 instances found
[Symcon] Initializing device with name 57647...
[Symcon] 57647: adding control characteristic POWER_STATE_CTYPE...
[Symcon] 57647: services loaded

Ok, die Homematic "Address"en in der InstanzConfiguration sind nicht nach Typen gruppiert.
Leider bietet IPS scheinbar keine Möglichkeit die Art der Geräteinstanz abzufragen.

Was ich bräuchte wäre die Gerätebezeichnung: HM-LC-Sw4-SM, HM-Sec-Key für die jeweilige Instanz.

Es wäre möglich diese über eine CCU mit XML-API auszulesen, denn:
http://ccu/config/xmlapi/devicelist.cgi

bietet eine Verbindung von Address zu Device_Type:

<device name="Wandthermostat Wohnzimmer" address="LEQ1072408" ise_id="7348" interface="BidCos-RF" device_type="HM-TC-IT-WM-W-EU" ready_config="true">

Aber ich finde den Weg über die CCU sehr unschön. Ich denke ich arbeite mit dem Workaround, dass der IPS-Nutzer in die Device-Beschreibung den Namen / Typ des Devices eingeben muss.

@Symcon: Bitte patcht diese Information in künftigen Versionen ein. Sollte doch nur eine kleine Anpassung sein.

Hallo Andre,

ich habe nun einige Homematic-Geräte (div. Stecker, Unterputzaktoren, Wandthermostate, etc.) erfolgreich integrieren können. (Naja es sind noch viele Kleinigkeiten zu machen)

Aber eine Frage noch:

Für reine Temperatur / Feuchtigkeitsensoren hast du keine generische Klasse angelegt. Ich wollte dazu eine SymconGenericTemperatureAccessory und darauf basierend eine HomeMaticTemperatureAccessory erstellen.

Die Homebridge fährt wunderbar hoch, aber beim Verbinden / Einrichten des iPhones erhalte ich die Meldung, dass das Gerät nicht den Homekit Konventionen entspricht. Hast du irgendwo die Konventionen gefunden? Ich finde keine Doku welche Klassen / Funktionen es gibt.

Sobald ich fertig bin teile poste ich hier meinen Lösungsansatz für die Einbindung der HomeMatic Komponenten.