Update:
Ich habe das Script noch ein wenig angepasst, die Variablen für Wirkenergie und Leistung müssen jetzt nicht mehr von Hand angelegt werden, sondern es reicht das Script einmal von Hand zu starten. (Trotzdem musst du noch ComPort/Cutter und Register Variable anlegen und verknüpfen)
Achtung ! Bitte packe das Script jwls. in eine eigene Kategorie pro Zähler und lass es dann erst einmal von Hand laufen.
Und natürlich nicht die Namen der Variablen in IPS ändern, sonst werden die nicht mehr gefunden. Du könntest höchsten das Script anpassen.
<?
//manuell starten = prüfen ob Variablen vorhanden und ggf anlegen !
//wenn die Variablen vorhanden sind wird direkt das richtige Profil draufgelegt!
$name_Wirkenergie="Wirkenergie";
$name_Wirkenergie_T1="Wirkenergie - Tarif 1";
$name_Wirkenergie_T2="Wirkenergie - Tarif 2";
$name_Wirkleistung="Wirkleistung";
if($_IPS['SENDER'] == "Execute")
{
$parent=IPS_GetParent($_IPS['SELF']);
$variableid = @IPS_GetVariableIDByName($name_Wirkenergie, $parent);
if($variableid === false)
{
$variableid = IPS_CreateVariable(2);
IPS_SetName($variableid, $name_Wirkenergie);
IPS_SetParent($variableid, $parent);
IPS_SetVariableCustomProfile($variableid, "~Electricity");
}
else
{
IPS_SetVariableCustomProfile($variableid, "~Electricity");
}
$variableid = @IPS_GetVariableIDByName($name_Wirkenergie_T1, $parent);
if($variableid === false)
{
$variableid = IPS_CreateVariable(2);
IPS_SetName($variableid, $name_Wirkenergie_T1);
IPS_SetParent($variableid, $parent);
IPS_SetVariableCustomProfile($variableid, "~Electricity");
}
else
{
IPS_SetVariableCustomProfile($variableid, "~Electricity");
}
$variableid = @IPS_GetVariableIDByName($name_Wirkenergie_T2, $parent);
if($variableid === false)
{
$variableid = IPS_CreateVariable(2);
IPS_SetName($variableid, $name_Wirkenergie_T2);
IPS_SetParent($variableid, $parent);
IPS_SetVariableCustomProfile($variableid, "~Electricity");
}
else
{
IPS_SetVariableCustomProfile($variableid, "~Electricity");
}
$variableid = @IPS_GetVariableIDByName($name_Wirkleistung, $parent);
if($variableid === false)
{
$variableid = IPS_CreateVariable(2);
IPS_SetName($variableid, $name_Wirkleistung);
IPS_SetParent($variableid, $parent);
IPS_SetVariableCustomProfile($variableid, "~Watt.3680");
}
else
{
IPS_SetVariableCustomProfile($variableid, "~Watt.3680");
}
}//Ende manueller Start
//Auswertung, start über Regvar
if($_IPS['SENDER'] == "RegisterVariable")
{
$data=str_replace(" ","",ascii2hex($IPS_VALUE));
$parent=IPS_GetParent($_IPS['SELF']);
//Variablen IDs
$id_wirkenergie_ges = @IPS_GetVariableIDByName($name_Wirkenergie, $parent) /*[Keller\Stromzähler neu test (Script von mir)\Wirkenergie]*/;
$id_wirkenergie_t1 = @IPS_GetVariableIDByName($name_Wirkenergie_T1, $parent) /*[Keller\Stromzähler neu test (Script von mir)\Wirkenergie - Tarif 1]*/;
$id_wirkenergie_t2 = @IPS_GetVariableIDByName($name_Wirkenergie_T2, $parent) /*[Keller\Stromzähler neu test (Script von mir)\Wirkenergie - Tarif 2]*/;
$id_wirkleistung_ges = @IPS_GetVariableIDByName($name_Wirkleistung, $parent) /*[Keller\Stromzähler neu test (Script von mir)\Wirkleistung]*/;
//folgende aktuell bei mir nicht vorhanden
// $id_wirkleistung_l1 = 1234 ;
// $id_wirkleistung_l2 = 1234 ;
// $id_wirkleistung_l3 = 1234 ;
// $id_wirkleistung_einspeisung = 1234 ;
$pakete=ehz77er($data);
for($i = 1; $i < count($pakete); ++$i)
{
//Check ob Inhalt 2tes Array [1] die Wirkenergie Gesamt ist (MT681 - bunnymc - 0100010800FF objName 1-0:1.8.0*255)
if ($pakete[$i][1] == "0100010800FF")
{
//Einheit auswerten Array 4, könnte gemacht werden aber eigentlich nicht nötig 1E = Wh
//Scaler Auswerten (00 = Kein Scaler, FF = /10, FE = /100 und mit richtigem Scaler Werte schreiben
//Da es sich um Watt Stunden handelt habe ich die Berechnung auf kWh angepasst
if ($pakete[$i][5]=="00")
{
SetValue($id_wirkenergie_ges,hexdec($pakete[$i][6]));
}
elseif ($pakete[$i][5]=="FF")
{
SetValue($id_wirkenergie_ges,(hexdec($pakete[$i][6])/10000));
}
elseif ($pakete[$i][5]=="FE")
{
SetValue($id_wirkenergie_ges,(hexdec($pakete[$i][6])/100000));
}
}
//Check ob Inhalt 2tes Array [1] die Wirkenergie Tarif 1 ist (MT681 - fussi24&bunnymc - 0100010801FF objName 1-0:1.8.1*255)
elseif ($pakete[$i][1] == "0100010801FF")
{
//Wie Wirkenergie Gesamt
if ($pakete[$i][5]=="00")
{
SetValue($id_wirkenergie_t1,hexdec($pakete[$i][6]));
}
elseif ($pakete[$i][5]=="FF")
{
SetValue($id_wirkenergie_t1,(hexdec($pakete[$i][6])/10000));
}
elseif ($pakete[$i][5]=="FE")
{
SetValue($id_wirkenergie_t1,(hexdec($pakete[$i][6])/100000));
}
}
//Check ob Inhalt 2tes Array [1] die Wirkenergie Tarif 2 ist (MT681 - bunnymc - 0100010802FF objName 1-0:1.8.2*255)
elseif ($pakete[$i][1] == "0100010802FF")
{
//Wie Wirkenergie Gesamt
if ($pakete[$i][5]=="00")
{
SetValue($id_wirkenergie_t2,hexdec($pakete[$i][6]));
}
elseif ($pakete[$i][5]=="FF")
{
SetValue($id_wirkenergie_t2,(hexdec($pakete[$i][6])/10000));
}
elseif ($pakete[$i][5]=="FE")
{
SetValue($id_wirkenergie_t2,(hexdec($pakete[$i][6])/100000));
}
}
//Check ob Inhalt 2tes Array [1] die Wirkleistung Gesamt ist /MT681 - bunnymc - 0100100700FF objName 1-0:16.7.0*255)
elseif ($pakete[$i][1] == "0100100700FF")
{
//Einheit auswerten Array 4, könnte gemacht werden aber eigentlich nicht nötig 1E = Wh
//Scaler Auswerten (00 = Kein Scaler, FF = /10, FE = /100 und mit richtigem Scaler Werte schreiben
if ($pakete[$i][5]=="00")
{
SetValue($id_wirkleistung_ges,hexdec($pakete[$i][6]));
}
elseif ($pakete[$i][5]=="FF")
{
SetValue($id_wirkleistung_ges,(hexdec($pakete[$i][6])/10));
}
elseif ($pakete[$i][5]=="FE")
{
SetValue($id_wirkleistung_ges,(hexdec($pakete[$i][6])/100));
}
}
//ACHTUNG folgende Funktion wird AUCH in Gesamt geschrieben !!!
//Check ob Inhalt 2tes Array [1] die Wirkleistung Bezug+ ist (MT681 - fussi24 - 0100010700FF objName 1-0:1.7.0*255)
elseif ($pakete[$i][1] == "0100010700FF")
{
//Einheit auswerten Array 4, könnte gemacht werden aber eigentlich nicht nötig 1E = Wh
//Scaler Auswerten (00 = Kein Scaler, FF = /10, FE = /100 und mit richtigem Scaler Werte schreiben
if ($pakete[$i][5]=="00")
{
SetValue($id_wirkleistung_ges,hexdec($pakete[$i][6]));
}
elseif ($pakete[$i][5]=="FF")
{
SetValue($id_wirkleistung_ges,(hexdec($pakete[$i][6])/10));
}
elseif ($pakete[$i][5]=="FE")
{
SetValue($id_wirkleistung_ges,(hexdec($pakete[$i][6])/100));
}
}
//toDO Check ob Inhalt 2tes Array [1] die Wirkleistung Einspeisung- ist
//toDO Check ob Inhalt 2tes Array [1] die Wirkleistung L1- ist
//toDO Check ob Inhalt 2tes Array [1] die Wirkleistung L2- ist
//toDO Check ob Inhalt 2tes Array [1] die Wirkleistung L3- ist
}
} //Ende RegVar aufruf
////// Funktion für die Errechnung
function ehz77er($sml)
{ $sml1=substr($sml, strpos($sml, "77078181C78203FF")); //Schneidet ALLES vor der Herstelleridentifikationsorbiskennzahl ab (objName 129-129:199.130.3*255)
$daten=explode(chr(0x37).chr(0x37), $sml1); //bei 77er Listen trennen
for($i = 1; $i < count($daten); ++$i)
{
$paket1_len=substr($daten[$i], 1,1); //hiermit bekomme ich die länge des ersten pakets in byte (also immer 2er Pärchen)
if ($paket1_len!=1) //Wenn die angegebene länge nicht nur 1 Byte(leere Pakete) ist, dann die Daten rausholen
{
$paket[$i][1]=substr($daten[$i],2,(($paket1_len*2)-2)); //der Inhalt des Pakets wird anhand der Länge herausgefiltert (das erste byte wird abegschnitten), x2 bei 1 Byte 2 Zeichen hat in HEX)
}
else
{
$paket[$i][1]="00";
}
$paket2_len=substr($daten[$i], (($paket1_len*2)+1),1); //hiermit bekomme ich die länge des zweiten pakets in byte, abhängig von der Länge des ersten Pakets
if ($paket2_len!=1)
{
$paket[$i][2]=substr($daten[$i],(($paket1_len)+2),(($paket2_len*2)-2)); //Wie oben, nur ab hier alles abhängig von den vorherigen längen
}
else
{
$paket[$i][2]="00";
}
$paket3_len=substr($daten[$i], ((($paket1_len+$paket2_len)*2)+1),1);
if ($paket3_len!=1)
{
$paket[$i][3]=substr($daten[$i],((($paket1_len+$paket2_len)*2)+2),(($paket3_len*2)-2));
}
else
{
$paket[$i][3]="00";
}
$paket4_len=substr($daten[$i], ((($paket1_len+$paket2_len+$paket3_len)*2)+1),1);
if ($paket4_len!=1)
{
$paket[$i][4]=substr($daten[$i],((($paket1_len+$paket2_len+$paket3_len)*2)+2),(($paket4_len*2)-2));
}
else
{
$paket[$i][4]="00";
}
$paket5_len=substr($daten[$i], ((($paket1_len+$paket2_len+$paket3_len+$paket4_len)*2)+1),1);
if ($paket5_len!=1)
{
$paket[$i][5]=substr($daten[$i],((($paket1_len+$paket2_len+$paket3_len+$paket4_len)*2)+2),(($paket5_len*2)-2));
}
else
{
$paket[$i][5]="00";
}
$paket6_len=substr($daten[$i], ((($paket1_len+$paket2_len+$paket3_len+$paket4_len+$paket5_len)*2)+1),1);
if ($paket6_len!=1)
{
$paket[$i][6]=substr($daten[$i],((($paket1_len+$paket2_len+$paket3_len+$paket4_len+$paket5_len)*2)+2),(($paket6_len*2)-2));
}
else
{
$paket[$i][6]="00";
}
$paket7_len=substr($daten[$i], ((($paket1_len+$paket2_len+$paket3_len+$paket4_len+$paket5_len+$paket6_len)*2)+1),1);
if ($paket7_len!=1)
{
$paket[$i][7]=substr($daten[$i],((($paket1_len+$paket2_len+$paket3_len+$paket4_len+$paket5_len+$paket6_len)*2)+2),(($paket7_len*2)-2));
}
else
{
$paket[$i][7]="00";
}
}
return $paket;
// Die Funktion ehz77er wertet, wie der Name schon sagt, aller 77er Pakete (Liste mit 7 Einträgen) der SML Transmission aus.
// Diese werden dann als Doppel Array $Paket [PaketNr][PaketInhalt 1-7]
// In jedem der 7 EInträge wird ausschließlich der Wert des Eintrags zurückgeliefert
// Beispiel: 77078181C78203FF010101010649534B524101
// 77 Liste mit 7 Einträgen
// 078181C78203FF objName 129-129:199.130.3*255 Herstelleridentifikation
// (Bsp.:|07 bedeutet 7 Bytes, 81 81 C7 82 03 FF ist der echte Wert)
// 01 status (leer)
// 01 valTime (leer)
// 01 unit (leer)
// 01 scaler (leer)
// 0649534B5241 value
// 01
}
function ascii2hex($ascii) {
$hex = '';
for ($i = 0; $i < strlen($ascii); $i++) {
$byte = strtoupper(dechex(ord($ascii{$i})));
$byte = str_repeat('0', 2 - strlen($byte)).$byte;
$hex.=$byte." ";
}
return $hex;
}
?>
//Update - Script geupdated
Grüße
Rene
Ps. Darf natürlich auch jeder andere verwenden und anpassen, aber BITTE Nachsicht wenn etwas im Code von einem Programmierer anders gelöst worden wäre, ich bin keiner