Heizungsautomatik unterbrechen

Hallo zusammen,

alles, was Licht ist, läuft hier inzwischen zu meiner vollsten Zufriedenheit, das nächste Projekt ist die Heizung.

Zum Einsatz kommen ein 230V Stellantrieb über eine FS20 Funksteckdose und eine FHT80B.

Ich habe hier im Forum das Script gefunden, welches die Soll-Temperaturen für die jeweiligen Tage und Zeiten aus einer Textdatei ausliest. Funktioniert auch alles einwandfrei. Das Script wird immer dann ausgeführt, wenn die FHT80B die Temperatur sendet. Da dieses teilweise aber sehr lange dauert, wird das Script zusätzlich alle 5 Minuten ausgeführt.

Mein Problem ist, dass ich über die FHT80B keinen Einfluss auf die Temperatur habe. Stelle ich am Rad eine andere Temperatur ein, so sehe ich die auch im IPS, jedoch kommt irgendwann mein Script und macht die Änderung Rückgängig - somit läuft die Automatik wieder so, als ob nichts wäre. Das bedeutet, dass der Drehregler im Moment völlig wertlos ist. Ich vermute daher, dass mein Script vom Ansatz her eher ungünstig gestrickt ist.

Das Ziel soll sein, dass die Automatik so lange läuft, bis jemand am Drehrad eine andere Temperatur einstellt (WAF :)). Diese soll dann über einen Zeitraum von einer Stunde gehalten werden, danach soll die Automatik wieder einsetzen. Gleichzeitig soll nicht weiter geheizt werden, wenn das Fenster offen ist.

Kann mir jemand ein paar Denkantöße oder Code-Schnipsel zur Verfügung stellen?

Danke und Gruß,
Christoph

Hallo Christoph,

ich lasse IPS nur dann steuern solage sich der FHT im Automatik-Modus befindet.

Das bedeutet, dass ich bevor ich am Rad drehe erst in den manuelle Modus umschalte.

Ich hänge mal mein Script dran…kann man sicher schöner entwickeln…bin leider ein PHP DAU.:cool:

getriggert wird das ganze alle 3 Minuten.

<?
$haus_status = GetValueInteger(48148 /*[fs20\fht\HausStatus]*/);
$Zähler = GetValueInteger(45432 /*[fs20\fht\ZählerFht]*/);
$r = IPS_GetEvent(23428 /*[fs20\fht\FHT_Script\]*/);
$time = $r[NextRun]; //bzw. aus mysql spalte auslesen und dann in variable speichern
SetValueString(33887 /*[fs20\fht\FHT_Script\NextRun]*/,date("H:i",$time));




switch ($Zähler) {

 case 1:
		IPS_LogMessage("Z14 FHT_Script","Zähler ".$Zähler);
		$IdFht = 48609 /*[fs20\fht\WohnzimmerFHT80b]*/;
		$FHT_Mode = GetValueInteger(IPS_GetObjectIDByName("Target Mode",$IdFht));
		IPS_LogMessage("Z17 FHT_Script","Hausstatus = ".$haus_status." --> Mode = ".$FHT_Mode." von ".IPS_GetName($IdFht)." Funktion SetFht wird aufgerufen");
		setFht ($IdFht,$haus_status,$FHT_Mode);
		
		break;

 case 2:

		IPS_LogMessage("Z24 FHT_Script","Zähler ".$Zähler);
		$IdFht = 11309 /*[fs20\fht\KücheFHT80b]*/;
		$FHT_Mode = GetValueInteger(IPS_GetObjectIDByName("Target Mode",$IdFht));
		IPS_LogMessage("Z34 FHT_Script","Hausstatus = ".$haus_status." --> Mode = ".$FHT_Mode." von ".IPS_GetName($IdFht)." Funktion SetFht wird aufgerufen");
		setFht ($IdFht,$haus_status,$FHT_Mode);

	 break;

 case 3:

		IPS_LogMessage("Z34 FHT_Script","Zähler ".$Zähler);
		$IdFht = 50363 /*[fs20\fht\FlurFHT80b]*/;
		$FHT_Mode = GetValueInteger(IPS_GetObjectIDByName("Target Mode",$IdFht));
		IPS_LogMessage("Z34 FHT_Script","Hausstatus = ".$haus_status." --> Mode = ".$FHT_Mode." von ".IPS_GetName($IdFht)." Funktion SetFht wird aufgerufen");
		setFht ($IdFht,$haus_status,$FHT_Mode);
	 break;
	 
	 case 4:

		IPS_LogMessage("Z43 FHT_Script","Zähler ".$Zähler);
		$IdFht = 36600 /*[fs20\fht\BadFHT80b]*/;
		$FHT_Mode = GetValueInteger(IPS_GetObjectIDByName("Target Mode",$IdFht));
		IPS_LogMessage("Z43 FHT_Script","Hausstatus = ".$haus_status." --> Mode = ".$FHT_Mode." von ".IPS_GetName($IdFht)." Funktion SetFht wird aufgerufen");
		setFht ($IdFht,$haus_status,$FHT_Mode);
	 break;
	 case 5:

		IPS_LogMessage("Z43 FHT_Script","Zähler ".$Zähler);
		$IdFht = 53667 /*[fs20\fht\GäsetWcFHT80b]*/;
		$FHT_Mode = GetValueInteger(IPS_GetObjectIDByName("Target Mode",$IdFht));
		IPS_LogMessage("Z43 FHT_Script","Hausstatus = ".$haus_status." --> Mode = ".$FHT_Mode." von ".IPS_GetName($IdFht)." Funktion SetFht wird aufgerufen");
		setFht ($IdFht,$haus_status,$FHT_Mode);
	 break;

 }

if ($Zähler < 5)
	{
	SetValueInteger(45432 /*[fs20\fht\ZählerFht]*/ ,(GetValueInteger(45432 /*[fs20\fht\ZählerFht]*/)+1));
	}
else
	{
	SetValueInteger(45432 /*[fs20\fht\ZählerFht]*/ ,1);
	}


function SetFht($IDFHT,$haus_status,$FHT_Mode)
 {

	if ($FHT_Mode != 0)
	{
		IPS_LogMessage("Z54 FHT_Script","Fht_Mode ".$FHT_Mode." --> Exit !! --> ".IPS_GetName($IDFHT));
		return;
	}

 if ($haus_status == 1)
 	{
	$Path = "C:/IP-Symcon/fhtpara/".$IDFHT."_FHT.par";
	$newtemp =	GetNewTemp($Path);
	 }

 if ($haus_status == 0)
 	{
	$Path = "C:/IP-Symcon/fhtpara/".$IDFHT."_FHTNacht.par";
	$newtemp=	GetNewTemp($Path);
 	}

 if ($haus_status == 2)
 	{
	$Path = "C:/IP-Symcon/fhtpara/party.par";
	$newtemp=	GetNewTemp($Path);
 	}


 if ($haus_status == 3)
 	{
	$newtemp= GetValueFloat(IPS_GetObjectIDByName("TempManuell",$IDFHT));
   IPS_LogMessage("Z101 FHT_Script"," Neue Temp im ".IPS_GetName($IDFHT)." auf ". $newtemp." gesetzt --> Hausstatus  ".$haus_status." --> FHT_Mode ".$FHT_Mode." --> Target ".$Target." --> TargetPending ".$TargetPending);
 	}


$Target = GetValueFloat(IPS_GetObjectIDByName("Target Temperature",$IDFHT));
$TargetPending = GetValueFloat(IPS_GetObjectIDByName("Target Temperature (Pending)",$IDFHT));

//echo "Target ".$Target;
//echo "TargetPending ".$TargetPending;
//echo $newtemp;

	if ($Target == $newtemp)
	{
		IPS_LogMessage("Z114 FHT_Script","Keine Änderung notwendig -->TargetTemp ".$Target." --> TargetPending ".$TargetPending." --> Newtemp ".$newtemp." -->".IPS_GetName($IDFHT));
	}
	else
	{
      FHT_SetTemperature($IDFHT,(float)$newtemp);
      IPS_LogMessage("Z119 FHT_Script"," Neue Temp im ".IPS_GetName($IDFHT)." auf ". $newtemp." gesetzt --> Hausstatus  ".$haus_status." --> FHT_Mode ".$FHT_Mode." --> Target ".$Target." --> TargetPending ".$TargetPending);
	}

}

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


		$handle = fopen($Path,"r");
      while ($line = fgets($handle, 1000))
            {
             $parameter = explode(";", $line); //[0]-Day, [1]-Start Time, [2]-Temperature
             $day=$parameter[0];
             $switchtime=$parameter[1];
             $temp=$parameter[2];
             if (($day == $heute[$tag]) AND ($time > $switchtime))
        				{
                  $newtemp = substr($temp,0,4); // extract the "
" from the file

            }
            }
      fclose($handle);

return $newtemp;
}

?>

Jürgen

Mal eine allgemeine Frage, vielleicht bissl off-topic, also sorry im Vorhinein.
Wie sieht das mit den FHT80b überhaupt aus, liefern die DIREKT einen Wert zu IPS, oder brauchen die eine Zeit? Ich glaub ich hatte mal vor 1-2 Jahren irgendwo gelesen, dass die auch nur zyklisch senden. Stimmt das?

Ja, das stimmt, die Werte kommen nicht sofort.

Hallo,

erstmal zum FHT selbst: die Übertragung findet nur rund alle zwei Minuten statt (meine streuen von 115 - 118 Sekunden). Für Heizungsanlagen ist eine demzufolge durchschnittliche Reaktionszeit von rund einer Minute aber egal. Die „thermische Ansprechzeit“ liegt um eine vielfaches höher.

zum ursprünglichen Problem von DerStandart:
Um hier besser helfen zu können, solltest Du erstmal posten, welches Script Du verwendest…

Ich verwende eine (sehr stark) abgewandelte Version von Fredjes sFHTs.
Mein Ansatz ging dahin, dass ich eine Lockout-Time festlege (tagsüber 90-120 Minuten, nachts nur halbe Stunde), in welcher das Senden blockiert wird. Die Zeit wird dabei nicht von Beginn des Lock sondern von der letzten manuellen Betätigung gerechnet.

Solltest Du ebenfalls das sFHTs verwenden, kann ich gern mal meine Variante posten.

Grüße
Fabian

Hallo zusammen,

sFHTs war mir bis eben noch kein Begriff. Das, was ich im Wiki darüber gelesen habe, sieht sehr gut aus.

Aber:
Dadurch, dass ich zwar die FHT80B im Einsatz habe, aber nicht die ELV-Stellantriebe, sondern 230V Stellantriebe glaube ich, dass das Script dann nicht das Richtige für mich ist? Wenn ich das richtig überblicke, sendet das Script die Temperaturen an die FHT80B und die regelt entsprechend die Ventile.

Mein jetziges Script vergleicht alle 5 Minuten die Raumtemperatur mit der Soll-Temperatur und schaltet ggf. über FS20 den Stellantrieb an. Ich bin mir nicht sicher, ob sFHTs dann das richtige für mich ist? Es muss doch irgend eine Lösung geben :slight_smile:

Gruß,
Christoph

Ich nochmal :slight_smile:

Wenn ich es richtig verstehe, kann ich die Steuerung der „Heizszenen“ über sFHTs laufen lassen. Das Schalten der Heizung kann ich ja theoretisch weiterhin über mein jetziges Script laufen lassen, dass alle X Minuten die IST-Temperatur mit der SOLL-Temperatur verglichen werden und ggf. die Heizung eingeschaltet wird.

Bis jetzt habe ich nur noch eine Frage.
Wenn ich „am Rad drehe“, wie lange bleibt die eingestellte Temperatur aktiv?

Gruß,
Christoph

Daraus kann ich jetzt nur schließen, dass Du die Regelung durch reinen Soll-Ist Vergleich in IPS gelöst hast, und den FHT nur als „Geber“ benutzt…

Dies und die Temperaturvorgabe durch ein Tages-/Wochenprofil sind zwei unterschiedliche Probleme. Es sollten sinnvollerweise hier auch zwei Scripte zum Einsatz kommen.

Das gehört eindeutig in das Script für das Temp-Profil.

Die Steuerung der Antriebe solltest Du nur als Umsetzung des Pos-Wertes vom FHT realisieren:


$cycletime = 6 * 60; // gewünschte Zykluszeit in Sekunden (hier 6 min, Zykluszeit zum vollständigen Öffen/Schließen des Stellantirebes)
$pos = GetValue(12345/*ID der pos-Variablen*/);

$duration = $cycletime * $pos / 100;
FS20_SwitchDuration(47011/*ID der FS20-Steckdose*/, $duration);

die Codeschnipsel sollen nur als Anhalt dienen und wurden so nicht von mir getestet…
Trigger: alle 6 Minuten

Grüße
Fabian

Nabend,

habe festgestellt, dass das sFHTs in der Form, wie es per Download zur Verfügung steht, wohl nicht mit V2.1 kompatibel ist.

Ich muss mal schauen, ob meine PHP-Kenntnisse soweit ausreichen, dass ich das hinkriegen.

Gruß,
Christoph

Hallo zusammen,

ich bin mit meinem Script ein bißchen weitergekommen.

Probleme bereiten mir ein paar Zeilen Code, der irgendwo bei Zeile 108 stehen müsste:

$lastrun=IPS_GetLastRun("GetTemp");

Fehlermeldung:

Call to undefined funktion IPS_GetLastRun

Hier weiß ich leider nicht, was ich machen muss, um den Code V2-konform zu modifizieren. Kann mir jemand helfen?

Darüber hinaus habe ich noch ein Problem:
Das Script liest die Soll-Temperaturen aus der tempsettings.ini korrekt aus und sendet die Werte an die FHT80B. Drehe ich jedoch am Rad und stelle eine andere Temperatur ein, so wird diese auch übernommen, aber leider nur so lange, bis das FHT80B die IST-Temperatur sendet. Ab diesem Zeitpunkt habe ich wieder die Soll-Temperatur aus der tempsettings.ini. Ich vermute, dass ich das Script evtl. falsch triggere? Ich triggere es direkt auf die Temperatur-Variable der FHT80B. Hab ich was falsch verstanden? Würde mich über Antworten freuen.

Danke und Gruß,
Christoph

Die „lastrun“-Zeile kann man auskommentieren, hat keine Verwendung.

Für den Rest müsste man das geänderte Script sehen…
Auch die zugehörigen Logdateien (-abschnitte) wären gut

Gruß
Fabian

Hallo Fabian,

habe die Zeile auskommentiert - nun gibt es keine Fehlermeldungen mehr.

Hier das Script:


<?

 /*
*******************************
 IP-SYNCOM Event Scripting
*******************************
*/
//File: sFHTs.ips.php   PUBLIC       : 0.70   date  08/11/06
//File: sFHTs.ips.php   BETA VERSION : 0.69   date  04/11/06 '7' settings in .ini weekend bad interpret bug by Prof
//File: sFHTs.ips.php   BETA VERSION : 0.68   date  01/11/06 flank-detection problem due to TimerEvent and RunScript
//File: sFHTs.ips.php   BETA VERSION : 0.67   date  29/10/06 flank-detection doesn't work in S regime. bug by Torsteng
//File: sFHTs.ips.php   BETA VERSION : 0.66   date  18/06/06 Back to basic - no good
//File: sFHTs.ips.php   BETA VERSION : 0.65   date  18/06/06 semaphore test
//File: sFHTs.ips.php   BETA VERSION : 0.64   date  17/06/06 debug switch
//File: sFHTs.ips.php   PUBLIC       : 0.63   date  23/01/06
//
//Events : __imhome, __imaway, __party and all FHT_status-intervention variables
/*
Copyright rules applie under GNU-regulations
rest of copyright text ToDo
*/

// Variablen
$V_IMHOME = 18357 /*[OG\Zimmer 1\Heizung\Variablen\__imhome]*/ ;
$V_IMAWAY = 18351 /*[OG\Zimmer 1\Heizung\Variablen\__imaway]*/ ;
$V_PARTY = 48393 /*[OG\Zimmer 1\Heizung\Variablen\__party]*/ ;
$V_INHIBIT = 13117 /*[OG\Zimmer 1\Heizung\Variablen\__fht_inhibit]*/ ;
$V_DEBUG = 41022  /*[OG\Zimmer 1\Heizung\Variablen\__debug]*/;



include("GlobalDefines.ips.php");
   /* variables needed in GlobalDefines.ips.php !!
      see "tempsettings.ini" and modifie to your environment /*

   /**********  USER SETTINGS  ***********************************************/
   $tempfilepath=__myhome."tempsettings.ini"; //default: 'tempsettings.ini'
   //              |---> defined in GlobalDefines.ips.php

   $use_imhome = true;
   // Note : A IPS variabele '__iamhome' should exist !!
      /* use this switch to overrule general settings
      the effect is that if IPS-variable "__imhome" = true
      the HOLIDAY temperature is sent as the result of
      this function
      !! ATTENTION  BETA WORK !!
      19/11/2005 :  I am not happy with how this implemented but it's a start
      */

   $use_imaway = true;
   // Note : A IPS variabele '__iamaway' should exist !!
      /* use this switch to overrule general settings
      the effect is that if IPS-variable "__imaway" = true
      the AWAY temperature is sent as the result of
      this function
      !! ATTENTION  BETA WORK !!
      */

   $use_party = true;
   // Note : A IPS variabele '__party' should exist !!
      /* For all the party people out there ;-)
      Do YOU Like the Way YOU Feel when YOU Shake
      the effect is that if IPS-variable "__party" = true
      the party settings applie without checking days or dates.
      So starting on a Saturday will set party temperatures until
      you set __party=false on the Wednesday. (Oh my God what a party)
      */
   /**********  END OF USER SETTINGS  ****************************************/

   /**********  ADAPTATION TO YOUR ENVIROMENT  *******************************
   Every FHT has to have 2 variables with the names hereunder
   v(your-name)_soll : f.i. "vliv_temp_soll" = FHT soll temp in livingroom
   o(your-name)      : f.i. "oliv_temp" = device ID of the
                            FHT instance (set in GlobalDefines.ips.php)
   ***********  END ADAPTATION  **********************************************/

   /**********  DEBUG SWITCHES  **********************************************/
   $softswitch = true; /*    Send the temp-settings to FHT or not
                             If you're debugging set it to false
                             so FHZ won't be overbuffered            */
   $use_sollwert = false;
   $sollwert = "19";      //is 'use_sollwert' = true then take this value

   // if you want a master-debug switch : create an IPS variabele "__debug"
   if (IPS_VariableExists($V_DEBUG)){
      $debug = GetValueBoolean($V_DEBUG);
   } else {
      $debug = true;   // set to true if you want to enable echo-output
   }
   /* logfilepath since we are dealing with variables which cannot be show in
      the direct output window.                                              */
   $logfilepath=__mylogs."Heizung/tempSENT.txt";

//   $IPS_SENDER = "TimerEvent";

   /**********  END DEBUG  ***************************************************/

if ($IPS_SENDER == "Designer"){
//do not run when event is triggered by designer
   return;
}
if (IPS_VariableExists($V_INHIBIT)){
   if (GetValueBoolean($V_INHIBIT)){
      if($debug) echo("INHIBITED by '__fht_inhibit'");
      return;
   }
}
if ($IPS_SENDER == "Variable"){
   /* Switch ONLY when __imaway becomes true or __imhome becomes true
      die if false -> script will be triggered in max 30 minutes.
      if settings change from imhome -> imaway, then FHZ buffer get's
      overbuffered because script did run 2 times
      imhome -> false, imaway -> true x 5 FHT-devices = buffer overrun */
   if ($IPS_VARIABLE == "__imaway" && !GetValueBoolean($V_IMAWAY)) die;
   // die when imhome = false
   if ($IPS_VARIABLE == "__imhome" && !GetValueBoolean($V_IMAHOME)) die;
   if ($IPS_VARIABLE == "__party" && !GetValueBoolean($V_PARTY)) die;
   //$lastrun=IPS_GetLastRun("GetTemp");
}
if (!file_exists("$tempfilepath")) {
   echo("

******* ERROR: Please install '$tempfilepath'

");
   die;
}
if (!file_exists("$tempfilepath")) {
   echo("

******* ERROR: Please install '$tempfilepath'

");
   die;
}
$handle=fopen("$tempfilepath", "r");
if (!$handle){
   // error cannot open file
   echo("******* ERROR: Cannot open file '$tempfilepath'
");
}
//init variable
$aktor = array();
$now = getdate();
$isholiday = false;
$isparty = false;
$holiday="";
$season = "";
$today="";
$alldays="";
$weekend="";
$imhome=false;
$party=false;
$temp_rule="";
if ($use_imhome && IPS_VariableExists($V_IMHOME)){
   $imhome = GetValueBoolean($V_IMHOME);
} elseif ($use_imhome) {
   echo("

******* NOTICE: Variabele '__imhome' not found as a valid IPS variabele

");
   $imhome = false;
} else {
   $imhome = false;
}
if ($use_imaway && IPS_VariableExists($V_IMAWAY)){
   $imaway = GetValueBoolean($V_IMAWAY);
} elseif ($use_imaway) {
   echo("

******* NOTICE: Variabele '__imaway' not found as a valid IPS variabele

");
   $imaway = false;
} else {
   $imaway = false;
}
if ($use_party && IPS_VariableExists($V_PARTY)){
   $party = GetValueBoolean($V_PARTY);
} elseif ($use_party) {
   echo("

******* NOTICE: Variabele '__party' not found as a valid IPS variabele

");
   $party = false;
} else {
   $party = false;
}
// the serious work   start with settin' the inhibit switch
SetValueBoolean($V_INHIBIT,true);
// end modifie

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") {
         if ((sprintf("%02d",$now["mon"])."/".sprintf("%02d",$now["mday"]) == substr($buffer,2,5)) or (sprintf("%02d",$now["mon"])."/".sprintf("%02d",$now["mday"])."/".$now["year"] == substr($buffer,2,10))) {
            $isholiday = true;
            $temp_rule = substr($buffer,strpos($buffer,"#")+1,strlen($buffer)-strpos($buffer,"#")-3);
            if ($debug) echo "temp rule : $temp_rule";
         }
      }
      break;
   case "D":
      //DEFAULT lines
      if (substr($buffer,1,1) == "$season" && chop(substr($buffer,4,14))=="default"){
          // get default default or default room
          // aktor("default" -> $default OR "room" -> $default)
          $default = substr($buffer,27,48);
      } elseif (substr($buffer,1,1) == "$season") {
         $aktor[chop(substr($buffer,4,14))]["default"] = substr($buffer,27,48);
      }
      break;
   case "H":
      //HOLIDAY table entries
      if ($isholiday) {
         // NOTE THEM DOWN IN array[aktor,["holiday"]
         if (substr($buffer,1,1) == "$season") $aktor[chop(substr($buffer,4,14))]["holiday"]= substr($buffer,27,48);
      } else {
         if (substr($buffer,1,1) == "$season") $aktor[chop(substr($buffer,4,14))]["iamhome"]= substr($buffer,27,48);
      }
      break;
   case "I":
      //Table entries
      // GET RID OF THIS INSTRUCTION    GET THEM ALLL ;-)
      // array[substr(....),alldays, weekends, thisday]
      // ???? Should we apply precendence RULE here ??
      // WE SHOULD HAVE ALL INFO --> see tempfile.ini
      // SO HERE WE DEPEND THE RULE TO APPLY
      // WHAT IF NOT ?? NO APPLICABLE ENTRY ?? THEREFORE ALL THESE IF INSTRUCTIONS
         if ((substr($buffer,1,1) == "$season") and (substr($buffer,2,1) == "9")) $aktor[chop(substr($buffer,4,14))]["alldays"] = substr($buffer,27,48);
         if ((substr($buffer,1,1) == "$season") and (substr($buffer,2,1) == "7") and (($now["wday"] == 0) or ($now["wday"] == 6))) $aktor[chop(substr($buffer,4,14))]["weekend"] = substr($buffer,27,48);
         if ((substr($buffer,1,1) == "$season") and (substr($buffer,2,1) == $now["wday"])) $aktor[chop(substr($buffer,4,14))]["today"]= substr($buffer,27,48);
      break;
   case "W":
      // IamAway settings
      if (substr($buffer,1,1) == "$season" && chop(substr($buffer,4,14))=="default"){
          // get default default or default room
          // aktor("default" -> $default OR "room" -> $default)
          if ($imaway) $default = substr($buffer,27,48);
      }
      break;
   case "P":
      // PaAaRtY settings
      // no date-jump will occure !!
      // tryout 26/11/2005
      if (substr($buffer,1,1) == "$season") $aktor[chop(substr($buffer,4,14))]["party"]= substr($buffer,27,48);
      break;
   default:
      //only thing to expect are comments '#' and temp settings
      // PUT IN ARRAY !!! WE NEED THEM LATER
      // USE array[sign => value]
      if (substr($buffer,0,1) <> "#") {
         $temp[substr($buffer,0,1)] = substr($buffer,1,5);
      }
   }
}
$temp["0"]=false;
$temp["1"]=true;
fclose($handle);
if ($debug) {
   foreach($aktor as $key => $value){
      $thisday = $now["wday"];
      if ($debug) echo("
RESULT for '$key'
--------
");
      if ($debug) echo("  now             :'". $now["hours"] .":". $now["minutes"] . "'
");
      if ($debug) echo("  today is nr#    : $thisday
");
      if ($debug) echo("  season          : $season
");
      if ($debug) echo("  Is it a holiday : $isholiday
");
      if ($debug) echo("  Check precendence hereunder
");
      if ($debug) echo("  Am I home ?     : $imhome
");
      if(array_key_exists("iamhome",$value) && $debug)echo("  IAmHome         : ".$aktor[$key]["iamhome"]."
");
      if ($debug) echo("  Am I away ?     : $imaway
");
      if(array_key_exists("iamaway",$value) && $debug)echo("  IAmAway         : ".$aktor[$key]["iamaway"]."
");
      if(array_key_exists("holiday",$value) && $debug)echo("  holiday         : ".$aktor[$key]["holiday"]."
");
      if ($debug) echo("  Paaaartyy ?     : $party
");
      if(array_key_exists("party",$value) && $debug)echo("  Party           : ".$aktor[$key]["party"]."
");
      if(array_key_exists("today",$value) && $debug)echo("  today           : ".$aktor[$key]["today"]."
");
      if(array_key_exists("weekend",$value) && $debug)echo("  weekends        : ".$value["weekend"]."
");
      if(array_key_exists("alldays",$value) && $debug)echo("  alldays         : ".$aktor[$key]["alldays"]."
");
      if(array_key_exists("default",$value) && $debug)echo("  default rule    : ".$aktor[$key]["default"]."
");
      if ($debug) echo("  def. def. rule: $default
");
      if ($debug) echo("--------------------------------------------------
");
   } //for
} //if
/* precendence rules
   ON ALL ELEMENTS OF ARRAY = Aktors
   VARIABLES = FIELDS OF ARRAY ("AKTOR" [ROOMDEFAULT, HRule, DayRULE, RESULT, soll)
   NEGATIVE LOGIC    Variables are filled in IF applicable */
if ($debug) echo"

";
foreach($aktor as $key => $value){
   if (!array_key_exists("holiday", $value)) {
      if (!array_key_exists("today", $value)) {
         if (!array_key_exists("weekend", $value)) {
            if (!array_key_exists("alldays", $value)) {
               if (!array_key_exists("default", $value)) {
                  $aktor[$key]["result"] = $default;
                  if ($debug) echo "res = def. def";
               } else {
                  $aktor[$key]["result"] = $value["default"];
                  if ($debug) echo "res = default";
               } // if
            } else {
               $aktor[$key]["result"] = $value["alldays"];
               if ($debug) echo "res = alldays";
            }
         } else {
            $aktor[$key]["result"] = $value["weekend"];
            if ($debug) echo "res = weekend";
         }
      } else {
         $aktor[$key]["result"] = $value["today"];
         if ($debug) echo "res = today";
      }
   } else {
      $aktor[$key]["result"] = $value["holiday"];
      if ($debug) echo "res = holiday";
   }
   // attempt to set IAmHome rule !!
   if ($use_imhome and $imhome) {
      if (array_key_exists("iamhome", $value)){
         $aktor[$key]["result"] = $value["iamhome"];
         echo "
OVERRULED RESULT set to HOLIDAY because I AM HOME
";
      }
   }
   // attemp to set Away-rule
   if ($use_imaway and $imaway) {
      $aktor[$key]["result"] = $default;
      if ($debug) echo ("
OVERRULED RESULT set to AWAY
");
   }
   // attempt to set Party rule !!
   if ($use_party and $party) {
      if (array_key_exists("party", $value)){
         $aktor[$key]["result"] = $value["party"];
         echo "
OVERRULED RESULT set to PaAaRrTYyyyy
";
      }
   }
   if ($debug) echo("
For '$key' I did choose    : '".$aktor[$key]["result"]."'
");
}
// here we get the temperature out of string
// USE ARRAY["AKTOR", "soll"]
// change 11/10/2005 'floor' into 'round' because otherwise allways back to ??h00 instead of ??h00 or ??h30
$pos = $now["hours"]*2 + round($now["minutes"]/30);
$prevpos = $pos - 1;
if ($debug) echo("hours: " . $now["hours"] . " hours *2 = " . $now["hours"]*2 . "round($now[minutes]/30) = " . (round($now["minutes"]/30) . "
"));
if ($debug) echo "pos = '$pos'  (check midnight !!
";
// end change
foreach($aktor as $key => $value){
   $aktor[$key]["soll"] = $temp[substr($value["result"],$pos,1)];
   if ($debug) echo "res  : '" . $value["result"]."'
";
   if ($debug) echo "time : '12345678901234567890123456789012345678'
";
   if ($debug) echo "temp = '" . $aktor[$key]["soll"]."'
";
}
// and now deal with the state-event.
// detect flanks
//if ($temp[substr($value["result"],$pos,1)] <> $temp[substr($value["result"],$pos,1)]){

// 11/10/2005 This is still a burdon !! damn boy ... where do you wanne drive the MIN-TEMP to ? and MAX-TEMP ?
//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)."     : ";
//}
// 19/11/2005 : decided when 'I am Home' is selected to choose 'holiday'-rule

$handle = fopen("$logfilepath","a");
$neg = "NOT (SSw)";
if ($softswitch) $neg = "";

// GET ALL AKTORS OUT OF ARRAY["AKTOR","SOLL"] = nice result of all the -above- work
// loop here : for every aktor in array : setTemp(Aktor, argument);
$junk = 1;
foreach($aktor as $key => $value){
   if ($use_sollwert) {
      echo("OVERRULED BY use_sollwert");
      $value["soll"]= $sollwert;
   }
   SetValueFloat($key."_soll",floatval($value["soll"]));
   if ($debug) echo("FHT temp for '$key"."_soll' set to '".$value["soll"]."' !!
");
   // as the result of the function set aktors to soll
   $thisinstance = "o" . substr($key,1);
   if (!defined($thisinstance)) {
      echo("

******* NOTICE: FHT-ID ($thisinstance) not defined in GlobalDefines.ips.php

");
   } elseif (!IPS_InstanceExists(constant($thisinstance))) {
      echo("

******* NOTICE: FHT with ID '". constant($thisinstance) . "' is not a valid instance in IPS.

");
   } else {
      if ($IPS_SENDER == "Variable") {
         if ($IPS_VARIABLE == "__imhome" || $IPS_VARIABLE == "__imaway" || $IPS_VARIABLE == "__party"){
            if ($softswitch) FHT_SetTemperature(constant($thisinstance),floatval($value["soll"]));
            if ($debug) echo("FHT_SetTemp for $thisinstance $neg SENT due to '$IPS_VARIABLE'-trigger
");
            if ($debug) fwrite($handle, date("d.m.y")."  ". date("H:i:s")."  $IPS_SENDER  - FHT_SetTemp for $thisinstance $neg SENT due to '$IPS_VARIABLE'-trigger
");
         } else {
            if ($debug) fwrite($handle,  date("d.m.y")."  ". date("H:i:s")."  $IPS_SENDER  - $thisinstance is set EXTERNALLY to " . GetValueFloat($key."_state") . "°C due to '$IPS_VARIABLE'-trigger (no value sent... logging only)
");
         }
      } elseif ($IPS_SENDER == "RunScript") {
         // only set soll-temp if there are changes required (flank-detection) to reset manual intervention
         if ($debug) echo("Trigger : timerevent, Is '" . $temp[substr($value["result"],$pos,1)] . "' = '" . $temp[substr($value["result"],$prevpos,1)] . "' ?
");
         if ($temp[substr($value["result"],$pos,1)] <> $temp[substr($value["result"],$prevpos,1)]){
            //flank detected
            if ($softswitch) FHT_SetTemperature(constant($thisinstance),floatval($value["soll"]));
            if ($debug) echo("FHT_SetTemp for $thisinstance $neg SENT due to change of setting (flank detection).
");
            if ($debug) fwrite($handle, date("d.m.y")."  ". date("H:i:s")."  $IPS_SENDER  - FHT_SetTemp for $thisinstance $neg SENT due to change of setting (flank detection).
");
         } else {
            if ($debug) fwrite($handle, date("d.m.y")."  ". date("H:i:s")."  $IPS_SENDER  - No flank detected for $thisinstance.
");
         }
      } else {
         //manual exec.
         if ($softswitch) FHT_SetTemperature(constant($thisinstance),floatval($value["soll"]));
         if ($debug) echo("FHT_SetTemp for $thisinstance $neg SENT due to manual-exec.
");
         if ($debug) fwrite($handle, date("d.m.y")."  ". date("H:i:s")."  $IPS_SENDER/MANUAL - FHT_SetTemp for $thisinstance $neg SENT due to manual-exec.
");
      }
   }
   // ugly way to handle FHZ buffer issues
   // should be done by multiple passes so max 6 commands every 6 minutes
   // multiple passes ToDo
   // Paresy talked about a FHT1000 buffer; maybe there is a way to deal with this??

   // removed in version: 0.66 FHT-buffer now in place
   //if (bcmod($junk, 6) == 0) IPS_Sleep(1000*10); // wait 10 seconds FHZbuffer !!;
   //$junk += 1;
}
// 2006/05/30 modifie due to multi-hreads
SetValueBoolean($V_INHIBIT,false);
// 2006/05/30 end modifie
if ($debug) echo("Finished 
");
if ($debug) fclose($handle);

?>

Ich vermute, dass ich nur falsche Trigger oder falsche Variablen gesetzt habe…

Gruß,
Christoph

Hallo,

das Script sieht ganz normal aus. Der Teil

if ($IPS_SENDER == "Variable") { 
         if ($IPS_VARIABLE == "__imhome" || $IPS_VARIABLE == "__imaway" || $IPS_VARIABLE == "__party"){ 
            if ($softswitch) FHT_SetTemperature(constant($thisinstance),floatval($value["soll"])); 
            if ($debug) echo("FHT_SetTemp for $thisinstance $neg SENT due to '$IPS_VARIABLE'-trigger
"); 
            if ($debug) fwrite($handle, date("d.m.y")."  ". date("H:i:s")."  $IPS_SENDER  - FHT_SetTemp for $thisinstance $neg SENT due to '$IPS_VARIABLE'-trigger
"); 
         } else { 
            if ($debug) fwrite($handle,  date("d.m.y")."  ". date("H:i:s")."  $IPS_SENDER  - $thisinstance is set EXTERNALLY to " . GetValueFloat($key."_state") . "°C due to '$IPS_VARIABLE'-trigger (no value sent... logging only)
"); 
         } 
      } elseif ($IPS_SENDER == "RunScript") { 
         // only set soll-temp if there are changes required (flank-detection) to reset manual intervention 
         if ($debug) echo("Trigger : timerevent, Is '" . $temp[substr($value["result"],$pos,1)] . "' = '" . $temp[substr($value["result"],$prevpos,1)] . "' ?
"); 
         if ($temp[substr($value["result"],$pos,1)] <> $temp[substr($value["result"],$prevpos,1)]){ 
            //flank detected 
            if ($softswitch) FHT_SetTemperature(constant($thisinstance),floatval($value["soll"])); 
            if ($debug) echo("FHT_SetTemp for $thisinstance $neg SENT due to change of setting (flank detection).
"); 
            if ($debug) fwrite($handle, date("d.m.y")."  ". date("H:i:s")."  $IPS_SENDER  - FHT_SetTemp for $thisinstance $neg SENT due to change of setting (flank detection).
");

ist eigentlich für Unterscheidung Temp senden oder loggen zuständig. Um genauere Aussagen treffen zu können, müsste man (wie bereits geschrieben) die entsprechenden Auszüge aus den Logdateien sehen. Beide Logdateien, auch die tempSENT.txt ist wichtig. Sie gibt Auskunft darüber, ob die Temp gesendet wurde oder nur die manuelle Verstellung geloggt.

Generell gilt, nur auf die Status (home, away, holiday…)- und temp_state-Variablen triggern, nicht auf state-request oder gar die Soll-Var.

Wenn Du den Fehler nicht findest, könnte auch ein Blick auf die erzeugten Variablen und Trigger helfen.

Gruß
Fabian

Hallo Fabian,

ich habe leider noch das gleiche Phänomen. Vielleicht helfen diese Infos:

20.01.10  23:00:00  TimerEvent/MANUAL - FHT_SetTemp for ocs1_temp  SENT due to manual-exec.
20.01.10  23:02:00  Variable  - ocs1_temp is set EXTERNALLY to 0°C due to '14414'-trigger (no value sent... logging only)
20.01.10  23:05:00  TimerEvent/MANUAL - FHT_SetTemp for ocs1_temp  SENT due to manual-exec.
20.01.10  23:10:00  TimerEvent/MANUAL - FHT_SetTemp for ocs1_temp  SENT due to manual-exec.
20.01.10  23:15:00  TimerEvent/MANUAL - FHT_SetTemp for ocs1_temp  SENT due to manual-exec.
20.01.10  23:17:20  Variable  - ocs1_temp is set EXTERNALLY to 0°C due to '14414'-trigger (no value sent... logging only)
20.01.10  23:20:00  TimerEvent/MANUAL - FHT_SetTemp for ocs1_temp  SENT due to manual-exec.
20.01.10  23:25:00  TimerEvent/MANUAL - FHT_SetTemp for ocs1_temp  SENT due to manual-exec.

Variablen hab ich alle Standardvariablen der FHT80b und einige zusätzliche - siehe Screenshot.

Ich lasse das Script alle 5 Minuten ausführen - allerdings im Moment nur zu Testzwecken. Ziel sollen die 30 Minuten sein.

Das Script wird gleichzeitig durch die „vcs1_temp_soll2“ und die „Temperatur“ getriggert. Das Problem ist nach wie vor, dass Einstellungen am Rad nicht übernomen werden.

Gruß,
Christoph

Da bin ich wieder…

  1. Du hast im Bild mit den Variablen die IDs abgeschnitten, daher kann ich
    nicht erkennen, welche Variable (ID: 14414) das Script getriggert hat.

  2. Du schreibst, es wird auf „vcs1_temp_soll2“ getriggert. Diese Variable ist nicht vorhanden. Die richtige Variable wäre „Target Temperature“.

Es wird bei dem Problem bleiben, solange das Script alle 5 Minuten ausgeführt wird, bitte auf 30 Minuten stellen. Die Steuerung des Aktors muss hier unbedingt raus, siehe mein Vorschlag oben.
Erst dann kann man sich über das von mir beschrieben TempLock unterhalten.

Ich schaue heute Abend mal bei meinem Script nach…

Gruß
Fabian

Hallo Fabian,

ich habe den Screenshot noch einmal vernünftig erstellt.

Ich glaube, ich habe auf die völlig falschen Variablen getriggert, kann das sein?

„vcs1_temp_soll2“ war ein Schreibfehler von mir, gemeint war „vcs1_temp_soll“ (35185).

Ich habe die Zeit nun auf 30 Minuten erhöht - wie im Screenshot zu sehen. Verstehe ich es richtig, dass ich auf „Target Temperature“ (36274) und sonst nichts triggern muss?

Die Steuerung des Aktors ist in diesem Script nicht enthalten. Hier habe ich ein extra Script, welches alle 10 Minuten die IST mit der SOLL-Temperatur vergleicht und dann entsprechend agiert - im Screenshot als „Heizungsregler CS1“ zu sehen.

Ich glaube, wir sind kurz vorm Ziel :slight_smile:

Danke und Gruß,
Christoph

Hallo Christoph,

genau so ist es. Nur auf die „Target Temperature“ muss getriggert werden.
Natürlich sollte man je nach Wunsch noch die imhome, imaway… usw. in den Trigger einbinden. Es ist zwar kein muss, aber wenn man nach Hause kommt und auf „home“ stellt, möchte man sicher nicht (im ungünstigsten Fall) knapp 30 min Warten, bis es warm wird.

Wie gesagt, lagere die Steuerung des Aktors in ein extra Script aus. Hier brauchst Du nach meinem Vorschlag nur einen Trigger auf die Ventilposition „Position“ (17894) triggern.

Gruß
Fabian

Hallo Fabian,

vielen Dank für Deine Hilfe.

Mein Problem hat sich leider noch nicht erledigt. Habe die überflüssigen Trigger nun entfernt und triggere nur noch auf die „Target Temperature“ (36274) getriggert. Das funktioniert so lange, bis das sFHTs-Script vom „alle 30 Minuten Trigger“ gestartet wird, dann wird wieder der in der tempsettings.ini eingestellte Wert an den FHT80B übermittelt.

Eben habe ich z.B. um 0:56 Uhr per Hand auf 18,5° gestellt, um 1 Uhr lief das Script und stellte wieder auf 18° ein.

Ist das so korrekt? Anhand des Satzes

WAF: Wife Acceptance Factor = gross, denn wenn man am Rad des FHT dreht bleibt die dort eingestellte SOLL-temp (STATE) erhalten, bis zur nächsten Änderung im (Tages-)Wochenprogramm. 

aus dem Wiki, habe ich das Script so verstanden, dass die manuelle Änderung so lange aktiv bleibt, bis eine Änderung im Programm vorkommt. Hier bei mir ist es von 22 - 6 Uhr auf 18° eingestellt. Theoretisch müssten die per Hand eingestellten 18,5° doch bis 6 Uhr, wo auf 20° gestellt wird, aktiv bleiben. Oder habe ich das Script falsch verstanden?

Mir sind noch ein paar Dinge aufgefallen:

5.01.10  00:56:30  Variable  - ocs1_temp is set EXTERNALLY to 0°C due to '36274'-trigger (no value sent... logging only)
25.01.10  01:00:00  TimerEvent/MANUAL - FHT_SetTemp for ocs1_temp  SENT due to manual-exec.

Warum steht dort 0°? Die Variable „ocs1_temp“ gibt es bei mir nirgends …

Bin für jede Hilfe dankbar …

Gruß,
Christoph

Guten Morgen,

erstmal scheint der „Rest“ zu laufen…

das in der wiki beschrieben Verhalten ist grundsätzlich richtig und nennt sich flank-detection.
Uff, ich weiß ger nicht wo ich anfangen soll. Hier gibt es wohl ein generelles Problem (auch unten).

  1. Es müsste eigentlich über RunScript aufgerufen werden. Wie hier steht:

FHT_SetTemp for ocs1_temp SENT due to manual-exec
wird der Trigger aber als manueller Aufruf interpretiert. Da gibt es keine derartige Prüfung. Es wird einfach immer gesendet.

  1. Die Variable „ocs1_temp“ wiederum ist absolut richtig. Es ist nach der Definition das Output-Device (Instanz) „cs1_temp“ mit dem Präfix „o“ für Output. Unbedingt die Wiki genau lesen! …das löst auch das folgende Problem

  2. Das 0° in der Variable steht ist wiederum korrekt. Fredje hat für den korrekten Ablauf eine spezielle Variablen-Nomenklatur entwickelt.
    Demzufolge setzt sich die Var aus dem Präfix „v“ für Variable, der (Wohnraum-) Instanz „cs1“ und dem Zusatz „_temp“ für Heizung zusammen. Danach folgen die einzelnen Funktionsvariablen. Wie ich gerade sehe hängt die Wiki da noch auf einem recht alten Stand. Die am FHT eingestellte Temp sollte „_state“ heißen (bei Dir „Target Temperature“). Die bei FHT_SetTemp(…) an den FHT gesendete nenne ich „_state_r“ (_r für request)(bei Dir „Target Temperature (Pending)“.

Damit die Zuordnung der im Script abgefragten Variablen passt, muss man sich an diese Benennung halten, oder das Script anpassen.
Darin steckt auch die Antwort für beide Fragen. Die abgefragte „_state“ Var gibt es nicht, daher 0°. Außerdem wird im Script diese zur flank-detection herangezogen. Vergleich 0° mit 18° … neue Temp senden…

Hui, ziemlich viel Geschwafel, hoffe es war verständlich. :rolleyes:
Mein Vorschlag, bringe mal das mit den Vars in Ordnung, dann erkläre ich Dir wie ich es (mit noch besserem WAF) gelöst habe. :cool:

Fabian

Vielen Dank für die ausführliche Erläuterung.

Nachdem ich Deinen Beitrag gelesen habe dachte ich, ich hätte verstanden, was zu tun ist … Allerdings läuft hier noch irgendwas falsch.

Meine Änderungen sieht man auf den Screenshots. Ein Screenshots der Statusvariablen, so wie sie eigentlich sein müssten, würde mir glaub ich sehr helfen.

Die tempSENT.txt spricht nun auch etwas deutlicher:

25.01.10  11:53:55  Variable  - ocs1_temp is set EXTERNALLY to 18.5°C due to '43146'-trigger (no value sent... logging only)
25.01.10  11:57:48  Execute/MANUAL - FHT_SetTemp for ocs1_temp  SENT due to manual-exec.
25.01.10  11:59:40  Variable  - ocs1_temp is set EXTERNALLY to 18°C due to '43146'-trigger (no value sent... logging only)
25.01.10  12:00:00  TimerEvent/MANUAL - FHT_SetTemp for ocs1_temp  SENT due to manual-exec.

Leider gibt es noch ein Problem:
Die Temperatur wird nun IMMER auf den eigentlich Wert gestellt, wenn das Script läuft oder ich am Rad drehe. Irgendwo ist dort der Wurm drin.

Eigentlich dachte ich, es wäre alles okay … leider ist es nicht so.

Gruß,
Christoph