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.