FHEM - Anwendungen > Heizungssteuerung/Raumklima

Buderus KM200 Kommunikationsmodul

(1/368) > >>

Sailor:
Die neuste Version des km200 Moduls kommt seit dem 07.01.2015 per update-Befehl automatisch in das fhem-System geliefert.

Das zugehörige WIKI ist hier zu finden: http://www.fhemwiki.de/wiki/Buderus_Web_Gateway#Aktivierung_und_Definition_in_FHEM





Ein herzerfrischendes "Moin" vom hinterm-Deich vorweg

Ich habe eine Frage/Bitte an jene die der Programmiersprache Perl und PHP gleichermaßen mächtig sind.

Da sich meine Programmier - Kenntnisse nicht so weit erstrecken, ein eigenes Modul zu schreiben, brauche ich Eure Unterstützung.

Ich bin seit kurzem stolzer Besitzer einer nagelneuen Gasheizung von Buderus, welche das Kommunikationsmodul "Buderus KM200" als Schnittstelle zum Netz hat.
Dies funktioniert so weit auch recht gut mit der Buderus App "EasyControl", jedoch vermisse ich die Anbindung an fhem.

Die Kollegen von IP-SymCon haben diese Nuss offensichtlich für sich schon "geknackt": http://www.ip-symcon.de/forum/threads/25103-Buderus-Logamatic-Web-KM200

Der Code, den sie dafür verwenden lautet


--- Code: ---// IP Adresse oder DNS-Hostname des KM200
define( "km200_gateway_host", '192.168.0.7', true );
// Achtung: Gerätepasswort ohne Bindestriche und in ASCII!
define( "km200_gateway_password", 'aaaBBBcccDDD', true );
// Achtung: Eigenes Passwort in ASCII!
define( "km200_private_password", '0000', true );
// Salt der MD5-Hashes zur AES-Schlüsselerzeugung
$Buderus_MD5Salt = pack(
    "c*",
    0x86, 0x78, 0x45, 0xe9, 0x7c, 0x4e, 0x29, 0xdc,
    0xe5, 0x22, 0xb9, 0xa7, 0xd3, 0xa3, 0xe0, 0x7b,
    0x15, 0x2b, 0xff, 0xad, 0xdd, 0xbe, 0xd7, 0xf5,
    0xff, 0xd8, 0x42, 0xe9, 0x89, 0x5a, 0xd1, 0xe4
);
define( "km200_crypt_md5_salt", $Buderus_MD5Salt, true );
// Erste Hälfte des Schlüssels: MD5 von ( Gerätepasswort . Salt )
$key_1 = md5( km200_gateway_password . km200_crypt_md5_salt, true );
// Zweite Hälfte des Schlüssels - initial: MD5 von ( Salt )
$key_2_initial = md5( km200_crypt_md5_salt, true );
// Zweite Hälfte des Schlüssels - privat: MD5 von ( Salt . privates Passwort )
$key_2_private = md5( km200_crypt_md5_salt . km200_private_password, true );
define( "km200_crypt_key_initial", $key_1 . $key_2_initial, true );
define( "km200_crypt_key_private", $key_1 . $key_2_private, 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\r\n" .
                "User-Agent: TeleHeater/2.2.3\r\n"
)
);
$context = stream_context_create( $options );
$content = @file_get_contents(
'http://' . km200_gateway_host . $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\r\n" .
                "User-Agent: TeleHeater/2.2.3\r\n",
'content' => km200_Encrypt( $content )
)
);
$context = stream_context_create( $options );
@file_get_contents(
'http://' . km200_gateway_host . $REST_URL,
false,
$context
);
}

--- Ende Code ---
Refer: http://www.ip-symcon.de/forum/threads/25103-Buderus-Logamatic-Web-KM200?p=230031#post230031

Scheinbar liegen alle Werte (Readings) in einer Art Verzeichnisstruktur: http://www.ip-symcon.de/wiki/Buderus_KM200


Da ich weder der dort verwendeten Programmiersprache (Ist es PHP?) mächtig bin, noch ausreichend Erfahrung in der Programmierung von fhem Modulen habe, meine Frage an die Community:
Hat Jemand Lust mich dabei zu unterstüzen (oder gar es zu übernehmen) ein fhem Modul für das Buderus KM200-Modul zu schreiben?  ::)

Kann doch schließlich nicht sein, dass uns die Mitbewerber etwas voraus haben, oder?  ;D

Vielen Dank für Eure Anregungen vorweg!

Beste Grüsse
    Sailor

Stefan M.:
Hallo zusammen
ich hab mir da was zusammengezimmert.

km200.php

--- Code: ---<?php
// km200.php
// Buderus KM 200
// Slash, Perseus
// http://www.ip-symcon.de/forum/threads/25103-Buderus-Logamatic-Web-KM200
// V 1.3

// IP Adresse oder DNS-Hostname des KM200
define( "km200_gateway_host", '192.168.0.xx', true );
// Gerätepasswort. Achtung: Ohne Bindestriche und in ASCII!
define( "km200_gateway_password", 'xxxxx', true );
// Eigenes Passwort wie in der App vergeben
define( "km200_private_password", 'xxx', true );
// Dreh- und Angelpunkt: Der geheime Salt der MD5-Hashes zur AES-Schlüsselerzeugung

$Buderus_MD5Salt = pack(
    "c*",
    0x86, 0x78, 0x45, 0xe9, 0x7c, 0x4e, 0x29, 0xdc,
    0xe5, 0x22, 0xb9, 0xa7, 0xd3, 0xa3, 0xe0, 0x7b,
    0x15, 0x2b, 0xff, 0xad, 0xdd, 0xbe, 0xd7, 0xf5,
    0xff, 0xd8, 0x42, 0xe9, 0x89, 0x5a, 0xd1, 0xe4
);
define( "km200_crypt_md5_salt", $Buderus_MD5Salt, true );
// Erste Hälfte des Schlüssels: MD5 von ( Gerätepasswort . Salt )
$key_1 = md5( km200_gateway_password . km200_crypt_md5_salt, true );
// Zweite Hälfte des Schlüssels - initial: MD5 von ( Salt )
$key_2_initial = md5( km200_crypt_md5_salt, true );
// Zweite Hälfte des Schlüssels - privat: MD5 von ( Salt . privates Passwort )
$key_2_private = md5( km200_crypt_md5_salt . km200_private_password, true );
define( "km200_crypt_key_initial", $key_1 . $key_2_initial, true );
define( "km200_crypt_key_private", $key_1 . $key_2_private, 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\r\n" .
                  "User-Agent: TeleHeater/2.2.3\r\n"
    )
  );
  $context = stream_context_create( $options );
  return json_decode(
    km200_Decrypt(
      file_get_contents(
        'http://' . km200_gateway_host . $REST_URL,
        false,
        $context
      )
    ),
    true //Achtung! Hier das true (und drüber das Komma) macht aus dem decodierten Objekt ein Array zur weiteren Bearbeitung)
  );
}

#function km200_SetData( $REST_URL, $Value )
#{
# $content = json_encode(
# array(
# "value" => $Value
# )
# );
# $options = array(
# 'http' => array(
#     'method' => "PUT",
#      'header' => "Content-type: application/json\r\n" .
#                  "User-Agent: TeleHeater/2.2.3\r\n",
# 'content' => km200_Encrypt( $content )
# )
# );
# $context = stream_context_create( $options );
# @file_get_contents(
# 'http://' . km200_gateway_host . $REST_URL,
# false,
# $context
# );
#} 
 
// Beispielaufruf
#$REST_Service = '/system';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#$REST_Service = '/system/sensors/temperatures/outdoor_t1';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#$REST_Service = '/system/sensors/temperatures/hotWater_t2';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#$REST_Service = '/system/sensors/temperatures/supply_t1';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#$REST_Service = '/system/sensors/temperatures/return';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#$REST_Service = '/system/sensors/temperatures/switch';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#$REST_Service = '/system/sensors/temperatures/chimney';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#$REST_Service = '/heatingCircuits/hc1/status';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#$REST_Service = '/heatSources';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#$REST_Service = '/heatSources/systemPressure';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );


#$REST_Service = '/heatingCircuits/hc1/roomtemperature';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#$REST_Service = '/gateway/versionFirmware';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#$REST_Service = '/gateway/versionHardware';
#$json = km200_GetData( $REST_Service );
#echo "Service: " . $REST_Service . "\n";
#var_dump( $json );

#hier werden die nicht benötigten Variablen auskommentiert.

$REST_services = array(
#"/system/sensors/temperatures/outdoor_t1",
#"/system/sensors/temperatures/hotWater_t2",
#"/heatingCircuits/hc1/roomtemperature",
#"/heatSources/systemPressure",
#"/heatingCircuits/hc1/status",

"/system/brand",
#"/system/systemType",
#"/system/bus",
#"/gateway/uuid",
"/gateway/DateTime",
"/gateway/versionFirmware",
#"/gateway/versionHardware",
"/gateway/instAccess",

#"/heatingCircuits",
#"/heatingCircuits/hc1",
#"/heatingCircuits/hc1/currentRoomSetpoint",
#"/heatingCircuits/hc1/actualSupplyTemperature",
"/heatingCircuits/hc1/operationMode",
#"/heatingCircuits/hc1/temperatureRoomSetpoint",
#"/heatingCircuits/hc1/manualRoomSetpoint",
#"/heatingCircuits/hc1/temporaryRoomSetpoint",
"/heatingCircuits/hc1/roomtemperature",
##"/heatingCircuits/hc1/activeSwitchProgram",
#"/heatingCircuits/hc1/switchPrograms",
#"/heatingCircuits/hc1/temperatureLevels",
#"/heatingCircuits/hc1/pumpModulation",
#"/heatingCircuits/hc1/suWiThreshold",
#"/heatingCircuits/hc1/designTemp",
#"/heatingCircuits/hc1/heatCurveMin",
#"/heatingCircuits/hc1/roomTempOffset",
#"/heatingCircuits/hc1/heatCurveMax",
#"/heatingCircuits/hc1/controlType",
#"/heatingCircuits/hc1/solarInfluence",
#"/heatingCircuits/hc1/roomInfluence",
#"/heatingCircuits/hc1/fastHeatupFactor",
#"/heatingCircuits/hc1/setpointOptimization",
#"/heatingCircuits/hc1/suWiSwitchMode",
#"/heatingCircuits/hc1/currentOpModeInfo",
"/heatingCircuits/hc1/status",

#"/solarCircuits",
"/solarCircuits/sc1/status",
"/solarCircuits/sc1/solarYield",
"/solarCircuits/sc1/collectorTemperature",
"/solarCircuits/sc1/pumpModulation",


#"/recordings",
#"/recordings/system",
#"/recordings/system/sensors",
#"/recordings/system/sensors/temperatures",
#"/recordings/system/sensors/temperatures/outdoor_t1",
#"/recordings/system/heatSources",
#"/recordings/system/heatSources/hs1",
#"/recordings/system/heatSources/hs1/actualPower",

#"/recordings/heatSources",
#"/recordings/heatSources/actualPower",
#"/recordings/heatSources/actualCHPower",
#"/recordings/heatSources/actualDHWPower",

#"/recordings/heatingCircuits",
#"/recordings/heatingCircuits/hc1",
#"/recordings/heatingCircuits/hc1/roomtemperature",

#"/heatSources",
"/heatSources/actualPower",
"/heatSources/actualCHPower",
"/heatSources/actualDHWPower",
"/heatSources/flameStatus",
"/heatSources/CHpumpModulation",
##"/heatSources/actualsupplytemperature",
##"/heatSources/powerSetpoint",
"/heatSources/gasAirPressure",
"/heatSources/systemPressure",
#"/heatSources/flameCurrent",
#"/heatSources/ChimneySweeper",
##"/heatSources/powerSetpoint",
"/heatSources/returnTemperature",
"/heatSources/systemPressure",
##"/heatSources/numberOfStarts",
##"/heatSources/nominalCHPower",
##"/heatSources/nominalDHWPower",
#"/heatSources/workingTime",

#"/notifications",

#"/system",

#"/system/info",
#"/system/minOutdoorTemp",
"/system/healthStatus",
#"/system/sensors",
#"/system/sensors/temperatures",
"/system/sensors/temperatures/outdoor_t1",
##"/system/sensors/temperatures/supply_t1_setpoint",
"/system/sensors/temperatures/supply_t1",
"/system/sensors/temperatures/hotWater_t1",
"/system/sensors/temperatures/hotWater_t2",
"/system/sensors/temperatures/return",
#"/system/sensors/temperatures/switch",
#"/system/sensors/temperatures/chimney",
#"/system/appliance",
#"/system/appliance/actualSupplyTemperature",
##"/system/appliance/powerSetpoint",
##"/system/appliance/actualPower",
##"/system/appliance/CHpumpModulation",
"/system/appliance/numberOfStarts",
##"/system/appliance/gasAirPressure",
##"/system/appliance/systemPressure",
##"/system/appliance/flameCurrent",
##"/system/appliance/ChimneySweeper",
##"/system/appliance/workingTime",
##"/system/appliance/nominalBurnerLoad",
#"/system/heatSources/hs1",
#"/system/heatSources/hs1/energyReservoir",
#"/system/heatSources/hs1/reservoirAlert",
#"/system/heatSources/hs1/nominalFuelConsumption",
#"/system/heatSources/hs1/fuelConsmptCorrFactor",
#"/system/heatSources/hs1/actualModulation",
#"/system/heatSources/hs1/actualPower",
#"/system/heatSources/hs1/fuel",
#"/system/heatSources/hs1/fuel/density",
#"/system/brand",
#"/gateway/versionFirmware",
#"/gateway/versionHardware"
);

//durch alle Services gehen, mit Wert und Einheit rausschreiben
foreach ($REST_services as $service) {
         $json = km200_GetData( $service );

#         echo "<tr>
#                 <td>$service</td><td>";

echo $json["id"];
echo ";";
#  
                 if(array_key_exists ("value", $json ))
 {
                         echo $json["value"];
 echo ";";
                 }
 else
 {
echo "x;";  
 }
#                 if(array_key_exists ("unitOfMeasure", $json ))
#  {
#                         echo $json["unitOfMeasure"];
#                 }
#  echo" \n ";
#         echo "</td>
#              </tr>";

}
?>

--- Ende Code ---

diese PHP Datei liegt auf meinem QNAP-Webserver kann aber auf jedem Webserver liegen.

Aufruf
http://192.168.0.180/km200/km200.php

Ergebnis

--- Zitat ---/system/brand;Buderus;/gateway/DateTime;2014-07-21T16:20:59;/gateway/versionFirmware;01.09.04;/gateway/instAccess;off;/heatingCircuits/hc1/operationMode;auto;/heatingCircuits/hc1/roomtemperature;27.6;/heatingCircuits/hc1/status;ACTIVE;/solarCircuits/sc1/status;ACTIVE;/solarCircuits/sc1/solarYield;0;/solarCircuits/sc1/collectorTemperature;50.4;/solarCircuits/sc1/pumpModulation;0;/heatSources/actualPower;0;/heatSources/actualCHPower;0;/heatSources/actualDHWPower;0;/heatSources/flameStatus;off;/heatSources/CHpumpModulation;0;/heatSources/gasAirPressure;0;/heatSources/systemPressure;25.5;/heatSources/returnTemperature;44.7;/heatSources/systemPressure;25.5;/system/healthStatus;ok;/system/sensors/temperatures/outdoor_t1;25.7;/system/sensors/temperatures/supply_t1;51.4;/system/sensors/temperatures/hotWater_t1;55.8;/system/sensors/temperatures/hotWater_t2;51;/system/sensors/temperatures/return;44.7;/system/appliance/numberOfStarts;37849;

--- Ende Zitat ---

Dann habe ich mir ein FMEM Modul aus Beispielen zusammengesucht

71.km200.pm

--- Code: ---# $Id: 71_KM200.pm
##############################################################################
#
#     71_km200.pm
#
#     Fhem is free software: you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation, either version 2 of the License, or
#     (at your option) any later version.
#
#     Fhem is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with fhem.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################

package main;

use strict;
use warnings;
use Time::HiRes qw(gettimeofday sleep);
use HttpUtils;
 
sub km200_Get($@);
sub km200_Define($$);
sub km200_GetStatus($;$);
sub km200_Undefine($$);
sub km200_GetIPS($);

my $Version = "V 1.1.2";
my $FW ="V 1.0.x";
my $SN ="123456";

my $Interval = "10";



###################################
sub
km200_Initialize($)
{
  my ($hash) = @_;

  $hash->{GetFn}     = "km200_Get";
  $hash->{SetFn}     = "km200_Set";
  $hash->{DefFn}     = "km200_Define";
  $hash->{UndefFn}   = "km200_Undefine";

$hash->{FirmWare} = $FW;
$hash->{Version} = $Version;
$hash->{SerialNr} = $SN;

$hash->{STATE}="Init";

my $name = $hash->{helper}{NAME};

 Log3 $name, 4, "km200: Init $hash";
     
 $hash->{AttrList}  = "do_not_notify:1,0 loglevel:0,1,2,3,4,5,6 INTERVAL disable:0,1 Div1 Div2 Div3 Description1 Description2 Description3 WebSeite:0,1 Webserver IPSDev:89,91,14,23 ".$readingFnAttributes;
 
 RemoveInternalTimer($hash);
 InternalTimer(gettimeofday()+5, "km200_GetStatus", $hash, 0);

}

###################################
sub
km200_GetStatus($;$)
{
    my ($hash, $local) = @_;
   
    my $name = $hash->{helper}{NAME};
       
    $local = 0 unless(defined($local));

    return "" if(!defined($hash->{helper}{ADDRESS}) or !defined($hash->{helper}{INTERVAL}));

    my $device = $hash->{helper}{ADDRESS};
   
    my $Int = $hash->{helper}{INTERVAL};
    my $now = localtime(time);
   
    #my $Interval = $hash->{INTERVAL};
   
    $Interval = $attr{$name}{INTERVAL};
   
    my $disable = $attr{$name}{disable};
   
    my $NextI = gettimeofday() + $Interval;
    my $NextIT = localtime($NextI);
   
    #Log3 $name, 4, "km200: GetStatus $device $hash $name $local $Int $Interval $now";
    #Log3 $name, 4, "km200: GetStatus $NextI $NextIT";

    #Log3 $name, 4, "km200 GetStatus Int: $Int";
   Log3 $name, 4, "km200 GetStatus Interval: $Interval";
   Log3 $name, 4, "km200 GetStatus Disable: $disable";
   
readingsSingleUpdate($hash, "state", "OK", 1);

RemoveInternalTimer($hash);
InternalTimer($NextI, "km200_GetStatus", $hash, 0) unless($local == 1);
   
    readingsBeginUpdate($hash); 
    readingsBulkUpdate($hash, "last", $now);
    readingsBulkUpdate($hash, "next", $NextIT);     
    readingsEndUpdate($hash, 1);
       
    Log3 $name, 4, "km200 GetStatus $name: ".$hash->{STATE};

    if ($disable == 0)
   
    {
    km200_GetIPS($hash);
    $hash->{STATE}="OK $now";
    }
    else
    {
    $hash->{STATE}="Disabled";
    }
   
    Log3 $name, 4, "km200 GetStatus $name: ".$hash->{STATE};
   
    return $hash->{STATE};
}

###################################
sub
km200_Get($@)
{
    my ($hash, @a) = @_;
    my $what;
   
     my $name = $hash->{helper}{NAME};
   
     Log3 $name, 4, "km200: Get $name";

}


###################################
sub
km200_Set($@)
{
    my ($hash, @a) = @_;
   
    my $name = $hash->{helper}{NAME};
    my $address = $hash->{helper}{ADDRESS};
    my $Int = $hash->{helper}{INTERVAL};
       
    $Interval = $attr{$name}{INTERVAL};
   
    Log3 $name, 4, "km200: Set $address $name $Interval";
#    Log3 $name, 4, "km200: Set Int : $Int";
#    Log3 $name, 4, "km200: Set Interval: $Interval";

# $hash->{STATE}="set";

}


#############################
sub
km200_Define($$)
{
    my ($hash, $def) = @_;
    my @a = split("[ \t][ \t]*", $def);
    my $name = $hash->{NAME};

$hash->{FirmWare} = $FW;
$hash->{Version} = $Version;
$hash->{SerialNr} = $SN;

$hash->{STATE}="define";
   
    Log3 $name, 4, "km200 : Define H $hash";
    Log3 $name, 4, "km200 : Define D $def";
    Log3 $name, 4, "km200 : Define A @a";

$attr{$name}{INTERVAL}="25";
$attr{$name}{room}="KM200";
$attr{$name}{disable}="0";

# $attr{$name}{Div1}="1";
# $attr{$name}{Div2}="1";
# $attr{$name}{Div3}="1";

# $attr{$name}{Description1}="Descr 1";
# $attr{$name}{Description2}="Descr 2";
# $attr{$name}{Description3}="Descr 3";

# $attr{$name}{WebServer}="192.168.0.180";
# $attr{$name}{WebSeite}="1";
# $attr{$name}{IPSDev}="89";


    my $address = $a[2];
    $name = $a[0];
 
    $hash->{helper}{ADDRESS} = $address;
    $hash->{helper}{NAME} = $name;
   
    $Interval = $attr{$name}{INTERVAL};
   
    Log3 $name, 4, "km200 : Define Adr $address";
    Log3 $name, 4, "km200 : Define Name $name";
    Log3 $name, 4, "km200 : Define Interval: $Interval";
       
    $hash->{helper}{INTERVAL}=$Interval;
   
#    unless(exists($hash->{helper}{AVAILABLE}) and ($hash->{helper}{AVAILABLE} == 0))
#    {
#    $hash->{helper}{AVAILABLE} = 1;
#    readingsSingleUpdate($hash, "presence", "present", 1);
#    }

    # start the status update timer

RemoveInternalTimer($hash);
    InternalTimer(gettimeofday()+5, "km200_GetStatus", $hash, 0);
 
  return undef;
}


#############################
sub
km200_Undefine($$)
{
  my($hash, $name) = @_;
   
   $name = $hash->{helper}{NAME};
 
   Log3 $name, 4, "km200: Undefine $name";

  # Stop the internal GetStatus-Loop and exit
  RemoveInternalTimer($hash);
  return undef;
}


sub km200_GetIPS($)
{
my($hash, $name) = @_;

my $name = $hash->{helper}{NAME};

my $dev = $hash->{helper}{ADDRESS};

Log3 $name, 4, "Getkm200 $hash $name $dev";

# km200itch csv m2-0Ev,0,0,0,0,0,0,0,0,33.4,-99,0.0,0,0,0,0, 153506, 2726200, 6211815, 0,4,795, ,,, ,,, ,,, ,,, ,,,IPs01,,,<br>th 10-10-13 13:13:48.090
# /system/brand;Buderus;/system/systemType;CoreIcomGw;/system/bus;EMS1_0;/gateway/uuid;109010275;/gateway/DateTime;2014-07-14T14:36:55;/gateway/versionFirmware;01.09.04;/gateway/versionHardware;iCom_Low_v1;/gateway/instAccess;off;/heatingCircuits/hc1/operationMode;auto;/heatingCircuits/hc1/temperatureRoomSetpoint;0;/heatingCircuits/hc1/roomtemperature;24.4;/heatingCircuits/hc1/status;ACTIVE;/heatSources/flameStatus;off;/heatSources/gasAirPressure;0;/heatSources/systemPressure;25.5;;/heatSources/returnTemperature;49.9;/heatSources/systemPressure;25.5;/system/healthStatus;ok;/system/sensors/temperatures/outdoor_t1;19.7;/system/sensors/temperatures/supply_t1;50.1;/system/sensors/temperatures/hotWater_t2;54.3;/system/sensors/temperatures/return;49.9;/system/sensors/temperatures/switch;-3276.8;/system/sensors/temperatures/chimney;-3276.8;

Log3 $name, 5, "Def: " . $dev;

my $url = $dev."/km200.php";
Log3 $name, 5, "km200CSV URL: " . $url;

  my $val = GetHttpFile ($url,'');
  Log3 $name, 5, "km200CSV org: " . $val;
my $valL= length($val);
Log3 $name, 5, "Laenge: " . $valL;

readingsBeginUpdate($hash);
readingsBulkUpdate( $hash, "URL", $url );
#readingsBulkUpdate( $hash, "CSV", $val );
readingsBulkUpdate( $hash, "CSV-Laenge", $valL );
readingsEndUpdate( $hash, 1 );

if ($valL ==0)

{

$hash->{STATE}="Error";
readingsSingleUpdate($hash, "state", "Error", 1);

}

else
{   
#$val=substr($val,0,$valI);
#Log3 $name, 5, "km200CSV sub: " . $val;

my $valL= length($val);
Log3 $name, 5, "Laenge: " . $valL;
Log3 $name, 5, "km200CSV: " . $val;

my @var = split(/;/, $val);


Log3 $name, 5, "km200CSV var".@var[0]." ".@var[1]." ".@var[2];


Log3 $name, 5, "km200Felder: " . @var[0];

my $var = "";

for (my $i =0 ; $i <= 100; $i++)

{
#Log3 $name, 5, "ForCnt : " . $i;

$var=@var[$i];
Log3 $name, 5, "km200Feld $i : " . $var;

}

readingsBeginUpdate($hash);
readingsBulkUpdate( $hash, @var[0], @var[1] );
readingsBulkUpdate( $hash, @var[2], @var[3] );
readingsBulkUpdate( $hash, @var[4], @var[5] );
readingsBulkUpdate( $hash, @var[6], @var[7] );
readingsBulkUpdate( $hash, @var[8], @var[9] );
readingsBulkUpdate( $hash, @var[10], @var[11] );
readingsBulkUpdate( $hash, @var[12], @var[13] );
readingsBulkUpdate( $hash, @var[14], @var[15] );
readingsBulkUpdate( $hash, @var[16], @var[17] );
readingsBulkUpdate( $hash, @var[18], @var[19] );
readingsBulkUpdate( $hash, @var[20], @var[21] );
readingsBulkUpdate( $hash, @var[22], @var[23] );
readingsBulkUpdate( $hash, @var[24], @var[25] );
readingsBulkUpdate( $hash, @var[26], @var[27] );
readingsBulkUpdate( $hash, @var[28], @var[29] );
readingsBulkUpdate( $hash, @var[30], @var[31] );
readingsBulkUpdate( $hash, @var[32], @var[33] );
readingsBulkUpdate( $hash, @var[34], @var[35] );
readingsBulkUpdate( $hash, @var[36], @var[37] );
readingsBulkUpdate( $hash, @var[38], @var[39] );
readingsBulkUpdate( $hash, @var[40], @var[41] );
readingsBulkUpdate( $hash, @var[42], @var[43] );
readingsBulkUpdate( $hash, @var[44], @var[45] );
readingsBulkUpdate( $hash, @var[46], @var[47] );
readingsBulkUpdate( $hash, @var[48], @var[49] );
readingsBulkUpdate( $hash, @var[50], @var[51] );
readingsBulkUpdate( $hash, @var[52], @var[53] );
readingsBulkUpdate( $hash, @var[54], @var[55] );
readingsBulkUpdate( $hash, @var[56], @var[57] );
readingsBulkUpdate( $hash, @var[58], @var[59] );
readingsBulkUpdate( $hash, @var[60], @var[61] );
readingsBulkUpdate( $hash, @var[62], @var[63] );
readingsBulkUpdate( $hash, @var[64], @var[65] );
readingsBulkUpdate( $hash, @var[66], @var[67] );
readingsBulkUpdate( $hash, @var[68], @var[69] );

readingsEndUpdate( $hash, 1 );

#$hash->{FirmWare} = @var[9];

# $hash->{READINGS}{$key}{TIME} = $tn;
# $hash->{READINGS}{$key}{VAL}  = $val;
# DoTrigger( $name, "$key: $val" );


my $WS=0;
my $WebServer="192.168.0.180";
my $IPSDev="91";

$WS = $attr{$name}{WebSeite};
$WebServer = $attr{$name}{WebServer};
$IPSDev = $attr{$name}{IPSDev};

Log3 $name, 5, "Erweiterung : " . $WS ." ". $WebServer ." " . $IPSDev ;

}

}

1;

=pod
=begin html

<a name="km200"></a>
<h3>IP-Switch</h3>
<ul>
<a name="IP-Switchdefine"></a> <b>Define</b>
</ul>



=end html

=begin html_DE

<a name="km200"></a>
<h3>km200</h3>
<ul>
<a name="km200define"></a> <b>Definition</b>
<ul>
<code>define &lt;name&gt; km200 &lt;IP-Addresse&gt; [&lt;Zone&gt;]
[&lt;Status_Interval&gt;]</code> <br>
<br>
Modul zur Abfrage eines IP-Switch von http://www.sms-guard.org/ <br>
<br>
Beispiel:<br>
<br>
<ul>
<code> define mykm200_1 km200 192.168.0.10<br>
<br>
attr mykm200_1 </code>
</ul>
<br>
<br>
</ul>
<a name="km200get"></a> <b>Get-Kommandos</b>
<ul>
<code>get &lt;Name&gt; &lt;Parameter&gt;</code> <br>
<br>
Aktuell stehen folgende Parameter zur Verfügung welche den aktuellen
Status des Receivers zurück geben.<br>
<br>
<ul>
<li><code>power</code> - Betriebszustand des Receiveres/Zone (on
oder off)</li>
<li><code>presence</code> - Empfangsbereitschaft des Receivers
(absent oder present)</li>
<li><code>input</code> - Gewählter Eingang</li>
<li><code>inputName</code> - Bezeichnung des gewählten Einganges
wie im Display des Receivers</li>
<li><code>mute</code> - Lautlos an oder aus (on oder off)</li>
<li><code>volume</code> - Lautstärkepegel in %</li>
<li><code>volumeStraight</code> - Lautstärkepegel in dB</li>
</ul>
</ul>
<br>
<a name="km200attr"></a> <b>Attribute</b>
<ul>
<li><a href="#do_not_notify">do_not_notify</a></li>
<br>
<li><a name="volume-smooth-change">disable</a></li>
Stopen der <br>
<br>
Mögliche Werte: 0 =&gt; deaktiviert , 1 =&gt; aktiviert<br>
<br>
<li><a name="volume-smooth-steps">INTERVAL</a></li>
In welchem Zeitinterval (sec) abgefragt wird <br>
</ul>
<b><br>
Generierte Readings/Events:</b><br>
<ul>
<li><b>CSV </b></li>
- Der CSV String
<li><b>CSV-Laenge</b> - Länge des Strings</li>
<li><b>Name</b> - Name des Gerätes</li>
<li><b>iSo1</b> - </li>
<li><b>iSo1x</b> - </li>
<li><b>iSo2</b> - </li>
<li><b>iSo2x</b> - </li>
<li><b>iSo3</b> - </li>
<li><b>iSo3x</b> - </li>
<li><b>iTe</b> - </li>
<li><b>iTi</b> - </li>
<li><b>last</b> - </li>
<li><b>next</b> - </li>
<li><b>state </b> - </li>
</ul>
<b> </b> <b> <br>
<br>
</b>
</ul>
=end html_DE

=cut


--- Ende Code ---

Dieses Modul muss im Verzeichnis ../fhem/FHEM liegen.

Aufruf mit
reload 71_km200
define myKM200 km200 192.168.0.180/km200

Ist zwar nicht schön programmiert aber funktioniert.

Wenn jemand bessere Ideen hat nur her damit.
Die beiden Dateien hänge ich mit dran.

LG
Stefan


Sailor:
Hallo Stefan


das sieht ja schon mal gar nicht schlecht aus.

Jetzt müesste man nur noch den php-Teil mit in die .pm Datei bekommen und schon hätte man es etwas homogener.  8)

Frage: Was macht eigentlich der Webseiten-Teil ganz am Ende des Scriptes. Kann man dort die Einstellungen vornehmen. Und wenn ja, wie ruft man diese auf?  :o

Gruß
    Sailor

Stefan M.:
Hi
der Webseiten-Teil  macht eigentlich gar nichts, der ist noch Übrig von einem vorherigen Modul, hab ich vergessen raus zu nehmen.
das werde ich mal bereinigen.

lg
Stefan

Jens_B:
Hallo zusammen, der PHP Teil sollte auf einem Webserver liegen? Wenn man sowas nun nicht hat. Kann man das direkt in fhem bringen? Fhem hat doch auch soweit ich es verstehe einen eigenen webserverteil?
Gruß
Jens


Gesendet von meinem iPhone mit Tapatalk

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln