Hier das Skript was ich seit 2 Jahren am laufen habe
<?php
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : antis_fht.ips.php
Trigger :
Interval : 5 min
Author : Anti
Project : Heizungsteuerung
Version : 2.0
Date : 07.11.2010
*/
// 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;
$fth_setTimeStart = "04:11"; // (Format HH:MM) ab diesem Zeitpunkt wird die Zeit gesendet (was nehmen wo sonst nicht viel ist, typischerweise Nachts
//Hier die VariableID der FHZ eintragen (aus Objektbaum--> SplitterInstanzen vom Typ FHZ1x00PC)
$VarID_FHZ= 15586 /*[FHZ1X00PC]*/;
$AlarmNachMin = 40; // Wenn solange der Temperaturstatus nicht mehr aktualisiert wurde -> Alarmmeldung
$AlarmAktionNextTryMin = 20; // Nach sovielen Minuten versuche neue Reperaturaktion (erste nach $AlarmNachMin)
$mailId = 28434 /*[Objekt #28434 existiert nicht]*/ ; // Mal kurz scharf nachdenken was das sein könnte ;)
/* 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 == IPS_GetVariableIDByName("fht_resend", 0) && $IPS_VALUE == false) return;
//Prüfen ob die FHZ genügend SendeBuffers hat
$FREE_BUFFERS = FHZ_GetFreeBuffer($VarID_FHZ);
if ((10-$FREE_BUFFERS) > 4) {
fht_alert ("Beknackte FHT Qeue mal wieder zu voll");
return;
}
error_reporting(E_ALL ^ E_NOTICE /*^ E_DEPRECATED*/);
include_once 'Excel/reader.php';
// ExcelFile($filename, $encoding);
$data = new Spreadsheet_Excel_Reader();
// Set output Encoding.
$data->setOutputEncoding('CP1251');
$data->read('Temps.xls');
// $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];
$aktProfilReason = " in Excel gesetzt";
// 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;
$aktProfilReason = " in Excel an heutigem Datum gesetzt";
}
}
}
}
}
// In IPS ein Override gesetzt ?
$VarID_fht_profileoverride = @IPS_GetVariableIDByName("fht_profileoverride",0);
if ( $VarID_fht_profileoverride > 0 ) {
$tmp = GetValueString ($VarID_fht_profileoverride);
if (in_array ($tmp, $profiles)) {
$aktProfil = $tmp;
$aktProfilReason = " in fht_profileoverride gesetzt";
}
}
// Room´s auslesen (ID setzen)
//echo "Rooms auslesen
"; //Kontrollausgabe
$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];
// Interval in dem wir das Ding auf Manuell schalten?
$rooms[$newdata][gotoman]= checkInterval ($rooms[$newdata][time1], -12, 5) || checkInterval ($rooms[$newdata][time2], -12, 5);
// Interval in dem wir das Ding wieder auf Auto schalten?
$rooms[$newdata][gotoauto]= checkInterval ($rooms[$newdata][time1], 6, 5) || checkInterval ($rooms[$newdata][time2], 6, 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'];
// 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];
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;
}
// So sämtliche Soll Temperaturen sind erfasst *juhu* nun vergleichen mit alter Temp und setzen der alten Temp
// Alte Tempraturem lesen:
$VarID_fht_datasave =IPS_GetVariableIDByName("fht_datasave",0);
if ($VarID_fht_datasave > 0) {
$tmp = wddx_deserialize (GetValueString ($VarID_fht_datasave));
$oldTemp = $tmp[oldTempNeu];
// print_r ($oldTemp);
} else {
$VarID_fht_datasave = IPS_CreateVariable(3);
IPS_SetName($VarID_fht_datasave, "fht_datasave");
}
// Ein Resend angefordert ?
$boolTemp = false;
$VarID_fht_resend =IPS_GetVariableIDByName("fht_resend",0);
if ($VarID_fht_resend > 0) {
$boolTemp = GetValueBoolean ($VarID_fht_resend);
SetValueBoolean ($VarID_fht_resend, false);
}
else {
$VarID_fht_resend = IPS_CreateVariable(0);
IPS_SetName($VarID_fht_resend, "fht_resend");
SetValueBoolean ($VarID_fht_resend, false);
}
// Die Zeiten setzen, einmal am tag im angebeenen Zeitfenster, alle FHT nacheinander (je einen Scriptaufruf versetzt)
$oldTempNeu["LastTimeUp"]=$oldTemp["LastTimeUp"];
$oldTempNeu["LastTimeRoom"]=$oldTemp["LastTimeRoom"];
// Die Dinger mit der aktuellen Zeit versorgen
if ($fht_settime) {
if (checkInterval ($fth_setTimeStart,0,60)) { // Sind wir innerhalb von 60 Minuten ?
if ($oldTempNeu["LastTimeUp"] + 60*120 < time()) { // Letzemal ist mehr als 2 Std her (sprich neuer Tag)
$oldTempNeu["LastTimeUp"]=time(); // So zu erkennen geben das Heute aktiv war
reset ($rooms);
$tmp =current($rooms);
$oldTempNeu["LastTimeRoom"] = $tmp[id]; // und den Startraum setzen
}
Echo $oldTempNeu["LastTimeRoom"]." a
";
if ($oldTempNeu["LastTimeRoom"] != "End") {
FHT_SetHour(intval($oldTempNeu["LastTimeRoom"]),intval( date("H")));
FHT_SetMinute(intval($oldTempNeu["LastTimeRoom"]),intval(date("i")));
echo $oldTempNeu["LastTimeRoom"]." set to ".date("H").":". date("i")."
";
echo $oldTempNeu["LastTimeRoom"]." b
";
$found = false;$set = false;
foreach ($rooms as $key => $data1) {
if ($found) { $oldTempNeu["LastTimeRoom"] = $data1[id]; $set = true;}
if ($data1[id] == $oldTempNeu["LastTimeRoom"]) $found = true;
}
if (!$set) $oldTempNeu["LastTimeRoom"] = "End";
}
}
}
//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];
//echo "Bin im VOR Modeauswahl Programmteil für ".$data1[id]."
";
if (IPS_InstanceExists(intval ($data1[id]))) {
//echo "Bin im Modeauswahl Programmteil für ".$data1[id]."
";
// WIe siehts aus mit automatischem auto/manuell umschalten ?
if ($data1[gotoman]) {
echo "Goto Man $key
";
FHT_SetMode(intval($data1[id]),1);
}
if ($data1[gotoauto]){
echo "Goto Auto $key
";
FHT_SetMode(intval($data1[id]),0);
}
}
if ($oldTemp[$key2][soll] != $tempTable[$data1[soll]] || $fht_forcewrite || $boolTemp) { // Schreibn Meister
if (!IPS_InstanceExists((intval ($data1[id])))) {
Echo "Das Modul ".$data1[id]." gibts nicht!
";
} else {
if ($fht_debug) echo "setze $key to ".$tempTable[$data1[soll]]."
";
else {
echo "setze ".$key." ". $data1[id].".auf ".$tempTable[$data1[soll]]."
";
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
echo "Es ist ".date("H:i",$oldTempNeu[$key2][setTime])." ".$oldTempNeu[$key2][setTime] ." Uhr
";
}
}
}
//Wenn keine neue temperatur vorliegt, die alte Temperatur nochmal einmal senden - sicher ist sicher
//Scriptintervall 5 Minuten
// So das Resend noch mal neu nach frühestens 12 Minuten
if (checkInterval (date("H:i",$oldTempNeu[$key2][setTime]),12,5)) {
FHT_SetTemperature(intval($data1[id]), floatval ($tempTable[$data1[soll]]));
echo " - resend ".$key." ". $data1[id].".auf ".$tempTable[$data1[soll]]."
";
}
}
//IPS_LogMessage("Antis_FHT", "$key wurde auf ".$tempTable[$data1['soll']]." Grad gesetzt");
Echo "Aktives Profil: $aktProfil $aktProfilReason
";
// Solltemp: $tempTable[$allSoll]";
//print_r ($rooms);
//print_R ($oldTempNeu);
$alertCounter = 0;
$oldTempNeu["lastAktion"]=$oldTemp["lastAktion"];
foreach ($rooms as $key => $data1) {
if (IPS_InstanceExists((intval ($data1[id])))) {
$tempId = IPS_GetVariableIDByName ("Temperatur", intval ($data1["id"]));
$temp = GetValueFloat ($tempId);
$t = IPS_GetVariable ($tempId);
$TempUpdateTime = round((-$t["VariableUpdated"]+time())/60,2);
echo $key." soll: ".$tempTable[$data1['soll']]."° Celsius - ist: ".$temp."° Celsius - ($TempUpdateTime Minuten alt)";
if ($TempUpdateTime > $AlarmNachMin) {
echo " ---> Alert: Letztes Update ist ".$TempUpdateTime." Minuten her!";
IPS_LogMessage("Antis_FHT", $key ."ist nicht gesetzt !!");
fht_alert ( $key." ist seit $TempUpdateTime nicht gesetzt!!
");
$AlarmAktionNr = ceil (($TempUpdateTime-$AlarmNachMin) /$AlarmAktionNextTryMin);
echo $oldTempNeu["lastAktion"]." < $AlarmAktionNr
";
if ($oldTempNeu["lastAktion"] < $AlarmAktionNr) {
$oldTempNeu["lastAktion"]++;
SetValueString (IPS_GetVariableIDByName("fht_datasave",0), wddx_serialize_vars("oldTempNeu"));
fht_noconnect_action ($oldTempNeu["lastAktion"]-1,$data1["id"],$tempTable[$data1['soll']],$key);
}
$alertCounter++;
}
echo "
";
}
}
if ($alertCounter == 0) {
// Vonn Alarmzustand zurück zu normal
if ($oldTempNeu["lastAktion"] <> 0) {
IPS_LogMessage("Antis_FHT","Antis_FHT returns to normal operation");
fht_alert ("");
SetValueBoolean (IPS_GetVariableIDByName("fht_noalert",0),true);
}
$oldTempNeu["lastAktion"]=0;
}
// MSG
if ($oldTempNeu["lastAktion"] > 0) echo "FHT sendet keine neunen Temperaturen. Korrektur-Phase: ".($oldTempNeu["lastAktion"]-1)."
";
// Neue Alte Temperaturen (und sontiges) speichern
//print_r ($oldTempNeu);
SetValueString (IPS_GetVariableIDByName("fht_datasave",0), wddx_serialize_vars("oldTempNeu"));
$FREE_BUFFERS2 = FHZ_GetFreeBuffer($VarID_FHZ);
echo "Free Buffers vorher:".$FREE_BUFFERS." - nachher:".$FREE_BUFFERS2."
";
function fht_alert ($hint) {
if (!IPS_VariableExists(IPS_GetVariableIDByName("fht_noalert",0))) {
$id = IPS_CreateVariable(0);
IPS_SetName($id, "fht_noalert");
}
if (!IPS_VariableExists(IPS_GetVariableIDByName("fht_alertMSG",0))) {
$id = IPS_CreateVariable(3);
IPS_SetName($id, "fht_alertMSG");
}
SetValueString (IPS_GetVariableIDByName("fht_alertMSG",0),date("H:i")." - ".$hint);
SetValueBoolean (IPS_GetVariableIDByName("fht_noalert",0),false);
}
// Hier reinschreiben was passieren soll im $nr ten versuch einen kositenten Zustand wiederherzustellen
function fht_noconnect_action ($nr, $id, $sollTemp, $ort="") {
global $mailId;
switch ($nr) {
case 1:
echo "Aktion Nr.$nr um eingeschlafene Temperaturmessung wiederzubeleben ($ort) resend Temperature - 0.5°";
SMTP_SendMail($mailId,"FHT ALERT","Versuch $nr - resend Temperature - 0.5° ($ort) zwecks anderem Wert");
FHT_SetTemperature(intval($id), floatval ($sollTemp-0.5));
break;
case 2:
echo "Aktion Nr.$nr um eingeschlafene Temperaturmessung wiederzubeleben ($ort) - Restart IPS";
SMTP_SendMail($mailId,"FHT ALERT","Versuch $nr ($ort) - Restart IPS/FHT");
$ourFileName = "trigger";
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
fclose($ourFileHandle);
break;
case 3:
echo "Aktion Nr.$nr um eingeschlafene Temperaturmessung wiederzubeleben ($ort) resend Temperature + 0.5°";
SMTP_SendMail($mailId,"FHT ALERT","Versuch $nr - resend Temperature + 0.5° ($ort) zwecks anderem Wert");
FHT_SetTemperature(intval($id), floatval ($sollTemp+0.5));
break;
case 4:
echo "Aktion Nr.$nr um eingeschlafene Temperaturmessung wiederzubeleben ($ort) - Restart IPS";
SMTP_SendMail($mailId,"FHT ALERT","Versuch $nr ($ort) - Restart IPS/FHT");
$ourFileName = "trigger";
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
fclose($ourFileHandle);
break;
case 5:
echo "Aktion Nr.$nr um eingeschlafene Temperaturmessung wiederzubeleben ($ort) - Restart IPS Machine";
SMTP_SendMail($mailId,"FHT ALERT","Versuch $nr ($ort) - Restart IPS Machine");
exec ("shutdown -f -r -t 01");
break;
case 6:
echo "Aktion Nr.$nr um eingeschlafene Temperaturmessung wiederzubeleben ($ort)- Give UP
";
echo "Wiederbelebung aufgegeben - Bitte eingreifen !";
SMTP_SendMail($mailId,"FHT ALERT","Wiederbelebung aufgegeben ($ort) - Bitte eingreifen !");
break;
}
}
?>
Gruß drini