Hallo,
aufgrund mehreren Anfragen von Forum-Mitgliedern hier dann mein prinzip, wie ich die FHT’s ansteuere:
Vorwort:
Bitte immer jeweils bewusst sein, die FHZ es nicht mag, wenn sie vollgestopft wird mit Befehlen. Dann stellt sie auf ‚stur‘ und alle Befehle landen irgendwann im Timeout !
Ich möchte auch direkt im Voraus sagen, dass ich kein PHP Experte bin. Sicherlich werden einige behaupten, es ginge auch anders. So sei es denn !
- Zuerst einmal müssen die Variablen mit System angelegen werden, d.h. jedem Raum seine zugehörigen Variablen müssen auch als solch benannt werden.
Hier ein Beispiel aus meinem Projekt:
Der eingerahmte Teil bleibt immer der gleiche für alle Räume !
Der Raum hier wäre KITCH = Kitchen = Küche. Und so sind dann auch alle anderen Räume benannt !
Hier der Auszug aus dem GLOBAL_ARRAY Skript:
$Room_id = array(
'CENTHEAT',
'CELLAR',
'FLOOR',
'WC',
'SALA',
'KITCH',
'BATH1',
'BATH2',
'KID1',
'KID2',
'COMP',
'KID3',
'MASBED'
);
So, hier findet man dann alle Räume wieder, die im Haus sind, und von Relevanz für IPS sind !
Um dann zu vermeiden, dass alle FHT’s beim (Neu)Start von IPS alle miteinander angesprochen werden, habe ich das ganze in eine Schrittkette aufgeteilt. Somit würde im schlimmsten Fall nur jede Minute ein FHT Befehl rausgehen, und pro FHT nur alle 11 Minuten, da ich meine Schrittkette so eingestellt habe, dass sie 11 Minuten braucht um einen Zyklus zu durchlaufen.
Das basiert auf meinen Erfahrungswerten !
Hier wäre dann so eine Schrittkette:
// Load common arrays
include_once ('GLOBAL_ARRAYS.ips.php');
// -----------------------------------------------------------------------------
// Loop
$fht_loop = GetValueInteger('FHT_LOOP_COUNTER');
if ($fht_loop < 12) $fht_loop = $fht_loop + 1;
else ($fht_loop = 2);
include_once($Room_id[$fht_loop].'_GLOBDEF.ips.php');
include(IPS_GetScriptFile('FHT_MODUL'));
// -----------------------------------------------------------------------------
// Write Loop Value back to Variable
SetValueInteger('FHT_LOOP_COUNTER', $fht_loop);
Jeder Raum hat dann natürlich seine eigenen Einstellungen, und die müssen auch dann zusammengefasst werden und in einem Skript niedergelegt sein.
Das nenne ich dann GLOBDEF, was eben Globale Definitionen heisst. Da die für jeden Raum eben variieren können gibt es so eine Datei eben auch pro Raum !
Deshalb diese Zeile:
include_once($Room_id[$fht_loop].'_GLOBDEF.ips.php');
Hier ein Auszug aus der Globalen Definitionen Datei:
// Global defines for KITCHEN/DINING ROOM
// Global
$room = "KITCH";
$room_status = GetValueBoolean("KITCH_ROOM_STATUS");
$day_status = GetValueBoolean("KITCH_DAY_STATUS");
// FHT
$FHT_id = 56294;
$FHT_actual_temp = GetValueFloat("KITCH_FHT_ACTUAL_TEMP");
$FHT_actual_vpos = GetValueFloat("KITCH_FHT_ACTUAL_VPOS");
$FHT_actual_window = GetValueBoolean("KITCH_FHT_ACTUAL_WINDOW");
$FHT_target_mode = GetValueInteger("KITCH_FHT_TARGET_MODE");
$FHT_target_temp = GetValueFloat("KITCH_FHT_TARGET_TEMP");
$FHT_target_ips_t = GetValueFloat("KITCH_FHT_IPS_TEMP");
$FHT_target_ips_m = GetValueInteger("KITCH_FHT_IPS_MODE");
$FHT_low_batt = GetValueBoolean("KITCH_FHT_LOW_BATT");
....
So, nun müssen wir nur noch das FHT Modul aufrufen, in dem alle nötigen Funktionen zur Ansteuerung des FHT’s vorhanden sind:
// --- Execute Automatic only when Window closed and Mode = Automatic ----------
if (($FHT_actual_window == False) AND ($FHT_target_mode == 0))
{
// Script will only be executed when:
// 1. the window in the room is closed
// 2. the FHT is on Automatic
// Load common arrays
include_once("GLOBAL_ARRAYS.ips.php");
$time = date("H:i");
$day_parameter = array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","");
$actual_day = date("w");
// Select the Parameters for FHT
if ($room_status == False)
$handle = fopen("C:/IP-Symcon/DATA/".$room."_FHT.par","r");
else
$handle = fopen("C:/IP-SYMCON/DATA/".$room."_FHT_HOL.par","r");
// Find the right parameter to adjust the target if necessary
while ($line = fgets($handle, 1000))
{
$parameter = explode(";", $line); //[0]-Day, [1]-Start Time, [2]-Temperature
$day = $parameter[0];
$switchtime = $parameter[1];
$temp = $parameter[2];
if (($day == $day_parameter[$actual_day]) AND ($time > $switchtime))
$newtemp = substr($temp, 0, 4); // extract the "
" from the file
}
fclose($handle);
// When Value changes -> Send the new Value to the Unit
if ($memo_temp != $newtemp)
{
FHT_SetTemperature($FHT_id, (float)$newtemp);
SetValueFloat($room."_FHT_MEMO_TEMP", (float)$newtemp);
}
// If Actual and Target Values don´t match
else
if ($FHT_target_temp != $memo_temp)
{
// If IPS Request has been updated recently, but IPS Request
// has not been sent yet to FHT, don't send Value again
// But if Target has been changed manually, the Value will
// be sent again
$update_ips_request = IPS_GetUpdateTime($room.'_FHT_IPS_TEMP');
$update_ips_target = IPS_GetUpdateTime($room.'_FHT_TARGET_TEMP');
if ($update_ips_target > $update_ips_request)
{
SetValueString('HMI_LOG_NEW_MESSAGE', $Room_id_text[$room].chr(9).': Wrong Target Temp. according to Parameters ('.$FHT_target_temp.' °C)');
FHT_SetTemperature($FHT_id, (float)$newtemp);
}
}
}
So, ich hoffe, jeder kann hiermit was anfangen. Vorteil dieser Vorgehensweise ist eben, dass wenn man eine Umänderung machen will, nicht jedesmal x Skripte umändern muss, sondern nur das FHT Modul
mfG Franz