Hallo Erwoolf ,
bin gerade dabei das Script wieder lauffähig zu bekommen.
Mit ein paar Änderungen läuft es wenigstens. Es kommen zwar noch Fehlermeldungen, aber das Script erfüllt seine Funktion.
Änderungen waren immer bei „IPS_VariableExists“ notwendig, da dieser befehl jetzt die VariablenID als Argument benötigt.
Diese muss zuerst mit „IPS_GetVariableID“ ermittelt werden.
Nur für den befehl „IPS_ModuleInstanceExists“ habe ich noch keine Lösung gefunden.
Grüssle
Winfried
<?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 'Excel/reader.php';
// ExcelFile($filename, $encoding);
$data = new Spreadsheet_Excel_Reader();
// Set output Encoding.
$data->setOutputEncoding('CP1251');
$data->read('D:/Programme/IP-SymconV2/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);
}
?>