Buderus KM200 Kommunikationsmodul

Begonnen von Sailor, 21 Juli 2014, 12:39:47

Vorheriges Thema - Nächstes Thema

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


// 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
);
}

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
******************************
Man wird immer besser...

Stefan M.

#1
Hallo zusammen
ich hab mir da was zusammengezimmert.

km200.php

<?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*",
    
0x860x780x450xe90x7c0x4e0x290xdc,
    
0xe50x220xb90xa70xd30xa30xe00x7b,
    
0x150x2b0xff0xad0xdd0xbe0xd70xf5,
    
0xff0xd80x420xe90x890x5a0xd10xe4
);
define"km200_crypt_md5_salt"$Buderus_MD5Salttrue );
// Erste Hälfte des Schlüssels: MD5 von ( Gerätepasswort . Salt )
$key_1 md5km200_gateway_password km200_crypt_md5_salttrue );
// Zweite Hälfte des Schlüssels - initial: MD5 von ( Salt )
$key_2_initial md5km200_crypt_md5_salttrue );
// Zweite Hälfte des Schlüssels - privat: MD5 von ( Salt . privates Passwort )
$key_2_private md5km200_crypt_md5_salt km200_private_passwordtrue );
define"km200_crypt_key_initial"$key_1 $key_2_initialtrue );
define"km200_crypt_key_private"$key_1 $key_2_privatetrue );

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_repeatchr$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_decryptMCRYPT_RIJNDAEL_128km200_crypt_key_privatebase64_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 ] );
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>";

}
?>



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;

Dann habe ich mir ein FMEM Modul aus Beispielen zusammengesucht

71.km200.pm

# $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



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


FHEM auf 3 x RaspberryPi, 1 x Fritzbox,1 x Win. FS20 über CUL, HomeMatic über HMLan, 6 x  HM_CC_RT_DN,2 x HM_LC_BL1_FM,3 x HM_SEC_KEY,2 x HM_RC_Key4_2,7 x HM_SEC_SC,1 x HM_SEC_WDS,1 x HM_Sen_RD_O, 1x HM_Sen_Wa_Od,2 x HM_RC_Key4_2, 5 x HM-ES-PMSw1-Pl,1 x HM_LC_SW4_WM,1 x HM_SCI_3_FM

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
******************************
Man wird immer besser...

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

FHEM auf 3 x RaspberryPi, 1 x Fritzbox,1 x Win. FS20 über CUL, HomeMatic über HMLan, 6 x  HM_CC_RT_DN,2 x HM_LC_BL1_FM,3 x HM_SEC_KEY,2 x HM_RC_Key4_2,7 x HM_SEC_SC,1 x HM_SEC_WDS,1 x HM_Sen_RD_O, 1x HM_Sen_Wa_Od,2 x HM_RC_Key4_2, 5 x HM-ES-PMSw1-Pl,1 x HM_LC_SW4_WM,1 x HM_SCI_3_FM

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
RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

Sailor

Moin zusammen

Ich versuche mal Jemanden zu finden, der den PHP Teil in Perl umschreiben kann.
Das kann ja schliesslich kein Ding der Unmoeglichkeit sein.  :-\

Wenn Ihr Jemanden kennt, der beide Sprachen beherrscht, dann immer nur her damit.
Ich moechte naemlich auch keinen extra Webserver dafuer einrichten muessen.  ;)

Gruss
    Sailor
******************************
Man wird immer besser...

Puschel74

Hallo,

@Sailor
Keine Angst, ich verfolge auch Beiträge die nicht im Anfängerbereich angesiedelt sind  ;)
Aber für dieses Vorhaben bin ich auf alle Fälle der gänzlich falscheste da ich weder Perl noch PHP beherrsche.
Tut mir leid das ich euch hierbei nicht weiterhelfen kann.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Sailor

Schade, Schade  :'(

Hast auch keine Idee wer so etwas koennte, oder?

Gruss
    Sailor

******************************
Man wird immer besser...

Sailor

Hallo Stefan


habe jetzt einfach mal angefangen das PHP modul in ein fhem-Modul umzuschreiben...

Kannst Du bitte mal überprüfen ob mit deinem aktiven PHP file die gleichen MD5 Schlüssel rauskommen:.

Diese werden ins Log File geschrieben:

2014.07.25 15:01:33 3: km200_crypt_key_initial:
2014.07.25 15:01:33 3: km200_crypt_key_private:


Die Namen der Variablen sind im PHP modul identisch. Ich habe aber keine Ahnung wie du diese explizit sichtbar machen kannst.

Mein Modul bezieht sich auf folgende Werte:

  # Gateway Passwort as printed on the label of the KM200. Without hyphen "-" and in ASCII!
  my $km200_gateway_password = "tjZvrnJicB8DpJyZ";

  # Private Password as defined in the "Buderus - EasyControl" - App
  my $km200_private_password = "Hm4711";




# $Id: 73_km200test.pm 0001 2014-07-25 10:17:00Z sailor $
########################################################################################################################
#
#     73_km200test.pm
#     Creates the possibility to access the Buderus central heating system via
#     KM200 Communication module
#
#     Copyright by Sailor, Stefan M.
#     e-mail: Contat via http://forum.fhem.de
#
#     This file is part of fhem.
#
#     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/>.
#
########################################################################################################################



###START###### Initialize module ##############################################################################START####
package main;

use strict;
use warnings;
use Blocking;
use Time::HiRes qw(gettimeofday sleep);
use HttpUtils;
use Digest::MD5 qw(md5 md5_hex md5_base64);
use base qw( Exporter );
use MIME::Base64;
#use Mcrypt;




#sub km200_Get($@);
#sub km200_Define($$);
#sub km200_GetStatus($;$);
#sub km200_Undefine($$);
#sub km200_GetIPS($);



sub
km200test_Initialize($)
{
  my ($hash) = @_;

# require "$attr{global}{modpath}/FHEM/HttpUtils.pm";

 

#  $hash->{GetFn}     = "km200_Get";
#  $hash->{SetFn}     = "km200_Set";
#  $hash->{DefFn}     = "km200_Define";
#  $hash->{UndefFn}   = "km200_Undefine";
 
  $hash->{FirmWare} = 1;
  $hash->{Version} = 0.1;
  $hash->{SerialNr} = 123456;

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

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

  Log3 $name, 4, "km200: Init $hash";
     
  $hash->{AttrList}  = "km200GateLoginName km200GatePassword km200PrivatePassword km200GateIP 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);

# To be changed to fhem module attributes
  # IP Adresse oder DNS-Hostname des KM200
  my $km200_gateway_host = "192.168.178.200";

  # Gerätepasswort. Achtung: Ohne Bindestriche und in ASCII!
  my $km200_gateway_password = "tjZvrnJicB8DpJyZ";

  # Eigenes Passwort wie in der App vergeben
  my $km200_private_password = "Hm4711";
# To be changed to fhem module attributes
   
 
 

  ###START###### Create the secret SALT of the MD5-Hash for AES-encoding #####################################START####
  my $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
  );
  ####END####### Create the secret SALT of the MD5-Hash for AES-encoding ######################################END#####


  ###START###### Create keys with MD5 ########################################################################START####
  # Copy Salt
  my $km200_crypt_md5_salt = $Buderus_MD5Salt;
 
  # First half of the key: MD5 of (km200GatePassword . Salt)
  my $key_1 = md5($km200_gateway_password . $km200_crypt_md5_salt); 
 
  # Second half of the key: - Initial: MD5 of ( Salt)
  my $key_2_initial = md5($km200_crypt_md5_salt);
 
  # Second half of the key: -  private: MD5 of ( Salt . km200PrivatePassword)
  my $key_2_private = md5($km200_crypt_md5_salt . $km200_private_password);
 
  # Create keys
  my $km200_crypt_key_initial = ($key_1 . $key_2_initial);
  my $km200_crypt_key_private = ($key_1 . $key_2_private);
  ####END####### Create keys with MD5 #########################################################################END#####

 
# For testing prupose only - To be deleted   
my $InitialKey = "km200_crypt_key_initial: " . $km200_crypt_key_initial;
my $PrivateKey = "km200_crypt_key_private: " . $km200_crypt_key_private;

Log 3, $InitialKey;
Log 3, $PrivateKey;
# For testing prupose only - To be deleted   

}
####END####### Initialize module ###############################################################################END#####


###START####### More or less replicates the equivalent PHP function ###########################################START####
sub str_repeat
{
    my $string = shift;
    my $count = shift;
    return( ${string}x${count} );
}
####END######## More or less replicates the equivalent PHP function ############################################END#####


###START###### Subroutine Encrypt Data ########################################################################START####
#function km200_Encrypt( $encryptData )
#{
# # add PKCS #7 padding
# my $blocksize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
# my $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,
# ''
# )
# );
#}
####END####### Subroutine Encrypt Data #########################################################################END#####

1;



Folgende Probleme stellen zur Zeit eine Blockade dar:
a) Wie bekomme ich die Werte der Attribut-$hashs ausgelesen???  >:(
b) Ich bin auf der Suche nach dem "MyCrypt" package für "ActivePerl" und dem debian linux (Raspberry Pi)  :o

Wenn Jemand Abhilfe weiss, dann nur her damit...

Gruß
    Sailor
******************************
Man wird immer besser...

Stefan M.

Hi
kannst Du mir bitte genauer erklären was ich testen soll.

Ich kann Dein Modul bei mir nicht in FHEM einbinden. Ich bekomme immer Unknown module km200test, obwohl das Modul vorhanden ist.

lg
Stefan
FHEM auf 3 x RaspberryPi, 1 x Fritzbox,1 x Win. FS20 über CUL, HomeMatic über HMLan, 6 x  HM_CC_RT_DN,2 x HM_LC_BL1_FM,3 x HM_SEC_KEY,2 x HM_RC_Key4_2,7 x HM_SEC_SC,1 x HM_SEC_WDS,1 x HM_Sen_RD_O, 1x HM_Sen_Wa_Od,2 x HM_RC_Key4_2, 5 x HM-ES-PMSw1-Pl,1 x HM_LC_SW4_WM,1 x HM_SCI_3_FM

Puschel74

Hallo,

hast du auch ein
reload km200test
eingegeben?

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Stefan M.

FHEM auf 3 x RaspberryPi, 1 x Fritzbox,1 x Win. FS20 über CUL, HomeMatic über HMLan, 6 x  HM_CC_RT_DN,2 x HM_LC_BL1_FM,3 x HM_SEC_KEY,2 x HM_RC_Key4_2,7 x HM_SEC_SC,1 x HM_SEC_WDS,1 x HM_Sen_RD_O, 1x HM_Sen_Wa_Od,2 x HM_RC_Key4_2, 5 x HM-ES-PMSw1-Pl,1 x HM_LC_SW4_WM,1 x HM_SCI_3_FM

Sailor

Hallo Stefan

Ein reload sollte ausreichen um die besagten Einträge im fhem log zu erzeugen.

Ich schau mir das morgen mal An und werde berichten...


Matthias


Gesendet mit Tapatalk
******************************
Man wird immer besser...

Stefan M.

Hi
bisher hatte ich auch noch nie ein Problem Module einzubinden, aber mit diesem will es einfach nicht funktionieren.
Ich werde es morgen nochmal versuchen.

lg
Stefan
FHEM auf 3 x RaspberryPi, 1 x Fritzbox,1 x Win. FS20 über CUL, HomeMatic über HMLan, 6 x  HM_CC_RT_DN,2 x HM_LC_BL1_FM,3 x HM_SEC_KEY,2 x HM_RC_Key4_2,7 x HM_SEC_SC,1 x HM_SEC_WDS,1 x HM_Sen_RD_O, 1x HM_Sen_Wa_Od,2 x HM_RC_Key4_2, 5 x HM-ES-PMSw1-Pl,1 x HM_LC_SW4_WM,1 x HM_SCI_3_FM

Sailor

Hallo Stefan

Also ich führe fhem zur Entwicklung in einer Windows Umgebung mit ActivePerl aus.

Ich vermute, dass die Repositories in Deiner perl Umgebung (Raspberry, Fritzbox?) noch nicht installiert sind.

use Digest::MD5 qw(md5 md5_hex md5_base64);
use base qw( Exporter );
use MIME::Base64;


Da ich kein Linux Experte bin (In fact Ich habe gerade mal fundiertes Halbwissen) weiss ich nicht, mit welchem Befehl man sich die bereits installierten Pakete anzeigen lassen kann.

Du kannst ja mal versuchen eine Windows fhem-Test-Umgbung zu installieren: http://www.fhemwiki.de/wiki/Windows_-_FHEM_installieren

Wobei ich sagen muss, dass ich einfach nur ActivePerl installiert habe und das fhem Paket  http://fhem.de/fhem-5.5.tar.gz einfach in das Perl-Verzeichnis reinkopiert habe.
Dann einfach ,,perl fhem.pl fhem.cfg" eingeben und schon hast Du eine lokale Test-Umgebung unter  http://localhost:8083/fhem


Mein Stand der Entwicklung:
Aufgrund der besagten Wissenslücken, hadere ich zur Zeit mit dem Problem sowohl unter dem Raspberry als auch unter dem ActivePerl das CPAN-Paket "Mcrypt" http://search.cpan.org/~fkuo/MCrypt-0.92/MCrypt.pm zu installieren.

Ich habe es unter dem Raspberry mit CPAN Minusversucht, aber es bricht mit einer Fehlermeldung ab: http://www.raspberrypi.org/forums/viewtopic.php?f=34&t=13410
Unter ActivePerl komme ich gar nicht weiter... :'(


An diesem Problem beisse ich mir zur Zeit die Zähne aus und trägt nicht gerade zur Motivation bei!  >:(


Gruß
    Sailor
******************************
Man wird immer besser...