da mir nach Jahren doch meine Heizungssteuerung "verlassen" hat, und ich da einiges per IP-Symcon auf dem Pi gemacht habe, möchte ich das auch hier, weitergeben.
An Hardware ist nur ein 1wire Bus und Relaisblock direkt am RaspberryPi(2) verbaut, der 1wire Bus ist nur für die Temperaturen der Heizung zuständig, der Relaisblock steuert Brenner, Mischer und Pumpen. Das ganze ist noch umsteckbar auf die alte Steuerung, und bleibt als "Notnagel" erst mal vorhanden.
Für IP-Symcon habe ich ein Install Skript erstellt, welches alles anlegt, nur einige enige Dinge müssen von Hand angepasst (eingerichtet) werden.
Kleine Doku ist als PHP enthalten.
Wer Fehler findet, darf die mir gerne zeigen.
Code: Alles auswählen
';
CreateScriptByName('aktion',$HauptCatId,$skript);
//IPS_SetHidden($ScriptID, true);
IPS_SetVariableCustomAction($a1, $ScriptID);
IPS_SetVariableCustomAction($a2, $ScriptID);
IPS_SetVariableCustomAction($a3, $ScriptID);
IPS_SetVariableCustomAction($a4, $ScriptID);
IPS_SetVariableCustomAction($k2, $ScriptID);
IPS_SetVariableCustomAction($k3, $ScriptID);
IPS_SetVariableCustomAction($k4, $ScriptID);
IPS_SetVariableCustomAction($k5, $ScriptID);
IPS_SetVariableCustomAction($k6, $ScriptID);
IPS_SetVariableCustomAction($k7, $ScriptID);
IPS_SetVariableCustomAction($k8, $ScriptID);
IPS_SetVariableCustomAction($k9, $ScriptID);
IPS_SetVariableCustomAction($m1, $ScriptID);
IPS_SetVariableCustomAction($m2, $ScriptID);
//IPS_SetVariableCustomAction($m3, $ScriptID);
IPS_SetVariableCustomAction($m4, $ScriptID);
IPS_SetVariableCustomAction($m5, $ScriptID);
IPS_SetVariableCustomAction($m6, $ScriptID);
IPS_SetVariableCustomAction($m7, $ScriptID);
IPS_SetVariableCustomAction($m8, $ScriptID);
IPS_SetVariableCustomAction($m9, $ScriptID);
IPS_SetVariableCustomAction($m10, $ScriptID);
IPS_SetVariableCustomAction($s1, $ScriptID);
IPS_SetVariableCustomAction($s2, $ScriptID);
IPS_SetVariableCustomAction($s3, $ScriptID);
IPS_SetVariableCustomAction($s4, $ScriptID);
//------------------------------------------------------------------------------
$skript =' /sys/class/gpio/gpio23/value\');// Mischer Pumpe aus
exec (\'echo "1" > /sys/class/gpio/gpio22/value\');// Brenner aus
exec (\'echo "1" > /sys/class/gpio/gpio24/value\');// Speicher Pumpe aus
exec (\'echo "1" > /sys/class/gpio/gpio17/value\');// Mischer aus
// exec (\'echo "1" > /sys/class/gpio/gpio27/value\');// Mischer auf/zu
}
}
?>';
CreateScriptByName('aktion Hand',$CatID_aussen,$skript);
IPS_SetVariableCustomAction($a1, $ScriptID);
//------------------------------------------------------------------------------
$skript =' /sys/class/gpio/export
echo "in" >/sys/class/gpio/gpio${Port}/direction
chmod 660 /sys/class/gpio/gpio${Port}/direction
chmod 660 /sys/class/gpio/gpio${Port}/value
done
# Output-Ports (LED)
for Port in 17 27 22 23 24
do
echo "$Port" > /sys/class/gpio/export
echo "out" >/sys/class/gpio/gpio${Port}/direction
echo "0" >/sys/class/gpio/gpio${Port}/value
chmod 660 /sys/class/gpio/gpio${Port}/direction
chmod 660 /sys/class/gpio/gpio${Port}/value
done
##############################################################
/etc/rc.local erweitern :
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/opt/gpio/gpio_init.sh
exit 0
#############################################################
/boot/config.txt :
gpu_mem=16
dtoverlay=sdhost
#dtoverlay=w1-gpio
dtoverlay=w1-gpio,gpiopin=4,pullup=on
*/
?>';
CreateScriptByName('doku',$HauptCatId,$skript);
//------------------------------------------------------------------------------
$skript =' $zaehler) {
break;
}
$ds_id[$i]= trim($ds_id[$i]);
$temp = exec(\'cat /sys/bus/w1/devices/\'.$ds_id[$i].\'/w1_slave |grep t=\');
$crc = exec(\'cat /sys/bus/w1/devices/\'.$ds_id[$i].\'/w1_slave | grep crc | sed "s/^.*\(...\)$/\1/"\');
$temp = explode(\'t=\',$temp);
//The power-on reset value of the temperature register is +85°C
if($crc =="YES" and $temp[1] !== "-62" and $temp[1] !== "85000") //Fehler raus, -1.2 °C ,85°C und CRC
{
$temp = $temp[1] / 1000;
$temp = round($temp,2);
$id = CreateVariableByName($id3, $ds_id[$i], 2);
SetValue($id, $temp);
}
}
//------------------------------------------------------------------------------
if($_IPS[\'SENDER\'] == "Variable")
{
if($_IPS[\'VALUE\'])
{
IPS_SetScriptTimer($_IPS[\'SELF\'], 10); // Sekunden-Takt
} else {
IPS_SetScriptTimer($_IPS[\'SELF\'], 0);
}
}
//------------------------------------------------------------------------------
//##############################################################################
function CreateVariableByName($id, $name, $type)
{
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid===false) {
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
}
return $vid;
}
//##############################################################################
function CreateEventIDByName($id, $name, $type)
{
$eid = @IPS_GetEventIDByName($name, $id);
if($eid===false) {
$eid = IPS_CreateEvent($type);
IPS_SetParent($eid, $id);
IPS_SetName($eid, $name);
}
return $eid;
}
?>';
CreateScriptByName('Temperaturen_lesen',$CatID_gpio,$skript);
//------------------------------------------------------------------------------
$skript =' /sys/class/gpio/gpio22/value\');
}
If ($y > $Kessel_faktor )
{
exec (\'echo "0" > /sys/class/gpio/gpio22/value\');
}
}
$x = intval(exec (\'cat /sys/class/gpio/gpio22/value\'));
if ($x == 1){ $x=0;} else { $x=1; }
SetValueBoolean($bernnerID,$x);
?>';
CreateScriptByName('Regler Kessel',$CatID_kessel,$skript);
IPS_SetScriptTimer($ScriptID, 0);
$skript =' /sys/class/gpio/gpio22/value\');}// Brenner aus
if($_IPS["VALUE"] ==1) {exec (\'echo "0" > /sys/class/gpio/gpio22/value\');}// Brenner ein
}
?>';
CreateScriptByName('aktion gpio',$CatID_kessel,$skript);
IPS_SetHidden($ScriptID, true);
$aktion_skript=$ScriptID;
$skript ='';
CreateScriptByName('graph1',$CatID_kessel,$skript);
IPS_SetHidden($ScriptID, true);
$skript ='';
CreateScriptByName('graph2',$CatID_kessel,$skript);
IPS_SetHidden($ScriptID, true);
//------------------------------------------------------------------------------
$skript =' /sys/class/gpio/gpio23/value\'); // Pumpe ein
// $Vorlauftemperatur_Mischer=min(max(round((0.55*$Steilheit*(pow($Raumsollwert,($Aussentemp/(320-$Aussentemp*4))))*((-$Aussentemp+20)*2)+$Raumsollwert+$Korrektur_Mischer)*1)/1,$min_Mischer),$max_Mischer);
$Vorlauftemperatur_Mischer=min(max( ((0.55*$Steilheit*(pow($Raumsollwert,($Aussentemp/(320-$Aussentemp*4))))*((-$Aussentemp+20)*2)+$Raumsollwert+$Korrektur_Mischer)*1)/1,$min_Mischer),$max_Mischer);
SetValueFloat($Soll_Temperatur_MischerID, $Vorlauftemperatur_Mischer);
} else{
// Ausentemp grösserr Raumsollwert
exec (\'echo "1" > /sys/class/gpio/gpio23/value\');// Pumpe aus
SetValueFloat($Soll_Temperatur_MischerID,$min_Mischer);//Wert anpassen !!!!!
}
}
$e = (GetValueFloat($Soll_Temperatur_MischerID)- GetValueFloat($IstTemperaturID));
// Die Berechnung des neuen Regelwertes
//$y = ($Kp * $e + $Ki * $Ta * $esum + $Kd * ($e - $ealt) / $Ta);
$y = $Kp * $e;
$Einschaltzeit=$y;
if ($Hand == 1) { //Hand ist an
$action = \'Hand\';
}
SetValueFloat($VorherigeRegelabweichungID, $y);
$Einschaltzeit=abs($y);
IF ($Einschaltzeit = 14) {
$Einschaltzeit = 14;
}
IPS_SetEventCyclic($EinschaltzeitID, 0, 0, 0, 0, 1 ,$Einschaltzeit);
if (IPS_GetName($_IPS[\'EVENT\'])==\'Einschaltzeit\') {
//Netzrelais aus
if ($Hand == 0) { //Automatik ist an
exec (\'echo "1" > /sys/class/gpio/gpio17/value\');
SetValueInteger($MischerID, 1); //Stop
}
IPS_SetEventActive($EinschaltzeitID,false);
IPS_SetEventActive($WartezeitID,true);
}
if (IPS_GetName($_IPS[\'EVENT\'])==\'Wartezeit\') {
$Soll_VL = GetValue($Soll_Temperatur_MischerID);
$Ist_VL = GetValue($IstTemperaturID);
if ($Hand == 0) { //Automatik ist an
$action = \'Idle\';
if ($Ist_VL ($Soll_VL + $Hysterese) ) $action = \'Zu\';
//if (GetValue(32015 /*[Objekt #32015 existiert nicht]*/) == False) $action = \'Idle\';
Switch ($action){
Case \'Idle\':
break;
Case \'Zu\':
//Richtungsrelais aus
exec (\'echo "1" > /sys/class/gpio/gpio27/value\');
//Netzrelais ein
exec (\'echo "0" > /sys/class/gpio/gpio17/value\');
SetValueInteger($MischerID, 3); //Zu
break;
Case \'Auf\':
//Richtungsrelais ein
exec (\'echo "0" > /sys/class/gpio/gpio27/value\');
//Netzrelais ein
exec (\'echo "0" > /sys/class/gpio/gpio17/value\');
SetValueInteger($MischerID, 0); //Auf
break;
}
}
SetValueString($actionID,$action);
IPS_SetEventActive($EinschaltzeitID,true);
IPS_SetEventActive($WartezeitID,false);
}
$x = intval(exec (\'cat /sys/class/gpio/gpio23/value\'));
if ($x == 1){ $x=0;} else { $x=1; }
SetValueBoolean($PumpeID,$x);
//}
?>';
CreateScriptByName('Regler Mischer',$CatID_Mischer,$skript);
CreateEventIDByName($ScriptID, 'Einschaltzeit', 1);
CreateEventIDByName($ScriptID, 'Wartezeit', 1);
$skript =' /sys/class/gpio/gpio27/value\');
//Netzrelais ein
exec (\'echo "0" > /sys/class/gpio/gpio17/value\');
}
if($_IPS["VALUE"] ==2) { // Mischer zu
//Richtungsrelais aus
exec (\'echo "1" > /sys/class/gpio/gpio27/value\');
//Netzrelais ein
exec (\'echo "0" > /sys/class/gpio/gpio17/value\');
}
if($_IPS["VALUE"] ==1) { // Mischer Stop
//Netzrelais ein
exec (\'echo "1" > /sys/class/gpio/gpio17/value\');
}
}
?>';
CreateScriptByName('aktion gpio Mischer',$CatID_Mischer,$skript);
IPS_SetHidden($ScriptID, true);
$aktion_skript=$ScriptID;
$skript =' /sys/class/gpio/gpio23/value\');}// Pumpe aus
if($_IPS["VALUE"] ==1) {exec (\'echo "0" > /sys/class/gpio/gpio23/value\');}// Pumpe ein
}
?>';
CreateScriptByName('aktion gpio Pumpe',$CatID_Mischer,$skript);
IPS_SetHidden($ScriptID, true);
$aktion_skript=$ScriptID;
$skript ='';
CreateScriptByName('graph',$CatID_Mischer,$skript);
IPS_SetHidden($ScriptID, true);
//------------------------------------------------------------------------------
$skript ='= $Hysterese )
{
SetValue($SpeicheranforderungID, 1);
SetValue($ZustandID, " Speicheranforderung ein");
If ( ($IstTemperaturKessel+3) > $IstTemperaturUnten )
{
exec (\'echo "0" > /sys/class/gpio/gpio24/value\');
SetValue($ZustandID, " Speicheranforderung ein - Pumpe ein");
}
else
{
exec (\'echo "1" > /sys/class/gpio/gpio24/value\');
SetValue($ZustandID, "Kessel zu kalt - Pumpe aus");
}
}
If ($y /sys/class/gpio/gpio24/value\');
SetValue($SpeicheranforderungID, 0);
SetValue($ZustandID, " Speicheranforderung aus - Nachlauf");
}
} //Uhr
if ($Uhr == 0)
{
//Kessel auf sollwert setzen
SetValue($SpeicheranforderungID, 0);
SetValue($ZustandID, " Nachtabsenkung");
}
}
$x = intval(exec (\'cat /sys/class/gpio/gpio24/value\'));
if ($x == 1){ $x=0;} else { $x=1; }
SetValueBoolean($PumpeID,$x);
?>';
CreateScriptByName('Regler Speicher',$CatID_Speicher,$skript);
CreateEventIDByName($ScriptID, 'Speichertimer', 1);
//------------------------------------------------------------------------------
$skript ='= $Nachlauf_soll){
exec (\'echo "1" > /sys/class/gpio/gpio24/value\');
IPS_SetEventCyclic($NachlaufzeitID, 0, 0, 0, 0, 1 ,0);
SetValue($NachlaufIstAltID, $Nachlauf_ist);
SetValue($NachlaufIstID, 0);
SetValue($ZustandID, " Nachlauf Zeit abgelaufen");
}
// if ($Kessel_ist /sys/class/gpio/gpio24/value\');
IPS_SetEventCyclic($NachlaufzeitID, 0, 0, 0, 0, 1 ,0);
SetValue($NachlaufIstAltID, $Nachlauf_ist);
SetValue($NachlaufIstID, 0);
SetValue($ZustandID, " Nachlauf stop, Temperatur");
}
}
$x = intval(exec (\'cat /sys/class/gpio/gpio24/value\'));
if ($x == 1){ $x=0;} else { $x=1; }
SetValueBoolean($PumpeID,$x);
?>';
CreateScriptByName('Nachlauf Pumpe',$CatID_Speicher,$skript);
CreateEventIDByName($ScriptID, 'Nachlaufzeit', 1);
//------------------------------------------------------------------------------
$skript =' /sys/class/gpio/gpio24/value\');}// Pumpe aus
if($_IPS["VALUE"] ==1) {exec (\'echo "0" > /sys/class/gpio/gpio24/value\');}// Pumpe ein
}
?>
';
CreateScriptByName('aktion_gpio',$CatID_Speicher,$skript);
//------------------------------------------------------------------------------
} // KatID vorhanden
else
{
echo "Die Kategorien-ID lautet: ". $KategorieID;
echo " Bitte erst löschen: ". $KategorieID;
}
//##############################################################################
function CreateVariableByName($id, $name, $type)
{
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid===false) {
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
}
return $vid;
}
//##############################################################################
function CreateEventIDByName($id, $name, $type)
{
$eid = @IPS_GetEventIDByName($name, $id);
if($eid===false) {
$eid = IPS_CreateEvent($type);
IPS_SetParent($eid, $id);
IPS_SetName($eid, $name);
}
return $eid;
}
//##############################################################################
function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT)
{
global $_IPS,$ScriptID;
$ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
if ($ScriptID == 0){
$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $ScriptNAME);
IPS_SetParent($ScriptID, $ParentID);
IPS_SetInfo($ScriptID, "This script was created by: ".$_IPS['SELF']);
$ScriptPath = $ScriptID.".ips.php"; //Skriptdatei
IPS_SetScriptFile($ScriptID, $ScriptPath);
IPS_SetHidden($ScriptID, false);
IPS_SetScriptContent($ScriptID, $ScriptTEXT);
}
}
?>
lg Thomas - hat so nichts mit LCN zu tun, aber eine Anbindung habe ich da auch.