FHT Uhrzeit setzen

Hier noch ein Skript das sich bei mir bewährt hat.

Ich habe einen FHT die jeden Tag fast 1 Minute nachgeht.
Die anderen gehen auch nach längerer Zeit ein paar Minuten falsch.
Das ist ärgerlich wenn die Dinger im Automode laufen und wie bei mir die Zeiten mit der Heizung (Nachtabsenkung) kombiniert sind.

Folgendes Skript sorgt für korrekte Uhrzeiten ohne die FHZ Queue zu stressen.

Voraussetzung ist natürlich das die PC Uhr stimmt (lässt sich ja leicht mit NTP synchronisieren).

Es werden alle FHT automatisch gefunden, eine Anpassung des Skripts an die örtlichen Gegebenheiten ist nicht nötig.

Für jeden FHT wird automatisch eine Variable ‚FHT_LAST_CLOCK_SET_xxxxx‘ angelegt um zu Speichern wann zuletzt die Zeit gestellt wurde.

$NDAYS definiert wie Oft die Uhrzeit gestellt wird, Vorgabe ist alle 3 Tage.
Je nach Drift der FHT Uhren sollte eigentlich auch weniger oft reichen.

Die FHZ queue wird geprüft, und falls kein Platz (mindestens 7 freie buffer) gewartet, es eilt ja nicht die Uhr zu setzen.

Das Skript per Timer einmal pro Stunde aufrufen.


 IP-SYMCON Event Scripting
*******************************
File     : SET_FHT_CLOCK.ips.php
Trigger  : Timer
Interval : once per hour
Purpose  : Set clock of all FHT once every n days
Version  : 1

*/

// define how often clock should be set, every N days
$NDAYS = 3;
// loop thourgh all IPS instances
$INSTANCE_LIST=(IPS_GetInstanceIDs());
// find FHZ 
foreach($INSTANCE_LIST as $IPS_INSTANCE)
   {
   // Get the Module Instance
   $MODULE_INSTANCE=IPS_GetModuleInstance($IPS_INSTANCE);
   // check if this is the FHZ
   if ($MODULE_INSTANCE['moduleguid'] =='{57040540-4432-4220-8D2D-4676B57E223D}')
      {
      // check if at least 7 buffers free , we need 5 to set the clock and should leave some buffers for other things
      $FREE_BUFFERS = FHZ_GetFreeFHTBuffer($MODULE_INSTANCE['instanceid']) ;
      if ($FREE_BUFFERS >= 7 )
         {
         // find the FHT's
         $CONNECTED_INSTANCES=IPS_GetModuleInstanceConnections($IPS_INSTANCE);
         foreach($CONNECTED_INSTANCES as $IPS_INSTANCE)
            {
            // check if we still  have enough buffers
            if  ($FREE_BUFFERS >= 7)
               {
               // Get the module instance
               $MODULE_INSTANCE=IPS_GetModuleInstance($IPS_INSTANCE);
               // check if this is a FHT
               if ($MODULE_INSTANCE['moduleguid'] =='{A89F8DFA-A439-4BF1-B7CB-43D047208DDD}')
                  {
                     // this is the variable that remembers when FHT clock was last set
                     $LAST_CLOCK_VARNAME =  'FHT_LAST_CLOCK_SET_' . $MODULE_INSTANCE['instanceid'];
                     if (IPS_VariableExists ($LAST_CLOCK_VARNAME) == false )
                        {
                        // if the variable doesnt exist, then we create it
                        IPS_CreateVariable ($LAST_CLOCK_VARNAME,'Integer');
                        // set it to n days ago plus one second to trigger an immediate update
                        SetValueInteger ($LAST_CLOCK_VARNAME, (TIME() - ($NDAYS * 86400) - 1));
                        }
                     // read when clock was set
                     $LAST_CLOCK_SET =GetValueInteger ($LAST_CLOCK_VARNAME);
                     // if last update more than n days ago then send time to fht
                     if (TIME() - $LAST_CLOCK_SET   >  ($NDAYS * 86400))
                        {
                        FHT_SetYear ($MODULE_INSTANCE['instanceid'],intval(date('y')));
                        FHT_SetMonth ($MODULE_INSTANCE['instanceid'],intval(date('m')));
                        FHT_SetDay ($MODULE_INSTANCE['instanceid'],intval(date('d')));
                        FHT_SetHour  ($MODULE_INSTANCE['instanceid'],intval(date('H')));
                        FHT_SetMinute  ($MODULE_INSTANCE['instanceid'],intval(date('i')));
                        // update the Variable that remembers last setting
                        SetValueInteger ($LAST_CLOCK_VARNAME,TIME());
                        IPS_LogMessage ('Updated FHZ Clock', strval($MODULE_INSTANCE['instanceid'])); 
                        $FREE_BUFFERS =$FREE_BUFFERS -5;
                        }
                     }
                  }
               }
            }
         }
      }
?>

P.S.

Ein update gibts ein paar Beiträge weiter unten.

Da sind ein paar Dinge, die du getrost rausschmeissen kannst. Du brauchst nicht andauernd deinem FHT SetYear, SetMonth, usw nachzuschmeissen ! Das belastet unnützt den Buffer.

Am besten ist, du setzt einmal deine FHT’s manuell, und sendest nur die SetMinute Zeile und einmal im Monat genügt völlig aus !

mfG Franz

Hallo,

Ich habe hier schon einige threads gelesen, die sich mit dem Setzen der Zeit der FHTs beschäftigen.
Meine FHTs (6x) habe ich jetzt fast ein Jahr im Einsatz und die gehen +/- 1 Minute genau… Da verstehe ich den Sinn nicht, die ständig zu stellen.
Wenn man vom Rechner gesteuert regelt, dann macht das eh keinen Sinn, oder?
Da ist es wichtig, dass die Zeit (per NTP, oder Funkuhr geholt) passt.
Selbst bei Automatikbetrieb, kommt es doch auf eine Minute hin und her auch nicht an?!

Zumindest würde ich es maximal so halten, wie Franz es schreibt… Einmal SetMinute pro Monat maximal, das reicht vollkommen…

Hallo,

ich hatte das erst genau so versucht, dann haben aber die FHT die Zeit nicht angenommen. Nur wenn ich komplett Jahr/Monat/Tag/Stunde/Minute sende funktionierts zuverlässig.

:confused: Ich verstehe den Zweck deines Kommentars nicht. :confused:
Ich habe doch extra geschrieben das ich einen habe der jeden Tag ne Minute falsch geht und meine alle auf Automatik laufen.

Bitte nimm das nicht persönlich, denn so war das nicht gemeint:o
Das hatte ich überlesen, dass dein FHT so daneben liegt, sorry!
Normal ist das aber glaube ich nicht, diese Zeitdifferenz.
Da würde ich reklamieren!
Denn wie geschrieben, keiner meiner 6 FHTs, die ich im Einsatz habe, weichen so der Art ab. Das würde ich bei E*V auch so begründen…

Nochwas, wenn man nur die Minute schickt (wenns denn geht) dann darf das Skript nicht zu vollen Strunde laufen, sonst kanns passieren das der FHT z.B auf 10:59 steht und mann ihn mit Minute = 00 auf 10:00 stellt, dann geht er ne Stunde falsch :smiley: .

Also entweder Stunde und Minute senden oder das Skript z.B zur halben Stunde aufrufen.

Kein Problem, ich habs nicht persönlich genommen. :cool:

Ich hab erst gemerkt das einer so weit falsch geht nachdem ich von der FHZ1000(nicht PC version) auf FHZ1300 umgestiegen bin. Die FHZ1000 synchronisiert die Zeit der FHT von alleine, da gehn denn auch alle immer richtig. Reklamieren… zu viel Aufwand, kostet Porto und im Winter brauch ich ja das Teil :slight_smile: das Skript tuts ja auch.

PsHome,

Dein script ist gut gedacht aber …
Bei der ausfuhrung braucht er 5 queue-plätze pro durchlauf. Das script checkt ob es 7 freie gibt.
Nach durchlauf der erste FHT sind 5 gebraucht ergo gibt es keine 7 freie mehr und wird also nur der erste FHT gesyncht. Die anderen werden niemals mit ne neue zeit vorsehen…

Das thema hat sich wohl etwas zu eiferig erstellen lassen :wink: trotzdem danke! Gute idee um generelle scripts ausfuhren zu können die alle aktoren einem kategorie mit rein nimmt.

Dann tausch den Quarz im FHT aus und gut is…

Nee… stimmt so nicht ganz, der nächste FHT wird dann halt beim nächsten Aufruf des Skripts eine Stunde später gesetzt (wenn die queue dann frei ist).

Aber es stimmt trotzdem, die zweite Abfrage macht so wenig Sinn weil ja nie genug buffer frei sind. Es würde reichen nachdem 1 FHT gestellt wurde das Skript zu verlassen. Das war halt schnelles cut&paste :o geht aber trotzdem.

Aber wenn wie vorgeschlagen nur die Minuten geschickt werden, dann kannst du die max Buffer Werte statt auf 7 auf 2 setzen und dann passts wieder.

Ich habe das Skript bei mir jetzt auf „Nur Minute setzen“ geändert.
Mal sehen ob das geht. Ich hatte es ursprünglich mit „Stunde und Minute setzen“ gemacht und das ging nicht.

Es gibt übrigens doch einen echten Bug, Zeile 64 die den Logeintrag macht hab ich auf die schnelle beim „hübsch machen“ eingefügt. Der zweite Paramater ist aber falsch, muss ein String sein.

Die Zeile rausschmeissen oder so ändern:

  IPS_LogMessage ('Updated FHZ Clock', strval($MODULE_INSTANCE['instanceid']));

Dass die FHT’s mit der Zeit falsch laufen, ist gewusst, dass muss man immer wieder bei E*V reklamieren. Dennoch, es genügt völlig, wenn du denen nur die Minuten übermittelst, und das geht auch tadellos, bei mir auf jedenfall schon mehr als ein Jahr.
Sowieso, wenn du mit diesen FHT befehlen spielst, wird deine Zeit sowieso immer falsch sein, denn wenn du diese Befehle zu einem bestimmten Zeitpunkt in den Buffer schickt, deine FHZ aber erst diese Befehle 5 Minuten später rausschickt, gehen deine FHT’s sowieso wieder 5 Minuten falsch.
Dieses Thema ist schon seit längerem eine Diskussion, und es wurde noch nie richtig gelöst.
Ich muss es leider erwähnen, nur C0NTR0NICS Software beherrscht die Synchronisation der FHT’s perfekt.

Ausserdem, sehr gutes Skript, nur leider funktionniert es mit WLAN FHZ’s nicht !

mfG Franz

also bei mir gehen die Kommandos eigentlich immer innerhalb von 2 Minuten raus, meistens schneller. Auf ein paar Minuten Fehler bei der Uhr kommts ja auch wirklich nicht an, aber wenns irgendwann eine halbe Stunde ist, dann wirds zuviel. Mann könnte ja auch immer eine oder zwei Minuten zugeben wenn man das Komando schickt, dann passts etwas besser.

Ich habe keine WLAN FHZ, warum funktionierts damit nicht?

Na währ doch gelacht wenn das mit IP-SYMCON nicht auch gehen würde.

Hier Version 2 meines Skripts, es setzt die FHT Zeit auf die Minute genau.

Wie funktionierts? Ich hab mal das Timing der FHZ angeschaut, Komandos aus der Queue gehen immer kurz vor einer neuen Stellmeldung raus.

Der Empfangsslot der FHT ist also immer kurz vor einer Stellmeldung offen.

Die Stellmeldungen kommen ziemlich genau alle 116 Sekunden an, ob das überall so ist weiss ich nicht, evtl den Wert anpassen.

Wenn nun das FHTSetMinute Kommando zur rechten Zeit geschickt wird (115 Sekunden plus etwas Sicherheitsabstand nach dem letzen Stellwertupdate) gehts sofort raus und die Zeit stimmt.

Das klappt aber nur wenn nicht schon andere Kommandos an den selben FHT in der Queue sind. Da sich die Queue nicht abfragen lässt schicke ich einfach nur wenn die Queue ganz leer ist, es eilt ja nicht.

Es stimmt das man nur die Minute senden kann, warum das vorher bei mir nicht geklappt hat weiss ich nicht. Jetzt wird nur noch die Minute gesendet. Das kann aber in die Hose gehen wenn z.b. der FHT nachgeht und auf 10:59 steht und dann die Minute „00“ erhält. Dann wird er auf 10:00 gesetzt und geht eine Stunde falsch. Das Skript läuft darum nicht 5 Minuten vor/nach der vollen Stunde. Das Skript nun entweder alle halbe Stunde aufrufen (wobei der Aufruf zu vollen Stunde nichts tut) oder einen Customtimer schreiben.


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : SET_FHT_CLOCK.ips.php
Trigger  : Timer
Interval : call it once per hour  , but not at the full hour, use a custom timer or call the it every 30 minutes :)
Purpose  : Set clock of all FHT'S once every n days
Version  : 2
           - updates only minute value
           - waits for timeslot to be ready to set time
           - doesnt run between between 5 minutes beofre and after full hour
*/

// define how often clock should be set, every N days
$NDAYS = 3;

// we need this variables, to be created if needed

if (IPS_VariableExists ('FHT_SET_MINUTE_FHTID') == false)
   {
   // this is the ID of FHT that needs setting
   IPS_CreateVariable ('FHT_SET_MINUTE_FHTID','Integer');
   }

if (GetValueInteger ('FHT_SET_MINUTE_FHTID') > 0 )
   {
   // there is a minute set command waiting, so we send it
   $FHT_ID = GetValueInteger ('FHT_SET_MINUTE_FHTID');
   // this is te FHT to send to
   FHT_SetMinute  ($FHT_ID, intval(date('i')));
   SetValueInteger ('FHT_SET_MINUTE_FHTID',0);
   //  switch off the timer
   IPS_SetScriptTimer ('SET_FHT_CLOCK',0);
   $LOGMSG = 'Command sent to ' . $FHT_ID . ' - Set Minute to ' .  date('i') ;
   IPS_LogMessage ('Update FHT Clock', $LOGMSG);
   return;
   }

// there is no minute set command waiting, so we can check for FTH'" that need an update
if (intval(date('i')) > 5 )
   {
   if (intval(date('i')) < 55 )
      {
      // setting the minute at the full hour may cause undesired results (set 10:59 to 10:00 for example)
      // loop thourgh all IPS instances
      $INSTANCE_LIST=(IPS_GetInstanceIDs());
      // find FHZ and check if enough free buffers
      foreach($INSTANCE_LIST as $IPS_INSTANCE)
         {
         // Get the Module Instance
         $MODULE_INSTANCE=IPS_GetModuleInstance($IPS_INSTANCE);
         // check if this is the FHZ
         if ($MODULE_INSTANCE['moduleguid'] =='{57040540-4432-4220-8D2D-4676B57E223D}')
            {
            // check if all 10 buffers free , otherwise our command maybe not the first in queue to the FHT we want to set and is then sent to late
            $FREE_BUFFERS = FHZ_GetFreeFHTBuffer($MODULE_INSTANCE['instanceid']) ;
            if ($FREE_BUFFERS == 10 )
               {
               // find the FHT's
               $CONNECTED_INSTANCES=IPS_GetModuleInstanceConnections($IPS_INSTANCE);
               foreach($CONNECTED_INSTANCES as $IPS_INSTANCE)
                  {
                  // Get the module instance
                  $MODULE_INSTANCE=IPS_GetModuleInstance($IPS_INSTANCE);
                  // check if this is a FHT
                  if ($MODULE_INSTANCE['moduleguid'] =='{A89F8DFA-A439-4BF1-B7CB-43D047208DDD}')
                     {
                     // this is the variable that remembers when FHT clock was last set
                     $LAST_CLOCK_VARNAME =  'FHT_LAST_CLOCK_SET_' . $MODULE_INSTANCE['instanceid'];
                     if (IPS_VariableExists ($LAST_CLOCK_VARNAME) == false )
                        {
                        // if the variable doesnt exist, then we create it
                        IPS_CreateVariable ($LAST_CLOCK_VARNAME,'Integer');
                        // set it to n days ago plus one second to trigger an immediate update
                        SetValueInteger ($LAST_CLOCK_VARNAME, (TIME() - ($NDAYS * 86400) - 1));
                        }
                     // read when clock was set
                     $LAST_CLOCK_SET =GetValueInteger ($LAST_CLOCK_VARNAME);
                     // if last update more than n days ago then send time to fht
                     if (TIME() - $LAST_CLOCK_SET   >  ($NDAYS * 86400))
                        {
                        $INSTANCE_DATA=IPS_GetInstanceSettings ($MODULE_INSTANCE['instanceid']);
                        // find the variable that tracks the position values
                        $STELL_VARIABLE_NAME = preg_match( '#PositionVar.*"(.*)"#', $INSTANCE_DATA, $m) ? $m[1] : '';
                        // check wehn it was last received
                        $LAST_STELL_UPDATE =IPS_GetUpdateTime ($STELL_VARIABLE_NAME);
                        // Positions come about every 116 seconds,  this is the time left until the next pos comes.
                        // a tx timeslot is available just before, so we send our command 5 beofre the slot is open
                        // if the commands are sent to late , then change this value (111) a bit
                        $MINUTE_TO_SET =  111- (TIME() -$LAST_STELL_UPDATE );
                        if ($MINUTE_TO_SET < 15)
                        {
                        // to close to next timeslot, better take the next one
                         $MINUTE_TO_SET=$MINUTE_TO_SET + 116;
                        }
                        // we rememeber the FHT we need the miute to send to
                        SetValueInteger ('FHT_SET_MINUTE_FHTID',intval($MODULE_INSTANCE['instanceid']));
                        // we call ourselves just before the timeslot is ready
                        IPS_SetScriptTimer ('SET_FHT_CLOCK',intval( $MINUTE_TO_SET));
                        // update the Variable that remebers last time setting for this FHT
                        SetValueInteger ($LAST_CLOCK_VARNAME,TIME());
                        $LOGMSG = 'Set Minute Command queued to be sent to ' . $MODULE_INSTANCE['instanceid'] . ' in ' . $MINUTE_TO_SET . ' seconds';
                        IPS_LogMessage ('Update FHT Clock', $LOGMSG);
                        // done
                        return;
                        }
                     }
                  }
               }
            }
         }
      }
   }


?>

Die Sache mit dem warten auf den Timeslot kann man natürlich für so einiges verwenden. Damit bekommt man die Kommandos offenbar zuverlässiger raus als wenn man einfach in die Queue schreibt. Ich vermute mal, das mit einer eigenen Verwaltung die dafür sorgt das immer nur eine Kommando pro FHT zur rechten Zeit gesendet wird der Durchsatz und die Zuverlässigkeit der Kommandos Richtung FHT’S verbessert werden kann.

p.s.

kleines Bugfix, muss natürlich

if ($FREE_BUFFERS == 10 )

heissen. jetzt stimmts.

p.p.s stat exit jetzt return, exit macht wohl u.U. Probleme mit anderen Timern.

Naja, weil du die Module GUID abfragst ? Oder gibt es da wieder villeicht etwas was ich noch nicht weiss, bzw, wo kann ich diese ModuleGUI einsehen ?

Ich habe gesehen, dass du diese ID auch für einen FHT gefunden hast??? ‚{A89F8DFA-A439-4BF1-B7CB-43D047208DDD}‘

mfG Franz

Das ist ja mal eine interesaante Erkenntnis betreffend FHT’s !

In der Tat kommen Ventilpositionen alle 2 Minuten rein, fast Sekundengenau!
Jetzt muss ich nur noch probieren, ob ein Telegramm wirklich nach dem Eintreffen einer Ventilposition auch dann rausgeht.
Das wäre in der Tat eine wichtige neue Erkenntnis. (zumindest für mich)

Super !

mfG Franz

Beim Ausführen des Skriptes erhalte ich immer in den Kernel Messages:

ScriptError: .currentscript ~ Sender: Execute ~ Result:

Leider kenne ich mich nicht sehr gut mit den Meldungen aus, um gezielt danach zu suchen.

Was kann es sein? Oder liegt es daran, dass ich eine FHZ 1300 WLAN habe???

Gruß,

Specky

@ Specky: Könnte eine Vermutung sein, da IPS laut Skript eben keine FHZ finden wird. Nun, ich sprech es lieber leise aus, da ich mir mit dieser ModuleGUID noch nicht im klaren bin !

@ alle:

In der Tat, es ist eine neue interessante Erkenntis, dass ein Zusammenhang besteht zwischen Ventilposition und Senden eines neuen Telgramms.

Beipiel:

FHT Ventilpositionen, Zeitindex

11:05:54 VPOS
11:07:49 VPOS
11:09:49 VPOS
11:11:45 VPOS

Dann sende ich ein Telegramm zu diesem FHT

[Befehl wartet in der Queue]

Jetzt kommt ein Timeslot…

11:13:50 TELEGRAMM wird gesendet, jedoch keine Ventilposition

11:15:40 VPOS wieder

Und das klappt jedesmal

mfG Franz

Hallo Franz,

zum Beispiel, indem Du WIIPS installierst, da hast Du dann in der Uebersicht alle GUID aller Module. In WIIPS wird das schon seit jeher so gemacht, schau es Dir einfach mal in den Sourcen an. Du musst es ja deshalb noch lange nicht nutzen, aber bestimmt kannst Du aus dem Code Dir einige Ideen rausholen.

Gruss Torro

Danke für die Info, Torro

Doch du weisst, ich mag das WIIPS nicht installieren, somit wäre es auch ein leichtes gewesen, mir einfach nur zu sagen, wo das WIIPS diese GUI’s rausnimmt, anstelle dass ich das jetzt installieren muss, und nachher wieder de-installieren !

mfG Franz