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);
}
?>