Hallo Kenny,
bei mir hat die Anmeldung des ersten Gerätes auch etwas gehakt. Habe dann das Gateway auch bis auf 4 m Abstand gebracht und nach 3/4 Versuchen hat es dann geklappt. Genau wie du geschrieben hast:
- Einstellungen am Gerät/Miele @home anmelden
- Im Geteway Neue Geräte suchen
Es ist auch kürzlich eine neue Frimware raus gekommen. Mein Gateway hatte im Auslieferungszustand auch eine (ur-)alte Version drauf.
Ich lasse das ganze unter IPS 4.0 auf der Symbox laufen und habe dafür das weiter vorne vorgestellte Skript (ursprünglich von Parsey) etwas angepasst:
<?
// **************************************************************************
// Eingabedaten
// **************************************************************************
$IPAdresse = "192.168.005.027"; //IP-Adresse XGW300 Gateway.
$Passwort = "xgw3000"; //Passwort für die Homebus anmeldung. Standard ist "xgw3000".
// 20160228 diese Version ist getestet unter IPS 4.0 beta aktueller Stand, XGW3000 aktuelle Firmware mit einem Trockner und einer Waschmaschine
// **************************************************************************
// **************************************************************************
// Username für die Homebus Anmeldung
$Username = "xgw3000";
// ID des Übergeordneten Objekts ermittlen (ID der Kategorie)
// $ParentID = IPS_GetParent($IPS_SELF); //vor IPS v 4.0
$ParentID = IPS_GetParent($_IPS['SELF']);
// Allgemeine Gerätedaten vom Gateway abfragen
$content = @Sys_GetURLContentEx('http://' . $IPAdresse . '/homebus', Array("AuthUser"=> $Username, "AuthPass"=> $Passwort));
if ($content == false) {
return;
}
// Empfangene XML-Struktur laden
$devices=simplexml_load_string($content);
// Alle gefundenen Geräte durchgehen
foreach($devices as $device)
{
// Allgemeine Daten parsen
$device_uid = str_replace("-", "N", $device->UID);
$device_name = utf8_decode($device->name);
$device_type = utf8_decode($device->type);
$device_additionalname= utf8_decode($device->additionalName);
$device_url = $device->actions->action->attributes()['URL'];
// Dummy Instance ID ermitteln, wenn nicht vorhanden, dann erstellen
$DeviceID = GetInstID($ParentID, $device_uid, $device_additionalname);
// Dummy Instance Name aktualisieren, wenn unterschiedlich
if (IPS_GetName($DeviceID) != $device_additionalname)
{
IPS_SetName($DeviceID, $device_additionalname);
}
// VariablenID ermitteln, wenn nicht vorhanden, dann erstellen
$VarID = GetVarID($DeviceID, 'Typ', 'Gerätetyp');
// Variablenwert aktualisieren, wenn unterschiedlich
if (GetValueString($VarID) != $device_type)
{
SetValueString($VarID, $device_type);
}
// Gerätedetails abfragen
$content = @Sys_GetURLContentEx(strval($device_url), Array("AuthUser"=> $Username, "AuthPass"=> $Passwort));
if ($content == false) {
return;
}
// Empfangene XML-Struktur laden
$device=simplexml_load_string($content);
$keys = $device->information;
// Alle Werte durchgehen
foreach($keys->children() as $key)
{
// VariablenID ermitteln, wenn nicht vorhanden, dann erstellen
// $VarID=GetVarID($DeviceID, filter_characters(utf8_decode($key['name']))); //vor IPS v 4.0
$VarID=GetVarID($DeviceID, utf8_decode($key['name']));
// Variablenwert aktualisieren, wenn unterschiedlich
if (GetValueString($VarID) != utf8_decode($key['value']))
{
SetValueString($VarID, utf8_decode($key['value']));
}
}
}
//Script Timer prüfen, wenn nicht vorhande dann mit 10 sec erstellen
If (IPS_GetScriptTimer($_IPS['SELF']) == 0)
{
IPS_SetScriptTimer($_IPS['SELF'], 10);
}
// **************************************************************************
// Hilfsfunktionen
// **************************************************************************
// Diese Funktion dient zum Ermitteln einer Variablen-ID anhand des Ident
// Wenn die Variable nicht existiert, wird sie angelegt
function GetVarID($parentid, $ident)
{
// $varid = @IPS_GetObjectIDByIdent($ident, $parentid); //vor IPS v 4.0
$varid = @IPS_GetObjectIDByName($ident, $parentid);
if ($varid === false)
{
$ScriptID = $_IPS['SELF'];
$varid = IPS_CreateVariable(3);
IPS_SetParent($varid, $parentid);
IPS_SetIdent($varid, $ident);
IPS_SetName($varid, $ident);
IPS_SetInfo($varid, "This Variable was created by Script #$ScriptID");
IPS_SetVariableCustomProfile($varid, "~String");
}
return $varid;
}
// Diese Funktion dient zum Ermitteln einer Dummy Instanz-ID anhand des Ident
// Wenn die Dummy Instanz nicht existiert, wird sie angelegt
function GetInstID($parentid, $ident, $name)
{
$ObjektID = @IPS_GetObjectIDByIdent($ident, $parentid);
if ($ObjektID === false)
{
$ScriptID = $_IPS['SELF'];
$ObjektID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}"); //Dummy Instance erstellen
IPS_SetParent ($ObjektID, $parentid); // Dummy Instance verschieben
IPS_SetName ($ObjektID, $name); //Dummy Instance umbenennen
IPS_SetInfo ($ObjektID, "This Variable was created by Script #$ScriptID");
IPS_SetIdent ($ObjektID, $ident);
}
return $ObjektID;
}
// Funktion zum filtern von nicht erlaubten Zeichen (z.B. bei Variablennamen) vor IPS v 4.0 wird zum ermitteln von $VarID nicht mehr benötigt, da Variablennamen jetzt in UTF8 gespeichert werden.
function filter_characters($input)
{
$search = explode(",","ç,æ,,á,é,í,ó,ú,à,è,ì,ò,ù,ä,ë,ï,ö,ü,ÿ,â,ê,î,ô,û,å,e,i,ø,u,-, ");
$replace = explode(",","c,ae,oe,a,e,i,o,u,a,e,i,o,u,a,e,i,o,u,y,a,e,i,o,u,a,e,i,o,u,_,_");
return str_replace($search, $replace, $input);
}
?>
Was mir ums verrecken nicht gelingen wollte, ist das beibehalten von (der Empfohlenen) IPS_GetObjectIDByIdent in der Hilfsfunktion für $varid.
Die beiden Variablen „Gerät“ und „Gerätestatus“ haben nicht geklappt. Ich konnte das Problem auf die UTF8 Codierung zurück führen, aber keine andere Lösung gefunden, als es mit IPS_GetObjectIDByName zu identifizieren.
Wenn mir hier jemand auf die Sprünge helfen kann, bitte sehr gerne.
Den Skripttimer schalte ich über die Variablenänderung des Gerätestatuts inkl. der Sichtbarkeit einiger Variablen erst ab dem Status „Bereit“ aktiv/sichtabar ein und freu mir ein Loch in den Bauch 
Beste Grüße,
Frank