Zeitkritische Scriptbefehle

Für die Steuerung der Lamellenwinkel bei einem Raffstore verwende ich folgende Befehle

Ausgangssituation immer gleich: Die Jalousie ist komplett geschlossen und WORKING = false

HM_WriteValueFloat ($id,„LEVEL“,1);
IPS_Sleep (400);
HM_WriteValueBoolean ($id,„STOP“,True);

Leider versagt die Steuerung in etwas mehr als 5% der Aufrufe und die Lamellenwinkel weichen dann deutlich vom vorausberechneten Wert ab.
In diesen Fällen benötigt die Abarbeitung der 3 Befehle deutlich mehr Zeit. Normalerweise liegen die Ausführungszeiten zwischen 700 und 750 ms, aber wenn Ausreißer auftreten kann die Zeit schon mal auf 1100 ms ansteigen.
Ist es die CCU (CCU2), die manchmal träge reagiert weil sie überlastet ist oder gibt es für die HM-Befehle eine Warteschlange? Sind es andere IP-Symcon Scripts, die sich in den Ablauf einschieben?
Kann ich eine Verbesserung erwarten, wenn ich die Jalousie-Aktoren (wired) über eine eigenen CCU betreibe?

Direkt den richtigen Wert z.b. 0.2 übergeben funktioniert nicht ?
Weil dann zählt ja der Aktor die Zeit.
Michael
PS: Bei mir ist 0% geschlossen.

Leider Nein. Die Steuerung über den Level ist viel zu grob. Ich strebe eine Genauigkeit der Lamellenwinkel von ±3 Grad an. Die Winkel werden nach Sonnenstand und Geometrie der Lamellen genau so berechnet, dass keine Sonne ins Zimmer fällt, aber optimale Sicht nach außen besteht.

Weitere Idee wäre es das über ein Programm in der CCU zu realisieren.
Somit hättest du als zeitkritischen Faktor zumindest das Netzwerk zwischen IPS und CCU nicht mehr.
Dann bleibt noch die Frage wie viel auf dem RS485-Bus los ist und natürlich das Netzwerk zwischen CCU2 und RS485-Gateway.
Vielleicht hilft hier wirklich nur eine separate CCU (1 am besten da hier RS485 direkt angesprochen wird).
Michael

Hast du mal getestet ob die Zeit im Script denn überhaupt stimmt? Läuft sleep denn 400ms? Wie lange braucht das gesamte Script?

Könnte mir vorstellen dass der „Luftraum“ oder dein Gateway schlicht und einfach grade „besetzt“ ist. Funk ist keine Zauberei sondern hat auch eine Verarbeitungszeit. Im Falle von Homematic ist diese variabel.

Gruß,

Toni

Hi,

Problem inzwischen gelöst.
Auch ein auf der CCU ausgeführtes Programm verursacht die gleiche Ungenauigkeit.
Es funktioniert, wenn man die Zeit bis zur Rückgabe misst, bis der Befehl mit true bestätigt wird. Diese Zeit variiert. Der eigentliche Schaltbefehl danach nicht.

Man misst die Zeit bis zur Rückgabe und berechnet daraus die korrekte sleep Zeit. Läuft so perfekt.

Gruß Sebastian

Hallo!

Hab das selbe Problem, kannst du deinen Lösungsweg genauer beschreiben.

Danke und lg

@christianbre
Sieh Dir mal mein Script unten an.
Wie Buzz2912 schon angedeutet hat, habe ich einen Workaround programmiert (siehe oben). Bei jeder Ausführung des Up Befehls wird die Zeit für den ersten HM-Befehl gemessen. Weicht sie von der „Norm (minimaler Wert)“ ab, wird der anschließende Sleep Befehl entsprechend korrigiert. Du brauchst zunächst eine Hilfsvariable (Integer), welche die kürzeste Ausführungszeit speichert. Nach 20-30 Versuchen sollte das Minimum gefunden sein, dann ändert sich der Wert für die minimale Ausführungszeit wohl nicht mehr.
Nach dem Absenden des Befehls HM_WriteValueFloat(…,‚LEVEL‘,1) an den Aktor vergeht unterschiedlich viel Zeit, bis das Script mit dem nächsten Befehl weitermachen kann. Diese Unterschiede werden ausgeglichen.
Ob auch der HM-Stop Befehl einen ähnlichen Effekt aufweist, also ob nach dem Absenden des Befehls auch unterschiedlich viel Zeit vergeht, bis der Stoppbfehl zum Aktor gelangt, kann ich nicht sagen. Aber in der Praxis hat sich die Korrektur wie unten bewährt. Die Lamellenwinkel sind jetzt mit einer recht guten Reproduktion einstellbar.

<?

$id = 13985;  // Instanz Raffstore
$idHilfsvar = 55678;  // Integer Hilfsvariable Bitte anlegen

function Up($idRaffstore,$Uptime) {
  global $idHilfsvar;
  $TMin = GetValue($idHilfsvar);

  $T0=microtime(true);  // Startzeit für HM-Befehl
  $OK = @HM_WriteValueFloat($idRaffstore,"LEVEL",1);
  if (!$OK) return;
  $T1=microtime(true);
  $TAkt = floor(1000*($T1-$T0));  // in ms
  if (($TMin==0) || ($TAkt<$TMin))
     {  $TMin = $TAkt;
   	  SetValue($idHilfsvar,$TMin);
     }
  $T = $Uptime - ($TAkt-$TMin);
  echo "Uptime $Uptime".PHP_EOL;
  echo "TMin=$TMin TAkt=$TAkt".PHP_EOL;
  echo "Sleeptime $T".PHP_EOL;

  if ($T>50) {IPS_Sleep($T);}

  HM_WriteValueBoolean($idRaffstore,"STOP",True);
}  // end function Up


Up($id,400);
IPS_Sleep(1000);
HM_WriteValueFloat($id,"LEVEL",0);
IPS_Sleep(2000);

?>

Hallo!

Vielen Dank für das Scriptbeispiel, hat mir sehr weitergeholfen!

lg Chris

Auch von mir herzlichen Dank für die Idee! Endlich können die HM Jalousieaktoren zuverlässig verwendet werden.:smiley: