Buderus Logamatic Web KM200 - Reloaded

Die Verbindung zum KM50 hat diesmal gut 10 Wochen durchgehalten. Beim Neuverbinden stellte ich fest das sich einiges getan hat. Die Software ist jetzt V4.0 und ein über Browser bedienbares „Control Center Connect“ gibt es auch. Weiß jemand noch mehr?

Moin,
ich bekomme in zwei Wochen eine neue GB192iT - da soll wohl auch bereits eine IP-Schnittstelle mit onboard sein (RC300 ist dabei). So richtig viele Infos habe ich aber bisher noch nicht gefunden. Ich lass mich mal überraschen…

Moin,
seit heute ist meine GB192-iT online - so richtig rund läuft die Kiste noch nicht, morgen kommt nochmal ein Service-Techniker.
Das Teil hängt aber schon im Netz, Zugriff per App und über Buderus-Connect klappt.
Das AES-Key Generator-Modul habe ich in IPS eingebunden, nun weiß ich nicht so genau was ich bei „Geräte-Passwort“ und „Benutzer-Passwort“ eintragen soll… :confused:

Eingebaut ist ein KM100 (ist zwar kein KM200, aber ich gehe einfach davon aus dass das schon gehen wird…), darauf ist ein Aufkleber mit den Angaben „Loginname“ und „Passwort“ - ist das gemeint? Oder mein Login für das Buderus-Connect Web-Portal?

Kann mich jemand erleuchten?

Moin,
so, bin einen Schritt weiter. Kommunikation scheint grundsätzlich zu funktionieren.
Ich rufe das Script zum Erstellen des Variablenbaums auf und es erzeugt auch /gateway und /system, bricht dann aber ab mit Fehlern:

CreateCategory: ( /gateway, 0gateway, 0 ) 
CreateVariable: ( /gateway/uuid, 3, 557410299, 0gateway0uuid, 25033 ) 
Service /gateway/firmware returned NULL
Service /gateway/userpassword returned NULL
CreateVariable: ( /gateway/versionFirmware, 3, 03.01.04, 0gateway0versionFirmware, 25033 ) 
CreateVariable: ( /gateway/versionHardware, 3, iCom_Low_NSC_v1, 0gateway0versionHardware, 25033 ) 
Service /gateway/boschSHPassword returned NULL
Service /gateway/portalPassword returned NULL
Service /gateway/knxPassword returned NULL
Service /gateway/haiPassword returned NULL
CreateVariable: ( /gateway/DateTime (writeable) (recordable), 3, 2015-12-11T14:45:34, 0gateway0DateTime, 25033 ) 
Service /gateway/instPassword returned NULL
CreateVariable: ( /gateway/instAccess (writeable) (recordable), 3, off, 0gateway0instAccess, 25033 ) 
CreateVariable: ( /gateway/instWriteAccess (writeable) (recordable), 3, off, 0gateway0instWriteAccess, 25033 ) 
CreateCategory: ( /system, 0system, 0 ) 
CreateVariable: ( /system/brand, 3, Buderus, 0system0brand, 32353 ) 
CreateVariable: ( /system/systemType, 3, NSC_ICOM_GATEWAY, 0system0systemType, 32353 ) 
CreateVariable: ( /system/bus, 3, EMS2_0, 0system0bus, 32353 ) 
CreateCategory: ( /system/info, 0system0info, 32353 ) 

Notice:  Undefined property: stdClass::$Name in C:\IP-Symcon\scripts\43298.ips.php on line 127

Notice:  Undefined property: stdClass::$Version in C:\IP-Symcon\scripts\43298.ips.php on line 127

Notice:  Undefined property: stdClass::$Token in C:\IP-Symcon\scripts\43298.ips.php on line 127
CreateVariable: ( , 3, , 0system0info0, 53848 ) 

Notice:  Undefined property: stdClass::$Name in C:\IP-Symcon\scripts\43298.ips.php on line 127

Notice:  Undefined property: stdClass::$Version in C:\IP-Symcon\scripts\43298.ips.php on line 127

Notice:  Undefined property: stdClass::$Token in C:\IP-Symcon\scripts\43298.ips.php on line 127
CreateVariable: ( , 3, , 0system0info0, 53848 ) 

Notice:  Undefined property: stdClass::$Name in C:\IP-Symcon\scripts\43298.ips.php on line 127

Notice:  Undefined property: stdClass::$Version in C:\IP-Symcon\scripts\43298.ips.php on line 127

Notice:  Undefined property: stdClass::$Token in C:\IP-Symcon\scripts\43298.ips.php on line 127
CreateVariable: ( , 3, , 0system0info0, 53848 ) 

Notice:  Undefined property: stdClass::$Name in C:\IP-Symcon\scripts\43298.ips.php on line 127
Abort Processing during exceed of maximal ErrorCount: Undefined property: stdClass::$Version
   Error in Script C:\IP-Symcon\scripts\43298.ips.php on Line 127

So sieht dann der erzeugte (Teil)baum aus:

Any ideas?

Moin,

echt keiner eine Idee?.. :o

EDIT: Hab das Script spasseshalber gerade nochmal gestartet und siehe da - es hat sich eine umfangreiche Struktur in meinem IPS-Baum aufgebaut. Vielleicht musste die Therme erstmal etwas warm werden mit mir… :wink:

EDIT 2: Und ich sehe mein KM100 scheint sich seit dem Wochenende auf FW 04.00.04 upgedated zu haben (vorher 3.xx).

Bei zu vielen Abfragen hintereinander kann es passieren, dass sich das Gateway aufhängt.
Und was mir auch noch aufgefallen ist: der Jsonstring wird manchmal nicht vollständig übertragen, was dann zu Deiner beschriebenen Fehlermeldung führt.
Ist ein bisschen komisch habe 2 km200 im Einsatz. Das eije funktioniert ohne Probleme und Ausfälle, dass andere hängt sich sporadisch immet wieder mal auf (ohne ein Muster zu erkennen).

Gruß
Manfred

Ich lese jetzt mal per Script eine handvoll Werte (9) im Ein-Minuten-Takt aus. Mal sehen wie zuverlässig das läuft.

Ich lese auch derzeit manuell ein paar Werte aus. Das lief bei mir ca. 2 Monate stabli ohne dass sich das Gateway aufgehängt hat.

Habe dann am Wochenende auch mal auf die FW 04.00.04 einen Update „erzwungen“ durch aus-/einschalten. Danach dauerte es für ein paar Umfänge bis zu einem Tag bis wieder Werte gelesen wurden. Habe ich etwas eigenartig gefunden. Am Anfang dachte ich schon na toll jetzt wird noch weniger geliefert als vorher mit der neuen Firmware :smiley:

Hier mal mein Script:

<?
include_once( "37224.ips.php" ); // KM200 Gateway

//Heizkreis Infos (ganz selten nicht möglich zu lesen wenn zB: andere Abfrage lauft; deswegen mit zusätzlichem if statement)
$raumthermostat = km200_GetData('/heatingCircuits/hc1/roomtemperature');
if ($raumthermostat == false) {
   SetValueFloat(42959 /*[Heizung\Thiemo\Wohnzimmer Raumthermostat]*/, 0);
} else {
   SetValueFloat(42959 /*[Heizung\Thiemo\Wohnzimmer Raumthermostat]*/, get_object_vars($raumthermostat)['value']);          //Raumtemperatur
}
$vorlaufoben = km200_GetData('/heatingCircuits/hc1/actualSupplyTemperature');
if ($vorlaufoben == false) {
   SetValueFloat(58082 /*[Heizung\Thiemo\Heizung Kreis Oben Vorlauftemperatur]*/, 0);  //Vorlauf Temperatur Heizkreis1
} else {
   SetValueFloat(58082 /*[Heizung\Thiemo\Heizung Kreis Oben Vorlauftemperatur]*/, get_object_vars($vorlaufoben)['value']);  //Vorlauf Temperatur Heizkreis1
}
$vorlaufunten = km200_GetData('/heatingCircuits/hc2/actualSupplyTemperature');
if ($vorlaufunten == false) {
   SetValueFloat(38065 /*[Heizung\Thiemo\Heizung Kreis Unten Vorlauftemperatur]*/, 0);  //Vorlauf Temperatur Heizkreis2
} else {
   SetValueFloat(38065 /*[Heizung\Thiemo\Heizung Kreis Unten Vorlauftemperatur]*/, get_object_vars($vorlaufunten)['value']);  //Vorlauf Temperatur Heizkreis2
}
$obenpumpe = km200_GetData('/heatingCircuits/hc1/pumpModulation');
if ($obenpumpe == false) {
   SetValueFloat(22586 /*[Heizung\Thiemo\Heizung Kreis Oben Pumpe]*/, 0);           //Heizkreis1 Pumpe
} else {
   SetValueFloat(22586 /*[Heizung\Thiemo\Heizung Kreis Oben Pumpe]*/, get_object_vars($obenpumpe)['value']);           //Heizkreis1 Pumpe
}
$untenpumpe = km200_GetData('/heatingCircuits/hc2/pumpModulation');
if ($untenpumpe == false) {
   SetValueFloat(41273 /*[Heizung\Thiemo\Heizung Kreis Unten Pumpe]*/, 0);           //Heizkreis2 Pumpe
} else {
   SetValueFloat(41273 /*[Heizung\Thiemo\Heizung Kreis Unten Pumpe]*/, get_object_vars($untenpumpe)['value']);           //Heizkreis2 Pumpe
}

//Systemsensoren
SetValueFloat(15830 /*[Heizung\Thiemo\Heizung Wasserdruck]*/, get_object_vars(km200_GetData('/heatSources/systemPressure'))['value']);                          //System Druck
SetValueFloat(53001 /*[Heizung\Thiemo\Heizung Außentemperatur]*/, get_object_vars(km200_GetData('/system/sensors/temperatures/outdoor_t1'))['value']);          //Außentemperatur
SetValueFloat(39316 /*[Heizung\Thiemo\Warmwasser Boiler aktuelle Leistung]*/, get_object_vars(km200_GetData('/system/heatSources/hs1/actualPower'))['value']);  //Leistung

//Kessel
SetValueFloat(20815 /*[Heizung\Thiemo\Kessel Vorlauftemperatur]*/, get_object_vars(km200_GetData('/system/sensors/temperatures/supply_t1'))['value']);  //Kessel Vorlauftemperatur
SetValueFloat(57299 /*[Heizung\Thiemo\Kessel Rücklauftemperatur]*/, get_object_vars(km200_GetData('/system/sensors/temperatures/return'))['value']);    //Kessel Rücklauftemperatur

//flameCurrent
SetValueFloat(10971 /*[Heizung\Thiemo\Brenner Temperatur]*/, get_object_vars(km200_GetData('/heatSources/flameCurrent'))['value']);

//(bei Sommerbetrieb nicht möglich zu lesen)
$flameStatus = get_object_vars(km200_GetData('/heatSources/flameStatus'))['value'];
if ($flameStatus == "ok") {
   SetValueBoolean(41757 /*[Heizung\Thiemo\Brenner Flammenstatus]*/, true);
} else {
	SetValueBoolean(41757 /*[Heizung\Thiemo\Brenner Flammenstatus]*/, false);
}

//Gesamtzustand
$healthStatus = get_object_vars(km200_GetData('/system/healthStatus'))['value'];
if ($healthStatus == "ok") {
   SetValueBoolean(48442 /*[Heizung\Thiemo\Heizung Gesamtzustand]*/, true);                        
} else {
	SetValueBoolean(48442 /*[Heizung\Thiemo\Heizung Gesamtzustand]*/, false);
}

//Brennerstatus (Power)
$actualPower = get_object_vars(km200_GetData('/heatSources/actualPower'))['value'];
SetValueFloat(27784 /*[Heizung\Thiemo\Heizung aktuelle Leistung]*/, $actualPower);
if ($actualPower == 0) {
   SetValueBoolean(48862 /*[Heizung\Thiemo\Heizung Brennerstatus]*/, false);              
} else {
   SetValueBoolean(48862 /*[Heizung\Thiemo\Heizung Brennerstatus]*/, true);               
}

//Aktuell Gestartet
$numberofstarts = get_object_vars(km200_GetData('/system/appliance/numberOfStarts'))['value'];
if ($numberofstarts == false) {
   //SetValueFloat(43377 /*[Heizung\Thiemo\Heizung Anzahl Starts aktuell]*/, ]);     //Anzahl Starts
   SetValueBoolean(58827 /*[Heizung\Thiemo\Gateway Status]*/, false);
} else {
   SetValueBoolean(58827 /*[Heizung\Thiemo\Gateway Status]*/, true);
   SetValueFloat(43377 /*[Heizung\Thiemo\Heizung Anzahl Starts aktuell]*/, $numberofstarts);     //Anzahl Starts
}

$aktuellStarts = GetValueFloat(43377 /*[Heizung\Thiemo\Heizung Anzahl Starts aktuell]*/);
$vorherStarts = GetValueFloat(40716 /*[Heizung\Thiemo\Heizung Anzahl Starts vorher]*/);
$differenz = $aktuellStarts - $vorherStarts;
if ($differenz == 1) {
	SetValueBoolean(22347 /*[Heizung\Thiemo\Heizung Gestartet]*/, true);
} else {
	SetValueBoolean(22347 /*[Heizung\Thiemo\Heizung Gestartet]*/, false);
}
SetValueFloat(40716 /*[Heizung\Thiemo\Heizung Anzahl Starts vorher]*/, $aktuellStarts);
?>

Das Ergebnis ist dann so:

Jo, Abfrage läuft bei mir seit ein paar Tagen zuverlässig und schnell - hab in der Zwischenzeit auch die Zahl der Variablen mal auf 18 erhöht.
Ich muss mich allerdings nochmal genauer mit der Flut an Variablen beschäftigen - da scheinen ja von der Beschreibung her einige redundant zu sein, die ausgelesenen Werte unterscheiden sich aber…

Sagt mal, es gibt ja einige Variablen die mit dem Auslesescript nicht gefunden werden.
Ich erinnere mich bei mir konkret an die Warmwasser-Bereitungs-Variable.

Jetzt meine Frage:

Gibt es eine Variable um die Zirkulationspumpe zu schalten? Ich habe ja in den Zeiten wo das Wasser warm ist die Heizung im Nachtbetrieb mit der Tag-Temperatur, aber die Zirkulationspumpe läuft dann ja nicht.
Anstatt einem zus. Homematic-Modul wäre das natürlich einfacher und günstiger.

Und gibt es eine Variable die mir zeigt wenn die Warmwasser-Pumpe läuft, also die den Boiler „belädt“.
Ich habe in IPSView ein Flowchart und das wäre natürlich toll den Status zu sehen!
Gefunden / eingebunden habe ich bereits die Umwälzpumpe für das Heizwasser.
Ich habe bereits „/heatSources/DHWpumpModulation“ versucht - aber da kommt nur ein Fehler zurück.
Die Steuerung ist eine MC10.

Noch was: @Manni: vor längerem hast Du mal geschrieben Du würdest das Auslese-Script „Aufbohren“ gibt es da mal was neues? Ich habe gerade nochmal den kpl. Thread gesehen und bin quasi deprimiert was Ihr alles hier an abgefahren guter Arbeit leistet, ich allerdings nichts wirklich (mangels Können) Beitragen kann.

Danke schonmal!
Gruß,
Matthias

Keiner was dazu zu sagen?
Vor allem bzgl. des neuen Ausleseskripts?
Gruß,
Matthias

Viel dazu sagen kann ich jetzt nicht. Habe auch nur die normal sichtbaren Variablen eingebunden. Außerdem habe ich das ganze Heizprogramm jetzt durch IPS gesteuert. Aber solche Pumpen steuervariablen fehlen mir auch noch. Wie heißt denn die für das Heisswasser?

muss man die km200.dll auch bei IPS4 in das modulverzeichnis kopieren?
brauche ich eine andere dll datei als die hier vorliegenede?
Klappt bei mir so leider nicht. d.h. ich finde danach das modul nicht in den instanzen.
Kann mir jemand einen Tip geben?
Vielen Dank
Thorsten

Moin Thorsten!

Die alten DLL Module von IPS 3.4 funktionieren bei IPS 4 nicht mehr und müssten für IPS 4 komplett anders und neu programmiert werden.

Bei IPS 4 wurden als leichter zu programmierenden Ersatz für die DLL Module die PHP Module eingeführt (aktuell verfügbare Module > Übersicht der PHP-Module).

Grüße,
Chris

Du brauchst das gar nicht für den laufenden Betrieb.
Nimm Punkt 1 aus der Liste im ersten Post.
Damit kannst du den Key online errechnen lassen.
Michael

Genau das habe ich Gestern nach dem Update auch gemacht bzw machen müssen.
Übrigens, wenn Du auch das „alte“ Modul für die Systemvariablen der Homematic CCU nutzt, geht auch nicht mehr.
Dazu legt das neue Modul alle Variablen neu an.
Ich habe gestern Nachmittag über eine Stunde Nur Skripte durchgesucht…
Gruß,
Matthias

Mal was anderes: Weiß mittlerweile jemand ob und wie man die Warmwasser-Ladepumpe auslesen / überwachen kann?

Hallo,

da wir ende des Monats unsere neue Heizung bekommen wollte ich schon mal anfangen vorzubereiten.
Nun meine Frage welche Scripte sind denn jetzt aktuell?

Hallo,

ich komme nicht weiter. Ich habe jetzt so viele Scripte hier gefunden, habe aber keine Ahnung welche ich tatsächlich benötige.

Kann mir jemand sagen welche Scripte ich unter IPS4.0 benötige um mir wenigstens mal ein paar Daten anzuzeigen.
Was muss ich wo includen?

Hallo,
ich habe folgende 2 Skripte verwendet:

Generische Zugriffe (36145.ips.php):

<?php

// IP Adresse oder DNS-Hostname des KM200
define( "km200_gateway_host", 'xxx.xxx.xxx.xxx', true );
// Port des KM200, nur bei Zugriff über Internet mit Portweiterleitung am Router ändern!
define( "km200_gateway_port", '80', true );



/*

Für die Einbindung des Schlüssels zur Kommunikation mit dem KM200 gibt es mehrere Möglichkeiten.

1. PHP only
  Online unter https://ssl-account.com/km200.andreashahn.info/
  mit Geräte- und Benutzer-Passwort den AES-Key ausrechnen lassen und folgende Zeile in das Coding einbinden:

define( "km200_crypt_key_private", hex2bin( '1f733c2af8c855981e84bb2952a77f0dc04cc65abf979b733ec8a6724c0c0369' ), true );

  Hier den Parameter von hex2bin durch den eigenen AES-Key ersetzen

2. IP Symcon-Modul, Passwörter in den Moduleigenschaften
  Online unter https://ssl-account.com/km200.andreashahn.info/ das IP Symcon-Modul herunter laden, entpacken und
  im IP Symcon Verzeichnis im Unterordner "modules" installieren. Falls der Ordner nicht vorhanden ist diesen
  einfach vorab erstellen. Den IP Symcon-Dienst stoppen und wieder starten.

  Nun über das Kontextmenü "Objekt hinzufügen->Instanz hinzufügen" unter "(Sonstige)" die Instanz
  "AES-Key-Generator for KM200 Web Gateway" auswählen.

  In den Moduleigenschaften Geräte- und Benutzer-Passwort setzen und folgende Zeile in das Coding einbinden:

define( "km200_crypt_key_private", hex2bin( KM200_GetAESKey( Modul-ID ) ), true );

  Hier den Parameter "Modul-ID" durch die Objekt-ID des Moduls ersetzen

3. IP Symcon-Modul, Passwörter über den Funktionsaufruf
  Das IP Symcon-Modul wie unter 2. beschrieben herunterladen, installieren und eine Instanz erzeugen.

  Unabhängig von den Moduleigenschaften kann der Schlüssel über eine Funktion mit Geräte- und Benutzer-
  Passwort als Parameter erzeugt werden. Dies ist z.B. wünschenswert, wenn das Benutzer-Passwort nicht
  gespeichert werden sondern jedes mal nteraktiv abgefragt werden soll.

  Hierfür folgende Zeile in das Coding einbinden:

define( "km200_crypt_key_private", hex2bin( KM200_GetAESKeyWithPasswords( Modul-ID, BenutzerPasswort, GerätePassword ) ), true );

  Hier den Parameter "Modul-ID" durch die Objekt-ID des Moduls ersetzen sowie entsprechend Benutzer-
  und Geräte-Passwort.

*/

// Hier nochmals alle drei Varianten, bitte nur GENAU EINE auskommentieren und anpassen!
// define( "km200_crypt_key_private", hex2bin( '21D3CF8751ED6BB163BE8C7CDE20210E0C2F9378C0DA3108F0673987B0D63E37' ), true );
// define( "km200_crypt_key_private", hex2bin( KM200_GetAESKey( Modul-ID ) ), true );
// define( "km200_crypt_key_private", hex2bin( KM200_GetAESKeyWithPasswords( Modul-ID, BenutzerPasswort, GerätePassword ) ), true );
define( "km200_crypt_key_private", hex2bin( 'THE KEY' ), true );

function km200_Encrypt( $encryptData )
{
    // add PKCS #7 padding
    $blocksize = mcrypt_get_block_size(
        MCRYPT_RIJNDAEL_128,
        MCRYPT_MODE_ECB
    );
    $encrypt_padchar = $blocksize - ( strlen( $encryptData ) % $blocksize );
    $encryptData .= str_repeat( chr( $encrypt_padchar ), $encrypt_padchar );
    // encrypt
    return base64_encode(
        mcrypt_encrypt(
            MCRYPT_RIJNDAEL_128,
            km200_crypt_key_private,
            $encryptData,
            MCRYPT_MODE_ECB,
            ''
        )
    );
}

function km200_Decrypt( $decryptData )
{
    $decrypt = (
        mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128,
            km200_crypt_key_private,
            base64_decode( $decryptData ),
            MCRYPT_MODE_ECB,
            ''
        )
    );
    // remove zero padding
    $decrypt = rtrim( $decrypt, "\x00" );
    // remove PKCS #7 padding
    $decrypt_len = strlen( $decrypt );
    $decrypt_padchar = ord( $decrypt[ $decrypt_len - 1 ] );
    for ( $i = 0; $i < $decrypt_padchar ; $i++ )
    {
        if ( $decrypt_padchar != ord( $decrypt[$decrypt_len - $i - 1] ) )
        break;
    }
    if ( $i != $decrypt_padchar )
        return $decrypt;
    else
        return substr(
            $decrypt,
            0,
            $decrypt_len - $decrypt_padchar
        );
}

function km200_GetData( $REST_URL )
{
    $options = array(
        'http' => array(
           'method' => "GET",
           'header' => "Accept: application/json
" .
                        "User-Agent: TeleHeater/2.2.3
"
        )
    );
    $context = stream_context_create( $options );
    $content = @file_get_contents(
        'http://' . km200_gateway_host . ':' . km200_gateway_port . $REST_URL,
        false,
        $context
    );

    if ( false === $content )
        return false;
    return json_decode(
        km200_Decrypt(
            $content
        )
    );
}

function km200_SetData( $REST_URL, $Value )
{
    $content = json_encode(
        array(
            "value" => $Value
        )
    );
    $options = array(
        'http' => array(
           'method' => "PUT",
            'header' => "Content-type: application/json
" .
                        "User-Agent: TeleHeater/2.2.3
",
            'content' => km200_Encrypt( $content )
        )
    );
    $context = stream_context_create( $options );
    @file_get_contents(
        'http://' . km200_gateway_host . ':' . km200_gateway_port . $REST_URL,
        false,
        $context
    );
}

?>

Sowie zur Generierung der Variablen das folgende Skript:

<?
include_once( "36145.ips.php" ); // KM200 Gateway
$RootCategoryID = 21535 /*[Skripte\Heizung\CreateSkript]*/;
$km200_REST_URLs = array(   '/gateway',    '/system',    '/heatingCircuits',    '/solarCircuits',    '/heatSources',);
function CreateCategory( $Name, $Ident = '', $ParentID = 0 )
{
   global $RootCategoryID;
   echo "CreateCategory: ( $Name, $Ident, $ParentID ) 
";
	if ( '' != $Ident )
	{
		$CatID = @IPS_GetObjectIDByIdent( $Ident, $ParentID );
		if ( false !== $CatID )
		{
			$Obj = IPS_GetObject( $CatID );
			if ( 0 == $Obj['ObjectType'] ) // is category?
				return $CatID;
		}
	}
	$CatID = IPS_CreateCategory();
	IPS_SetName( $CatID, $Name );
	IPS_SetIdent( $CatID, $Ident );
   if ( 0 == $ParentID )
		if ( IPS_ObjectExists( $RootCategoryID ) )
			$ParentID = $RootCategoryID;
		IPS_SetParent( $CatID, $ParentID );
	return $CatID;
}

function SetVariable( $VarID, $Type, $Value )
{
	switch( $Type )
	{
		case 0: // boolean
			SetValueBoolean( $VarID, $Value );
			break;
      case 1: // integer
			SetValueInteger( $VarID, $Value );
			break;
		case 2: // float
			SetValueFloat( $VarID, $Value );
			break;
		case 3: // string
			SetValueString( $VarID, $Value );
			break;
	}
}

function CreateVariable( $Name, $Type, $Value, $Ident = '', $ParentID = 0 )
{
	echo "CreateVariable: ( $Name, $Type, $Value, $Ident, $ParentID ) 
";
	if ( '' != $Ident )
	{
		$VarID = @IPS_GetObjectIDByIdent( $Ident, $ParentID );
		if ( false !== $VarID )
		{
			SetVariable( $VarID, $Type, $Value );
			return;
		}
	}
	$VarID = @IPS_GetObjectIDByName( $Name, $ParentID );
	if ( false !== $VarID ) // exists?
	{
		$Obj = IPS_GetObject( $VarID );
		if ( 2 == $Obj['ObjectType'] ) // is variable?
		{
			$Var = IPS_GetVariable( $VarID );
			if ( $Type == $Var['VariableValue']['ValueType'] )
			{
				SetVariable( $VarID, $Type, $Value );
				return;
			}
		}
	}
	$VarID = IPS_CreateVariable( $Type );
	IPS_SetParent( $VarID, $ParentID );
	IPS_SetName( $VarID, $Name );
	if ( '' != $Ident )
		IPS_SetIdent( $VarID, $Ident );
	SetVariable( $VarID, $Type, $Value );
}



function Traverse_REST_URL( $REST_Service, $ParentID = 0 )
{
	$Name = $REST_Service;
	$REST_Obj = km200_GetData( $REST_Service );
	if( NULL == $REST_Obj )
	{
		echo "Service $REST_Service returned NULL
";
		return;
	}
	$Ident = str_replace( '/', '0', $REST_Obj->id );
   if ( property_exists( $REST_Obj, 'writeable' ) )
		if( 0 !== $REST_Obj->writeable )
			$Name .= " (writeable)";
		if ( property_exists( $REST_Obj, 'recordable' ) )
			if( 0 !== $REST_Obj->writeable )
				$Name .= " (recordable)";
    switch( $REST_Obj->type )
	 {
	 	case 'refEnum':           // create category
		 	$CatID = CreateCategory( $Name, $Ident, $ParentID );          // loop through enum array
			 foreach( $REST_Obj->references as $SubService )
			 Traverse_REST_URL( $SubService->id, $CatID ); // recurse
			 break;
		case 'moduleList':           // create category
			$CatID = CreateCategory( $Name, $Ident, $ParentID );          // loop through values array
			foreach( $REST_Obj->values as $Modules )
				CreateVariable( $Modules->Name, 3, $Modules->Version, $Ident . "0" . $Modules->Token, $CatID );
			break;
		case 'floatValue':
			CreateVariable( $Name, 2, $REST_Obj->value, $Ident, $ParentID );
			break;
		case 'stringValue':
			CreateVariable( $Name, 3, $REST_Obj->value, $Ident, $ParentID );
			break;
		case 'switchProgram':
			CreateVariable( $Name, 3, "switchProgram, toDo!", $Ident, $ParentID );
			break;
		default:
			echo "$Name ist Typ $REST_Obj->type !
";
			CreateVariable( $Name + $REST_Obj->type, 3, (string) $REST_Obj->value, $Ident, $ParentID );
			break;
	}
}


foreach( $km200_REST_URLs as $REST_Service )
	Traverse_REST_URL( $REST_Service, $RootCategoryID )
?>

Dann bekomme ich entsprechende Einträge.

Meine Abfrage in der Umsetzung sieht dann wie folgt aus:

<?
   include_once( "36145.ips.php" ); // KM200 Gateway

	$idList = IPS_GetChildrenIDs(52696 /*[Keller\Heizungsraum\Therme\Werte\1min]*/);

	foreach ($idList as $id)
	{
	   $rest_url = IPS_GetName($id);
	   $REST_Obj = km200_GetData( $rest_url );
	   SetVariable($id, $REST_Obj->type, $REST_Obj->value);
	}

function SetVariable( $VarID, $Type, $Value )
{
    switch( $Type )
	 {
	 	case 'refEnum':           // create category
			 break;
		case 'moduleList':           // create category
			foreach( $REST_Obj->values as $Modules )
//				CreateVariable( $Modules->Name, 3, $Modules->Version, $Ident . "0" . $Modules->Token, $CatID );
			break;
		case 'floatValue':
//			CreateVariable( $Name, 2, $REST_Obj->value, $Ident, $ParentID );
			SetValueFloat( $VarID, $Value );
			break;
		case 'stringValue':
//			CreateVariable( $Name, 3, $REST_Obj->value, $Ident, $ParentID );
			SetValueString( $VarID, $Value );
			break;
		case 'switchProgram':
//			CreateVariable( $Name, 3, "switchProgram, toDo!", $Ident, $ParentID );
			SetValueString( $VarID, $Value );
			break;
		default:
//			echo "$Name ist Typ $REST_Obj->type !
";
//			CreateVariable( $Name + $REST_Obj->type, 3, (string) $REST_Obj->value, $Ident, $ParentID );
			SetValueString( $VarID, $Value );
			break;
	}
}

?>

Gruß,
Sven