Homematic und GOTO

Hallo,

für meine Beschattung habe ich ein Skript, das die Jalousien unter bestimmten Bedingungen auf eine jeweils definierte Höhe fährt. Da die Homematic-Aktoren manchmal nicht ordnungsgemäß reagieren, möchte ich sicherstellen, dass es in einem solchen Fall solange versucht wird, bis es klappt. Dazu möchte ich die Aktor-Variable „WORKING“ zur Hilfe nehmen wie folgt (die Aktor-Instanz hat die ID $JalID):

$ObjektID = @IPS_GetObjectIDByName("WORKING", $JalID);
a:	
HM_WriteValueFloat($JalID, "LEVEL", 0.15);	
if (!GetValue($ObjektID)) goto a;

Frage 1:
Nun dauert es immer ein wenig, bis die Infos aus Homematic in IPS ankommen, d.h. auch dann, wenn der Aktor reagiert, springt die IPS-Aktor-Variable „WORKING“ erst nach ein paar Sekunden auf TRUE. Solange wird der Schaltbefehl aber immer wieder an Homematic gegeben. Schadet das in irgendeiner Form (zuviel Funk-Verkehr, Aktor wird zu oft angesprochen und geht auf Dauer kaputt oder ähnliches)?

Frage 2:
Darüber hinaus stammt der obige Skriptteil aus einem Skript, das für verschiedene Rolläden aus ihnen jeweils zugeordneten Skripten per INCLUDE einbezogen wird, was auch parallel für 9-12 Jalousien der Fall sein kann. Kann dies zu Problemen führen?

Danke für Eure Hilfe, auch wenn die Antworten aus Profi-Sicht ggf. vollkommen klar sind…:confused:

Ich kann mir vorstellen, dass dein DutyCycle steigt und unter Umständen dann gar nichts mehr geht.

Bei HM sollte man eine gewisse Funkhygiene beachten.

Parallele Schaltbefehle sind auch nicht zu bevorzugen.

Ich würde die Dauerschleife entzerren und höchstens einen fehlgeschlagen Befehl wiederholen.

Bei den Rollos würde ich die zu mindest um 1 Sekunde zeitversetzt schalten.

Uli

Gesendet von iPhone mit Tapatalk

Fehlgeschlagene Befehle werden bei HM_WriteValueXxx mit false zurück gemeldet. Du musst also Working nicht auswerten.
Sondern nur den Rückgabewert von HM_WriteValueXxx auswerten.

Michael

Danke, Ihr beiden.

Michael, der Ansatz klingt prima. Wie frage ich den Rückgabewert ab? Das Beispiel in der Doku

$id_aktor = 12345;
$err = HM_WriteValueBoolean($id_aktor, "STATE" , False);
//echo "Err: " .(int) $err . "
";
if ($err === False){
    echo "Fehler: Schaltaktor - Befehl wurde nicht ausgeführt
";
    SetValue($id_done, False);
} else {
    SetValue($id_done, True);
    echo "OK: Schaltaktor - Befehl wurde  ausgeführt
";
}

kann ich leider bereits für eine Bool nicht ganz nachvollziehen…:mad Bei mir ist es zudem ja eine Float, wenn es um „LEVEL“ gehen würde…


// First run
$result = true;
$result = @HM_WriteValueFloat($JalID, "LEVEL", 0.15); 
// Second run
if ($result === false) {
   @HM_WriteValueFloat($JalID, "LEVEL", 0.15); 
}

Uli

Was du schaltest ist egal. Der Rückgabewert ist false wenn die CCU den Aktor nicht schalten konnte und true wenn der Befehl erfolgreich war. Egal ob du State, Level oder sonstwas schaltest.
Wobei ich Wiederholungen nicht als Lösung sehe. Hier wäre es besser du findest die Ursache.
Eventuell ist einfach der duty-cycle der CCU erreicht und sie darf gerade nicht senden?

Michael

Prima, herzlichen Dank noch mal an Euch beide…!

@Michael

Hallo Michael,

manchmal muss ich mehrere Aktoren schalten.

Beispiel Alarmsirene Innen und Außen.

Bei den neuen HmIP Komponenten sind ja vier Schaltbefehle notwendig:

HM_WriteValueInteger($alarmSiren, ‚ACOUSTIC_ALARM_SELECTION‘, 0);
HM_WriteValueInteger($alarmSiren, ‚OPTICAL_ALARM_SELECTION‘, 0);
HM_WriteValueInteger($alarmSiren, ‚DURATION_UNIT‘, 0);
HM_WriteValueInteger($alarmSiren, ‚DURATION_VALUE‘, $duration);

D.h. bei zwei Aktoren sind das 8 Schaltbefehle an die CCU.

Ich löse das so, dass ich nach dem ersten 4er Block ein IPS_Sleep(500) setzte, damit sichergestellt ist, dass die ersten vier durch sind und die zweiten vier Schaltbefehle gesendet werden können.

Wie würdest du es realisieren?

Uli

Wenn es so läuft, lass es doch.
Habe solche Geräte nicht.
Mir sind bisher immer nur die ganzen Anzeigen negativ aufgefallen, wenn man dort lange Strings versendet, die treiben immer den duty-cycle hoch.
Michael