Hallo,
nachdem ich meine Heizungsansteuerung erfolgreich in Betrieb genommen habe, möchte ich euch gern meine Scripte zur Verfügung stellen.
Ursprünglich hatte ich die Abfrage der Telnetschnittstelle der vcontrold mit einem Stack gelöst (s. auch hier), da man die Antwort ja irgendwie zu einer Abfrage zuordnen muss.
Die Idee von PumpkinEater mit der Erweiterung der Rückgabe um den aufrufenden Befehl hat mich aber mehr überzeugt. Deshalb habe ich alle Scripte daraufhin noch einmal angepasst.
Es gibt jetzt einen zentralen Script VitoCommandHelper:
Der Script ist zuständig, damit nur an einer Stelle eine Liste der Variablen, Commands und Var_Typen geführt werden muss.
<?
//der Helper ordnet die Variablen zu den vcontrold commands und Variablentypen
function getVarListArray()
{
return array(
#command,Var_ID,Var_Type,autoload
#################################
array("getTempATiefpass" , 49087 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\TempAussen]*/,"float",1)
, array("getStatusSLP" , 31558 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Speicherladepumpe]*/,"bool",0)
, array("getBrennerstarts" , 57653 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Brennerstarts]*/,"integer",1)
, array("getStundenBrenner" , 18311 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Brennerstunden]*/,"float",1)
, array("getTempWW1Tiefpass" , 37274 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\TempSpeicherLadeSensor]*/,"float",1)
, array("getTempWW2Tiefpass" , 13778 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\TempAuslauf]*/,"float",1)
, array("getTempKist" , 59236 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\TempKollektor]*/,"float",1)
, array("getSammelStoerung" , 41449 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\Sammelstoerung]*/,"E_ST",1)
, array("getStatusHKP_M2" , 11984 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\HeizkreisPumpeM2]*/,"E_ST",1)
);
}
//echo getCommandforVariable(getVariableFromCommand("getStatusHKP_M2"));
function getVariableFromCommand($command)
{
$zuordnung=getVarListArray();
$Var_ID=0;
foreach ($zuordnung as &$zeile)
{
if($zeile[0]==$command) $Var_ID=$zeile[1];
}
return $Var_ID;
}
function getVariableTypeFromCommand($command)
{
$zuordnung=getVarListArray();
$Var_Type=0;
foreach ($zuordnung as &$zeile)
{
if($zeile[0]==$command) $Var_Type=$zeile[2];
}
return $Var_Type;
}
function getCommandforVariable($var_ID)
{
$zuordnung=getVarListArray();
$command=0;
foreach ($zuordnung as &$zeile)
{
if($zeile[1]==$var_ID) $command=$zeile[0];
}
return $command;
}
?>
Dann gibt es einen Script (readAllVariablesTrigger), welcher die Anfragen startet, er ließt aus dem Helper die Liste der Datenbefehle und schickt sie zum vcontrold:
<?
define ("ID_RaspiVito_SOCKET", 40978 /*[Raspi_Vito]*/);
//den VitoCommandoHelper einbinden
include(IPS_GetScript(54897 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\receiveDataViessmann\VitoCommandHelper]*/)['ScriptFile']);
//jeden Eintrag durchgehen
$zuordnung=getVarListArray();
foreach ($zuordnung as &$zeile)
{
if($zeile[3]==1)//autoload==1
{
sendVitoCommand($zeile[0]);
IPS_Sleep(3000);
}
}
function sendVitoCommand($command)
{
CSCK_SendText(ID_RaspiVito_SOCKET, $command.CHR(13).CHR(10));
}
?>
Und zu guter Letzt der Empfangsscript (receiveDataScript), welcher natürlich an die Registervariable angeknüpft ist und die empfangenen Daten verarbeitet. Es ist im Übrigen nicht nötig einen Cutter zwischenzuschalten. Die nicht verarbeitbaren Antworten, werden einfach ignoriert.
<?
function L($text) //kleine LOGFunktion im Meldungsfenster
{
IPS_LogMessage("receiveDataScript",$text);
}
include(IPS_GetScript(54897 /*[01_Haus\Erdgeschoss\Hauswirtschaftsraum\Heizung\receiveDataViessmann\VitoCommandHelper]*/)['ScriptFile']);
L($_IPS['VALUE']);
//1. Befehl ermitteln und abtrennen
$tmp=explode("|",$_IPS['VALUE']); //z.B.: "getTempATiefpass|9.900000 Grad Celsius"
$command=$tmp[0];
$tmp=$tmp[1];
//L($command);
//2. Wert von Einheit abtrennen (durch Leerzeichen getrennt)
$tmp=explode(" ",$tmp); //z.B.: "9.900000 Grad Celsius"
$val=$tmp[0];
//3. VariablenID aus Helper ermitteln
$varID=getVariableFromCommand($command);
//4. VariablenTyp aus Helper ermitteln
$varType=getVariableTypeFromCommand($command);
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));
break;
default: //falls nix sinnvolles mitgeliefert wurde
}
}
?>
Zum Schluss nur noch die ID’s der Scripte und Variablen eintragen und los geht`s.
Viele Grüße
tommes