Ja, hatte das Problem schon immer…
Muss ehrlich sagen, habe mich noch gar nie mit der pack() Funktion beschäftigt, aber da alles so reibungslos funktioniert hatte ich nicht das Bedürfnis.
Habe aber das Script noch ein wenig abgeändert.
Folgende Änderungen sind eingeflossen
-
Es wird ein Dummymodul erstellt und die Variablen werden darin platziert.
-
Das Dummymodul und die Variablen lassen sich nun umbenennen
-
Viele überflüssigen Einträge entfernt und nicht benötigte Variablen ausgefiltert
<?php
// includes
include "29151.ips.php";
include "48554.ips.php";
// Dummy Modul anlegen als Heimat der Messdaten im selben Pfad wie das Script
$parentobject = IPS_GetObject($_IPS['SELF']);
$parentID = $parentobject['ParentID'];
// Überprüfen, ob das Dummy-Modul bereits existiert
$dummyModuleIdent = 'MyDummyModule';
$dummyModuleID = @IPS_GetObjectIDByIdent($dummyModuleIdent, $parentID);
if ($dummyModuleID === false) {
// Dummy-Modul erstellen
$dummyModuleID = IPS_CreateInstance('{485D0419-BE97-4548-AA9C-C083EB82E61E}'); // Dummy-Modul ID
IPS_SetParent($dummyModuleID, $parentID); // Setzen Sie das übergeordnete Objekt auf das übergeordnete Objekt des Scripts
IPS_SetName($dummyModuleID, 'Wärmepumpe');
IPS_SetIdent($dummyModuleID, $dummyModuleIdent);
IPS_SetInfo($dummyModuleID, 'This is a dummy module for storing data.');
IPS_ApplyChanges($dummyModuleID);
}
// Variablen
$sBuff = 0;
$time1 = time();
$filename = "test.tst";
$JavaWerte = 0;
$refreshtime = 5; // Sekunden
// Connecten
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
$connect = socket_connect($socket, $IpWwc, $WwcJavaPort);
if (!$connect) {
$error_code = socket_last_error();
exit("Socket connect failed with error code: $error_code\n");
}
// Daten holen
$msg = pack('N*',3004);
//printf('msg:%s <br>',$msg);
$send=socket_write($socket, $msg, 4); //3004 senden
//printf('Bytes send:%d <br>',$send);
$msg = pack('N*',0);
//printf('msg:%s <br>',ord($msg));
$send=socket_write($socket, $msg, 4); //0 senden
//printf('Bytes send:%d <br>',$send);
socket_recv($socket,$Test,4,MSG_WAITALL); // Lesen, sollte 3004 zurückkommen
$Test = unpack('N*',$Test);
//printf('read:%s <br>',implode($Test));
socket_recv($socket,$Test,4,MSG_WAITALL); // Status
$Test = unpack('N*',$Test);
//printf('Status:%s <br>',implode($Test));
socket_recv($socket,$Test,4,MSG_WAITALL); // Länge der nachfolgenden Werte
$Test = unpack('N*',$Test);
//printf('Länge der nachfolgenden Werte:%s <br>',implode($Test));
$JavaWerte = implode($Test);
//printf('============================================================== <br>');
for ($i = 0; $i < $JavaWerte; ++$i)//vorwärts
{
socket_recv($socket,$InBuff[$i],4,MSG_WAITALL); // Lesen, sollte 3004 zurückkommen
$daten_raw[$i] = implode(unpack('N*',$InBuff[$i]));
//printf('InBuff(%d): %d <br>',$i,$daten_raw[$i]);
}
//socket wieder schliessen
socket_close($socket);
// Werte anzeigen
for ($i = 0; $i < $JavaWerte; ++$i)//vorwärts
{
if ($i >= 10 && $i <= 18) // Temperaturen
{
$minusTest = $daten_raw[$i] * 0.1;
if ($minusTest > 429496000) {
$daten_raw[$i] -= 4294967296;
$daten_raw[$i] *= 0.1;
} else {
$daten_raw[$i] *= 0.1;
}
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValueFloat($varid, $daten_raw[$i]);
}
/* Wird aktuell nicht ausgewertet
if ($i == 56) // Zähler
{
($daten_raw[$i] = $daten_raw[$i]/3600);
//printf('(%d)%s : %.2f h<br>',$i,$java_dataset[$i],$daten_raw[$i]);
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValue($varid,$daten_raw[$i]);
}
if ($i == 57) // Zähler
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValue($varid,$daten_raw[$i]);
}
if ($i == 58) // Zähler
{
($daten_raw[$i] = $daten_raw[$i]/3600);
//printf('(%d)%s : %.2f h<br>',$i,$java_dataset[$i],$daten_raw[$i]);
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValue($varid,$daten_raw[$i]);
}
if ($i == 59) // Zähler
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValue($varid,$daten_raw[$i]);
}
if ($i >= 60 & $i <= 66) // Zähler
{
($daten_raw[$i] = $daten_raw[$i]/3600);
//printf('(%d)%s : %d h<br>',$i,$java_dataset[$i],$daten_raw[$i]);
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValue($varid,$daten_raw[$i]);
}
*/
if ($i == 67) // WP läuft seit
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
$time = $daten_raw[$i]; // time duration in seconds
$hours = floor($time / (60 * 60));
$time -= $hours * (60 * 60);
$minutes = floor($time / 60);
$time -= $minutes * 60;
$WPseit = "{$hours}h {$minutes}m";
SetValue($varid,$WPseit);
}
if ($i == 73) // WP steht seit
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
$time = $daten_raw[$i]; // time duration in seconds
$days = floor($time / (60 * 60 * 24));
$time -= $days * (60 * 60 * 24);
$hours = floor($time / (60 * 60));
$time -= $hours * (60 * 60);
$minutes = floor($time / 60);
$time -= $minutes * 60;
$seconds = floor($time);
$time -= $seconds;
$WPseit = "{$days}d {$hours}h {$minutes}m";
SetValue($varid,$WPseit);
}
/* Wird aktuell nicht ausgewertet
if ($i >= 95 & $i <= 99) // Errors
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
$FehlerDatum = date("d.m.y",$daten_raw[$i]);
setValueString($varid,$FehlerDatum);
}
if ($i >= 100 & $i <= 105) // Errors
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
setValueString($varid,$daten_raw[$i]);
}
*/
if ($i == 141) // Abtauen in ...
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
$time = $daten_raw[$i]; // time duration in seconds
$hours = floor($time / (60 * 60));
$time -= $hours * (60 * 60);
$minutes = floor($time / 60);
$time -= $minutes * 60;
$WPseit = "{$hours}h {$minutes}m";
SetValue($varid,$WPseit);
}
if ($i == 154) // Wärmemenge seit Reset
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValue($varid,$daten_raw[$i] / 10);
}
if ($i == 173) // Durchfluss
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValue($varid,$daten_raw[$i]);
}
if ($i == 184) // Ventilatordrehzahl
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValue($varid,$daten_raw[$i]);
}
if ($i == 257) // Leistung
{
($daten_raw[$i] = $daten_raw[$i]/1000);
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
$daten_raw[$i] = sprintf("%5.2f", $daten_raw[$i]);
setValue($varid,$daten_raw[$i]);
}
if ($i == 231) // Verdichterdrehzahl
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 2, 'WP_'.$java_dataset[$i], "", $i);//float
setValue($varid,$daten_raw[$i]);
}
if ($i == 80) // Betriebszustand
{
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 1, 'WP_'.$java_dataset[$i], "", $i);//integer
SetValue($varid,$daten_raw[$i]);
}
/* Wird aktuell nicht ausgewertet
if ($i == 80) // Betriebszustand
{
switch ($daten_raw[$i]) {
case 0:
$status = "Heizen";
break;
case 1:
$status = "Warmwasser";
break;
case 2:
$status = "Schwimmbad / Photovoltaik";
break;
case 3:
$status = "EVU-Sperre";
break;
case 4:
$status = "Abtauen";
break;
case 5:
$status = "Keine Anforderung";
break;
case 6:
$status = "Heizen ext. Energiequelle";
break;
case 7:
$status = "Kühlbetrieb";
break;
}
$varid = CreateVariableByName($dummyModuleID, $java_dataset[$i], 3, 'WP_'.$java_dataset[$i], "", $i);//integer
setValueString($varid,$status);
}
*/
}
// Funktion zur Erstellung von Variablen nach Name
function CreateVariableByName($dummyModuleID, $name, $type, $ident, $profile, $position) {
$vid = @IPS_GetObjectIDByIdent($ident, $dummyModuleID);
if ($vid === false) {
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $dummyModuleID); // Setzen Sie das Dummy-Modul als Eltern-Objekt
IPS_SetName($vid, $name);
IPS_SetIdent($vid, $ident);
IPS_SetInfo($vid, "");
IPS_SetPosition($vid, $position);
if ($profile !== "") {
IPS_SetVariableCustomProfile($vid, $profile);
}
}
return $vid;
}