<?php
// Bei forcewrite schreibt er immer seine ermittelte Temp. Heisst Rädchendrehen ist mehr oder weniger wirkungslos
$fht_forcewrite = false;
// bei Debug nur Echo ausgaben statt zu senden
$fht_debug = false;
// Wenn true wird ein mal am Tag die Zeit gesetzt
$fht_settime = true;
/* IPS Variablen
"fht_profileoverride" , wenn vorhanden und einen Namen eines vorhanden Profils enthält, wird das genommen
"fht_save" , wird anleget dient zur zwischenspeicherung alter Tempraturen
*/
include_once 'reader.php';
// ExcelFile($filename, $encoding);
$data = new Spreadsheet_Excel_Reader();
// Set output Encoding.
$data->setOutputEncoding('CP1251');
$data->read('c:/IP-Symcon/scripts/Temps.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, $tmp[1] , $tmp[0]-1, $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 ?
//Fehlermeldung mit @ unterdrücken
$VarID = @IPS_GetVariableID("fht_profileoverride");
if ($VarID === false)
echo "Variable fht_profileoverride nicht gesetzt, nehme Standardprofil!";
else {
echo "Die Variablen-ID lautet: ". $VarID;
//if (IPS_VariableExists("fht_profileoverride")){
$tmp = GetValueString ($VarID);
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];
// test
//echo (checkInterval ($rooms[$newdata][time1], -10, 6)) ? "ja": "nein";
// Interval in dem wir das Ding auf Manuell schalten?
$rooms[$newdata][gotoman]= checkInterval ($rooms[$newdata][time1], -10, 6) || checkInterval ($rooms[$newdata][time2], -10, 6);
// Interval in dem wir das Ding wieder auf Auto schalten?
$rooms[$newdata][gotoauto]= checkInterval ($rooms[$newdata][time1], 4, 6) || checkInterval ($rooms[$newdata][time2], 4, 6);
}
}
// 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 $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 $ProfileTable[3][1]; // Zeile, Spalter
// 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;
$y = $dayindex+3;
$x = $timeindex+2;
$allSoll = $ProfileTable[$y][$x];
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;
$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:
//Fehlermeldung mit @ unterdrücken
$VarID = @IPS_GetVariableID("fht_datasave");
if ($VarID === false)
{ echo "Variable fht_datasave nicht gefunden!";
$VarID = IPS_CreateVariable(3); //Variable Typ String anlegen
IPS_SetName($VarID,"fht_datasave"); // Variable benennen
}
else {
echo "Die Variablen-ID lautet: ". $VarID;
//if (IPS_VariableExists("fht_datasave")) {
$tmp = wddx_deserialize (GetValueString ($VarID));
$oldTemp = $tmp[oldTempNeu];
}
// Ein Ressend angefordert ?
$boolTemp = false;
//Fehlermeldung mit @ unterdrücken
$VarID = @IPS_GetVariableID("fht_resend");
if ($VarID === false)
{
$VarID=IPS_CreateVariable(0); //Variable Typ Boolean anlegen
IPS_SetName($VarID,"fht_resend"); // Variable benennen
SetValueBoolean ($VarID, false);
echo "Variable nicht gefunden , neu angelegt!". $VarID;
}
else {
echo "Die Variablen-ID lautet: ". $VarID;
//if (IPS_VariableExists("fht_resend")) {
$boolTemp = GetValueBoolean ($VarID);
SetValueBoolean ($VarID, false);
}
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];
//wm if (IPS_ModuleInstanceExists (intval ($data1[id]))) {
// WIe siehts aus mit automatischem auto/manuell umschalten ?
if ($data1[gotoman]) if ($fht_debug) echo "Goto Man $key
";
else FHT_SetMode(intval($data1[id]),1);
if ($data1[gotoauto]) if ($fht_debug) echo "Goto Auto $key
";
else FHT_SetMode(intval($data1[id]),0);
if ($fht_settime) {
// if ($fht_debug) echo "setze $data[id] to ".$tempTable[$data['soll']]."
";
// else FHT_SetTemperature($data[id], $tempTable[$data[soll]]);
}
//wm }
if ($oldTemp[$key2][soll] != $tempTable[$data1[soll]] || $fht_forcewrite || $boolTemp) { // Schreibn Meister
//wm if (!IPS_ModuleInstanceExists (intval ($data1[id]))) {
Echo "Das Modul $data1[id] gibts nicht!";
//wm } else {
if ($fht_debug) echo "setze $key to ".$tempTable[$data1['soll']]."
";
else {
FHT_SetTemperature(intval($data1[id]), 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
}
//wm }
}
if ($oldTempNeu[$key2][setTime]+ 360 < time() && !$fht_debug) { // Update wurde vor mehr als 6 Min gesendet
if ($oldTempNeu[$key2][setTime]+ 660 >= time()) { // Und nach weniger als 11 Min
// Senden wir den letzen Befehl noch mal, zur erhöhung der Sicherheit
FHT_SetTemperature(intval($data1[id]), floatval ($tempTable[$data1[soll]]));
}
if (IPS_VariableExists($data1[target])){ // Nur wenn die IPS Var existiert (empfolen)
$updTime = IPS_GetUpdatetime($data1[target]);
if ($updTime > $oldTempNeu[$key2][setTime]) {
//echo "alles im grünen Bereich $updTime > ".$oldTempNeu[$key2][setTime];
} else {
echo "$key2 ist nicht gesetzt !! -> retry";
IPS_LogMessage("Antis_FHT", "$key2 ist nicht gesetzt !! -> retry");
fht_alert ( "$key2 ist nicht gesetzt !! -> retry");
// FHT_SetTemperature(intval($data1[id]), floatval ($tempTable[$data1[soll]])); // Sinnlos
// echo $data1[id].",". $tempTable[$data1[soll]];
//$oldTempNeu[$key2][setTime]=time(); // Merken wir uns den Zeitpunkt der Sendung
}
}
}
}
//print_r ($oldTempNeu);
//IPS_LogMessage("Antis_FHT", "$key wurde auf ".$tempTable[$data1['soll']]." Grad gesetzt");
// Neue Alte Temperaturen (und sontiges) speichern
SetValueString ("fht_datasave", wddx_serialize_vars("oldTempNeu"));
Echo "Aktives Profil: $aktProfil
";
// Solltemp: $tempTable[$allSoll]";
foreach ($rooms as $key => $data1) {
echo $key." soll: ".$tempTable[$data1['soll']]."° Celsius
";
}
function fht_alert ($hint) {
if (!IPS_VariableExists("fht_noalert")) {
IPS_CreateVariable("fht_noalert", "Boolean");
}
if (!IPS_VariableExists("fht_alertMSG")) {
IPS_CreateVariable("fht_alertMSG", "String");
}
SetValueString ("fht_alertMSG",$hint);
SetValueBoolean ("fht_noalert",false);
}
?>