Buderus KM200 Web

Habe in der Bucht eine KM200 Web geschossen. War OVP. Ich habe sie mit meinem SM200 Solarregler verbunden. Am gleichen EMS Bus hängt noch ein RC300. SM200 und RC300 kommunizieren brav.

Nach dem booten habe ich auch eine schöne, statisch grüne LED an der KM 200 Web. Allerdings sagt mir die APP beim verbinden jedesmal, dass ich nicht die aktuelle Gateway Software drauf hätte. Allerdings ist die KM200 bereits seit heute Mittag am Netz.

Also eigentlich sollte sie ja mittlerweile die neue Firmware gezogen haben. Habe drüben im FHEM Wiki gelesen, dass das in Extremfällen wohl auch über Nacht dauern kann, aber wieso sollte ich ein Extremfall sein ? :smiley:

Wenn ich die REST API abpolle, dann bekomme ich einige wenige Info’s aus dem Gateway. Zumindest IP-Adresse und meine Passwörter scheinen aber zu stimmen. Was ich seltsam finde ist, dass er „no Bus“ sagt, obwohl die LED ja statisch grün ist, er also eine Busverbindung hat :confused:

CreateCategory: ( /gateway, 0gateway, 0 )
CreateVariable: ( /gateway/uuid, 3, geheim, 0gateway0uuid, 35424 )
Service /gateway/firmware returned NULL
Service /gateway/userpassword returned NULL
CreateVariable: ( /gateway/instAccess (writeable) (recordable), 3, off, 0gateway0instAccess, 35424 )
Service /gateway/instPassword returned NULL
CreateVariable: ( /gateway/instWriteAccess (writeable) (recordable), 3, off, 0gateway0instWriteAccess, 35424 )
CreateVariable: ( /gateway/versionFirmware, 3, 01.09.04, 0gateway0versionFirmware, 35424 )
CreateVariable: ( /gateway/versionHardware, 3, iCom_Low_v1, 0gateway0versionHardware, 35424 )
CreateVariable: ( /gateway/DateTime (writeable) (recordable), 3, 2016-03-11T20:31:12, 0gateway0DateTime, 35424 )
CreateCategory: ( /system, 0system, 0 )
CreateVariable: ( /system/brand, 3, Buderus, 0system0brand, 18261 )
CreateVariable: ( /system/bus, 3, No_Bus, 0system0bus, 18261 )

Kann mir da jemand mit ein bisschen Erfahrung mit der KM200 mal auf die Sprünge helfen?

Hi,

sag mal bist Du hier weitergekommen, schon was in IPS realisiert?
Wenn ja, könntest Du mir sagen wie?

Danke

Nicht wirklich.

Die KM200 funktioniert nur mit einem RC300 Modul (Ich habe ein SC300) und das RC300 funktioniert wiederum nur mit einem Brenner oder Wärmepumpe zusammen (Ich habe Solar).

Mit anderen Worten: KM200 funktioniert bei mir nicht.
Du kannst aber den KM200 mit folgendem Skript auslesen, kommt irgendwo hier aus dem Forum:


<?
include_once( "45307.ips.php" ); // KM200 Gateway
$RootCategoryID = 32306 /*[Heizung\KM 200 Web]*/;
$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 )
?>


Das include Skript ist:


<?php


// IP Adresse oder DNS-Hostname des KM200
define( "km200_gateway_host", 'IP DES HOSTS', 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 folgende Möglichkeit


  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:






  Hier den Parameter von hex2bin durch den eigenen AES-Key ersetzen
define( "km200_crypt_key_private", hex2bin( '22D3CF8751ED6BB163BE8D7CDE20210E0C2F9378C0DA3108F0673987B0D63E37' ), 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
    );
}


?>


Ah ok, danke.

War am überlegen ob ich es mir hole. Hmm…

Hab eine abzugeben :slight_smile: mehr per PN falls Du willst.