FHT Uhrzeit setzen V2.x

Hallo zusammen,

gibt es von dem Script zwischenzeitlich was für V2? Eigener Überarbeitungsversuch ist fehlgeschlagen.:confused:

Gruß
Thorsten

Ich habe eine Frage: Spricht etwas dagegen, sämtliche Datums- und Zeitinformationen zu senden? Wenn nicht auf einmal, dann meinetwegen so nach und nach… oder, noch besser, bei Bedarf, also wenn sie vom Systemdatum abweichen

Grund: Nach Batteriewechsel ist bei meinem FHT die Uhrzeit und das Datum immer zurückgesetzt und es wäre toll, wenn man sich das Neueinstellen sparen könnte. Ich benutze meine Thermostate zwar alle auf Manu (IPS steuert), aber ich finds schon praktisch, wenn da die Uhrzeit steht. Eben als Uhr :slight_smile:

Siehe hier.

Ich habe jetzt mal das Skript von pshome unter 2.1 lauffähig gemacht. Dabei sind mir ein paar Sachen aufgefallen, die ich im Header als Bugs dokumentiert habe.

Ich werde noch dran rumbasteln und hier die jeweils aktuelle Fassung hinstellen. Es ist so gehalten, daß es sich ohne Angabe von konkreten Objekt-IDs sofort zurechtfindet.

Ich habe das Setzen der Stunde optional noch hinzugefügt, aber irgendwie klappt dieser Punkt noch nicht richtig… Die Verteilung der Minuten dagegen funktioniert scheinbar zuverlässig, wenn man von der Unschärfe durch den 2. beschriebenen Bug absieht.

Verbesserungen erwünscht!


<?
/*
*******************************
 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  : 3
           - option for debug output
           - option for updating hour
Bugs     : - updates only one FHT at a time instead of one per FHZ at a time
			  - when finding a command to send the minute, the script doesn't check whether the FHZ buffer is still empty
			  - sometimes the wakeup-timer is attemted to be set to a large negative number of seconds
			  - after sending command to FHZ check the free buffers and update the "last synced" time only if our commands are the only ones in the buffer
			  - script must be called "SET_FHT_CLOCK" to function correctly
			  - remaining print statements should be changed to IPS_LogMessage() calls
*/

// define how often clock should be set, every N days
$NDAYS = 3;
$SETHOUR = 1; // set to 0 to disable setting the hour on the FHT
$debug=0; // turns on debug output if not 0

$debug && IPS_LogMessage('Update FHT Clock',"debug output is on.");

// we need this variable - create if necessary
$FHT_SET_MINUTE_FHTID = @IPS_GetVariableIDByName("FHT_SET_MINUTE_FHTID", $IPS_SELF);
if ($FHT_SET_MINUTE_FHTID == false) // variable doesn't exist yet - create
   {
   $debug && IPS_LogMessage('Update FHT Clock', "creating variable FHT_SET_MINUTE_FHTID");
   $FHT_SET_MINUTE_FHTID = IPS_CreateVariable(1); // Integer
   IPS_SetName($FHT_SET_MINUTE_FHTID, "FHT_SET_MINUTE_FHTID");
   IPS_SetParent ($FHT_SET_MINUTE_FHTID, $IPS_SELF);
   }

if (GetValueInteger ($FHT_SET_MINUTE_FHTID) > 0 )
   {
   $debug && IPS_LogMessage('Update FHT Clock',"found command to sync FHT $FHT_SET_MINUTE_FHTID");
   // there is a minute set command waiting, so we send it
   $FHT_ID = GetValueInteger ('FHT_SET_MINUTE_FHTID');
   // this is the 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') ;
   if (intval(date('i')) < 30) // set hour only during first half of current hour
      {
   	$SETHOUR && FHT_SetHour  ($FHT_ID, intval(date('H')));
   	$LOGMSG = $LOGMSG . ' and Hour to ' .  date('H') ;
   	}
   IPS_LogMessage ('Update FHT Clock', $LOGMSG);
   return;
   }

// there is no minute set command waiting, so we can check for FHTs that need an update
if (intval(date('i')) > 5 )
   {
   if (intval(date('i')) < 55 )
      {
   	$debug && IPS_LogMessage('Update FHT Clock',"the time is right to look for FHTs to sync.");
      // 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_GetInstanceList());
      // find FHZ and check if enough free buffers
      foreach($INSTANCE_LIST as $IPS_INSTANCE)
         {
         // Get the Module Instance
         $MODULE_INSTANCE=IPS_GetInstance($IPS_INSTANCE);
         // check if this is the FHZ
         if ($MODULE_INSTANCE["ModuleInfo"]["ModuleName"] == "FHZ1X00PC")
            {
				$debug && print "	found ".IPS_GetName ($IPS_INSTANCE);
            // 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_GetFreeBuffer($IPS_INSTANCE) ;
				$debug && print " with $FREE_BUFFERS buffers free.
";
            if ($FREE_BUFFERS == 10)
               {
               // find the FHT's
               $CONNECTED_INSTANCES=IPS_GetInstanceChildrenIDs($IPS_INSTANCE);
               foreach($CONNECTED_INSTANCES as $IPS_INSTANCE)
                  {
                  // Get the module instance
                  $MODULE_INSTANCE=IPS_GetInstance($IPS_INSTANCE);
                  // check if this is a FHT
                  if ($MODULE_INSTANCE["ModuleInfo"]["ModuleName"] == "FHT")
                     {
                     $debug && print "		found ".IPS_GetName ($IPS_INSTANCE);
                     // this is the variable that remembers when FHT clock was last set
                     $LAST_CLOCK_VARNAME =  'FHT_LAST_CLOCK_SET_' . $IPS_INSTANCE;
                     
                     $LAST_CLOCK_VARNAMEID = @IPS_GetVariableIDByName($LAST_CLOCK_VARNAME, $IPS_SELF);
                     if ($LAST_CLOCK_VARNAMEID == false )
                        {
                        // if the variable doesnt exist, then we create it
                     	$debug && print ", creating memory variable for it";
                        $LAST_CLOCK_VARNAMEID = IPS_CreateVariable(1); // Integer
								IPS_SetName($LAST_CLOCK_VARNAMEID, $LAST_CLOCK_VARNAME);
								IPS_SetParent ($LAST_CLOCK_VARNAMEID, $IPS_SELF);
                        // set it to n days ago plus one second to trigger an immediate update
                        SetValueInteger ($LAST_CLOCK_VARNAMEID, (TIME() - ($NDAYS * 86400) - 1));
                        }
                     // read when clock was set
                     $LAST_CLOCK_SET =GetValueInteger($LAST_CLOCK_VARNAMEID);
                     // if last update more than n days ago then send time to fht
                     if (TIME() - $LAST_CLOCK_SET   >  ($NDAYS * 86400))
                        {
                     	$debug && print " and it's time to sync it.
";
                        // find the variable that tracks the position values
                        $POSITIONVAR = @IPS_GetVariableIDByName("Position", $IPS_INSTANCE);
                        // check when it was last received
                        $POSITIONVARINFO = IPS_GetVariable ($POSITIONVAR);
                        $LAST_STELL_UPDATE = $POSITIONVARINFO["VariableUpdated"];
                        // 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)
                        	{
                        	// too close to next timeslot, better take the one after
                         	$MINUTE_TO_SET=$MINUTE_TO_SET + 116;
                        	}
                        // we rememeber the FHT we need the minute to send to
                        SetValueInteger ($FHT_SET_MINUTE_FHTID,intval($IPS_INSTANCE));
                        // 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_VARNAMEID,TIME());
                        $LOGMSG = 'Set Minute Command queued to be sent to ' . $IPS_INSTANCE . ' in ' . intval($MINUTE_TO_SET) . ' seconds';
                        IPS_LogMessage ('Update FHT Clock', $LOGMSG);
                        // done
                        return;
                     	}else{
                     	$debug && print " and it should be in sync.
";
                        }
                     }
                  }
               }
            }
         }
      }
   }


?>

hi,

habe gerade deinen skript eingebaut.
ist ja schon ne weile her, dass du das ding umgeschrieben hier gepostet hast.
solltest du mittlerweile ein update habe, dann poste es hier doch nochmal.

ist es richtig, dass ich ein zyklisches ereignis zu jeder stunde aber nicht zur vollen einstellen muss, dass den skript aufruft.
oder macht es das event jetzt schon automatisch, dass der skript anlegt!??!

achso. ich sehe gerade, dass der skript hier noch unter ips 1.0 liegt. vllt. können die admins ja einen linkthread oder sowas ähnliches unter 2.0 erstellen, der hier zu der letzten seite linkt.

danke.

Habe den Thread getrennt und nach V2 verschoben.

Hallo Rainer,

A. Danke für die Mail

B. Köntest Du einen Link Posten ??

wir sind hier bei v2. :slight_smile:

der obere teil des threads war vorher bei v1.