Pi 2, 1wire direkt am GPIO4

So hatte ich es an eine Atmega am laufen,der am LCN I-Port hängt.:smiley:
Da habe ich jetzt einfach einen 2ten 1wire Bus dazu gehängt, der am Pi Direkt werkelt, habe so jetzt 3 Sensoren für jeden Wert.
Habe gerade das neuste Update eingespielt, bin da schmerzfrei.:smiley:
Mal sehen, kann ja Abends immer „umstecken“ und suchen, bleibt halt die Bude mal ein paar Stunden kalt.
Das kalt machen konnte meine alte Viessmann Steuerung aber besser…:D, und wenn ich die Temperaturen vergleiche, wird mir „anders“,

Ok, das Problem hab ich nicht. Meine Heizung arbeitet zuverlässig. Andernfalls hätte ich ein Problem mit meiner Familie.
Ich bin sehr gespannt, wie das Projekt weitergeht. Wenn ich die Zeit finde, teste ich mal einen parallelen Simulationsbetrieb.
Wird zwar verwirrend für Deine Schaltung sein aber mal sehen.

Simulationsbetrieb ist gut, so habe ich angefangen.:smiley:
Und danach die Grundparameter „gefunden“, war ein langer Testlauf.:smiley:

Wie schon mal gesagt, wollte das erst auf einem Atmega bauen, aber Pi und symcon bietet einfach mehr Möglichkeiten, die schneller umzusetzen sind.
Und per VPN und SSH habe ich einfach mehr Möglichkeiten, per iPhone oder PC dieses auch von extern zu „regeln“.
Die neuen Graphen in der IOS APP sind da auch nur einfach „geil“, um mal schnell zu schauen.:loveips:

Auch sehe ich fehlerhafte „alte Heizkörper“, die der Heizungsbauer nicht mit „berechnet“ hat usw.:mad:

Ich habe eine Hütte von 1876, Bruchstein(bleibt auch Aussen so !, Ansicht !), teilweise Innen neu ausgebaut, also muss ich selber aktiv werden, der Heizungsbauer hat es nie hin bekommen, die alte Regelung an zu passen, ich aber auch nicht, weil das was gebraucht wird, geht nicht,
Jetzt bin ich einen Schritt weiter, es geht, und ich kann neue Heizkurven bauen, die auf mein Haus ausgelegt sind und direkt steuern.
Das ist ein grosser Vorteil, spart Öl(erfasse ich schon länger, und kann an Hand der alten Aufzeichnungen mit anderer Software vergleichen) und und erhöht den komfort im Haus.
An der Stelle werde ich die Berechnung der Heizkurven (Kesselwasser - Mischervorlauf) noch anders anpassen.

Das liest sich sehr gut. Genau die richtige Einstellung und stringent durchgezogen. Klasse.
Wenn ich so weit bin, frag ich mal den letzten Softwarestand ab.

Hi Boui,

Softwarestand ist gut, habe da heute ein Install Skript gebaut, welches fast alles anlegt.
Zuordnung, 1wire zu den Temperaturwerten in den Reglern muss noch von Hand erfolgen, der Rest wist in 1 Sekunde installiert.

Ist nur blöd zum testen hier, da ich nur einen Pi habe, und mir so Life, die Heizung etwas „durcheinander“ bringe:D, mit 2 Reglern auf einen Pi.

Die Regelung läuft perfekt, bis auf einige „Aussetzer“ bei dem Mischertimer, der steckt das aber weg, und bleibt in der Toleranz. Da weiss ich noch nicht, mein Fehler oder IPS Problem.

Super. Hab vorhin gerade festgestellt, dass ich meine 3 PI2 auch im aktiven Einsatz habe. Mhmmm, da muss ich wohl Nachschub ordern.
Mischer hab ich keine. Wir haben ein Einfamilienhaus.

Hallo zusammen,

ich setzte jetzt auch seit fast einem Jahr einen RASP mit 1Wire/GPIO ein. Habe darüber auch im IPS-Stammtisch in Erlangen berichtet. Bis jetzt hat dies auch hervorragend funktioniert. Aber seit mehreren Wochen habe ich Aussetzer in der Form, das die 1Wire-Sensoren im RASP-Filesystem verschwinden, aber nach einer gewissen Zeit wieder eigenständig erscheinen. Ein Reboot zeigt auch sofort wieder alle Sensoren. Am beiliegenden Diagramm kann man es sehen, wenn der Sensor weg, wird er im IPS mit 0 Grad angezeigt. An der Verkabelung hat sich nicht geändert.

Könnt ihr euch vorstellen, an was das liegen kann ?

Als unschönen Workaround werde ich den RASP bei einem ermittelten Temperaturwert von 0 einfach durchbooten. Zum Glück überwacht dieser RASP nur die Fussbodenheizung.

Gruss
Bernd

Bei mir hatte es bislang IMMER irgendwie mit der Spannungsversorgung zu tun, wenn ein Sensor ausgefallen ist.

LG
Guido

Ich vermute auch die Spannungsversorgung und 1wire Buslänge.
Wir sind bei 3,3V am GPIO, DS18x20 ist bessser bei 5V aufgehoben.
Meine Heizubg hat nur 15 mtr Buslänge, mit allen Sensoren, da kommt aber noch mehr zu…:smiley:

Beim gemischten Betrieb, parasitär (2 Draht) und normal (3 Draht) hatte ich auch Probleme mit einigen Sensoren.
Ich hatte an meinem Eigenbau Modul am LCN nur den parasitären Modus am laufen, per 5V, dass ging Jahrelang gut, auch mit 40 mtr und 8 Sensoren.(gemischt, DS18S20 und DS18B20), bei einer Abfrage alle 30 Sekunden.
Netzteil am Pi ist bei mir immer 5V mit min. 2A, an derHeizungssteuerung und dem Haus Pi je eins von Meanwell Hutschiene. Kostet etwas mehr als ein Steckernetzteil, laufen aber absolut Stabil, Mit Steckernetzteilen hatt ich schon öfter Probleme, die setze ich nur bei „mobilen“ Pi’s ein.

Hallo Guido,

dein Tipp war ein Volltreffer. Ich dachte erst, dass dies bei mir nicht zutrifft, da ich max. 2 Meter lange Kabel zu den Sensoren habe und der RASP über ein gutes 2A- Netzteil versorgt wird. Es lief ja auch bereits ein Jahr stabil. Bei meinen AVR-Net-IOs nutze ich die gleiche 1Wire-Anbindung und z.T. 5 Meter lange Kabel seit Jahren ohne Problem.

Mir ist dann in den Logs aufgefallen, dass es eine gewisse Korrelation zwischen Einschalten von Waschmaschine/Trockner und den 1Wire-Ausfällen gibt. Alle hängen am selben Stromkreis.

Ich habe dann die USB-Leitung viermal durch einen Ferritkern gezogen (siehe Bild), seitdem ist Ruhe. Warum es vorher trotzdem 1 Jahr lief, ist mir ein Rätsel.

Nochmals Danke, Gruss und schöne Feiertage
Bernd

Ferrit.png

Hallo Bernd,

welches Netzteil verwendest du ?
Wie lang ist dein USB Stromkabel ?

Es könnte die Peaks der Wama vom Netzteil kommen, oder auf das USB Kabel „übersprechen“ wenn nah zusammen.
Der Ferritkern ist ein guter Tipp, ich hätte Netzteil getauscht.

Hallo Thomas,

das Netzteil ist ein MAVEL-5V2000 und hat ~1 Meter Kabellänge. Die Waschmaschine hängt zwar am selben Stromkreis, ist räumlich aber doch einige Meter weg. HF-Einstrahlung oder „Cross-Talk“ würde ich deshalb nicht erwarten. Ein anderes Netzteil werde ich auch noch ausprobieren, hab nur nicht so viel 2A-USB-Lader Zuhause. Muss wohl einer der Tablet-Lader herhalten.

Gruss
Bernd

Netzteil bzw. Ferritkern hilft bei ca. 90 % dieser Probleme.

Die restl. 10 % sind unerklärbar, wie bei Akte X.:smiley:

Mal wieder zurück zur Steuerung, baue da gerade ein Install Skript,
GPIO Temperaturen oder andere Temperaturen müssen noch von Hand in die Regler usw.
Auch könnten noch andere Fehler im Install Skript drin sein.

Hier meine Steuerung :


<?
// Heizung anlegen
IPS_DeleteVariableProfile("TS.fSteilheit");
IPS_CreateVariableProfile("TS.fSteilheit", 2);
IPS_SetVariableProfileDigits("TS.fSteilheit", 1);
IPS_SetVariableProfileValues("TS.fSteilheit", 0, 5, 0.1);
IPS_SetVariableProfileIcon("TS.iWartezeit",  "Gauge");

IPS_DeleteVariableProfile("TS.fTemp_aussen");
IPS_CreateVariableProfile("TS.fTemp_aussen", 2);
IPS_SetVariableProfileDigits("TS.fTemp_aussen", 1);
IPS_SetVariableProfileIcon("TS.fTemp_aussen",  "Temperature");
IPS_SetVariableProfileValues("TS.fTemp_aussen", -15, 40, 0.1);
IPS_SetVariableProfileText("TS.fTemp_aussen", "", " °C");

IPS_DeleteVariableProfile("TS.fTemp_Korektur");
IPS_CreateVariableProfile("TS.fTemp_Korektur", 2);
IPS_SetVariableProfileDigits("TS.fTemp_Korektur", 1);
IPS_SetVariableProfileIcon("TS.fTemp_Korektur",  "Temperature");
IPS_SetVariableProfileValues("TS.fTemp_Korektur", -15, 15, 1.0);
IPS_SetVariableProfileText("TS.fTemp_Korektur", "", " k");

IPS_DeleteVariableProfile("TS.iTemp_Kessel");
IPS_CreateVariableProfile("TS.iTemp_Kessel", 1);
IPS_SetVariableProfileValues("TS.iTemp_Kessel", 0, 70, 1);
IPS_SetVariableProfileText("TS.iTemp_Kessel", "", " °C");

IPS_DeleteVariableProfile("TS.fTemp_Kessel");
IPS_CreateVariableProfile("TS.fTemp_Kessel", 2);
IPS_SetVariableProfileIcon("TS.fTemp_Kessel",  "Temperature");
IPS_SetVariableProfileValues("TS.fTemp_Kessel", 10, 80, 0.1);
IPS_SetVariableProfileText("TS.fTemp_Kessel", "", " °C");

IPS_DeleteVariableProfile("TS.iTemp_k");
IPS_CreateVariableProfile("TS.iTemp_k", 1);
IPS_SetVariableProfileIcon("TS.iTemp_k",  "Temperature");
IPS_SetVariableProfileValues("TS.iTemp_k", 0, 10, 1);
IPS_SetVariableProfileText("TS.iTemp_k", "", " k");

IPS_DeleteVariableProfile("TS.fTemp_k");
IPS_CreateVariableProfile("TS.fTemp_k", 2);
IPS_SetVariableProfileIcon("TS.fTemp_k",  "Temperature");
IPS_SetVariableProfileDigits("TS.fTemp_k", 1);
IPS_SetVariableProfileValues("TS.fTemp_k", 0, 5, 0.1);
IPS_SetVariableProfileText("TS.fTemp_k", "", " k");

IPS_DeleteVariableProfile("TS.iWartezeit");
IPS_CreateVariableProfile("TS.iWartezeit", 1);
IPS_SetVariableProfileValues("TS.iWartezeit", 0, 20, 1);
IPS_SetVariableProfileIcon("TS.iWartezeit",  "Clock");
IPS_SetVariableProfileText("TS.iWartezeit", "", " sek");


IPS_DeleteVariableProfile("TS.iNachlaufzeit");
IPS_CreateVariableProfile("TS.iNachlaufzeit", 1);
IPS_SetVariableProfileValues("TS.iNachlaufzeit", 0, 20, 1);
IPS_SetVariableProfileIcon("TS.iNachlaufzeit",  "Clock");
IPS_SetVariableProfileText("TS.iNachlaufzeit", "", " min");

IPS_DeleteVariableProfile("TS.iMischer");
IPS_CreateVariableProfile("TS.iMischer", 1);

$KategorieID = @IPS_GetCategoryIDByName("TS_Heizung", 0);
if ($KategorieID === false)
{
    echo "Kategorie nicht gefunden!, wird installiert";
$CatID = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID, "TS_Heizung");      // Kategorie benennen
$HauptCatId = $CatID;
//------------------------------------------------------------------------------
$CatID_gpio = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID_gpio, "GPIO Temperatur"); // Kategorie benennen
IPS_SetParent($CatID_gpio, $HauptCatId); // Kategorie einsortieren unter dem Objekt mit der ID "12345"

$CatID_aussen = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID_aussen, "Regler Aussentemperatur"); // Kategorie benennen
IPS_SetParent($CatID_aussen, $HauptCatId); // Kategorie einsortieren unter dem Objekt mit der ID "12345"

$CatID_kessel = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID_kessel, "Regler Kessel"); // Kategorie benennen
IPS_SetParent($CatID_kessel, $HauptCatId); // Kategorie einsortieren unter dem Objekt mit der ID "12345"

$CatID_Mischer = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID_Mischer, "Regler Mischer"); // Kategorie benennen
IPS_SetParent($CatID_Mischer, $HauptCatId); // Kategorie einsortieren unter dem Objekt mit der ID "12345"

$CatID_Speicher = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID_Speicher, "Regler Speicher"); // Kategorie benennen
IPS_SetParent($CatID_Speicher, $HauptCatId); // Kategorie einsortieren unter dem Objekt mit der ID "12345"

// Kessel
$k1=CreateVariableByName($CatID_kessel, "Soll_Temperatur_Kessel", 2);
IPS_SetVariableCustomProfile($k1, "TS.fTemp_Kessel");
$k21=CreateVariableByName($CatID_kessel, "Temperatur", 2);
IPS_SetVariableCustomProfile($k21, "TS.fTemp_Kessel");

$k22=CreateVariableByName($CatID_kessel, "Heizungs_Stellelement", 1);
IPS_SetVariableCustomProfile($k22, "TS.iTemp_k");
$k23=CreateVariableByName($CatID_kessel, "Vorherige_Regelabweichung", 2);
IPS_SetVariableCustomProfile($k23, "~Temperature.Difference");

$k2=CreateVariableByName($CatID_kessel, "Brenner", 0);
IPS_SetVariableCustomProfile($k2, "~Switch");
$k3=CreateVariableByName($CatID_kessel, "Speicheranforderung", 0);
IPS_SetVariableCustomProfile($k3, "~Switch");
$k4=CreateVariableByName($CatID_kessel, "Soll_Temperatur_Speicherladung", 1);
IPS_SetVariableCustomProfile($k4, "TS.iTemp_Kessel");
SetValue ($k4 , 64 );

$k5=CreateVariableByName($CatID_kessel, "Steilheit", 2);
IPS_SetVariableCustomProfile($k5, "TS.fSteilheit");
SetValue ($k5 , 1.2 );

$k6=CreateVariableByName($CatID_kessel, "max Kessel", 1);
IPS_SetVariableCustomProfile($k6, "TS.iTemp_Kessel");
SetValue ($k6 , 65 );

$k7=CreateVariableByName($CatID_kessel, "min Kessel", 1);
IPS_SetVariableCustomProfile($k7, "TS.iTemp_Kessel");
SetValue ($k7 , 20 );

$k8=CreateVariableByName($CatID_kessel, "Korrektur_Kessel", 2);
IPS_SetVariableCustomProfile($k8, "TS.fTemp_Korektur");
SetValue ($k8 , 5 );

$k9=CreateVariableByName($CatID_kessel, "Kessel Hysterese", 1);
IPS_SetVariableCustomProfile($k9, "TS.iTemp_k");
SetValue ($k9 , 3 );

// Aussen
$a1=CreateVariableByName($CatID_aussen, "Hand_Auto", 0);
IPS_SetVariableCustomProfile($a1, "~Switch");
$a2=CreateVariableByName($CatID_aussen, "Soll Nacht", 1);
IPS_SetVariableCustomProfile($a2, "TS.iTemp_Kessel");
SetValue ($a2 , 10 );
$a3=CreateVariableByName($CatID_aussen, "Soll Tag", 1);
IPS_SetVariableCustomProfile($a3, "TS.iTemp_Kessel");
SetValue ($a3 , 21 );

$a4=CreateVariableByName($CatID_aussen, "Sommerumschaltung", 1);
IPS_SetVariableCustomProfile($a4, "TS.iTemp_Kessel");
SetValue ($a4 , 28 );

$a22=CreateVariableByName($CatID_aussen, "Temperatur_Aussen", 2);
IPS_SetVariableCustomProfile($a22, "TS.fTemp_aussen");

$VarID=CreateVariableByName($CatID_aussen, "Uhr Heizung", 0);
SetValue ($VarID , 1 );
IPS_SetVariableCustomProfile($VarID, "~Switch");
$AktID=CreateEventIDByName($VarID, 'Schaltuhr', 2);
IPS_SetEventScheduleAction($AktID, 0, "Nacht", 0xFF0000, "SetValue(\$_IPS['TARGET'], false);");
IPS_SetEventScheduleAction($AktID, 1, "Tag", 0x00FF00, "SetValue(\$_IPS['TARGET'], true);");
IPS_SetEventScheduleGroup($AktID, 0, 1);
IPS_SetEventScheduleGroup($AktID, 1, 2);
IPS_SetEventScheduleGroup($AktID, 2, 4);
IPS_SetEventScheduleGroup($AktID, 3, 8);
IPS_SetEventScheduleGroup($AktID, 4, 16);
IPS_SetEventScheduleGroup($AktID, 5, 32);
IPS_SetEventScheduleGroup($AktID, 6, 64);
IPS_SetEventActive($AktID, true);             //Ereignis aktivieren

$VarID=CreateVariableByName($CatID_aussen, "Uhr Speicher", 0);
SetValue ($VarID , 1 );
IPS_SetVariableCustomProfile($VarID, "~Switch");
$AktID=CreateEventIDByName($VarID, 'Schaltuhr', 2);
IPS_SetEventScheduleAction($AktID, 0, "Nacht", 0xFF0000, "SetValue(\$_IPS['TARGET'], false);");
IPS_SetEventScheduleAction($AktID, 1, "Tag", 0x00FF00, "SetValue(\$_IPS['TARGET'], true);");
IPS_SetEventScheduleGroup($AktID, 0, 1);
IPS_SetEventScheduleGroup($AktID, 1, 2);
IPS_SetEventScheduleGroup($AktID, 2, 4);
IPS_SetEventScheduleGroup($AktID, 3, 8);
IPS_SetEventScheduleGroup($AktID, 4, 16);
IPS_SetEventScheduleGroup($AktID, 5, 32);
IPS_SetEventScheduleGroup($AktID, 6, 64);
IPS_SetEventActive($AktID, true);             //Ereignis aktivieren

//Mischer
$m1=CreateVariableByName($CatID_Mischer, "Pumpe", 0);
IPS_SetVariableCustomProfile($m1, "~Switch");

$m2=CreateVariableByName($CatID_Mischer, "Mischer", 1);
IPS_SetVariableCustomProfile($m2, "TS.iMischer");

CreateVariableByName($CatID_Mischer, "Zustand", 3);
$m22 = CreateVariableByName($CatID_Mischer, "Temperatur", 2);
IPS_SetVariableCustomProfile($m22, "TS.fTemp_Kessel");
$m3=CreateVariableByName($CatID_Mischer, "Soll_Temperatur_Mischer", 2);
IPS_SetVariableCustomProfile($m3, "TS.fTemp_Kessel");
$m4=CreateVariableByName($CatID_Mischer, "Verstärkungsfaktor Proportionalregler", 2);
IPS_SetVariableCustomProfile($m4, "TS.fSteilheit");
SetValue ($m4 , 4.5 );

$m23 = CreateVariableByName($CatID_Mischer, "Regelabweichung", 2);
IPS_SetVariableCustomProfile($m23, "~Temperature.Difference");
$m5=CreateVariableByName($CatID_Mischer, "Steilheit", 2);
IPS_SetVariableCustomProfile($m5, "TS.fSteilheit");
SetValue ($m5 , 1.2 );
$m6=CreateVariableByName($CatID_Mischer, "Hysterese", 2);
IPS_SetVariableCustomProfile($m6, "TS.fTemp_k");
SetValue ($m6 , 0.3 );
$m7=CreateVariableByName($CatID_Mischer, "Korrektur_Mischer", 2);
IPS_SetVariableCustomProfile($m7, "TS.fTemp_Korektur");
SetValue ($m7 , 4 );
$m8=CreateVariableByName($CatID_Mischer, "Mischer Max", 1);
IPS_SetVariableCustomProfile($m8, "TS.iTemp_Kessel");
SetValue ($m8 , 60 );
$m9=CreateVariableByName($CatID_Mischer, "Mischer Min", 1);
IPS_SetVariableCustomProfile($m9, "TS.iTemp_Kessel");
SetValue ($m9 , 15 );
$m10=CreateVariableByName($CatID_Mischer, "Wartezeit", 1);
IPS_SetVariableCustomProfile($m10, "TS.iWartezeit");
SetValue ($m10 , 16 );

//Speicher
CreateVariableByName($CatID_Speicher, "Heizungs_Stellelement", 1);
$s21 = CreateVariableByName($CatID_Speicher, "Nachlaufzeit Pumpe Ist", 1);
IPS_SetVariableCustomProfile($s21, "TS.iNachlaufzeit");
$s1=CreateVariableByName($CatID_Speicher, "Nachlaufzeit Pumpe Soll", 1);
IPS_SetVariableCustomProfile($s1, "TS.iNachlaufzeit");
SetValue ($s1 , 16 );
$s2=CreateVariableByName($CatID_Speicher, "Pumpe", 0);
IPS_SetVariableCustomProfile($s2, "~Switch");
$s3=CreateVariableByName($CatID_Speicher, "Soll_Temperatur mitte", 1);
IPS_SetVariableCustomProfile($s3, "TS.iTemp_Kessel");
SetValue ($s3 , 51 );
$s4=CreateVariableByName($CatID_Speicher, "Soll_Temperatur unten", 1);
IPS_SetVariableCustomProfile($s4, "TS.iTemp_Kessel");
SetValue ($s4 , 40 );
$s22 = CreateVariableByName($CatID_Speicher, "Temperatur mitte", 2);
IPS_SetVariableCustomProfile($s22, "TS.fTemp_Kessel");
$s23 = CreateVariableByName($CatID_Speicher, "Temperatur oben", 2);
IPS_SetVariableCustomProfile($s23, "TS.fTemp_Kessel");
$s24 = CreateVariableByName($CatID_Speicher, "Temperatur unten", 2);
IPS_SetVariableCustomProfile($s24, "TS.fTemp_Kessel");
CreateVariableByName($CatID_Speicher, "Vorherige_Regelabweichung", 2);
//------------------------------------------------------------------------------


// Skripte anlegen
$skript ='<?
if($_IPS["SENDER"] == "WebFront")
{
    SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
}
?>';
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 ='<?
if($_IPS["SENDER"] == "WebFront")
{
    SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
	if($_IPS["VALUE"] ==1) {
		exec (\'echo "1" > /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 ='<?
/*
Gpio Belegung :

Mischer auf     = GPIO 27 an
Mischer Zu      = GPIO 27 aus
Mischer Netz    = GPIO 17 aus = Mischer Netz an
Brenner         = GPIO 22
Pumpe Heizkreis = GPIO 23
Pumpe Speicher  = GPIO 24

1wire Bus       = GPIO 4
*/

/*
##############################################################
im /opt/gpio die Datei gpio_init.sh erzeugen :

#!/bin/sh
# Input-Ports (Taster)
for Port in  20 21
  do
  echo "$Port" > /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 ='<?
$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("GPIO Temperatur", $id2);
//------------------------------------------------------------------------------
 if($_IPS[\'SENDER\'] == "Execute")                // nur wenn bei "Ausführen"
 {
   CreateVariableByName($id3, "onewireId", 3);
   $onewireID = IPS_GetObjectIDByName("onewireId", $id3);
   SetValue($onewireID, "");
   $vid = CreateVariableByName($_IPS[\'SELF\'], "Running", 0);
   $eid = CreateEventIDByName($_IPS[\'SELF\'], "StartStop", 0);
   IPS_SetEventActive($eid, true);
   IPS_SetEventTrigger($eid, 0, $vid);
   IPS_SetEventScript($eid, $_IPS[\'SELF\']);
	$datei = file("/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves");
	$i=1;
	foreach($datei AS $dallas_id)
   {
	   $ds_id[$i]= $dallas_id;
      $wire = GetValue($onewireID);
      $wire = "".$wire." ".$ds_id[$i];
  	   SetValue($onewireID, $wire);
		$i++;
   }
 }
//------------------------------------------------------------------------------
// if($_IPS[\'SENDER\'] == "TimerEvent")             //

$zaehler = intval(exec(\'cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slave_count\'));
$onewireID = IPS_GetObjectIDByName("onewireId", $id3);

$wire = GetValue($onewireID);
$ds_id = explode(" ", $wire);
	for ($i = 1; ; $i++)
	{
	   if ($i > $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 ='<?
// Daten die vorgegeben werden müssen
$Kp=1; // 5 Kp = Verstärkungsfaktor Proportionalregler
$Ki=1; //2.5 Ki = Verstärkungsfaktor Integralregler
$Kd=1; //0 Kd = Verstärkungsfaktor Differenzialregler

$Script = IPS_GetScript($_IPS[\'SELF\']);
//$Ta = Round((time() - $Script[\'ScriptExecuted\'])/15,0); //Ta = Rechenschrittweite (Abtastzeit)

$SollTemperaturID = IPS_GetObjectIDByName("Soll_Temperatur_Kessel", IPS_GetParent($_IPS[\'SELF\']));
$IstTemperaturID = IPS_GetObjectIDByName("Temperatur", IPS_GetParent($_IPS[\'SELF\']));
$HeizungsStellelementID = IPS_GetObjectIDByName("Heizungs_Stellelement", IPS_GetParent($_IPS[\'SELF\']));
$VorherigeRegelabweichungID = IPS_GetObjectIDByName("Vorherige_Regelabweichung", IPS_GetParent($_IPS[\'SELF\']));
$bernnerID = IPS_GetObjectIDByName("Brenner", IPS_GetParent($_IPS[\'SELF\']));
$SpeicheranforderungID = IPS_GetObjectIDByName("Speicheranforderung", IPS_GetParent($_IPS[\'SELF\']));
$SollTemperaturSpeicherID = IPS_GetObjectIDByName("Soll_Temperatur_Speicherladung", IPS_GetParent($_IPS[\'SELF\']));
$SteilheitID = IPS_GetObjectIDByName("Steilheit", IPS_GetParent($_IPS[\'SELF\']));
$maxID = IPS_GetObjectIDByName("max Kessel",IPS_GetParent($_IPS[\'SELF\']));
$minID = IPS_GetObjectIDByName("min Kessel", IPS_GetParent($_IPS[\'SELF\']));
$Korrektur_KesselID = IPS_GetObjectIDByName("Korrektur_Kessel", IPS_GetParent($_IPS[\'SELF\']));
$Kessel_faktorID = IPS_GetObjectIDByName("Kessel Hysterese", IPS_GetParent($_IPS[\'SELF\']));

$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Aussentemperatur", $id2);
$HandID = IPS_GetObjectIDByName("Hand_Auto", $id3);
$UhrID = IPS_GetObjectIDByName("Uhr Heizung", $id3);
$Soll_TagID = IPS_GetObjectIDByName("Soll Tag", $id3);
$Soll_NachtID = IPS_GetObjectIDByName("Soll Nacht", $id3);
$IstTemperaturAussenID = IPS_GetObjectIDByName("Temperatur_Aussen", $id3);
$SommerID = IPS_GetObjectIDByName("Sommerumschaltung", $id3);

$Uhr = GetValue($UhrID);
$Hand = GetValue($HandID);
$max = GetValue($maxID);
$min = GetValue($minID);
$Aussentemp=GetValueFloat($IstTemperaturAussenID);;
$Steilheit = GetValue($SteilheitID);
$Korrektur_Kessel = GetValue($Korrektur_KesselID);
$Speicheranforderung = GetValue($SpeicheranforderungID);
$SollTemperaturSpeicher = GetValue($SollTemperaturSpeicherID);
$Soll_Tag = GetValue($Soll_TagID);
$Soll_Nacht = GetValue($Soll_NachtID);
$Sommer =GetValue($SommerID);
if ($Hand == 0)  { //Automatik ist an

	if ($Uhr == 1)  {
		$Raumsollwert= $Soll_Tag ;//12 Nacht
		} else{
		$Raumsollwert= $Soll_Nacht ;//12 Nacht
	}
//Sommer, Kesselsollwert
   if ($Aussentemp < $Sommer ) {
		$Vorlauftemperatur_Kessel=min(max(round((0.55*$Steilheit*(pow($Raumsollwert,($Aussentemp/(320-$Aussentemp*4))))*((-$Aussentemp+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max);
		$Kessel_faktor = GetValue($Kessel_faktorID);
		$Kessel_soll = $Vorlauftemperatur_Kessel + $Kessel_faktor;
// Kesselschutz 38°C
		if ($Kessel_soll < $min) {
          SetValueFloat($SollTemperaturID, $min);
      }
// Maximalbegrenzung Kessel
		if ($Kessel_soll < $max) {
			SetValueFloat($SollTemperaturID, $Kessel_soll);
			} else {
			SetValueFloat($SollTemperaturID, $max);
		}
     } else{
// Ausentemp grösserr Raumsollwert
     SetValueFloat($SollTemperaturID, $min);
     }
}


//aktuelle Regelabweichung bestimmen
if ($Speicheranforderung == 0) {
	$e = GetValueFloat($SollTemperaturID)- GetValueFloat($IstTemperaturID);#
	} else{
	$e = ($SollTemperaturSpeicher -3 ) - GetValueFloat($IstTemperaturID);
	SetValueFloat($SollTemperaturID, $SollTemperaturSpeicher);
}

// Die vorherige Regelabweichung ermitteln
$ealt = GetValueFloat($VorherigeRegelabweichungID);

// Die Berechnung des neuen Regelwertes
//$y = ($Kp * $e + $Ki * $Ta * $esum + $Kd * ($e - $ealt) / $Ta);
$y = $Kp * $e;
$Stellwert=$y;
// Vorherige Regelabweichung durch jetzige ersetzen
SetValueFloat($VorherigeRegelabweichungID, $e);
// 6K - 8K  zwischen Brenner ein/aus
SetValueInteger($HeizungsStellelementID, $Stellwert);
if ($Hand == 0)  { //Automatik ist an

	If ($y < -3 )
	    {
	   	exec (\'echo "1" > /sys/class/gpio/gpio22/value\');
	    }

	If ($y > 3 )
	    {
	   	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 ='<?
if($_IPS["SENDER"] == "WebFront")
{
   SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
	if($_IPS["VALUE"] ==0) {exec (\'echo "1" > /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 ='<?///$Kp=1.5;//1.1; // 5 Kp = Verstärkungsfaktor Proportionalregler
$Ki=1; //2.5 Ki = Verstärkungsfaktor Integralregler
$Kd=1; //0 Kd = Verstärkungsfaktor Differenzialregler


$EinschaltzeitID = IPS_GetObjectIDByName("Einschaltzeit", ($_IPS[\'SELF\']));
$WartezeitID = IPS_GetObjectIDByName("Wartezeit", ($_IPS[\'SELF\']));
$actionID = IPS_GetObjectIDByName("Zustand", IPS_GetParent($_IPS[\'SELF\']));
$VorherigeRegelabweichungID = IPS_GetObjectIDByName("Regelabweichung", IPS_GetParent($_IPS[\'SELF\']));
$HystereseID = IPS_GetObjectIDByName("Hysterese",  IPS_GetParent($_IPS[\'SELF\']));
$MischerID = IPS_GetObjectIDByName("Mischer",  IPS_GetParent($_IPS[\'SELF\']));
$SteilheitID = IPS_GetObjectIDByName("Steilheit", IPS_GetParent($_IPS[\'SELF\']));
$Korrektur_MischerID = IPS_GetObjectIDByName("Korrektur_Mischer", IPS_GetParent($_IPS[\'SELF\']));
$PumpeID = IPS_GetObjectIDByName("Pumpe", IPS_GetParent($_IPS[\'SELF\']));
$KpID = IPS_GetObjectIDByName("Verstärkungsfaktor Proportionalregler", IPS_GetParent($_IPS[\'SELF\']));
$min_MischerID = IPS_GetObjectIDByName("Mischer Min", IPS_GetParent($_IPS[\'SELF\']));
$max_MischerID = IPS_GetObjectIDByName("Mischer Max", IPS_GetParent($_IPS[\'SELF\']));
$WartezeitVarID = IPS_GetObjectIDByName("Wartezeit", IPS_GetParent($_IPS[\'SELF\']));

$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Aussentemperatur", $id2);
$HandID = IPS_GetObjectIDByName("Hand_Auto", $id3);
$UhrID = IPS_GetObjectIDByName("Uhr Heizung", $id3);
$Soll_TagID = IPS_GetObjectIDByName("Soll Tag", $id3);
$Soll_NachtID = IPS_GetObjectIDByName("Soll Nacht", $id3);
$IstTemperaturAussenID = IPS_GetObjectIDByName("Temperatur_Aussen", $id3);
$SommerID = IPS_GetObjectIDByName("Sommerumschaltung", $id3);

$Aussentemp=GetValueFloat($IstTemperaturAussenID);
$Soll_Tag = GetValue($Soll_TagID);
$Soll_Nacht = GetValue($Soll_NachtID);
$Hand = GetValue($HandID);
$Uhr = GetValue($UhrID);
$Sommer =GetValue($SommerID);
//var_dump ($Hand);
$Soll_Temperatur_MischerID = IPS_GetObjectIDByName("Soll_Temperatur_Mischer", IPS_GetParent($_IPS[\'SELF\']));
$IstTemperaturID = IPS_GetObjectIDByName("Temperatur", IPS_GetParent($_IPS[\'SELF\']));
$Hysterese =GetValueFloat($HystereseID);
$Steilheit = GetValue($SteilheitID);
$Korrektur_Mischer = GetValue($Korrektur_MischerID);
$Kp = GetValue($KpID);
$min_Mischer = GetValue($min_MischerID);
$max_Mischer = GetValue($max_MischerID);
$Wartezeit = GetValue($WartezeitVarID);

IPS_SetEventCyclic($WartezeitID, 0, 0, 0, 0, 1 ,$Wartezeit);

if ($Hand == 0)  { //Automatik ist an

	if ($Uhr == 1)  {
		$Raumsollwert= $Soll_Tag ;//12 Nacht
		} else{
		$Raumsollwert= $Soll_Nacht ;//12 Nacht
	}
//Sommer, Pumpe aus, Kessel aus, Mischer zu
   if ($Aussentemp < $Sommer ) {
      exec (\'echo "0" > /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);
		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 <= 2) {
	 	$Einschaltzeit = 2;
	 }
    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 = \'Auf\';
		    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 ='<?
if($_IPS["SENDER"] == "WebFront")
{
   SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
	if($_IPS["VALUE"] ==0) { // Mischer auf
		//Richtungsrelais ein
		exec (\'echo "0" > /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 ='<?
if($_IPS["SENDER"] == "WebFront")
{
   SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
	if($_IPS["VALUE"] ==0) {exec (\'echo "1" > /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 ='<?
// Daten die vorgegeben werden müssen
$Kp=1; // 5 Kp = Verstärkungsfaktor Proportionalregler
$Ki=1; //2.5 Ki = Verstärkungsfaktor Integralregler
$Kd=1; //0 Kd = Verstärkungsfaktor Differenzialregler

$SollTemperaturUntenID = IPS_GetObjectIDByName("Soll_Temperatur unten", IPS_GetParent($_IPS[\'SELF\']));
$SollTemperaturMitteID = IPS_GetObjectIDByName("Soll_Temperatur mitte", IPS_GetParent($_IPS[\'SELF\']));
$IstTemperaturID = IPS_GetObjectIDByName("Temperatur unten", IPS_GetParent($_IPS[\'SELF\']));
$IstTemperaturMitteID = IPS_GetObjectIDByName("Temperatur mitte", IPS_GetParent($_IPS[\'SELF\']));

$HeizungsStellelementID = IPS_GetObjectIDByName("Heizungs_Stellelement", IPS_GetParent($_IPS[\'SELF\']));
$VorherigeRegelabweichungID = IPS_GetObjectIDByName("Vorherige_Regelabweichung", IPS_GetParent($_IPS[\'SELF\']));
$PumpeID = IPS_GetObjectIDByName("Pumpe", IPS_GetParent($_IPS[\'SELF\']));

$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Kessel", $id2);
$IstTemperaturKesselID = IPS_GetObjectIDByName("Temperatur", $id3);
$SpeicheranforderungID = IPS_GetObjectIDByName("Speicheranforderung", $id3);
$id3= IPS_GetObjectIDByName("Regler Aussentemperatur", $id2);
$Uhr_Speicher = IPS_GetObjectIDByName("Uhr Speicher", $id3);
$Uhr = GetValueBoolean($Uhr_Speicher);
$HandID= IPS_GetObjectIDByName("Hand_Auto", $id3);
$Hand = GetValue($HandID);

$IstTemperaturKessel = GetValueFloat($IstTemperaturKesselID);
$IstTemperaturMitte = GetValueFloat($IstTemperaturMitteID);
$SollTemperaturMitte = GetValue($SollTemperaturMitteID);
$IstTemperaturUnten = GetValueFloat($IstTemperaturID);
$SollTemperaturUnten = GetValue($SollTemperaturUntenID);
//aktuelle Regelabweichung bestimmen
$e = $SollTemperaturUnten - $IstTemperaturUnten;
// Die vorherige Regelabweichung ermitteln
$ealt = GetValueFloat($VorherigeRegelabweichungID);
// Die Berechnung des neuen Regelwertes
//$y = ($Kp * $e + $Ki * $Ta * $esum + $Kd * ($e - $ealt) / $Ta);
$y = $Kp * $e;
$Stellwert=$y;
// Vorherige Regelabweichung durch jetzige ersetzen
SetValueFloat($VorherigeRegelabweichungID, $e);
SetValueInteger($HeizungsStellelementID, $Stellwert);
if ($Hand == 0)  { //Automatik ist an
	if ($Uhr == 1) {
		If ($y > 2 )
		    {
			   if(($IstTemperaturMitte <= $SollTemperaturMitte and $IstTemperaturUnten < $SollTemperaturUnten) or ($IstTemperaturUnten < 22) )
				{
						//Kessel auf 70°C setzen
				      SetValue($SpeicheranforderungID, 1);
				}
//            $SollTemperaturUnten_minus = $SollTemperaturUnten - 15;
//			   if($IstTemperaturUnten <= $SollTemperaturUnten_minus) {
						//Kessel auf 70°C setzen
//				      SetValue($SpeicheranforderungID, 1);
				}
		    }
		If ( ($IstTemperaturKessel+3) > $IstTemperaturUnten )
		{
			If ($y < 0 )
			    {
//			   	exec (\'echo "1" > /sys/class/gpio/gpio24/value\');
		         SetValue($SpeicheranforderungID, 0);
			    }
			If ($y >= 2 )
			    {
   			   if( ($IstTemperaturMitte < $SollTemperaturMitte) or ($IstTemperaturUnten < 22) )
					{
			   		exec (\'echo "0" > /sys/class/gpio/gpio24/value\');
					}
			    }
			}
			else{
		   	exec (\'echo "1" > /sys/class/gpio/gpio24/value\');
		}
	 } else
	   {
	 			//Kessel auf sollwert setzen
		         SetValue($SpeicheranforderungID, 0);
			   	exec (\'echo "1" > /sys/class/gpio/gpio24/value\');
	   }
	if ($Uhr == 0)
	{
			//Kessel auf sollwert setzen
	      SetValue($SpeicheranforderungID, 0);
	}
			   if(($IstTemperaturMitte > $SollTemperaturMitte+2 ) and ($IstTemperaturUnten > 22) )
				{
						//Kessel auf 70°C setzen
				      SetValue($SpeicheranforderungID, 0);
				}

$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 ='<?
$NachlaufzeitID = IPS_GetObjectIDByName("Nachlaufzeit", ($_IPS[\'SELF\']));
$NachlaufSollID = IPS_GetObjectIDByName("Nachlaufzeit Pumpe Soll", IPS_GetParent($_IPS[\'SELF\']));
$NachlaufIstID = IPS_GetObjectIDByName("Nachlaufzeit Pumpe Ist", IPS_GetParent($_IPS[\'SELF\']));
$PumpeID = IPS_GetObjectIDByName("Pumpe", IPS_GetParent($_IPS[\'SELF\']));
$TemperaturMitteID = IPS_GetObjectIDByName("Temperatur mitte", IPS_GetParent($_IPS[\'SELF\']));

$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Kessel", $id2);
$SpeicheranforderungID = IPS_GetObjectIDByName("Speicheranforderung", $id3);
$Kessel_istID = IPS_GetObjectIDByName("Temperatur", $id3);
$Speicheranforderung = GetValue($SpeicheranforderungID);
$Nachlauf_soll= GetValue($NachlaufSollID);
$Nachlauf_ist= GetValue($NachlaufIstID);

$Kessel_ist = GetValue($Kessel_istID);
$SpeicherMitte = GetValue($TemperaturMitteID);
if ($Speicheranforderung == 0){
	$Nachlauf_ist=$Nachlauf_ist+1;
	SetValue($NachlaufIstID, $Nachlauf_ist);
	IPS_SetEventCyclic($NachlaufzeitID, 0, 0, 0, 0, 1 ,60);
	if ($Nachlauf_ist >= $Nachlauf_soll){
		exec (\'echo "1" > /sys/class/gpio/gpio24/value\');
		IPS_SetEventCyclic($NachlaufzeitID, 0, 0, 0, 0, 1 ,0);
		SetValue($NachlaufIstID, 0);
	}
	if ($Kessel_ist <= $SpeicherMitte){
		exec (\'echo "1" > /sys/class/gpio/gpio24/value\');
		IPS_SetEventCyclic($NachlaufzeitID, 0, 0, 0, 0, 1 ,0);
		SetValue($NachlaufIstID, 0);
	}
}
$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 ='<?
if($_IPS["SENDER"] == "WebFront")
{
   SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
	if($_IPS["VALUE"] ==0) {exec (\'echo "1" > /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);
    }
}

?>

Noch etwas weitergemacht.
Heizungskennlinien mit im Webfront eingebaut, über eine Bilddatei die per PHP erzeugt wird:


<?
$SteilheitID = IPS_GetObjectIDByName("Steilheit", IPS_GetParent($_IPS['SELF']));
$maxID = IPS_GetObjectIDByName("Mischer Max",IPS_GetParent($_IPS['SELF']));
$minID = IPS_GetObjectIDByName("Mischer Min", IPS_GetParent($_IPS['SELF']));
$Korrektur_KesselID = IPS_GetObjectIDByName("Korrektur_Mischer", IPS_GetParent($_IPS['SELF']));
$id = IPS_GetParent($_IPS['SELF']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Aussentemperatur", $id2);

$Soll_TagID = IPS_GetObjectIDByName("Soll Tag", $id3);
$Soll_NachtID = IPS_GetObjectIDByName("Soll Nacht", $id3);
$IstTemperaturAussenID = IPS_GetObjectIDByName("Temperatur_Aussen", $id3);
$max = GetValue($maxID);
$min = GetValue($minID);
$Steilheit = GetValue($SteilheitID);
$Korrektur_Kessel = GetValue($Korrektur_KesselID);
$Soll_Tag = GetValue($Soll_TagID);
$Soll_Nacht = GetValue($Soll_NachtID);
$Raumsollwert= $Soll_Tag ;
$Aussentemp=GetValueFloat($IstTemperaturAussenID);

$Raumsollwert= 20;
$Korrektur_Kessel=0;
$max = 75;
$j=20;
for ( $i = 1; $i <= 550; $i++ ) {
   $Values[$i] = min(max( ((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;
   $Values[$i] = 800 - $Values[$i] ;
   $j=$j-0.1;
}

$max = GetValue($maxID);
$Steilheit = GetValue($SteilheitID);
$Korrektur_Kessel = GetValue($Korrektur_KesselID);
$Raumsollwert= $Soll_Tag ;
$j=20;
for ( $i = 1; $i <= 550; $i++ ) {
   $Values2[$i] = min(max( ((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;
   $Values2[$i] = 800 - $Values2[$i] ;
   $j=$j-0.1;
}

$xPoint=50;
$yPoint=50;
$Image = imagecreate( 650, 650 );
$backColour = imagecolorallocate( $Image, 250, 250, 250 );
$colRed = imagecolorallocate( $Image, 250, 0, 0 );
$colBlue = imagecolorallocate( $Image, 0, 0, 250 );
$colGreen = imagecolorallocate( $Image, 0, 250, 0 );
$colGrey=imagecolorallocate($Image, 192, 192, 192);
$colGrey2=imagecolorallocate($Image, 150, 150, 150);
$colBlack=imagecolorallocate($Image, 2, 0, 0);

// Raster erzeugen
for ($i=5; $i<61; $i++){
imageline($Image, $i*10, 50, $i*10, 600, $colGrey);
imageline($Image, 50, $i*10, 600, $i*10, $colGrey);
}
for ($i=1; $i<13; $i++){
imageline($Image, $i*50, 50, $i*50, 600, $colGrey2);
imageline($Image, 50, $i*50, 600, $i*50, $colGrey2);
}

#draw x & y axis
imageline( $Image, $xPoint, 600, 600, 600, $colBlue );
imageline( $Image, $xPoint, 600, $xPoint, $yPoint, $colBlue );
imagestring( $Image, 3, 10, 20, "Kennline Mischer, rot = mit Niveau, gruen = nur Steilheit : ".$Steilheit, $colBlack);

imagestring( $Image, 3, 10, 50, "75'C", $colRed);
imagestring( $Image, 3, 10, 100, "70'C", $colRed);
imagestring( $Image, 3, 10, 150, "65'C", $colRed);
imagestring( $Image, 3, 10, 200, "60'C", $colRed);
imagestring( $Image, 3, 10, 250, "55'C", $colRed);
imagestring( $Image, 3, 10, 300, "50'C", $colRed);
imagestring( $Image, 3, 10, 350, "45'C", $colRed);
imagestring( $Image, 3, 10, 400, "40'C", $colRed);
imagestring( $Image, 3, 10, 450, "35'C", $colRed);
imagestring( $Image, 3, 10, 500, "30'C", $colRed);
imagestring( $Image, 3, 10, 550, "25'C", $colRed);
imagestring( $Image, 3, 10, 600, "20'C", $colRed);

imagestring( $Image, 3, 50, 625, "20'C", $colBlue);
imagestring( $Image, 3, 100, 625, "15'C", $colBlue);
imagestring( $Image, 3, 150, 625, "10'C", $colBlue);
imagestring( $Image, 3, 200, 625, "5'C", $colBlue);
imagestring( $Image, 3, 250, 625, "0'C", $colBlue);
imagestring( $Image, 3, 300, 625, "-5'C", $colBlue);
imagestring( $Image, 3, 350, 625, "-10'C", $colBlue);
imagestring( $Image, 3, 400, 625, "-15'C", $colBlue);
imagestring( $Image, 3, 450, 625, "-20'C", $colBlue);
imagestring( $Image, 3, 500, 625, "-25'C", $colBlue);
imagestring( $Image, 3, 550, 625, "-30'C", $colBlue);
imagestring( $Image, 3, 50, 605, "Aussen: ".$Aussentemp."'C", $colBlue);

$xPoint=49;
$yPoint=50;
$xinterval=1;
$y1Point=$Values[1];
for ( $i = 1; $i <= 550; $i++ ) {
    $xPoint=$xPoint + $xinterval;
    imageline( $Image, $xPoint, $y1Point, $xPoint + $xinterval, $Values[$i], $colGreen );
    $y1Point=$Values[$i];
}

$xPoint=49;
$yPoint=50;
$xinterval=1;
$y1Point=$Values2[1];
for ( $i = 1; $i <= 550; $i++ ) {
    $xPoint=$xPoint + $xinterval;
	 imageline( $Image, $xPoint, $y1Point, $xPoint + $xinterval, $Values2[$i], $colRed );
	 $y1Point=$Values2[$i];
}

header('Content-Disposition: attachment; filename="Mischer.png"');
imagepng( $Image, "/usr/share/symcon/media/Mischer.png"  );
imagedestroy( $Image );
?>


Das Jahr fängt ja gut an.
Hast Du mal daran gedacht, die Kennlinie dynamisch zu machen. Das war mal vor längerer Zeit Thema, um die Heizung besser anpassen zu können (z.B. Übergangszeit).

BTW: Im Kennlinienpic fehlt oben links ein s. [emoji38]

Hallo Boui,

dass war mein erstes Bild welches von PHP im IPS erzeugt wird, und ist bestimmt nicht perfekt.
Übergangszeit, da muss ich noch Gedanken machen, da hast du Recht.
Wenn du Tipps hast, her damit.:slight_smile:

Das „s“ fehlt auch nicht mehr @home, Tippfehler kann ich gut.:smiley:

Du machst das schon sehr gut. :slight_smile:
Das Thema mit der Heizkurve hatte meine ich Bernhard vorgebracht. Lässt sich am iPhone aktuell schlecht recherchieren.

Noch etwas umgebaut, und ein Install Skript zum testen.
Wer es probiert und Fehler fndet, ich würde mich über ein Rückmeldung freuen.
Temperaturen müssen von Hand den Dallas zugeordnet werden, wie auch einige Timer noch von Hand angeschupst werden, mir geht es in erster Line um die Funktionen.
Ich steuere damit meine komplette Heizungsanlage, und den ersten Stromausfall am Mitwoch (ich war im Ausland), hat die Steuerung auch überstanden, was ich von der orginal Steuerung nicht behaupten kann (die hatte sich „aufgehängt“, ist ja nicht schimm, da nur noch als Notnagel vorhanden, muss dann nur die Lastkreise umstecken…)

Ich betreibe das auf einem Pi2, an dem nicht weiters als IPS und die GPIO Geschichte läuft, dafür aber stabil bis jetzt.
Auch werden alle Messwerte und Schaltungen bei mir auf der SD Karte aufgezeichnet (Muss jeder selber einstellen), um optimieren zu können.


<?
// Install Skript
// Heizung anlegen
IPS_DeleteVariableProfile("TS.fSteilheit");
IPS_CreateVariableProfile("TS.fSteilheit", 2);
IPS_SetVariableProfileDigits("TS.fSteilheit", 1);
IPS_SetVariableProfileValues("TS.fSteilheit", 0, 5, 0.1);
IPS_SetVariableProfileIcon("TS.iWartezeit",  "Gauge");

IPS_DeleteVariableProfile("TS.fTemp_aussen");
IPS_CreateVariableProfile("TS.fTemp_aussen", 2);
IPS_SetVariableProfileDigits("TS.fTemp_aussen", 1);
IPS_SetVariableProfileIcon("TS.fTemp_aussen",  "Temperature");
IPS_SetVariableProfileValues("TS.fTemp_aussen", -15, 40, 0.1);
IPS_SetVariableProfileText("TS.fTemp_aussen", "", " °C");

IPS_DeleteVariableProfile("TS.fTemp_Korektur");
IPS_CreateVariableProfile("TS.fTemp_Korektur", 2);
IPS_SetVariableProfileDigits("TS.fTemp_Korektur", 1);
IPS_SetVariableProfileIcon("TS.fTemp_Korektur",  "Temperature");
IPS_SetVariableProfileValues("TS.fTemp_Korektur", -15, 15, 1.0);
IPS_SetVariableProfileText("TS.fTemp_Korektur", "", " k");

IPS_DeleteVariableProfile("TS.iTemp_Kessel");
IPS_CreateVariableProfile("TS.iTemp_Kessel", 1);
IPS_SetVariableProfileValues("TS.iTemp_Kessel", 0, 70, 1);
IPS_SetVariableProfileText("TS.iTemp_Kessel", "", " °C");

IPS_DeleteVariableProfile("TS.fTemp_Kessel");
IPS_CreateVariableProfile("TS.fTemp_Kessel", 2);
IPS_SetVariableProfileIcon("TS.fTemp_Kessel",  "Temperature");
IPS_SetVariableProfileValues("TS.fTemp_Kessel", 10, 80, 5);
IPS_SetVariableProfileText("TS.fTemp_Kessel", "", " °C");

IPS_DeleteVariableProfile("TS.iTemp_k");
IPS_CreateVariableProfile("TS.iTemp_k", 1);
IPS_SetVariableProfileIcon("TS.iTemp_k",  "Temperature");
IPS_SetVariableProfileValues("TS.iTemp_k", 0, 10, 1);
IPS_SetVariableProfileText("TS.iTemp_k", "", " k");

IPS_DeleteVariableProfile("TS.fTemp_k");
IPS_CreateVariableProfile("TS.fTemp_k", 2);
IPS_SetVariableProfileIcon("TS.fTemp_k",  "Temperature");
IPS_SetVariableProfileDigits("TS.fTemp_k", 1);
IPS_SetVariableProfileValues("TS.fTemp_k", 0, 5, 0.1);
IPS_SetVariableProfileText("TS.fTemp_k", "", " k");

IPS_DeleteVariableProfile("TS.iWartezeit");
IPS_CreateVariableProfile("TS.iWartezeit", 1);
IPS_SetVariableProfileValues("TS.iWartezeit", 0, 20, 1);
IPS_SetVariableProfileIcon("TS.iWartezeit",  "Clock");
IPS_SetVariableProfileText("TS.iWartezeit", "", " sek");


IPS_DeleteVariableProfile("TS.iNachlaufzeit");
IPS_CreateVariableProfile("TS.iNachlaufzeit", 1);
IPS_SetVariableProfileValues("TS.iNachlaufzeit", 0, 20, 1);
IPS_SetVariableProfileIcon("TS.iNachlaufzeit",  "Clock");
IPS_SetVariableProfileText("TS.iNachlaufzeit", "", " min");

IPS_DeleteVariableProfile("TS.iMischer");
IPS_CreateVariableProfile("TS.iMischer", 1);
IPS_SetVariableProfileAssociation("TS.iMischer", 0, "Auf", "Shutter", 0xFF0000);
IPS_SetVariableProfileAssociation("TS.iMischer", 1, "Stop", "Shutter", 0x00FF00);
IPS_SetVariableProfileAssociation("TS.iMischer", 2, "Zu", "Shutter", 0x0000FF);

$KategorieID = @IPS_GetCategoryIDByName("TS_Heizung", 0);
if ($KategorieID === false)
{
    echo "Kategorie nicht gefunden!, wird installiert";
$CatID = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID, "TS_Heizung");      // Kategorie benennen
$HauptCatId = $CatID;
//------------------------------------------------------------------------------
$CatID_gpio = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID_gpio, "GPIO Temperatur"); // Kategorie benennen
IPS_SetParent($CatID_gpio, $HauptCatId); // Kategorie einsortieren unter dem Objekt mit der ID "12345"

$CatID_aussen = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID_aussen, "Regler Aussentemperatur"); // Kategorie benennen
IPS_SetParent($CatID_aussen, $HauptCatId); // Kategorie einsortieren unter dem Objekt mit der ID "12345"

$CatID_kessel = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID_kessel, "Regler Kessel"); // Kategorie benennen
IPS_SetParent($CatID_kessel, $HauptCatId); // Kategorie einsortieren unter dem Objekt mit der ID "12345"

$CatID_Mischer = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID_Mischer, "Regler Mischer"); // Kategorie benennen
IPS_SetParent($CatID_Mischer, $HauptCatId); // Kategorie einsortieren unter dem Objekt mit der ID "12345"

$CatID_Speicher = IPS_CreateCategory();       // Kategorie anlegen
IPS_SetName($CatID_Speicher, "Regler Speicher"); // Kategorie benennen
IPS_SetParent($CatID_Speicher, $HauptCatId); // Kategorie einsortieren unter dem Objekt mit der ID "12345"

// Kessel
$k1=CreateVariableByName($CatID_kessel, "Soll_Temperatur_Kessel", 2);
IPS_SetVariableCustomProfile($k1, "TS.fTemp_Kessel");
$k21=CreateVariableByName($CatID_kessel, "Temperatur", 2);
IPS_SetVariableCustomProfile($k21, "TS.fTemp_Kessel");

$k22=CreateVariableByName($CatID_kessel, "Heizungs_Stellelement", 1);
IPS_SetVariableCustomProfile($k22, "TS.iTemp_k");
$k23=CreateVariableByName($CatID_kessel, "Vorherige_Regelabweichung", 2);
IPS_SetVariableCustomProfile($k23, "~Temperature.Difference");

$k2=CreateVariableByName($CatID_kessel, "Brenner", 0);
IPS_SetVariableCustomProfile($k2, "~Switch");
$k3=CreateVariableByName($CatID_kessel, "Speicheranforderung", 0);
IPS_SetVariableCustomProfile($k3, "~Switch");
$k4=CreateVariableByName($CatID_kessel, "Soll_Temperatur_Speicherladung", 1);
IPS_SetVariableCustomProfile($k4, "TS.iTemp_Kessel");
SetValue ($k4 , 64 );

$k5=CreateVariableByName($CatID_kessel, "Steilheit", 2);
IPS_SetVariableCustomProfile($k5, "TS.fSteilheit");
SetValue ($k5 , 1.2 );

$k6=CreateVariableByName($CatID_kessel, "max Kessel", 1);
IPS_SetVariableCustomProfile($k6, "TS.iTemp_Kessel");
SetValue ($k6 , 65 );

$k7=CreateVariableByName($CatID_kessel, "min Kessel", 1);
IPS_SetVariableCustomProfile($k7, "TS.iTemp_Kessel");
SetValue ($k7 , 20 );

$k8=CreateVariableByName($CatID_kessel, "Korrektur_Kessel", 2);
IPS_SetVariableCustomProfile($k8, "TS.fTemp_Korektur");
SetValue ($k8 , 5 );

$k9=CreateVariableByName($CatID_kessel, "Kessel Hysterese", 1);
IPS_SetVariableCustomProfile($k9, "TS.iTemp_k");
SetValue ($k9 , 3 );

// Aussen
$a1=CreateVariableByName($CatID_aussen, "Hand_Auto", 0);
IPS_SetVariableCustomProfile($a1, "~Switch");
$a2=CreateVariableByName($CatID_aussen, "Soll Nacht", 1);
IPS_SetVariableCustomProfile($a2, "TS.iTemp_Kessel");
SetValue ($a2 , 10 );
$a3=CreateVariableByName($CatID_aussen, "Soll Tag", 1);
IPS_SetVariableCustomProfile($a3, "TS.iTemp_Kessel");
SetValue ($a3 , 21 );

$a4=CreateVariableByName($CatID_aussen, "Sommerumschaltung", 1);
IPS_SetVariableCustomProfile($a4, "TS.iTemp_Kessel");
SetValue ($a4 , 28 );

$a22=CreateVariableByName($CatID_aussen, "Temperatur_Aussen", 2);
IPS_SetVariableCustomProfile($a22, "TS.fTemp_aussen");

$VarID=CreateVariableByName($CatID_aussen, "Uhr Heizung", 0);
SetValue ($VarID , 1 );
IPS_SetVariableCustomProfile($VarID, "~Switch");
$AktID=CreateEventIDByName($VarID, 'Schaltuhr', 2);
IPS_SetEventScheduleAction($AktID, 0, "Nacht", 0xFF0000, "SetValue(\$_IPS['TARGET'], false);");
IPS_SetEventScheduleAction($AktID, 1, "Tag", 0x00FF00, "SetValue(\$_IPS['TARGET'], true);");
IPS_SetEventScheduleGroup($AktID, 0, 1);
IPS_SetEventScheduleGroup($AktID, 1, 2);
IPS_SetEventScheduleGroup($AktID, 2, 4);
IPS_SetEventScheduleGroup($AktID, 3, 8);
IPS_SetEventScheduleGroup($AktID, 4, 16);
IPS_SetEventScheduleGroup($AktID, 5, 32);
IPS_SetEventScheduleGroup($AktID, 6, 64);
IPS_SetEventActive($AktID, true);             //Ereignis aktivieren

$VarID=CreateVariableByName($CatID_aussen, "Uhr Speicher", 0);
SetValue ($VarID , 1 );
IPS_SetVariableCustomProfile($VarID, "~Switch");
$AktID=CreateEventIDByName($VarID, 'Schaltuhr', 2);
IPS_SetEventScheduleAction($AktID, 0, "Nacht", 0xFF0000, "SetValue(\$_IPS['TARGET'], false);");
IPS_SetEventScheduleAction($AktID, 1, "Tag", 0x00FF00, "SetValue(\$_IPS['TARGET'], true);");
IPS_SetEventScheduleGroup($AktID, 0, 1);
IPS_SetEventScheduleGroup($AktID, 1, 2);
IPS_SetEventScheduleGroup($AktID, 2, 4);
IPS_SetEventScheduleGroup($AktID, 3, 8);
IPS_SetEventScheduleGroup($AktID, 4, 16);
IPS_SetEventScheduleGroup($AktID, 5, 32);
IPS_SetEventScheduleGroup($AktID, 6, 64);
IPS_SetEventActive($AktID, true);             //Ereignis aktivieren

//Mischer
$m1=CreateVariableByName($CatID_Mischer, "Pumpe", 0);
IPS_SetVariableCustomProfile($m1, "~Switch");

$m2=CreateVariableByName($CatID_Mischer, "Mischer", 1);
IPS_SetVariableCustomProfile($m2, "TS.iMischer");

CreateVariableByName($CatID_Mischer, "Zustand", 3);
$m22 = CreateVariableByName($CatID_Mischer, "Vorlauf", 2);
IPS_SetVariableCustomProfile($m22, "TS.fTemp_Kessel");
$m222 = CreateVariableByName($CatID_Mischer, "Rücklauf", 2);
IPS_SetVariableCustomProfile($m222, "TS.fTemp_Kessel");

$m3=CreateVariableByName($CatID_Mischer, "Soll_Temperatur_Mischer", 2);
IPS_SetVariableCustomProfile($m3, "TS.fTemp_Kessel");
$m4=CreateVariableByName($CatID_Mischer, "Verstärkungsfaktor Proportionalregler", 2);
IPS_SetVariableCustomProfile($m4, "TS.fSteilheit");
SetValue ($m4 , 4.5 );

$m23 = CreateVariableByName($CatID_Mischer, "Regelabweichung", 2);
IPS_SetVariableCustomProfile($m23, "~Temperature.Difference");
$m5=CreateVariableByName($CatID_Mischer, "Steilheit", 2);
IPS_SetVariableCustomProfile($m5, "TS.fSteilheit");
SetValue ($m5 , 1.2 );
$m6=CreateVariableByName($CatID_Mischer, "Hysterese", 2);
IPS_SetVariableCustomProfile($m6, "TS.fTemp_k");
SetValue ($m6 , 0.3 );
$m7=CreateVariableByName($CatID_Mischer, "Korrektur_Mischer", 2);
IPS_SetVariableCustomProfile($m7, "TS.fTemp_Korektur");
SetValue ($m7 , 4 );
$m8=CreateVariableByName($CatID_Mischer, "Mischer Max", 1);
IPS_SetVariableCustomProfile($m8, "TS.iTemp_Kessel");
SetValue ($m8 , 60 );
$m9=CreateVariableByName($CatID_Mischer, "Mischer Min", 1);
IPS_SetVariableCustomProfile($m9, "TS.iTemp_Kessel");
SetValue ($m9 , 15 );
$m10=CreateVariableByName($CatID_Mischer, "Wartezeit", 1);
IPS_SetVariableCustomProfile($m10, "TS.iWartezeit");
SetValue ($m10 , 16 );

//Speicher
CreateVariableByName($CatID_Speicher, "Heizungs_Stellelement", 1);
$s21 = CreateVariableByName($CatID_Speicher, "Nachlaufzeit Pumpe Ist", 1);
IPS_SetVariableCustomProfile($s21, "TS.iNachlaufzeit");
$s1=CreateVariableByName($CatID_Speicher, "Nachlaufzeit Pumpe Soll", 1);
IPS_SetVariableCustomProfile($s1, "TS.iNachlaufzeit");
SetValue ($s1 , 16 );
$s2=CreateVariableByName($CatID_Speicher, "Pumpe", 0);
IPS_SetVariableCustomProfile($s2, "~Switch");
$s3=CreateVariableByName($CatID_Speicher, "Soll_Temperatur mitte", 2);
IPS_SetVariableCustomProfile($s3, "TS.fTemp_Kessel");
SetValue ($s3 , 51 );
$s4=CreateVariableByName($CatID_Speicher, "Soll_Temperatur unten", 2);
IPS_SetVariableCustomProfile($s4, "TS.fTemp_Kessel");
SetValue ($s4 , 40 );
$s22 = CreateVariableByName($CatID_Speicher, "Temperatur mitte", 2);
IPS_SetVariableCustomProfile($s22, "TS.fTemp_Kessel");
$s23 = CreateVariableByName($CatID_Speicher, "Temperatur oben", 2);
IPS_SetVariableCustomProfile($s23, "TS.fTemp_Kessel");
$s24 = CreateVariableByName($CatID_Speicher, "Temperatur unten", 2);
IPS_SetVariableCustomProfile($s24, "TS.fTemp_Kessel");
CreateVariableByName($CatID_Speicher, "Vorherige_Regelabweichung", 2);
CreateVariableByName($CatID_Speicher, "Zustand", 3);
$s25=CreateVariableByName($CatID_Speicher, "Hysterese", 2);
IPS_SetVariableCustomProfile($s25, "TS.fTemp_k");
SetValue ($s25 , 3 );

//------------------------------------------------------------------------------


// Skripte anlegen
$skript ='<?
if($_IPS["SENDER"] == "WebFront")
{
    SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
}
?>';
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 ='<?
if($_IPS["SENDER"] == "WebFront")
{
    SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
	if($_IPS["VALUE"] ==1) {
		exec (\'echo "1" > /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 ='<?
/*
Gpio Belegung :

Mischer auf     = GPIO 27 an
Mischer Zu      = GPIO 27 aus
Mischer Netz    = GPIO 17 aus = Mischer Netz an
Brenner         = GPIO 22
Pumpe Heizkreis = GPIO 23
Pumpe Speicher  = GPIO 24

1wire Bus       = GPIO 4
*/

/*
##############################################################
im /opt/gpio die Datei gpio_init.sh erzeugen :

#!/bin/sh
# Input-Ports (Taster)
for Port in  20 21
  do
  echo "$Port" > /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 ='<?
$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("GPIO Temperatur", $id2);
//------------------------------------------------------------------------------
 if($_IPS[\'SENDER\'] == "Execute")                // nur wenn bei "Ausführen"
 {
   CreateVariableByName($id3, "onewireId", 3);
   $onewireID = IPS_GetObjectIDByName("onewireId", $id3);
   SetValue($onewireID, "");
   $vid = CreateVariableByName($_IPS[\'SELF\'], "Running", 0);
   $eid = CreateEventIDByName($_IPS[\'SELF\'], "StartStop", 0);
   IPS_SetEventActive($eid, true);
   IPS_SetEventTrigger($eid, 0, $vid);
   IPS_SetEventScript($eid, $_IPS[\'SELF\']);
	$datei = file("/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves");
	$i=1;
	foreach($datei AS $dallas_id)
   {
	   $ds_id[$i]= $dallas_id;
      $wire = GetValue($onewireID);
      $wire = "".$wire." ".$ds_id[$i];
  	   SetValue($onewireID, $wire);
		$i++;
   }
 }
//------------------------------------------------------------------------------
// if($_IPS[\'SENDER\'] == "TimerEvent")             //

$zaehler = intval(exec(\'cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slave_count\'));
$onewireID = IPS_GetObjectIDByName("onewireId", $id3);

$wire = GetValue($onewireID);
$ds_id = explode(" ", $wire);
	for ($i = 1; ; $i++)
	{
	   if ($i > $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 ='<?
// Daten die vorgegeben werden müssen
$Kp=1; // 5 Kp = Verstärkungsfaktor Proportionalregler
$Ki=1; //2.5 Ki = Verstärkungsfaktor Integralregler
$Kd=1; //0 Kd = Verstärkungsfaktor Differenzialregler

$Script = IPS_GetScript($_IPS[\'SELF\']);
//$Ta = Round((time() - $Script[\'ScriptExecuted\'])/15,0); //Ta = Rechenschrittweite (Abtastzeit)

$SollTemperaturID = IPS_GetObjectIDByName("Soll_Temperatur_Kessel", IPS_GetParent($_IPS[\'SELF\']));
$IstTemperaturID = IPS_GetObjectIDByName("Temperatur", IPS_GetParent($_IPS[\'SELF\']));
$HeizungsStellelementID = IPS_GetObjectIDByName("Heizungs_Stellelement", IPS_GetParent($_IPS[\'SELF\']));
$VorherigeRegelabweichungID = IPS_GetObjectIDByName("Vorherige_Regelabweichung", IPS_GetParent($_IPS[\'SELF\']));
$bernnerID = IPS_GetObjectIDByName("Brenner", IPS_GetParent($_IPS[\'SELF\']));
$SpeicheranforderungID = IPS_GetObjectIDByName("Speicheranforderung", IPS_GetParent($_IPS[\'SELF\']));
$SollTemperaturSpeicherID = IPS_GetObjectIDByName("Soll_Temperatur_Speicherladung", IPS_GetParent($_IPS[\'SELF\']));
$SteilheitID = IPS_GetObjectIDByName("Steilheit", IPS_GetParent($_IPS[\'SELF\']));
$maxID = IPS_GetObjectIDByName("max Kessel",IPS_GetParent($_IPS[\'SELF\']));
$minID = IPS_GetObjectIDByName("min Kessel", IPS_GetParent($_IPS[\'SELF\']));
$Korrektur_KesselID = IPS_GetObjectIDByName("Korrektur_Kessel", IPS_GetParent($_IPS[\'SELF\']));
$Kessel_faktorID = IPS_GetObjectIDByName("Kessel Hysterese", IPS_GetParent($_IPS[\'SELF\']));

$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Aussentemperatur", $id2);
$HandID = IPS_GetObjectIDByName("Hand_Auto", $id3);
$UhrID = IPS_GetObjectIDByName("Uhr Heizung", $id3);
$Soll_TagID = IPS_GetObjectIDByName("Soll Tag", $id3);
$Soll_NachtID = IPS_GetObjectIDByName("Soll Nacht", $id3);
$IstTemperaturAussenID = IPS_GetObjectIDByName("Temperatur_Aussen", $id3);
$SommerID = IPS_GetObjectIDByName("Sommerumschaltung", $id3);

$Uhr = GetValue($UhrID);
$Hand = GetValue($HandID);
$max = GetValue($maxID);
$min = GetValue($minID);
$Aussentemp=GetValueFloat($IstTemperaturAussenID);;
$Steilheit = GetValue($SteilheitID);
$Korrektur_Kessel = GetValue($Korrektur_KesselID);
$Speicheranforderung = GetValue($SpeicheranforderungID);
$SollTemperaturSpeicher = GetValue($SollTemperaturSpeicherID);
$Soll_Tag = GetValue($Soll_TagID);
$Soll_Nacht = GetValue($Soll_NachtID);
$Sommer =GetValue($SommerID);
$Kessel_faktor = GetValue($Kessel_faktorID);

if ($Hand == 0)  { //Automatik ist an
	if ($Uhr == 1)  {
		$Raumsollwert= $Soll_Tag ;//12 Nacht
		} else{
		$Raumsollwert= $Soll_Nacht ;//12 Nacht
	}
//Sommer, Kesselsollwert
   if ($Aussentemp < $Sommer ) {
		$Vorlauftemperatur_Kessel=min(max(round((0.55*$Steilheit*(pow($Raumsollwert,($Aussentemp/(320-$Aussentemp*4))))*((-$Aussentemp+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max);
//		$Vorlauftemperatur_Kessel=min(max(  ((0.55*$Steilheit*(pow($Raumsollwert,($Aussentemp/(320-$Aussentemp*4))))*((-$Aussentemp+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max);

		$Kessel_soll = $Vorlauftemperatur_Kessel + $Kessel_faktor;
// Kesselschutz 38°C
		if ($Kessel_soll < $min) {
          SetValueFloat($SollTemperaturID, $min);
      }
// Maximalbegrenzung Kessel
		if ($Kessel_soll < $max) {
			SetValueFloat($SollTemperaturID, $Kessel_soll);
			} else {
			SetValueFloat($SollTemperaturID, $max);
		}
     } else{
// Ausentemp grösserr Raumsollwert
     SetValueFloat($SollTemperaturID, $min);
     }
}

//aktuelle Regelabweichung bestimmen
if ($Speicheranforderung == 0)
{
	$e = GetValueFloat($SollTemperaturID)- GetValueFloat($IstTemperaturID);#
}
else
{
	if (GetValueFloat($SollTemperaturID) < $SollTemperaturSpeicher)
	{
		$e = ($SollTemperaturSpeicher) - GetValueFloat($IstTemperaturID);
		SetValueFloat($SollTemperaturID, $SollTemperaturSpeicher);
	}
	else
	{
		$e = GetValueFloat($SollTemperaturID)- GetValueFloat($IstTemperaturID);#
	}
}

// Die vorherige Regelabweichung ermitteln
$ealt = GetValueFloat($VorherigeRegelabweichungID);

// Die Berechnung des neuen Regelwertes
//$y = ($Kp * $e + $Ki * $Ta * $esum + $Kd * ($e - $ealt) / $Ta);
$y = $Kp * $e;
$Stellwert=$y;
// Vorherige Regelabweichung durch jetzige ersetzen
SetValueFloat($VorherigeRegelabweichungID, $e);
// 6K - 8K  zwischen Brenner ein/aus
SetValueInteger($HeizungsStellelementID, $Stellwert);
if ($Hand == 0)  { //Automatik ist an

	If ($y < -$Kessel_faktor )
	    {
	   	exec (\'echo "1" > /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 ='<?
if($_IPS["SENDER"] == "WebFront")
{
   SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
	if($_IPS["VALUE"] ==0) {exec (\'echo "1" > /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 ='<?
// Define variables
$SteilheitID = IPS_GetObjectIDByName("Steilheit", IPS_GetParent($_IPS[\'SELF\']));
$maxID = IPS_GetObjectIDByName("max Kessel",IPS_GetParent($_IPS[\'SELF\']));
$minID = IPS_GetObjectIDByName("min Kessel", IPS_GetParent($_IPS[\'SELF\']));
$Korrektur_KesselID = IPS_GetObjectIDByName("Korrektur_Kessel", IPS_GetParent($_IPS[\'SELF\']));
$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Aussentemperatur", $id2);

$Soll_TagID = IPS_GetObjectIDByName("Soll Tag", $id3);
$Soll_NachtID = IPS_GetObjectIDByName("Soll Nacht", $id3);

$max = GetValue($maxID);
$min = GetValue($minID);
$Steilheit = GetValue($SteilheitID);
$Korrektur_Kessel = GetValue($Korrektur_KesselID);
$Soll_Tag = GetValue($Soll_TagID);
$Soll_Nacht = GetValue($Soll_NachtID);
$Raumsollwert= $Soll_Tag ;//12 Nacht

$Raumsollwert= 20;//$Soll_Tag ;//12 Nacht
$Korrektur_Kessel=0;
$max = 75;
$j=20;
for ( $i = 1; $i <= 550; $i++ ) {
//   $Values[$i] = min(max(round((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;
   $Values[$i] = min(max( ((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;

$Test[$i] = $Values[$i];
$temp[$i] = $j;

   $Values[$i] = 800 - $Values[$i] ;
   $j=$j-0.1;

}
$max = GetValue($maxID);
$Steilheit = GetValue($SteilheitID);
$Korrektur_Kessel = GetValue($Korrektur_KesselID);
$Raumsollwert= $Soll_Tag ;//12 Nacht

$j=20;
for ( $i = 1; $i <= 550; $i++ ) {
//   $Values[$i] = min(max(round((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;
   $Values2[$i] = min(max( ((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;
$Test2[$i] = $Values2[$i];
   $Values2[$i] = 800 - $Values2[$i] ;
   $j=$j-0.1;

}

$xPoint=50;
$yPoint=50;

$Image = imagecreate( 650, 650 );
#1st colour allocated is used for the image background
$backColour = imagecolorallocate( $Image, 250, 250, 250 );
#line colours
$colRed = imagecolorallocate( $Image, 250, 0, 0 );
$colBlue = imagecolorallocate( $Image, 0, 0, 250 );
$colGreen = imagecolorallocate( $Image, 0, 250, 0 );
$colGrey=imagecolorallocate($Image, 192, 192, 192);
$colGrey2=imagecolorallocate($Image, 150, 150, 150);
$colBlack=imagecolorallocate($Image, 2, 0, 0);

// Raster erzeugen
for ($i=5; $i<61; $i++){
imageline($Image, $i*10, 50, $i*10, 600, $colGrey);
imageline($Image, 50, $i*10, 600, $i*10, $colGrey);
}
for ($i=1; $i<13; $i++){
imageline($Image, $i*50, 50, $i*50, 600, $colGrey2);
imageline($Image, 50, $i*50, 600, $i*50, $colGrey2);
}
#draw x & y axis
imageline( $Image, $xPoint, 600, 600, 600, $colBlue );
imageline( $Image, $xPoint, 600, $xPoint, $yPoint, $colBlue );
imagestring( $Image, 3, 10, 50, "75\'C", $colRed);
imagestring( $Image, 3, 10, 100, "70\'C", $colRed);
imagestring( $Image, 3, 10, 150, "65\'C", $colRed);
imagestring( $Image, 3, 10, 200, "60\'C", $colRed);
imagestring( $Image, 3, 10, 250, "55\'C", $colRed);
imagestring( $Image, 3, 10, 300, "50\'C", $colRed);
imagestring( $Image, 3, 10, 350, "45\'C", $colRed);
imagestring( $Image, 3, 10, 400, "40\'C", $colRed);
imagestring( $Image, 3, 10, 450, "35\'C", $colRed);
imagestring( $Image, 3, 10, 500, "30\'C", $colRed);
imagestring( $Image, 3, 10, 550, "25\'C", $colRed);
imagestring( $Image, 3, 10, 600, "20\'C", $colRed);

imagestring( $Image, 3, 50, 625, "20\'C", $colBlue);
imagestring( $Image, 3, 100, 625, "15\'C", $colBlue);
imagestring( $Image, 3, 150, 625, "10\'C", $colBlue);
imagestring( $Image, 3, 200, 625, "5\'C", $colBlue);
imagestring( $Image, 3, 250, 625, "0\'C", $colBlue);
imagestring( $Image, 3, 300, 625, "-5\'C", $colBlue);
imagestring( $Image, 3, 350, 625, "-10\'C", $colBlue);
imagestring( $Image, 3, 400, 625, "-15\'C", $colBlue);
imagestring( $Image, 3, 450, 625, "-20\'C", $colBlue);
imagestring( $Image, 3, 500, 625, "-25\'C", $colBlue);
imagestring( $Image, 3, 550, 625, "-30\'C", $colBlue);


$xPoint=49;
$yPoint=50;
$xinterval=1;
$y1Point=$Values[1];
for ( $i = 1; $i <= 550; $i++ ) {
    $xPoint=$xPoint + $xinterval;
    #create dummy data
//   $Values[$i]=rand(100,400);
//echo($Test[$i]." ".$Values[$i]."  ".$y1Point." ".$temp[$i].chr(10));
    imageline( $Image, $xPoint, $y1Point, $xPoint + $xinterval, $Values[$i], $colGreen );
    $y1Point=$Values[$i];
}


$xPoint=49;
$yPoint=50;
$xinterval=1;
$y1Point=$Values2[1];
for ( $i = 1; $i <= 550; $i++ ) {
    $xPoint=$xPoint + $xinterval;
    #create dummy data
//   $Values[$i]=rand(100,400);
//echo($Test2[$i]." ".$Values2[$i]."  ".$xPoint.chr(10));
	 imageline( $Image, $xPoint, $y1Point, $xPoint + $xinterval, $Values2[$i], $colRed );
	 $y1Point=$Values2[$i];
}

//header(\'Content-Disposition: attachment; filename="bilddatei.png"\');

imagepng( $Image, "/usr/share/symcon/media/Heizkennline.png"  );
imagedestroy( $Image );
?>';
CreateScriptByName('graph1',$CatID_kessel,$skript);
IPS_SetHidden($ScriptID, true);

$skript ='<?
// Define variables
$SteilheitID = IPS_GetObjectIDByName("Steilheit", IPS_GetParent($_IPS[\'SELF\']));
$maxID = IPS_GetObjectIDByName("max Kessel",IPS_GetParent($_IPS[\'SELF\']));
$minID = IPS_GetObjectIDByName("min Kessel", IPS_GetParent($_IPS[\'SELF\']));
$Korrektur_KesselID = IPS_GetObjectIDByName("Korrektur_Kessel", IPS_GetParent($_IPS[\'SELF\']));
$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Aussentemperatur", $id2);
$id4= IPS_GetObjectIDByName("Regler Mischer", $id2);
$SteilheitID_mischer = IPS_GetObjectIDByName("Steilheit", $id4);
$maxID_mischer = IPS_GetObjectIDByName("Mischer Max",$id4);
$minID_mischer = IPS_GetObjectIDByName("Mischer Min", $id4);
$Korrektur_MischerID = IPS_GetObjectIDByName("Korrektur_Mischer", $id4);

$Soll_TagID = IPS_GetObjectIDByName("Soll Tag", $id3);
$Soll_NachtID = IPS_GetObjectIDByName("Soll Nacht", $id3);

$max = GetValue($maxID);
$min = GetValue($minID);
$Steilheit = GetValue($SteilheitID);
$Korrektur_Kessel = GetValue($Korrektur_KesselID);
$Soll_Tag = GetValue($Soll_TagID);
$Soll_Nacht = GetValue($Soll_NachtID);
$Raumsollwert= $Soll_Tag ;//12 Nacht


$Raumsollwert= 20;//$Soll_Tag ;//12 Nacht
$Korrektur_Kessel=0;
$max = 75;
$j=20;
for ( $i = 1; $i <= 550; $i++ ) {
//   $Values[$i] = min(max(round((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;
   $Values[$i] = min(max( ((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;

$Test[$i] = $Values[$i];
$temp[$i] = $j;

   $Values[$i] = 800 - $Values[$i] ;
   $j=$j-0.1;

}

$max = GetValue($maxID);
$Steilheit = GetValue($SteilheitID);
$Korrektur_Kessel = GetValue($Korrektur_KesselID);
$Raumsollwert= $Soll_Tag ;//12 Nacht

$j=20;
for ( $i = 1; $i <= 550; $i++ ) {
//   $Values[$i] = min(max(round((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;
   $Values2[$i] = min(max( ((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;
$Test2[$i] = $Values2[$i];
   $Values2[$i] = 800 - $Values2[$i] ;
   $j=$j-0.1;

}


$max_m = GetValue($maxID_mischer);
$min_m = GetValue($minID_mischer);
$Steilheit_m = GetValue($SteilheitID_mischer);
$Korrektur_Mischer = GetValue($Korrektur_MischerID);
$j=20;
for ( $i = 1; $i <= 550; $i++ ) {
//   $Values[$i] = min(max(round((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;
   $Values3[$i] = min(max( ((0.55*$Steilheit_m*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Mischer)*1)/1,$min_m),$max_m)* 10;
//$Test2[$i] = $Values2[$i];
   $Values3[$i] = 800 - $Values3[$i] ;
   $j=$j-0.1;

}

$xPoint=50;
$yPoint=50;

$Image = imagecreate( 650, 650 );
#1st colour allocated is used for the image background
$backColour = imagecolorallocate( $Image, 230, 230, 230 );
#line colours
$colRed = imagecolorallocate( $Image, 250, 0, 0 );
$colGelb = imagecolorallocate( $Image, 250, 100, 0 );
$colBlue = imagecolorallocate( $Image, 0, 0, 250 );
$colGreen = imagecolorallocate( $Image, 0, 250, 0 );
$colGrey=imagecolorallocate($Image, 192, 192, 192);
$colGrey2=imagecolorallocate($Image, 150, 150, 150);
$colBlack=imagecolorallocate($Image, 2, 0, 0);

// Raster erzeugen
for ($i=5; $i<61; $i++){
imageline($Image, $i*10, 50, $i*10, 600, $colGrey);
imageline($Image, 50, $i*10, 600, $i*10, $colGrey);
}
for ($i=1; $i<13; $i++){
imageline($Image, $i*50, 50, $i*50, 600, $colGrey2);
imageline($Image, 50, $i*50, 600, $i*50, $colGrey2);
}
#draw x & y axis
imageline( $Image, $xPoint, 600, 600, 600, $colBlue );
imageline( $Image, $xPoint, 600, $xPoint, $yPoint, $colBlue );
imagestring( $Image, 3, 10, 50, "75\'C", $colRed);
imagestring( $Image, 3, 10, 100, "70\'C", $colRed);
imagestring( $Image, 3, 10, 150, "65\'C", $colRed);
imagestring( $Image, 3, 10, 200, "60\'C", $colRed);
imagestring( $Image, 3, 10, 250, "55\'C", $colRed);
imagestring( $Image, 3, 10, 300, "50\'C", $colRed);
imagestring( $Image, 3, 10, 350, "45\'C", $colRed);
imagestring( $Image, 3, 10, 400, "40\'C", $colRed);
imagestring( $Image, 3, 10, 450, "35\'C", $colRed);
imagestring( $Image, 3, 10, 500, "30\'C", $colRed);
imagestring( $Image, 3, 10, 550, "25\'C", $colRed);
imagestring( $Image, 3, 10, 600, "20\'C", $colRed);

imagestring( $Image, 3, 50, 625, "20\'C", $colBlue);
imagestring( $Image, 3, 100, 625, "15\'C", $colBlue);
imagestring( $Image, 3, 150, 625, "10\'C", $colBlue);
imagestring( $Image, 3, 200, 625, "5\'C", $colBlue);
imagestring( $Image, 3, 250, 625, "0\'C", $colBlue);
imagestring( $Image, 3, 300, 625, "-5\'C", $colBlue);
imagestring( $Image, 3, 350, 625, "-10\'C", $colBlue);
imagestring( $Image, 3, 400, 625, "-15\'C", $colBlue);
imagestring( $Image, 3, 450, 625, "-20\'C", $colBlue);
imagestring( $Image, 3, 500, 625, "-25\'C", $colBlue);
imagestring( $Image, 3, 550, 625, "-30\'C", $colBlue);


$xPoint=49;
$yPoint=50;
$xinterval=1;
$y1Point=$Values[1];
for ( $i = 1; $i <= 550; $i++ ) {
    $xPoint=$xPoint + $xinterval;
    #create dummy data
//   $Values[$i]=rand(100,400);
//echo($Test[$i]." ".$Values[$i]."  ".$y1Point." ".$temp[$i].chr(10));
    imageline( $Image, $xPoint, $y1Point, $xPoint + $xinterval, $Values[$i], $colGreen );
    $y1Point=$Values[$i];
}


$xPoint=49;
$yPoint=50;
$xinterval=1;
$y1Point=$Values2[1];
for ( $i = 1; $i <= 550; $i++ ) {
    $xPoint=$xPoint + $xinterval;
    #create dummy data
//   $Values[$i]=rand(100,400);
//echo($Test2[$i]." ".$Values2[$i]."  ".$xPoint.chr(10));
	 imageline( $Image, $xPoint, $y1Point, $xPoint + $xinterval, $Values2[$i], $colRed );
	 $y1Point=$Values2[$i];
}

$xPoint=49;
$yPoint=50;
$xinterval=1;
$y1Point=$Values3[1];
for ( $i = 1; $i <= 550; $i++ ) {
    $xPoint=$xPoint + $xinterval;
    #create dummy data
//   $Values[$i]=rand(100,400);
//echo($Test2[$i]." ".$Values2[$i]."  ".$xPoint.chr(10));
	 imageline( $Image, $xPoint, $y1Point, $xPoint + $xinterval, $Values3[$i], $colGelb );
	 $y1Point=$Values3[$i];
}

//header(\'Content-Disposition: attachment; filename="bilddatei.png"\');

imagepng( $Image, "/usr/share/symcon/media/Heizkennline_k_m.png"  );
imagedestroy( $Image );
?>';
CreateScriptByName('graph2',$CatID_kessel,$skript);
IPS_SetHidden($ScriptID, true);

//------------------------------------------------------------------------------
$skript ='<?
///$Kp=1.5;//1.1; // 5 Kp = Verstärkungsfaktor Proportionalregler
$Ki=1; //2.5 Ki = Verstärkungsfaktor Integralregler
$Kd=1; //0 Kd = Verstärkungsfaktor Differenzialregler


$EinschaltzeitID = IPS_GetObjectIDByName("Einschaltzeit", ($_IPS[\'SELF\']));
$WartezeitID = IPS_GetObjectIDByName("Wartezeit", ($_IPS[\'SELF\']));
$actionID = IPS_GetObjectIDByName("Zustand", IPS_GetParent($_IPS[\'SELF\']));
$VorherigeRegelabweichungID = IPS_GetObjectIDByName("Regelabweichung", IPS_GetParent($_IPS[\'SELF\']));
$HystereseID = IPS_GetObjectIDByName("Hysterese",  IPS_GetParent($_IPS[\'SELF\']));
$MischerID = IPS_GetObjectIDByName("Mischer",  IPS_GetParent($_IPS[\'SELF\']));
$SteilheitID = IPS_GetObjectIDByName("Steilheit", IPS_GetParent($_IPS[\'SELF\']));
$Korrektur_MischerID = IPS_GetObjectIDByName("Korrektur_Mischer", IPS_GetParent($_IPS[\'SELF\']));
$PumpeID = IPS_GetObjectIDByName("Pumpe", IPS_GetParent($_IPS[\'SELF\']));
$KpID = IPS_GetObjectIDByName("Verstärkungsfaktor Proportionalregler", IPS_GetParent($_IPS[\'SELF\']));
$min_MischerID = IPS_GetObjectIDByName("Mischer Min", IPS_GetParent($_IPS[\'SELF\']));
$max_MischerID = IPS_GetObjectIDByName("Mischer Max", IPS_GetParent($_IPS[\'SELF\']));
$WartezeitVarID = IPS_GetObjectIDByName("Wartezeit", IPS_GetParent($_IPS[\'SELF\']));

$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Aussentemperatur", $id2);
$HandID = IPS_GetObjectIDByName("Hand_Auto", $id3);
$UhrID = IPS_GetObjectIDByName("Uhr Heizung", $id3);
$Soll_TagID = IPS_GetObjectIDByName("Soll Tag", $id3);
$Soll_NachtID = IPS_GetObjectIDByName("Soll Nacht", $id3);
$IstTemperaturAussenID = IPS_GetObjectIDByName("Temperatur_Aussen", $id3);
$SommerID = IPS_GetObjectIDByName("Sommerumschaltung", $id3);

$Aussentemp=GetValueFloat($IstTemperaturAussenID);
$Soll_Tag = GetValue($Soll_TagID);
$Soll_Nacht = GetValue($Soll_NachtID);
$Hand = GetValue($HandID);
$Uhr = GetValue($UhrID);
$Sommer =GetValue($SommerID);
//var_dump ($Hand);
$Soll_Temperatur_MischerID = IPS_GetObjectIDByName("Soll_Temperatur_Mischer", IPS_GetParent($_IPS[\'SELF\']));
$IstTemperaturID = IPS_GetObjectIDByName("Vorlauf", IPS_GetParent($_IPS[\'SELF\']));
$Hysterese =GetValueFloat($HystereseID);
$Steilheit = GetValue($SteilheitID);
$Korrektur_Mischer = GetValue($Korrektur_MischerID);
$Kp = GetValue($KpID);
$min_Mischer = GetValue($min_MischerID);
$max_Mischer = GetValue($max_MischerID);
$Wartezeit = GetValue($WartezeitVarID);

IPS_SetEventCyclic($WartezeitID, 0, 0, 0, 0, 1 ,$Wartezeit);

if ($Hand == 0)  { //Automatik ist an

	if ($Uhr == 1)  {
		$Raumsollwert= $Soll_Tag ;//12 Nacht
		} else{
		$Raumsollwert= $Soll_Nacht ;//12 Nacht
	}
//Sommer, Pumpe aus, Kessel aus, Mischer zu
   if ($Aussentemp < $Sommer ) {
      exec (\'echo "0" > /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 <= 2) {
	 	$Einschaltzeit = 2;
	 }
    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 = \'Auf\';
		    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 ='<?
if($_IPS["SENDER"] == "WebFront")
{
   SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
	if($_IPS["VALUE"] ==0) { // Mischer auf
		//Richtungsrelais ein
		exec (\'echo "0" > /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 ='<?
if($_IPS["SENDER"] == "WebFront")
{
   SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
	if($_IPS["VALUE"] ==0) {exec (\'echo "1" > /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 ='<?
$SteilheitID = IPS_GetObjectIDByName("Steilheit", IPS_GetParent($_IPS[\'SELF\']));
$maxID = IPS_GetObjectIDByName("Mischer Max",IPS_GetParent($_IPS[\'SELF\']));
$minID = IPS_GetObjectIDByName("Mischer Min", IPS_GetParent($_IPS[\'SELF\']));
$Korrektur_KesselID = IPS_GetObjectIDByName("Korrektur_Mischer", IPS_GetParent($_IPS[\'SELF\']));
$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Aussentemperatur", $id2);

$Soll_TagID = IPS_GetObjectIDByName("Soll Tag", $id3);
$Soll_NachtID = IPS_GetObjectIDByName("Soll Nacht", $id3);
$IstTemperaturAussenID = IPS_GetObjectIDByName("Temperatur_Aussen", $id3);
$max = GetValue($maxID);
$min = GetValue($minID);
$Steilheit = GetValue($SteilheitID);
$Korrektur_Kessel = GetValue($Korrektur_KesselID);
$Soll_Tag = GetValue($Soll_TagID);
$Soll_Nacht = GetValue($Soll_NachtID);
$Raumsollwert= $Soll_Tag ;
$Aussentemp=GetValueFloat($IstTemperaturAussenID);

$Raumsollwert= 20;
$Korrektur_Kessel=0;
$max = 75;
$j=20;
for ( $i = 1; $i <= 550; $i++ ) {
   $Values[$i] = min(max( ((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;
   $Values[$i] = 800 - $Values[$i] ;
   $j=$j-0.1;
}

$max = GetValue($maxID);
$Steilheit = GetValue($SteilheitID);
$Korrektur_Kessel = GetValue($Korrektur_KesselID);
$Raumsollwert= $Soll_Tag ;
$j=20;
for ( $i = 1; $i <= 550; $i++ ) {
   $Values2[$i] = min(max( ((0.55*$Steilheit*(pow($Raumsollwert,($j/(320-$j*4))))*((-$j+20)*2)+$Raumsollwert+$Korrektur_Kessel)*1)/1,$min),$max)* 10;
   $Values2[$i] = 800 - $Values2[$i] ;
   $j=$j-0.1;
}

$xPoint=50;
$yPoint=50;
$Image = imagecreate( 650, 650 );
$backColour = imagecolorallocate( $Image, 250, 250, 250 );
$colRed = imagecolorallocate( $Image, 250, 0, 0 );
$colBlue = imagecolorallocate( $Image, 0, 0, 250 );
$colGreen = imagecolorallocate( $Image, 0, 250, 0 );
$colGrey=imagecolorallocate($Image, 192, 192, 192);
$colGrey2=imagecolorallocate($Image, 150, 150, 150);
$colBlack=imagecolorallocate($Image, 2, 0, 0);

// Raster erzeugen
for ($i=5; $i<61; $i++){
imageline($Image, $i*10, 50, $i*10, 600, $colGrey);
imageline($Image, 50, $i*10, 600, $i*10, $colGrey);
}
for ($i=1; $i<13; $i++){
imageline($Image, $i*50, 50, $i*50, 600, $colGrey2);
imageline($Image, 50, $i*50, 600, $i*50, $colGrey2);
}

#draw x & y axis
imageline( $Image, $xPoint, 600, 600, 600, $colBlue );
imageline( $Image, $xPoint, 600, $xPoint, $yPoint, $colBlue );
imagestring( $Image, 3, 10, 20, "Kennline Mischer, rot = mit Niveau, gruen = nur Steilheit : ".$Steilheit, $colBlack);

imagestring( $Image, 3, 10, 50, "75\'C", $colRed);
imagestring( $Image, 3, 10, 100, "70\'C", $colRed);
imagestring( $Image, 3, 10, 150, "65\'C", $colRed);
imagestring( $Image, 3, 10, 200, "60\'C", $colRed);
imagestring( $Image, 3, 10, 250, "55\'C", $colRed);
imagestring( $Image, 3, 10, 300, "50\'C", $colRed);
imagestring( $Image, 3, 10, 350, "45\'C", $colRed);
imagestring( $Image, 3, 10, 400, "40\'C", $colRed);
imagestring( $Image, 3, 10, 450, "35\'C", $colRed);
imagestring( $Image, 3, 10, 500, "30\'C", $colRed);
imagestring( $Image, 3, 10, 550, "25\'C", $colRed);
imagestring( $Image, 3, 10, 600, "20\'C", $colRed);

imagestring( $Image, 3, 50, 625, "20\'C", $colBlue);
imagestring( $Image, 3, 100, 625, "15\'C", $colBlue);
imagestring( $Image, 3, 150, 625, "10\'C", $colBlue);
imagestring( $Image, 3, 200, 625, "5\'C", $colBlue);
imagestring( $Image, 3, 250, 625, "0\'C", $colBlue);
imagestring( $Image, 3, 300, 625, "-5\'C", $colBlue);
imagestring( $Image, 3, 350, 625, "-10\'C", $colBlue);
imagestring( $Image, 3, 400, 625, "-15\'C", $colBlue);
imagestring( $Image, 3, 450, 625, "-20\'C", $colBlue);
imagestring( $Image, 3, 500, 625, "-25\'C", $colBlue);
imagestring( $Image, 3, 550, 625, "-30\'C", $colBlue);
imagestring( $Image, 3, 50, 605, "Aussen: ".$Aussentemp."\'C", $colBlue);

$xPoint=49;
$yPoint=50;
$xinterval=1;
$y1Point=$Values[1];
for ( $i = 1; $i <= 550; $i++ ) {
    $xPoint=$xPoint + $xinterval;
    imageline( $Image, $xPoint, $y1Point, $xPoint + $xinterval, $Values[$i], $colGreen );
    $y1Point=$Values[$i];
}

$xPoint=49;
$yPoint=50;
$xinterval=1;
$y1Point=$Values2[1];
for ( $i = 1; $i <= 550; $i++ ) {
    $xPoint=$xPoint + $xinterval;
	 imageline( $Image, $xPoint, $y1Point, $xPoint + $xinterval, $Values2[$i], $colRed );
	 $y1Point=$Values2[$i];
}

header(\'Content-Disposition: attachment; filename="Mischer.png"\');
imagepng( $Image, "/usr/share/symcon/media/Mischer.png"  );
imagedestroy( $Image );
?>';
CreateScriptByName('graph',$CatID_Mischer,$skript);
IPS_SetHidden($ScriptID, true);

//------------------------------------------------------------------------------

$skript ='<?
// Daten die vorgegeben werden müssen
$Kp=1; // 5 Kp = Verstärkungsfaktor Proportionalregler
$Ki=1; //2.5 Ki = Verstärkungsfaktor Integralregler
$Kd=1; //0 Kd = Verstärkungsfaktor Differenzialregler

$SollTemperaturUntenID = IPS_GetObjectIDByName("Soll_Temperatur unten", IPS_GetParent($_IPS[\'SELF\']));
$SollTemperaturMitteID = IPS_GetObjectIDByName("Soll_Temperatur mitte", IPS_GetParent($_IPS[\'SELF\']));
$IstTemperaturID = IPS_GetObjectIDByName("Temperatur unten", IPS_GetParent($_IPS[\'SELF\']));
$IstTemperaturMitteID = IPS_GetObjectIDByName("Temperatur mitte", IPS_GetParent($_IPS[\'SELF\']));

$HeizungsStellelementID = IPS_GetObjectIDByName("Heizungs_Stellelement", IPS_GetParent($_IPS[\'SELF\']));
$VorherigeRegelabweichungID = IPS_GetObjectIDByName("Vorherige_Regelabweichung", IPS_GetParent($_IPS[\'SELF\']));
$PumpeID = IPS_GetObjectIDByName("Pumpe", IPS_GetParent($_IPS[\'SELF\']));
$ZustandID = IPS_GetObjectIDByName("Zustand", IPS_GetParent($_IPS[\'SELF\']));
$HystereseID = IPS_GetObjectIDByName("Hysterese", IPS_GetParent($_IPS[\'SELF\']));

$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Kessel", $id2);
$IstTemperaturKesselID = IPS_GetObjectIDByName("Temperatur", $id3);
$SpeicheranforderungID = IPS_GetObjectIDByName("Speicheranforderung", $id3);
$id3= IPS_GetObjectIDByName("Regler Aussentemperatur", $id2);
$Uhr_Speicher = IPS_GetObjectIDByName("Uhr Speicher", $id3);
$Uhr = GetValueBoolean($Uhr_Speicher);
$HandID= IPS_GetObjectIDByName("Hand_Auto", $id3);
$Hand = GetValue($HandID);

$IstTemperaturKessel = GetValueFloat($IstTemperaturKesselID);
$IstTemperaturMitte = GetValueFloat($IstTemperaturMitteID);
$SollTemperaturMitte = GetValueFloat($SollTemperaturMitteID);
$IstTemperaturUnten = GetValueFloat($IstTemperaturID);
$SollTemperaturUnten = GetValueFloat($SollTemperaturUntenID);
$Hysterese = GetValue($HystereseID);

//aktuelle Regelabweichung bestimmen
$e = $SollTemperaturUnten - $IstTemperaturUnten;
// Die vorherige Regelabweichung ermitteln
$ealt = GetValueFloat($VorherigeRegelabweichungID);
// Die Berechnung des neuen Regelwertes
//$y = ($Kp * $e + $Ki * $Ta * $esum + $Kd * ($e - $ealt) / $Ta);
$y = $Kp * $e;
$Stellwert=$y;
// Vorherige Regelabweichung durch jetzige ersetzen
SetValueFloat($VorherigeRegelabweichungID, $e);
SetValueInteger($HeizungsStellelementID, $Stellwert);

if ($Hand == 0)
{ //Automatik ist an
	if ($Uhr == 1)
	{
		If ($y >= $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 <= 0 )
	   {
//			   	exec (\'echo "1" > /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 ='<?
$NachlaufzeitID = IPS_GetObjectIDByName("Nachlaufzeit", ($_IPS[\'SELF\']));
$NachlaufSollID = IPS_GetObjectIDByName("Nachlaufzeit Pumpe Soll", IPS_GetParent($_IPS[\'SELF\']));
$NachlaufIstID = IPS_GetObjectIDByName("Nachlaufzeit Pumpe Ist", IPS_GetParent($_IPS[\'SELF\']));
$NachlaufIstAltID = IPS_GetObjectIDByName("Nachlaufzeit Pumpe Alt", IPS_GetParent($_IPS[\'SELF\']));

$PumpeID = IPS_GetObjectIDByName("Pumpe", IPS_GetParent($_IPS[\'SELF\']));
$TemperaturMitteID = IPS_GetObjectIDByName("Temperatur mitte", IPS_GetParent($_IPS[\'SELF\']));
$TemperaturUntenID = IPS_GetObjectIDByName("Temperatur unten", IPS_GetParent($_IPS[\'SELF\']));

$id = IPS_GetParent($_IPS[\'SELF\']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("Regler Kessel", $id2);
$SpeicheranforderungID = IPS_GetObjectIDByName("Speicheranforderung", $id3);
$Kessel_istID = IPS_GetObjectIDByName("Temperatur", $id3);
$Speicheranforderung = GetValue($SpeicheranforderungID);
$Nachlauf_soll= GetValue($NachlaufSollID);
$Nachlauf_ist= GetValue($NachlaufIstID);
$Nachlauf_ist_alt= GetValue($NachlaufIstAltID);
$Kessel_ist = GetValue($Kessel_istID);
$SpeicherMitte = GetValue($TemperaturMitteID);
$SpeicherUnten = GetValue($TemperaturUntenID);
$ZustandID = IPS_GetObjectIDByName("Zustand", IPS_GetParent($_IPS[\'SELF\']));

if ($Speicheranforderung == 0){
	$Nachlauf_ist=$Nachlauf_ist+1;
	SetValue($NachlaufIstID, $Nachlauf_ist);
	IPS_SetEventCyclic($NachlaufzeitID, 0, 0, 0, 0, 1 ,60);
	if ($Nachlauf_ist >= $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 <= $SpeicherMitte){
  if ($Kessel_ist-3 <= $SpeicherUnten){
		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 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 ='<?
if($_IPS["SENDER"] == "WebFront")
{
   SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
	if($_IPS["VALUE"] ==0) {exec (\'echo "1" > /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);
    }
}

?>

Hi,

Ich hab nun noch einen Pi2 bekommen und teste diese Woche mal, wie das umsetzbar ist und wo ich Probleme habe/sehe.