Beispiel zur effektiven FHT Steuerung

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 !

  1. 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

SUPER, SUPER, SUPER

Vielen Dank

Hallo,

Sowas ähnliches habe ich auch. Ich hätte ein paar Fragen:

Wie sieht deine Parameter-Datei aus? So wie die Programmierung aussieht (ev. hab ichs übersehen) beginnt jeder Tag mit 00:00 Uhr?

Was ist die $memo_temp (ev. Zusammenhang mit oben)?

Wird das Script noch durch Variabeln getriggert (Target Temp.)?

Was ist der room_status?

Sorry für die vielen Fragen, ich suche weitere Ideen für meine Umsetzung (ja, ich bin fertig mit meiner Parameterdatei mittels Designer erstellen), wobei ich wahrscheinlich schon das Meiste drin habe.

Gruss

hightower

Wie sieht deine Parameter-Datei aus? So wie die Programmierung aussieht (ev. hab ichs übersehen) beginnt jeder Tag mit 00:00 Uhr?

Um das Problem zu umgehen setze ich immer um 00:01 noch einmal de gleiche Temperatur, die vor 00:00h war.

Hier ein Auszug aus einer Parameter datei:

Monday;00:01;18.0
Monday;07:00;22.0
Monday;19:00;18.0
Tuesday;00:01;18.0
Tuesday;07:00;22.0
Tuesday;19:00;18.0
Wednesday;00:01;18.0
Wednesday;07:00;22.0
Wednesday;19:00;18.0
Thursday;00:01;18.0
Thursday;07:00;22.0
Thursday;19:00;18.0
Friday;00:01;18.0
Friday;07:00;22.0
Friday;19:00;18.0
Saturday;00:01;18.0
Saturday;07:00;22.0
Saturday;19:30;18.0
Sunday;00:01;18.0
Sunday;07:00;22.0
Sunday;19:00;18.0

Die Memo Temp dient eben dazu um den letzten abgespeicherten Wert abzuspeichern, sodass nicht bei jedem neuen Durchlauf der Wert erneut an den FHT gesendet wird.

Jeder Raum hat einen Status, den ich als ‚Normal‘ und ‚Ferien‘ Status bezeichne.
Beispiel: Sind die Kinder in Schulferien und ich muss arbeiten, dann sind nur die Room-Stati von den Kinderzimmern auf TRUE gesetzt und es wird somit eine andere Parameter Datei aufgerufen, eben mit Ferienangepassten Parametern.
Das gleiche gilt für die Rolläden !

Die Room Stati werden auch wiederum von einer Parameterdatei gesteuert, die ich einmal um 00:01h aufrufe. Somit werden die automatisch alle gesetzt. So brauch ich nur einmal im Jahr alle Schulferien, Feiertage und meinen Urlaub einzutragen und dann läuft das ein Jahr durch, ohne irgendwie eingreifen zu müssen

Das Skript wird durch nix getriggert, nur durch die Aufrufe in der Schrittkette !

mfG Franz

Hallo,

bin noch sehr unerfahren was das Programm angeht, versuche gerade die Variablen zu erstellen und es klappt soweit schon mal das ich Werte reinbekomme. Jedoch beim erstellen der Variablen werden die alle in einen Ordner not categorized) gelegt. Etwas Übersicht wäre da nicht schlecht, da ja immer mit Erweiterungen zu rechnen ist. Wie erstelle ich Unterordner wie im oberen Bild zu sehen ist, also Level1 dann Kitch usw.

Bin jetzt ca. einen Monat mit IPS am versuchen und noch sehr überfordert mit vielen Dingen aber vielleicht geht eines Tages auch bei mir mal ein Licht auf.

MfG Bernd

Einfach in der Variablen TreeView Ansicht die rechte Maustaste drücken und Catagory > Add Catagory Auswählen, einen Namen vergeben und fertig.
Danach einfach per drag&drop die Variable reinpacken.

Danke soweit für die Antwort, dachte schon fast das es so zu machen ist. Ich bekomme aber nur „add Variable“ frei alle anderen Felder sind gegraut. Da liegt wohl noch ein weiterer Fehler bei meinen Einstellungen vor. Das Programm erweist sich immer mehr als etwas zu hoch für mich. Am Besten wieder einmal in die Ecke damit und die kalten Wintertage zum Testen verwenden und alles nochmals neu installieren.

Gruß Bernd

Die meisten von uns waren blutige Anfänger (inklusive mir), was PHP anbelangt. Zum Glück hatte ich grosse Erfahrung von SPS Programmierung, so konnten verschiedene Ideen mit reinfliessen, nur eben stellte sich immer gleiche Frage:
Ich weis was ich tun will, nur wie mache ich das in PHP ! Man lernt eben nie aus !

mfG Franz

PS: Und ausserdem ist dies hier ein tolles aktives Forum. Da werden sie immer geholfen !

Mach mal rechte Maustaste auf dem IP-Symcon Zweig, dann sollte es gehen, also nicht eiunfach auf die frei Fläche klicken, sondern wodrunter du die Kategorie anlegen willst.