Hallo Leute,
anbei das Script um die Daten meines eBus-Adapters mittels Anbindung mit meinem eBus-Modul auszuwerten.
Es ist letztendlich eine Weiterentwicklung von diesem Thread (Dank an Wupperi, Helmut und all den anderen).
Habe noch einige neue Funktionen für die diversen verwendeten Datentypen hinzugefügt.
Auch einige neue Methoden entwickelt, um Werte auf Variablen zu schreiben und diese gegebenenfalls auch gleich mit dem richtigen DatenType und Profile anlegt.
Bei einigen Bezeichnern bin ich mir noch nicht ganz sicher, wenn also wer Verbesserungsvorschläge hat - immer her damit …
Zusätzliche Informationen gibts auch noch im WIKI
Installation:
[ul]
[li] Installation der IPSLibrary (wird für den IPSLogger benötigt)
[/li][li] Anlegen einer eBus Adapter Instance
[/li][li] Auswerte Script anlegen (siehe unten)
[/li][li] Event anlegen, damit das Script bei jeder Datenänderung getriggert wird
[/li][li] Variablen werden autom. angelegt, sobald das erste mal Daten für das entsprechende Feld empfangen werden
[/li][/ul]
<?php
IPSUtils_Include ("IPSLogger.inc.php", "IPSLibrary::app::core::IPSLogger");
define ("HEATING_DT_STRING", '~String');
define ("HEATING_DT_DEGREE", 'Heating_Temperature');
define ("HEATING_DT_PRESSURE", 'Heating_Pressure');
define ("HEATING_DT_PERCENT", 'Heating_Percent');
if ($IPS_SENDER == 'Variable' or $IPS_SENDER == 'RegisterVariable') {
$data = str_replace (" ", "", $IPS_VALUE);
$rootId = IPS_GetParent($IPS_SELF);
$dataSender = substr($data,0,2);
$dataReceiver = substr($data,2,2);
$dataCommand = substr($data,4,4);
$dataLen = substr($data,8,2);
$dataVal = substr($data,10,(int)$dataLen*2);
// Heating to Controller
if ($dataCommand=='0503' and substr($data,10,2)=='01') {
storeData('Data.Heating-Controller.HeatingCircuit Temperature', decodeDATA1c($data,10), $rootId, 20, HEATING_DT_DEGREE);
storeData('Data.Heating-Controller.ReturnCircuit Temperature', decodeChar($data,11), $rootId, 30, HEATING_DT_DEGREE);
storeData('Data.Heating-Controller.WaterCircuit Temperature', decodeChar($data,12), $rootId, 40, HEATING_DT_DEGREE);
storeData('Data.Heating-Controller.Outdoor Temperature', decodeSignedChar($data,13), $rootId, 50, HEATING_DT_DEGREE);
// Controller to Heating
} else if ($dataCommand=='0507') {
storeData('Data.Controller-Heating.Heating Command', decodeData0507M6($data,6), $rootId, 10, HEATING_DT_STRING);
storeData('Data.Controller-Heating.Consumer Command', decodeData0507M7($data,7), $rootId, 20, HEATING_DT_STRING);
storeData('Data.Controller-Heating.HeatingCircuit Target Temperature', decodeDATA2c($data, 8), $rootId, 30, HEATING_DT_DEGREE);
storeData('Data.Controller-Heating.HeatingCircuit Target Pressuer', decodeDATA2b($data,10), $rootId, 40, HEATING_DT_PRESSURE);
storeData('Data.Controller-Heating.Water Target Temperature', decodeDATA1c($data,13), $rootId, 50, HEATING_DT_DEGREE);
// System
} else if ($dataCommand=='0700') {
storeData('Data.System.Outdoor Temperature', decodeDATA2b($data,6), $rootId, 10, HEATING_DT_DEGREE);
// Identification
} else if ($dataCommand=='0704') {
// Controller to Controller
} else if ($dataCommand=='0800') {
storeData('Data.Controller-Controller.HeatingCircuit Target Temperature', decodeDATA2b($data, 6), $rootId, 10, HEATING_DT_DEGREE);
storeData('Data.Controller-Controller.Outdoor Temperature', decodeDATA2b($data, 8), $rootId, 20, HEATING_DT_DEGREE);
storeData('Data.Controller-Controller.Water Target Temperature', decodeDATA2b($data,12), $rootId, 30, HEATING_DT_DEGREE);
} else {
IPSLogger_Inf(__file__, 'Unknown Command: '.$dataCommand.', Data='.$data);
}
}
if ($IPS_SENDER == 'Execute') {
// Testing ...
echo decodeSignedChar('0F',1);
}
// ----------------------------------------------------------------------------------------------------------------
function decodeSignedChar ($hexData, $byte) {
$data = substr(hexToStr($hexData), $byte-1,1);
if (ord($data)== 0x80) { //Ersatzwert
$result = false;
} else if ((ord($data) & 0x80) == 0x80) { //Negativ
$result = - ((~ ord($data)) & 0x000000ff);
} else {
$result = ord($data);
}
return $result;
}
// ----------------------------------------------------------------------------------------------------------------
function decodeChar ($hexData, $byte) {
$data = substr(hexToStr($hexData), $byte-1,1);
if (ord($data)== 0xFF) { //Ersatzwert
$result = false;
} else {
$result = ord($data);
}
return $result;
}
// ----------------------------------------------------------------------------------------------------------------
function decodeByte ($hexData, $byte) {
return decodeChar($hexData, $byte);
}
// ----------------------------------------------------------------------------------------------------------------
function decodeData2b ($hexData, $byte) { //data[0] = high, data[1]=low
$data = hexToStr($hexData);
$lowByte = substr($data, $byte-1,1);
$highByte = substr($data, $byte,1);
if (ord($highByte) == 0x80) { //Ersatzwert
$result = false;
} else if ((ord($highByte) & 0x80) == 0x80) { //high byte muss 0x80 sein
$result = - (((~ ord($highByte)) & 0x000000ff) + ((((~ ord($lowByte)) & 0x000000ff) + 1) / 256));
} else {
$result = (ord($highByte))+ (ord($lowByte)/256) ; // High Byte plus (Low Byte / 256)
}
return $result;
}
// ----------------------------------------------------------------------------------------------------------------
function decodeData1c ($hexData, $byte) {
$data = substr($hexData, $byte*2-2,2);
$value = ord(hexToStr($data))/2;
return $value;
}
// ----------------------------------------------------------------------------------------------------------------
function decodeData2c ($hexData, $byte) {
$data = hexToStr($hexData);
$lowByte = substr($data, $byte-1,1);
$highByte = substr($data, $byte,1);
if ((ord($data[0]) & 0x80) == 0x80) {
$result = - ((((~ ord($highByte)) & 0x000000ff) * 16) + (((~ ord($lowByte)) & 0x000000f0) >> 4) + ((((~ ord($lowByte)) & 0x0000000f) + 1) / 16));
} else {
$result = (ord($highByte) * 16) + ((ord($lowByte) & 0xf0) >> 4) + ((ord($lowByte) & 0x0f) / 16);
}
return $result;
}
// ----------------------------------------------------------------------------------------------------------------
function decodeData0507M6($hexData, $byte) {
$data = substr($hexData, $byte*2-2,2);
switch ($data) {
case '00': $msg = 'Brenner ausschalten'; break;
case '01': $msg = 'Keine Aktion'; break;
case '55': $msg = 'Brauchwasserbereitung'; break;
case 'AA': $msg = 'Heizbetrieb'; break;
case 'CC': $msg = 'Emissionskontrolle'; break;
case 'DD': $msg = 'TÜV-Funktion'; break;
case 'EE': $msg = 'Reglerstop-Funktion'; break;
case '66': $msg = 'Brauchwasserbereitung bei Reglerstop'; break;
case 'BB': $msg = 'Brauchwasserbereitung bei Heizbetrieb'; break;
case '44': $msg = 'Reglerstop-Funktion stufiger Betrieb'; break;
default : $msg='-';
}
return $msg;
}
// ----------------------------------------------------------------------------------------------------------------
function decodeData0507M7($hexData, $byte) {
$data = substr($hexData, $byte*2-2,2);
switch ($data) {
case '00': $msg = 'Keine Aktion'; break;
case '01': $msg = 'Ausschalten Kesselpumpe'; break;
case '02': $msg = 'Einschalten Kesselpumpe'; break;
case '03': $msg = 'Ausschalten variabler Verbraucher'; break;
case '04': $msg = 'Einschalten variabler Verbraucher'; break;
default : $msg='-';
}
return $msg;
}
// ----------------------------------------------------------------------------------------------------------------
function storeData($path, $value, $rootId, $order, $dataType) {
if ($value===false) {
return; // Ersatzwert ...
}
$variableId = storeDataGetId($path, $rootId, $order, $dataType);
switch ($dataType) {
case HEATING_DT_DEGREE:
case HEATING_DT_PERCENT:
case HEATING_DT_PRESSURE:
if (GetValue($variableId)<>$value) {
SetValueFloat($variableId, $value);
}
break;
default:
if (GetValue($variableId)<>$value) {
SetValue($variableId, $value);
}
}
}
// ----------------------------------------------------------------------------------------------------------------
function storeDataGetId($path, $rootId, $order, $dataType) {
$pathList = explode('.',$path);
$parentId = $rootId;
foreach ($pathList as $idx=>$pathItem) {
if ($idx == count($pathList)-1) {
$variableId = @IPS_GetVariableIDByName($pathItem, $parentId);
if ($variableId === false) {
$variableId = storeDataCreateVariable($pathItem, $parentId, $order, $dataType);
}
} else {
$categoryId = @IPS_GetCategoryIDByName($pathItem, $parentId);
if ($categoryId === false) {
$categoryId = IPS_CreateCategory();
IPS_SetName($categoryId, $pathItem);
IPS_SetParent($categoryId, $parentId);
}
$parentId = $categoryId;
}
}
return $variableId;
}
// ----------------------------------------------------------------------------------------------------------------
function storeDataCreateVariable($name, $parentId, $order, $dataType) {
switch ($dataType) {
case HEATING_DT_STRING:
$variableId = IPS_CreateVariable(3);
break;
case HEATING_DT_DEGREE:
case HEATING_DT_PRESSURE:
case HEATING_DT_PERCENT:
$variableId = IPS_CreateVariable(2);
storeDataCreateProfile($dataType);
break;
default:
IPSLogger_Err(__file__, 'Unknown Datatype '.$dataType);
}
IPS_SetName($variableId, $name);
IPS_SetParent($variableId, $parentId);
IPS_SetPosition($variableId, $order);
IPS_SetVariableCustomProfile($variableId, $dataType);
return $variableId;
}
// ----------------------------------------------------------------------------------------------------------------
function storeDataCreateProfile($dataType) {
switch ($dataType) {
case HEATING_DT_DEGREE:
@IPS_CreateVariableProfile($dataType, 1);
IPS_SetVariableProfileText($dataType, null, ' °C');
IPS_SetVariableProfileIcon($dataType, 'Temperature');
break;
case HEATING_DT_PRESSURE:
@IPS_CreateVariableProfile($dataType, 1);
IPS_SetVariableProfileText($dataType, null, ' bar');
break;
case HEATING_DT_PERCENT:
@IPS_CreateVariableProfile($dataType, 1);
IPS_SetVariableProfileText($dataType, null, ' %');
break;
default:
}
}
// ----------------------------------------------------------------------------------------------------------------
function strToHex ($str) {
$result = '';
for ($i = 0; $i < strlen($str); $i++)
{
$result .= strtoupper(((strlen(dechex(ord($str[$i]))) < 2) ? '0' : '').dechex(ord($str[$i])));
}
return $result;
}
// ----------------------------------------------------------------------------------------------------------------
function hexToStr($hex) {
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2)
{
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
?>