Heizungssteuerung

So,
ich geb mal das Anti-Script an, womit ich die Thermostate auf Auto stehen lasse ( in denne ist das Autoprogramm 00:00 17°C bis 00:00 eingestellt ).

Drehgriffkontakte sind direkt Verknüpft (0,5Sec Verzögerung ), also funktioniert auch die Absenktemperatur.

Das 2te Script trigger ich auf den Fensterkontaktes, welches dann wieder die in der Excel ( HM_datasave ) Tabelle stehende Temperatur an den Thermostat sendet. Funktioniert bei mir bisher ohne Probleme.

Das Antiscript sollte bereits bekannt sein, wie das zu installieren ist

<?php
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : antis_fht.ips.php
Trigger  :
Interval : 5 min
Author   : Anti
Project  : Heizungsteuerung
Version  :
Date     : 02.01.2010
Kommentar: mit Änderungen für IPS Version 2 von  winni2
*/

// Bei forcewrite schreibt er immer seine ermittelte Temp. Heisst Rädchendrehen ist mehr oder weniger wirkungslos
$HM_forcewrite = false;
// bei Debug nur Echo ausgaben statt zu senden
$HM_debug = false;
// Wenn true wird ein mal am Tag die Zeit gesetzt
$fht_settime = false;
$fth_setTimeStart = "02:37";  // (Format HH:MM) ab diesem Zeitpunkt wird die Zeit gesendet (was nehmen wo sonst nicht viel ist, typischerweise Nachts

/* IPS Variablen
"fht_profileoverride" , wenn vorhanden und einen Namen eines vorhanden Profils enthält, wird das genommen
"fht_datasave"    , wird anleget dient zur zwischenspeicherung alter Tempraturen
"fht_resend" , wenn man die True setzt werden alle Werte neu gesendet (wie immer 2 mal zur Sicherheit) die Var wird dann selbständig auf False zurückgesetzt
*/

// Um unnütze Aufrufe zu verhindern !
if ($IPS_SENDER == "Variable" && $IPS_VARIABLE ==  "fht_resend" && $IPS_VALUE == false) return;


include_once 'Excel/reader.php';
// ExcelFile($filename, $encoding);
$data = new Spreadsheet_Excel_Reader();
// Set output Encoding.
$data->setOutputEncoding('CP1251');


$data->read('C:/IP-Symcon/scripts/HMTemps.xls');

error_reporting(E_ALL ^ E_NOTICE);


// $tableNum enthält dannach auf dem Namen den Index der Tabelle also z.b. $tableNum["config"] = 1 , heisst config is Tabelle 1
foreach( $data->boundsheets as $key => $worksheet )  {
	$tableNum[$worksheet["name"]] = $key;
}

$configNr = $tableNum["config"];
$configTable = $data->sheets[$configNr]['cells']; // Das ist nun die config-Tabelle

// Set Punkt Temp zuordung [x]=temp
for ($x=2; $x <= 11; $x++) {
	$tempTable [$configTable[$x][1]]= $configTable[$x][2];
}

// Aktives Profil lesen
$aktProfil =  $configTable[4][5];

// Profil Liste lesen
$newdata = "new";$profiles = array();
for ($x=11; !empty ($newdata); $x++) {
	$newdata = $configTable[2][$x];
	if (!empty ($newdata)) {
      $profiles[] = $newdata;
      $newdata2 = "new";
      // Und nebenbei prüfen ob bei dem Profil das heutige Datum eingetragen ist
      for ($y=3; !empty ($newdata2); $y++) { //Daten drin ?
      $newdata2 = $configTable[$y][$x];
      	if (!empty ($newdata2)) {
            $tmp  = explode("/", $newdata2);
				$daybefore  = mktime(0, 0, 0, intval($tmp[1])  , intval($tmp[0]-1), intval($tmp[2])); // Fix, das Ding liest 1 tag später aus
            // Ein Datum überschreibt das aktive Profil !
            if ($daybefore ==  mktime(0, 0, 0))  {
               $aktProfil = $newdata;
				}
         }
      }
   }
}

// In IPS ein Override gesetzt ?

  $tmp = GetValueString (15213 /*[HM Heizungssteuerung\HM_profileoverride]*/);  // Override Temparaturmodus Auswahl
  if (in_array ($tmp, $profiles)) $aktProfil = $tmp;


// Room´s auslesen (ID setzen)
$newdata = "new";$rooms = array();
for ($x=25; !empty ($newdata); $x++) {
   $newdata = $configTable[$x][1];
   if (!empty ($newdata)) {
      $rooms[$newdata][id]= $configTable[$x][2];
      $rooms[$newdata][target]= $configTable[$x][3];
      $rooms[$newdata][time1]= $configTable[$x][4];
      $rooms[$newdata][time2]= $configTable[$x][5];
   }
}
// True wenn aktuelle Zeit im Bereich (time+offset) bis (time+offset+duration) ist
function checkInterval ($time, $offset, $duration) {
   $std = substr($time,0,2);
   $min = substr($time,3,2);
   $von = mktime ($std,$min+$offset);
	$bis = mktime ($std,$min+$offset+$duration);
   //echo "$std:$min -> ".time(). " von $von bis $bis
";
   return  (time() >= $von && time() <= $bis);
}

//print_R($rooms);
$profilNum = array_search($aktProfil, $profiles)+1;
$ProfileName ="Profiles".$profilNum;
$ProfileNr = $tableNum[$ProfileName];


$ProfileTable = $data->sheets[$ProfileNr]['cells'];
//    print_r($profiles);
  //echo  "Profiltabelle:".$ProfileTable[3][1]."
"; // Zeile, Spalte
// zumidnest im englischen PHP okay
$days = array ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat","Sun");
$dayindex = array_search( date("D",  mktime(0, 0, 0)), $days);    // 0-6
$timeindex = date("H")*4 + floor( date("i")/15);
  //echo "
 dayindex: ".$dayindex." timeindex:".$timeindex."
";
$y = $dayindex+3;
$x =  $timeindex+2;
$allSoll = $ProfileTable[$y][$x];
//echo "AllSoll: ".$allSoll."
";

foreach ($rooms as $key => $data) {
   $rooms[$key][soll] = $allSoll;
}

// Extra Räume ?
$start =12;
while ($ProfileTable[$start][1] != "") {
   $Room = $ProfileTable[$start][1];
   $x =  $timeindex+2;
   $y = $dayindex+$start+1;
   $rSoll = $ProfileTable[$y][$x];
   $rooms[$Room][soll] = $rSoll;
//   echo $Room." rsoll: ".$rSoll."
";
   $start+=9;
}
//print_r ($rooms);

// So sämtliche Soll Temperaturen sind erfasst *juhu* nun vergleichen mit alter Temp und setzen der alten Temp

// Alte Tempraturem lesen:



   $tmp = wddx_deserialize (GetValueString(22079 /*[HM Heizungssteuerung\HM_datasave]*/));
   $oldTemp = $tmp[oldTempNeu];

//********************************************
//Und jetzt die Temperaturen versenden
//********************************************
foreach ($rooms as $key => $data1) {
   // Umlaute mag er nicht
   $key2= str_ireplace (Array("ü","ö","ä","ß"), Array("ue","oe","ae","ss"), $key);
   $oldTempNeu[$key2][soll] = $tempTable[$data1[soll]];
   $oldTempNeu[$key2][setTime] = $oldTemp[$key2][setTime];


   // kann auch raus wenn die Temps immer verarbeitet werden sollen - also die IF drumherum ... dafür kannman dann  bei setzen auf Fenster auf prüfen

   if ($oldTemp[$key2][soll] != $tempTable[$data1[soll]] || $HM_forcewrite || $boolTemp) { // Schreibn Meister

      if (!IPS_InstanceExists((intval ($data1[id])))) {
         Echo "Das Modul ".$data1[id]." gibts nicht! 
";
      } else {
      	if ($fht_debug) echo "setze2 $key to ".$tempTable[$data1[soll]]."
";
      	else {
            echo "setze ".$key." ". $data1[id].".auf ".$tempTable[$data1[soll]]."
";
            HM_WriteValueFloat(intval($data1[id]),"SETPOINT" ,floatval ($tempTable[$data1[soll]]));
            //IPS_LogMessage("Antis_FHT .$key wurde auf $tempTable[$data1[soll]] Grad gesetzt");
            $oldTempNeu[$key2][setTime]=time(); // Merken wir uns den Zeitpunkt der Sendung
            echo "Es ist ".date("H:i",$oldTempNeu[$key2][setTime])."  ".$oldTempNeu[$key2][setTime] ." Uhr
";
         }
      }
   }
}


// Neue Alte Temperaturen (und sontiges) speichern
SetValueString (22079 /*[HM Heizungssteuerung\HM_datasave]*/, wddx_serialize_vars("oldTempNeu"));
Echo  "Aktives Profil: $aktProfil
";
foreach ($rooms as $key => $data1) {
echo $key." soll: ".$tempTable[$data1['soll']]."° Celsius
";
}


function fht_alert ($hint) {
   if (!IPS_VariableExists(IPS_GetVariableIDByName("HM_noalert",0))) {
      $id = IPS_CreateVariable(0);
	   IPS_SetName($id, "HM_noalert");
 	}
   if (!IPS_VariableExists(IPS_GetVariableIDByName("HM_alertMSG",0))) {
		$id = IPS_CreateVariable(3);
   	IPS_SetName($id, "HM_alertMSG");
		}
   SetValueString (IPS_GetVariableIDByName("HM_alertMSG",0),date("H:i")." - ".$hint);
   SetValueBoolean (IPS_GetVariableIDByName("HM_noalert",0),false);
}
?>

<?
$f=getValueInteger(48457 /*[OG\Kinderzimmer Timo\HM Fensterkontakt\STATE]*/);

if ($f == '0') {

			$tmp = wddx_deserialize (GetValueString(22079 /*[HM Heizungssteuerung\HM_datasave]*/));

				//print_r ($tmp);
				$SOLL = $tmp['oldTempNeu']['Kinderzimmer Timo']['soll'];
				$SollT=floatval($SOLL);
				HM_WriteValueFloat(37002 /*[OG\Kinderzimmer Timo\HM Heizung Timo\SetTemp]*/, "SETPOINT", $SollT);
	}



?>

Erstmal danke fürs posten, aber 2 Fragen hätte ich noch, vielleicht erweiterst deine Anleitung ja noch für etwas auf dem Schlauch stehende… :slight_smile:

  1. Die INstallation von Antis FHT ist nciht bekannt, da ich das Script ja bisher auch nicht kannte, kannst du vielleicht kurz was dazu sagen?

  2. Wie muss die Excel Datei aufgebaut sein?

Oder gibts zu beidem einen Post der das erklärt?

Danke im Vorraus für deine Mühe & Gruss,
Christian

Hm:

das war mal der Anfang. da ist auch eine Excel datei dabei meine ich.
Das Script haste ja oben schon.
Brauchen tust du dann nur noch die
HM.profileoverride Variable in Zeile 86
HM.datasave in Zeile 153 und 188

Schön das das Script noch weiterentwickelet wird :slight_smile:

ich finde das immernoch die beste Heizungssteuerung für IPS. schnell mal X profile in Excel erstellt , die einfach nur über profiloverride gesetzt werden können .

Ich versuche meine Ansätze mal zusammenzufassen, vielleicht hilft das ein paar anderen auch.

Ok, ich denke das 2. Skript ist klar, damit setzt du die Temperatur wieder auf den ursprünglichen Sollwert des Raumes zurück nachdem das Fenster wieder geschlossen wurde, das öffnen und absenken der Temperatur macht die Direktverknüpfung über den Raumthermostat.

Das eigentliche Skript timergesteuert alle 5 Minuten, HM_profileoverride und HM_datasave Variablen anlegen, soweit auch kein Thema.

Zur Excel Datei:

-Die Temperaturvaluies inkl. Korrektur, verstehe ich und werden ausgelesen

  • Aktives Profil, auch klar, allerdings muss man dann die Excel Datei bearbeiten, wenn es z.B. in urlaub geht, aber ok…
  • Profiulliste und die Daten an denen diese aktiv sind, auch klar.
  • Was sollen die gelb,rot,grünen Punkte bzw ( Profilliste aktuialisieren, Temperaturen zwnagssenden etc… ) ???
  • Name des Raumes ist klar, hier wird die Zuordnung Raum -> Instance gemacht, target Variable nutzt du wahrscheinlich gar nicht, da in deinen Anpassungen SETPOINT direkt als Variable genutzt wird, richtig? Wofür sind die Zeiten hinter den Räumne, das erschliesst sich mir nicht ganz, nach dem auslesen werden diese nicht mehr genutzt…

Oder sind ein paar FHT spezifische DInge halt weggefallen? Dann erstellen wir vielleicht mal eine eigene Muster Excel Datei. Würdest du deine hier mal zur Verfügung stellen, so als zusätzlichen Wegweiser?

Stimmen meine sonstigen Ausführungen dazu?

Gruss,
Christian

Brauchst du nicht ! NUR DIE PROFILOVERRIDE anders beschreiben ! DAS REICHT

Unwichtig für HM, bzw ein Zwangssenden aller Temps eventuell nach einem Serverausfall…
Das setzte die damalige Resend Varable mal kurz auf true …hmmm muß ich mal einbauen wieder, könnte man ja mal brauchen…

Also jo da ist noch ne Menge Karms in der Excel , die bei HM nicht wirklich benötigt werden. WICHTIG du gibtst in der Excel NICHT die SETPOINT Variable an ! Sondern die HM INSTANCE über der Setpiontvariable!!!

Die Zeiten hab ich alle gelöscht, ne Targetvariable NICHT angegeben.

Stimmt, das macht Sinn, war ich zwischendurch auch schon drauf gekommen.

Unwichtig für HM, bzw ein Zwangssenden aller Temps eventuell nach einem Serverausfall…
Das setzte die damalige Resend Varable mal kurz auf true …hmmm muß ich mal einbauen wieder, könnte man ja mal brauchen…

Ok, wobei es im Endeffekt bei HM nicht wirklich benötigt wird…

Also jo da ist noch ne Menge Karms in der Excel , die bei HM nicht wirklich benötigt werden. WICHTIG du gibtst in der Excel NICHT die SETPOINT Variable an ! Sondern die HM INSTANCE über der Setpiontvariable!!!

Das ist klar, deswegen auch die Frage nach der target Variable, weil darüber hätte man das schreiben in die HM INstanz ja erledigen können. :slight_smile: Aber im endeffekt reicht es auch so.

Die Zeiten hab ich alle gelöscht, ne Targetvariable NICHT angegeben.

Wofür waren denn die Zeiten urspünglich? Weil wann die Heizung etc. zu laufen hat steht ja in den Profilen.

Damit wir das ganze etwas komfortabler bekommen, habe ich jetzt in einem ersten Schritt die config Geschichten in einer MySQL DB ausgelagert und entsprechende HM Variablen definiert die dann nach Änderung im Webfront ewin Skript triggern dass das ganze wieder in die DB schreibt. So ist auf jeden Fall die etwas unübersichtliche Config Seite aus der Excel Datei weg.

Falls Interesse besteht kann ich ja mal Webfront Screenshots machen wenn ich morgen durch bin, je nachdem sind andere ja noch an einer Anleitung interessiert.

Überlege momentan auch schon wie sich die Profile umsetzen lassen, dann könnte man wirklich komplett auf die Excel Datei verzichten, da muss ich mir aber noch einen Aufbau überlegen der halbwegs nach was ausschaut.

Gruss,
Christian

Bin auch schon lange auf der suche nach einer funktionierenden Möglichkeit meine HM Heizung über IPS zu steuern.

Leider funktioniert das bei mir erstmal nicht. (Weil ich da irgendwas nicht richtig mache)
Ich bekomme den Fehler wie im Bild zu sehen ist. Mir ist auch unklar was ich ich im 2 Script in der letzten Zeile für eine ID nehmen soll? SetTemp hab ich nirgends?! Muss ich das was anlegen?

Eine Step by Step Anleitung wäre super :slight_smile:

Schon mal danke

Ach ja die Bilder… :smiley:

Achherje
das Script heißt nicht fht_resend, Das was du da hast, ist das Script , was ausgeführt wird, wenn ein Fester wieder geschlossen wird. ( Also auf Variablenwert 0 bei State eines Fensterkontaktes zB).
Wie sieht denn deine Excel datei aus ?

So, für die die es interessiert…

Ich habe das ganze jetzt mal entsprechend umgeschrieben sodass sämtliche Config Geschichten innerhalb von IPS abgebildet sind und somit auch bequem über die Weboberfläche einzustellen, die Zuordnung der Räume passiert über eine eigene Logik im Script und passende Links.
Die Temperaturverteilung selbst läuft momentan erstmal über die Excel Tabelle weiter, da denke ich noch drüber nach.

Mein Script erstellt mittlerweile sämtliche notwenigen Variablen und Dummy Instanzen etc. beim ersten ausführen selbst, sodass dei Einrichtung relativ problemlos ist. Standardmässig habe ich erstmal 2 Profile vorgesehen, das ganze ist aber relativ einfach erweiterbar.

Gruss,
Christian

Hallo zusammen,

das Script klingt toll, sowas suche ich schon lange- ein Traum wäre natürlich eine solche Matrix im Webfront als Zeitsteuerung zu haben.

Ich habe das Script nun „installiert“ - allerdings kommen folgend eFehlermeldungen (diehe Grafik):

Gruß
jf

Ja, das ist der Weg wo ich hin will, allerdings ist das Skript hier im Thread auch noch nicht das welches ich in meinem vorigen Post beschrieben habe. Hier wird alles noch über die Excel Datei gesteuert. Die Variablen etc. hast du angelegt und Excel passend bearbeitet?

Gruss,
Christian

Hallo,

ich habe die Variablen angelegt

fht_profileoverride -> als String in gleicher Kategorie wie Script
fht_datasave -> als String in gleicher Kategorie wie Script

die Excel Datei entsprechend meiner IDs angepasst (ID der HM Instanz, nicht die der Setpoint Variable).

Leider kommen immer noch folgende Fehler:

Warning: Wrong parameter type for ips_variableexists() in C:\IP-Symcon\scripts\21902.ips.php on line 71

Warning: Wrong parameter type for ips_variableexists() in C:\IP-Symcon\scripts\21902.ips.php on line 144

Warning: Wrong parameter count for ips_createvariable() in C:\IP-Symcon\scripts\21902.ips.php on line 148

Warning: Wrong parameter type for ips_variableexists() in C:\IP-Symcon\scripts\21902.ips.php on line 153

Warning: Wrong parameter count for ips_createvariable() in C:\IP-Symcon\scripts\21902.ips.php on line 157

Warning: Variable mit Namen „fht_resend“ existiert nicht in C:\IP-Symcon\scripts\21902.ips.php on line 158

Fatal error: Call to undefined function IPS_ModuleInstanceExists() in C:\IP-Symcon\scripts\21902.ips.php on line 193

Woran kann das nun noch liegen?

Danke Euch
JF

Die Variablen müssen aber laut muckel

HM.profileoverride
HM.datasave

heissen. Siehe Anleitung erste Seite.

Gruss,
Christian

Hi metzench,

das hatte ich überlesen - jetzt passts! Danke

JF

Hallo Christian,

du machst mich langsam neugierig, wie sieht den dein Script aus.

gruß Uwe

Denke ich werde bis zum WE damit durch sein dass alles passt, die INstall Routine ist schonmal sauber und es wird alles soweit automatisch angelegt.

Falls dann INteresse besteht kann ich gerne in nem neuen Thread das ganze posten, vielleicht finden sich ja noch mehr Leute.

Gruss,
Christian

Hi Metzench,

die Neugierde ist groß- wie ist der Stand bei Dir hierzu?
bin schon urst gespannt drauf.

JF