Heizungssteuerung mit Parameterdatei

Das Script steuert die Heizung mittels FHT-Modul(e). Es ist damit möglich, über eine einfache ASCII-Datei das Temperaturprofil für den Tag, bzw. die ganze Woche vorzugeben.
Die Parameterdatei (in diesem Falle "Heizung_Bad.par) für das Bad-Temperatur-Profil sieht folgendermaßen aus:

Montag;07:00;16.0
Montag;21:30;22.5
Montag;22:10;16.0
Dienstag;06:00;22.5
... usw.

Die Datei ist einfach erweiterbar - einfach an irgendeine Stelle einen neuen Temperaturumschaltpunkt in der gleichen Form einfügen.

Wichtig für die Funktion: Das Script führt man als Eventscript (Heizungssteuerung) ein und erstellt, z.B. mit dem Timer-Wizard, ein zusätzliches Timer-Event, welches z.B. alle 30 min. das Script (Heizungssteuerung) ausführt.

$hour=date("H");
$minute=date("i");
$time = $hour.":".$minute;
$heute = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
$tag = date("w");

$handle = fopen("D:\Heizung_Bad.par","r");
while ($line = fgets($handle, 1000))
{
	$parameter = explode(";", $line);	//[0]-Tag, [1]-(Ab)Zeit, [2]-Temperatur
	$day=$parameter[0];
	$switchtime=$parameter[1];
	$temp=$parameter[2];
	if($day == $heute[$tag])	//Tag erkannt
	{
		if($time > $switchtime)
			$newtemp = $temp;
	}
}
fclose($handle);
echo $newtemp;
SetValueFloat("Bad_Temp_Soll", (float)$newtemp);
FHT_SetTemperature(18958, (float)$newtemp);

dies war der erste Schuss die Steuerung umzusetzen - ich werde versuchen das alles noch etwas zu verfeinern. Für Vorschläge und Ideen bin ich immer offen.

Hallo Retiarius

habe jetzt jetzt mal angefangen zu üben und versuche gerade mit deinem Script meine Heizung im Bad zu steuern.

Aber leide bekomme ich wenn ich das Scprit ausführe folgende Meldung im Output-Fenster:

Warning: Unable to locate IPSVariable: Bad_Temp_Soll in line 31

Da ich ja blutiger Anfänger bin hoffe ich auf eine Tip von Dir was da noch falsch laufen könnte.

Vielen dank im voraus

Gruss
Horst

Hab’s glaube ich schon selber gefunden,
man muss natürlich auch eine variable haben :rolleyes:

Gruss
Horst

Hallo Fruende …

Probier mal dies hier …


<?
/*
*******************************
 IP-SYNCOM Event Scripting
*******************************
*/
//File: GetTemp.ips.php
//
if (!defined(sdefined)){
   include_once("scripts/GlobalDefines.ips.php");
}
// ********** USER SETTINGS *******************************************
   // see this file for additional explanation
   $tempfilepath=__myhome."tempsettings.ini";

   // use this switch weather or not to overrule general settings
   // the effect is that if IPS-variable "__imhome" = true
   // the default + (high) temperature is sent as the result of
   // this function
   $use_imhome = false;
// ********** END OF USER SETTINGS ************************************

//debug
#$thisinstanz = "vliv_temp";
//END DEBUG

// MODIFIE BEYOND THESE LINE ON OWN RISK
//
$ldebug = GetValueBoolean("__debug");
$handle=fopen("$tempfilepath", "r");
if (!$handle){
   // error cannot open file
   echo("ERROR : CANNOT OPEN FILE : '$tempfilepath'
");
}
$now = getdate();
$isholiday = false;
$holiday="";
$season = "";
$today="";
$alldays="";
$weekend="";
$imhome=false;
if ($use_imhome) $imhome = GetValueBoolean("__imhome");
while(!feof($handle)) {
   $buffer = fgets($handle);
   Switch (substr($buffer,0,1)) {
   case "@":
      //general settings
      if (substr($buffer,1,7) == "season=") {
         $season = substr($buffer,8,1);
      }
      if (substr($buffer,1,1) == "H") {
         // HOLIDAY SCHEISS compare today with holidays
         if (($now["mon"]."/".$now["mday"] == substr($buffer,2,-2)) or ($now["mon"]."/".$now["mday"]."/".$now["year"] == substr($buffer,2,-2))) {
               $isholiday = true;
         }
      }
      break;
   case "D":
      //DEFAULT lines
      if (substr($buffer,1,1) == "$season") $default = substr($buffer,27,48);
      break;
   case "H":
      //HOLIDAY table entries
         if ($isholiday) {
            if (substr($buffer,1,1) == "$season") $holiday = substr($buffer,27,48);
         }
      break;
   case "I":
      //Table entries
      if (chop(substr($buffer,4,14)) == $thisinstanz) {
         if ((substr($buffer,1,1) == "$season") and (substr($buffer,2,1) == "9")) $alldays = substr($buffer,27,48);
         if ((substr($buffer,1,1) == "$season") and (substr($buffer,2,1) == "7") and (($now["wday"]+0) > 4)) $weekend = substr($buffer,27,48);
         if ((substr($buffer,1,1) == "$season") and (substr($buffer,2,1) == $now["wday"])) $today = substr($buffer,27,48);
      }
      break;
   default:
      //only thing to expect are comments '#' and temp settings
      if (substr($buffer,0,1) <> "#") {
         $temp[substr($buffer,0,1)] = substr($buffer,1,5);
      }
   }
}
fclose($handle);
if ($ldebug) {
$thisday = $now["wday"];
echo("
RESULT
--------
");
echo("thisinstanz     :'$thisinstanz'
");
echo("now             :'". $now["hours"] .":". $now["minutes"] . "'
");
echo("today is nr#    : $thisday
");
echo("season          : $season
");
echo("Is it a holiday : $isholiday
");
echo("Check precendence hereunder
");
echo("holiday         : $holiday
");
echo("today           : $today
");
echo("weekends        : $weekend
");
echo("alldays         : $alldays
");
echo("default rule    : $default
");
echo("Am I home ?     : $imhome
");
if ($holiday == "") {
   if ($today == "") {
      if ($weekend == "") {
         if ($alldays == "") {
            $result = $default;
         } else {
            $result = $alldays;
         }
      } else {
         $result = $weekend;
      }
   } else {
      $result = $today;
   }
} else {
   $result = $holiday;
}
echo("I did choose    : '$result'
");
// here we get the temperature out of string
$pos = $now["hours"]*2 + floor($now["minutes"]/30);
$soll = $temp[substr($result,$pos,1)];
if ($use_imhome and $imhome) {
   $soll = $temp["+"];
   $status = "OVERRULED  set to";
} elseif ($use_imhome) {
   $soll = $temp["-"];
   $status = "OVERRULED  set to";
} else {
   $status = substr($result,$pos,1)."     : ";
}
echo("SOLLwert $status'". $soll ."'
");
SetValueFloat("vliv_temp_soll",($soll+0));

?>

und weiter diesem datei : $__myhome/tempsettings.ini


#            *******************
#            *  IPS Timetable  *
#            *******************
#
#    by GGGss under GPL license
#    31/07/2005
#    used in gettemp.ips.php version 0.1 rev 0
#  
#
#    lines starting with '#' are not taken into consideration
#    these settings use 3 'chapters'
#      * settings      -> user definable settings
#      * holidays      -> the dates used to trigger 'H'-lines in timetable
#      * timetable     -> settings in a 30 min. timeframe
#      * temperatures  -> the symbols used in timetable get their values here
#
#    ************   Settings   *************
//    season : S (summer) or W (winter)
@season=W
#
#     *************  Holidays  *****************
#
#      Start the line with 'H' and date
#      mm/dd  for fixed dates (recurring every year)
#      or mm/dd/yyyy
#
#  BELGIAN HOLIDAYS
@H12/31    #    Newyear's eve
@H01/01     #      Newyear
@H03/20    #    My birthday  yihaah 
@H05/01    #    workers holiday
@H07/11    #    Flemish holiday
@H07/21    #    National holiday
@H11/01    #    All saints
@H11/11    #    End of WW1
@H12/25    #    Christmasday
@H04/16/2006    #    Easter
@H05/25/2006    #    Jezus goes up the stairs ;-)
@H06/04/2006    #    and orders the appostels to continue his work
@H08/15/2006    #    Maria goes up the stairs
#
#    ************  Time table  *************
#
#     Season : W for Winter; S for Summer; H for holiday rules
#     Day    : 0 to 6 for mo - su
#              7 for weekends (sa & su)
#              9 for everyday
#     Sensor : name of the FHT 8(0)b to be triggered
#     Use Symbols to fill the timetable 
#     they switch to corresponding temp. settings - > See #temperatures
#     if it can't find an applicable rule it will take the Default 'D' one
#     D = Default  - ALWAYS USE
#     (precedence rule)
#     season & holiday -> season & day -> season & weekends -> season & everyday -> season & default
#
#Season            T T   H 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 
#| day             1 2   O 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 
#|| sensor         x x   U 030303030303030303030303030303030303030303030303
#|| |              x x   R 000000000000000000000000000000000000000000000000
DS  default        x x     --------------+++++------------------+++++++----
DW  default        x x     -------------++++++----------------+++++++++----
IS9 vliv_temp      x x     |||||||||||||||OOO||||||||||||||||||XXXXXXXXX|||
IW2 vliv_temp      x x     OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
HS9 vliv_temp      x x     ||||||||||||||||XXXXOOOOOOOOOOOOOOOOOOOOXXXXXX||
HW9 vliv_temp      x x     ||||||||||||||||XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX||
#
#     ************  Temperatures  *************
#
#      Use symbol in table and start the line with that symbol
#      DO NOT USE D, W, S, H or T or I symbols
#      - default min. temp
#      + default max. temp
#
-15.50
+20.00
|15.00
O19.00
X21.00
#
#      END WITH BLANK LINE (CR/LF)

Nur noch welche variablen in GlobalDefine-script eingeben aund fixie

  • __myhome
  • __debug
    (Bei bedarf sende ich gerne meine GlobalDefines…)

PS: Beta … habe noch ein macken mit ‚IAmHome‘ (Ich Bin Zuhause).
Brauche eure Inteligenz

PS2: Möchte dies gerne in die ‚Beispiele‘-Forum reingeben … aber lieber erst Ihre Kommentare

Grusse,
Fredtchen (aka gggss)

Hallo Hort…
ich habe das Script mittlerweile noch etwas modifiziert.


$hour=date("H");
$minute=date("i");
$time = $hour.":".$minute;
$heute = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
$tag = date("w");

$Temp_Mode=GetValueBoolean("Bad_Temp_Mode");
if($Temp_Mode==False)   //Heizung im Automatikbetrieb
{
   //Alten Zustand einlesen - nur für erste Zeit am Tag wichtig
   $newtemp=GetValueFloat("Bad_Temp_Soll"); 

   $handle = fopen("C:/Programme/IP-SYMCON/web/Parameter/Heizung_Bad.par","r");
   while ($line = fgets($handle, 1000))
   {
     $parameter = explode(";", $line);	//[0]-Tag, [1]-(Ab)Zeit, [2]-Temperatur
     $day=$parameter[0];
	  $switchtime=$parameter[1];
	  $temp=$parameter[2];
	  if($day == $heute[$tag])	//Tag erkannt
	  {
         if($time > $switchtime)
            $newtemp = $temp;
     }
   }
   fclose($handle);
   echo "Sollwert Temperatur Bad [°C]: ".$newtemp;
   SetValueFloat("Bad_Temp_Soll", (float)$newtemp);
   FHT_SetTemperature(18958, (float)$newtemp);
}

die Erweiterung besteht lediglich darin, dass wenn du dein Heizungsmodul auf Manuell stellst (via IPS und dann auch die Variable „Bad_Temp_Mode“ auf true setzt) die Heizungssteuerung ignoriert wird. Bsp: „Party-Taste“ an der normalen Heizung - du willst mal Abends länger warm haben. Modul auf Manuell, Temperatur vorgeben und fertig - die Heizungssteuerung setzt dann erst wieder ein wenn du zurück in den Automatikmodus gehst.

Ich werde auf jeden Fall noch weiter an der Steuerung basteln, da es an einigen Stellen noch nicht ganz „wasserdicht“ ist. Hab nur derzeit wenig Zeit dafür. Wenn du Fragen hast kannst du dich aber gerne melden.
Cu René

@Retiarius

werde Dein neues script mal ausprobieren.
Allerdings habe ich noch ein Problem, fang ja erst mit IP-Syncon an und habe absolut keine Ahnung von PHP :frowning:

Du hast geschrieben man sollte einen Timer Event mit dem Wizard erstellen der z.b. alle 30 min. das Heizungs-Script startet und genau da liegt mein Problem.

Wie kann ich denn im Timer Wizard angeben das dass Script Heizung alle 15 oder 30min. ausgeführt wird :confused:

Habe leider mit der Suchfunktion keine Beschreibung finden können.

Gruss

Horst

Wenn ich das Script v

Hallo Horst,

um ein Skript alle 15 bzw. 30 Minuten auszuführen, benutzt man besser die „Timer Settings“
des betreffenden Skripts: STRG + T
Für 15 Minuten trägt man dann 900 (15 * 60) in „Timer Settings“ ein und schließt anschließend das
Fenster mit

Gruß MST

PS: die Online-Hilfe wird überarbeitet … bei Fragen also ruhig melden…

@Steiner

Danke werde mal versuchen ob ich das hinbekomme :smiley:

… bei Fragen also ruhig melden…

das werde ich sicher noch oft machen :wink:

Gruss
Horst

Hallo Horst,

hier eine noch kleine Übung:

Vorher:
Eine Variable vom Typ “Integer” mit dem Namen “Zähler” hinzufügen
(in „Variables“ rechte Maustaste, „Add Variable“).
Die „Timer Settings“ des Skripts: STRG + T auf 1 setzen
und anschließend das Fenster mit schließen


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
*/
//File: Plus_Eins.ips.php
$zaehler = GetValueInteger("Zähler");
$zaehler = $zaehler +1;
echo $zaehler;
SetValueInteger("Zähler", $zaehler);
?>

Die Variable sollte nun jede Sekunde um eins erhöht werden (in „Variables“)
und im „Kernel“ im Reiter „Debug“ sollte auch ein entsprechender Hinweis stehen.

Gruß MST

@Steiner,

feine Übung, hat geklappt.

Gruss
Horst

Teil zwei folgt …

MST

Ich habe in einigen freien Minuten die Heizungssteuerung um einen weiteren Komfortpunkt erweitert.

Ergänzung: Wird am Heizungsregler (Stellrad) die Temperatur verändert (ich nenne das mal manuellen Eingriff in die Automatik) erkennt dies nun IPS und wird diesen Heizungsregler für 2 Stunden (kann man natürlich anpassen) in den Manuellmodus schalten, so dass dieser Regler von der Automatik für diese Zeit ausgeschlossen ist.

Beispiel: Die Automatik (nach der Parameterdatei) sieht für den Zeitraum zwischen 18 Uhr und 21.30 Uhr im Bad eine Temperatur von 18°C vor. Man will aber in dieser Zeit das Badezimmer nutzen - so stellt man kurzerhand am Stellrad die gewünschte Temperatur ein - IPS registriert dies und wird den Regler vom Automatikmodus ausschließen (hierbei würde die Heizung sonst wieder auf 18°C abgesenkt) - nach ca. 2h setzt IPS den Regler wieder in die Automatik und alles läuft nach der Parameterdatei weiter.

Der Eingriff in die bisherigen Scripte ist etwas größer - es müssen weitere Variablen erstellt und neue Scripte hinzugefügt werden. Ich hoffe ich kann die Idee soweit rüberbingen das ihr es leicht selber umsetzen könnt. Ansonsten einfach fragen.

Ich führe die Erweiterung an einem Beispiel aus
Als erstes die zusätzlichen Variablen:
(float)Bad_Temp_Param

das Script der Heizungssteuerung (Triggerung alle 30 min.)


$hour=date("H");
$minute=date("i");
$time = $hour.":".$minute;
$heute = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
$tag = date("w");

//Badezimmer
$Temp_Mode=GetValueInteger("Bad_Temp_Mode");
if($Temp_Mode==False)   //Heizung im Automatikbetrieb
{
   $newtemp=GetValueFloat("Bad_Temp_Soll"); //Alten Zustand einlesen - nur für erste Zeit am Tag wichtig

   $handle = fopen("C:/Programme/IP-SYMCON/web/Parameter/Heizung_Bad.par","r");
   while ($line = fgets($handle, 1000))
   {
     $parameter = explode(";", $line);	//[0]-Tag, [1]-(Ab)Zeit, [2]-Temperatur
     $day=$parameter[0];
	  $switchtime=$parameter[1];
	  $temp=$parameter[2];
	  if($day == $heute[$tag])	//Tag erkannt
	  {
         if($time > $switchtime)
            $newtemp = $temp;
     }
   }
   fclose($handle);
   echo "Sollwert Temperatur Bad [°C]: ".$newtemp;
   SetValueFloat("Bad_Temp_Param", (float)$newtemp);
   SetValueFloat("Bad_Temp_Soll", (float)$newtemp);
   FHT_SetTemperature(18958, (float)$newtemp);
}

das neue Script „Temp_Change“ (Triggerung durch die Soll-Variablen (target-state) der Regler:


if($IPS_SENDER=="Variable")
{
   SetValueString("Global_Variable",$IPS_VARIABLE);
   switch($IPS_VARIABLE)
   {
      case "Bad_Temp_Soll":
      if(GetValueFloat("Bad_Temp_Soll")!=GetValueFloat("Bad_Temp_Param"))
      {
         FHT_SetMode(18958, 1);                       //in Manuellmodus setzen
         SetValueInteger("Bad_Temp_Mode",1);
         IPS_SetScriptTimer("Bad_Temp_Ext",7000);  //ca. 2h halten
      }
      break;
   }
}

und ein Script zum Rücksetzen des Reglers - hier Name: „Bad_Temp_Ext“, dieses wird durch das Script „Temp_Change“ automatisch mit einem Timer versehen:


FHT_SetMode(18958, 0);  //Mode in Automatik
SetValueInteger("Bad_Temp_Mode",0);
IPS_SetScriptTimer("Bad_Temp_Ext",0);   //Timer aus

wahrscheinlich geht es wie so oft auch etwas leichter (weniger umfangreich), aber ich habe jetzt erst mal diese Lösung realisiert und beim Testen hat alles soweit funktioniert.

Hallo Retiarius,

habe Dein neues Script zur Heizungssteuerung getestet, klappt bestens :slight_smile:

Danke das Du es im Forum zur Verfügung gestellt hast.

Danke für das Script.

Hier noch ein kleiner Tipp:


 if($IPS_SENDER=="Variable") 
{ 
//SetValueString("Global_Variable",$IPS_VARIABLE);  <-- war für Debug?
   switch($IPS_VARIABLE) 
   { 
	  case "Bad_Temp_Soll": 
	  if(GetValueFloat("Bad_Temp_Soll")!=GetValueFloat("Bad_Temp_Param")) 
	  { 
		 FHT_SetMode(18958, 1);					 //in Manuellmodus setzen 
		 SetValueInteger("Bad_Temp_Mode",1); 
		 IPS_SetScriptTimer("Temp_Change",7000);  //ca. 2h halten 
	  } 
	  break; 
   } 
}

if($IPS_SENDER=="TimerEvent") {
 FHT_SetMode(18958, 0);  //Mode in Automatik 
 SetValueInteger("Bad_Temp_Mode",0); 
 IPS_SetScriptTimer("Temp_Change",0);   //Timer aus  
}


Dadurch spart man pro FHT 1 Script :slight_smile:

Man könnte, wenn man alle FHT’s mit einen Script erschlagen wollen würde… eine Variablenstruktur nehmen z.B. FHT_NAME_Mode , SollTemp… Diese dann jeweils ausschneiden, damit man weiß welcher FHT gesendet und überprüft werden soll. Das Script „Temp_Change“ alle 5 Min triggern, per GetUpdateTime „Bad_Temp_Mode“ abfragen wegen des 2h Timeouts… :wink: Ist dann aber nicht mehr so einfach Nachvollziehbar :smiley:

Grüße, paresy

was ich noch vergessen hatte…

natürlich führen nicht nur die manuellen Änderungen am Heizungsregler direkt zu einem „Umgehen“ der Automatik, sondern auch Änderungen die z.B. über das WebInterface durchgeführt werden…

Habe aber leider immer noch keine Ahnung wie ich es hinbekomme die Soll Temp. über das Web_interface zu setzen :mad:

Hallo Retarius,

ups, die Funktion habe ich schon eine Weile da ich versehentlich diese Zeile

if($Temp_Mode==False) //Heizung im Automatikbetrieb

mit meiner FHTMode Variablen verbunden habe.

Ich habe jetzt noch bemerkt, das der Regler bei Aktivierung der Urlaubsfunktion den Wert „2“ und bei der Partyfunktion den Modewert „3“ zurückgibt. So kann man diese Funktionen auch einfach nutzen ohne viel programmieren zu müssen.

Grüße Keule

Moin,

super Script und jetzt das Ganze an einem Stück zum Downloaden :rolleyes:

Danke

@Retiarius

Kann es sein das Dein Script auch in den manuellen Modus schaltet wenn das interne Programm vom FHT die Temperatur ändert?

Wohn_Temp_Mode steht bei mir nämlich heute morgen auf 1, das passt genau zu der Zeit wenn die FHT die Kompfort Temp. einstellt.

das müsste so sein…ich habe bei mir alle internen Programme deaktiviert. aber im script erkennst du ja, dass die übermittelte Temperatur vom FHT mit der „letzten bekannten“ Temperatur vergleichen wird - ist die ungleich wird auf manuell gestellt.

Ich denke ich werde das Script auch noch erweitern - muss selber erst mal alle „Fallstricke“ erörten und schauen was man noch so rausholen kann.

Aber danke schonmal für den Hinweis!