Hi,
jetzt konkret:
Die Variablenstruktur
Der Ablauf ist folgender:
Es wird eine anfrage an den Telnetserver gesendet, da die Antwort zeitverzögert kommt und nicht unbedingt einfach zur Anfrage zugeordnet werden kann, speichere ich mir die Anfrage in eine Hilfsvariable (Stack) (s.Script)
<?
define ("c_ID_STACK",17602 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\receiveDataViessmann\befehlsstack]*/);
define ("ID_RaspiVito_SOCKET", 40978 /*[Raspi_Vito]*/);
sendVitoCommand("getTempATiefpass",49087 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung empA]*/,"float");
#sendVitoCommand("getStatusSLP",31558 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Speicherladepumpe]*/,"bool");
sendVitoCommand("getBrennerstarts",57653 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Brennerstarts]*/,"integer");
sendVitoCommand("getStundenBrenner",18311 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Brennerstunden]*/,"float");
sendVitoCommand("getTempWW1Tiefpass",37274 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\TempSpeicherLadeSensor]*/,"float");
sendVitoCommand("getTempWW2Tiefpass",13778 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\TempAuslauf]*/,"float");
sendVitoCommand("getTempKist",59236 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\TempKollektor]*/,"float");
sendVitoCommand("getSammelStoerung",41449 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Sammelstoerung]*/,"E_ST");
sendVitoCommand("getStatusHKP_M2",11984 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\HeizkreisPumpeM2]*/,"E_ST");
#sendVitoCommand("",,"float");
#sendVitoCommand("",,"float");
#sendVitoCommand("",,"float");
function sendVitoCommand($command,$destvarID,$valuetype)
{
/*
speichert in den Stack die Zielvariable und deren Typ ['bool'|'float']
und sendet das Vitocommand
Damit kann die Antwort des vcontrold wieder zugeordnet werden
*/
SetValueString(c_ID_STACK,$destvarID.",".$valuetype);
CSCK_SendText(ID_RaspiVito_SOCKET, $command.CHR(13).CHR(10));
IPS_Sleep(3000);
}
?>
Anschließend muss die Antwort des Gerätes nur noch ausgewertet werden. Dazu habe ich am Clientsocket eine Registervariable „receiveDataViessmann“ angedockt, die den Script „receiveDataScript“ startet:
<?
define ("c_ID_STACK",17602 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\receiveDataViessmann\befehlsstack]*/);
/*
ermittelt aus Stack, welche Variable gesetzt werden soll und
schreibt ergebnis in diese ID
*/
echo $_IPS['VALUE'];
$tmp=explode(',',GetValueString(c_ID_STACK));
$varID=$tmp[0];
$varType=$tmp[1];
$val=explode(" ",$_IPS['VALUE'])[0];
echo ":".$val;
switch($val)
{
case "vctrld>":
break;
default:
switch($varType)
{
case "float":
SetValueFloat($varID,$val);
break;
case "bool":
SetValueBoolean($varID,$val);
break;
case "integer":
SetValueInteger($varID,$val);
break;
case "E_ST": //enum VitocontrolD (AUS|EIN)
SetValueBoolean($varID,($val == "EIN" ? true : false));
}
}
?>
Zugegeben es ist noch nicht in dem Stadium wo ich es haben will, aber mittlerweile läuft es seit 2 Wochen störungsfrei.
(Die gerade Linie gestern ist nur ein Ergebnis einer (gewollten) mehrstündigen Abschaltung von IPSymcon (SDKartenbackup mit Fahrradausflug:-)
edit:
Übrigens sieht man auf dem Screenshot einen Bug im Graph: Bei „CON“ wird das aktuelle Datum plus Intervall als Text oben links dargestellt („26.9.-2.10.“), der Graph jedoch zeigt korrekt Daten vom 19.9.-26.9.
Viele Grüße
tommes