Schaltbefehl im Fehlerfall erneut senden

Hallo zusammen,

ist es möglich, wenn ein Schaltbefehl nicht erfolgreich war den Befehl zu wiederholen?
Geht das in einen Script, oder läuft das Skript auf Grund des Fehlers nicht weiter?

Beispiel:


//Gerät einschalten
$err = HM_WriteValueBoolean(Zwischenstecker, "STATE", true);
if ($err == False) {
	IPS_Sleep(4000); 
	// erneut Versuchen
	HM_WriteValueBoolean(Zwischenstecker, "STATE", true);
}

MfG

Das sollte weiterlaufen, da es ja nur eine Warnung ist (kann mit @ unterdrückt werden).
Aber imho versucht die CCU eh mehrmals das Gerät zu erreichen.
Somit wäre es besser du suchst den Fehler warum der Befehle nicht ankommt.
Michael

Der letzte Fehler war eine Kommunikationsstörung.
Ich hatte den Eindruck, dass der zweite Schaltbefehl nicht gesendet wurde nachdem beim ersten die Störung aufgetreten ist.

Ich habe dann nach etwa 10 Sekunden das Gerät in der WebUI aktiviert und da war die Kommunikationsstörung auch wieder weg.

MfG

Ja, passt doch.
Eventuell ist das Gerät gerade so an der Grenze vom Empfangsbereich oder der Duty-Cycle der CCU war erreicht z.B. durch häufiges wiederholen von Sendungen oder großen Funkpaketen wie für die Statusanzeigen.

Lieber die Ursache suchen und nicht die Symptome mit doppelten dreifachen senden der Befehle behandeln.
Auf lange Sicht hast du sonst noch mehr Probleme.
Michael

Hallo Anubiss,

sollte es tatsächlich ein Funkproblem sein, so könnte dieser Link vielleicht hilfreich sein https://homematic-forum.de/forum/viewtopic.php?f=31&t=16907

Mittels einer besseren Antenne als der kleine Drahtstummel der CCU kannst du einiges an Empfangsqualität verbessern und damit möglicherweise dein Problem lösen. Ich habe jedenfalls nach der Umrüstung meiner CCU keine Probleme mehr :slight_smile:

Gruß
Hans

Ja, stimmt.

Bei einer Kommunikationsstörung kann ein neuer Versuch etwas später helfen.

Aber wenn es ein anderes Problem ist, wie zB als bei dem MP3 Gong die Batterien ohne Vorwarnung leer waren, hat es den Duty-Cycle der CCU auf über 80 % erhöht.

Leider kann man nicht sehen, was das Problem ist. Ich denk ein neuer Versuch nach 10 Sekunden ist ok, wenn der Fehler dann noch da ist muss er anders behoben werden.

Grüße

Danke, ich schau es mir mal an. Eventuell werde ich mal die Reserve CCU umrüsten und vergleichen.

Der betroffene Zwischenstecker ist am weitesten von der CCU weg und hat so etwa 2 - 3 Kommunikationsstörungen in der Woche.

Grüße

Moin,

mit Devconfig kannst du dir in der CCU ja die Signalqualität anzeigen lassen.

Deine Störung solltest du damit eigentlich wegbekommen, da diese ja nicht wirklich häufig auftritt.

Gruß
Hans

Hallo,

da sind ein paar Geräte in der Übersicht die ins rote gehen:

Zwischenstecker: -63dBm -196dBm
oder ein anderer: -42dBm -218dBm

MfG

~ 200 dbm… Da geht nix mehr.
Ich lege dir eine Reichweitenerhöhung, ala LAN-Gateway nahe…

Mit

IPS_Sleep(4000); 

solltest Du vorsichtig sein. Mehrere Skripte dieser Art können Dir sehr schnell die freien Threads zumüllen und dann kommt es zu Schwierigkeiten.

Lieber das Skript mit einem Event noch mal nach x Sekunden aufrufen und dann bei diesem Aufruf das TimerEvent deaktivieren.

Ich zitiere mal…

Alle Softwarekrücken sind da kontraproduktiv.
Stichwort „Dutycycle“:wink:

Evtl. stört hier auch ein anderes „funkendes Gerät“?
Telefon z.B.

Den sleep habe ich nur in wenigen Skripten.

Bei den Skript, wo ab und zu einmal die Kommunikationsstörung auftritt, werden hintereinander zwei Zwischenstecker geschaltet und danach wird Shutter Control aufgerufen.

Zuerst wird die ON_TIME gesetzt und dann eingeschaltet.

Von der CCU bis zum Zwischenstecker sind es 9 Meter und es ist eine Wand dazwischen.

Warum haben bei der RSSI Liste manche Geräte zwei Werte und andere nur einen?

Statusanzeige
-66dBm -205dBm

Zwischenstecker-Wohnzimmer
-58dBm -52dBm

Zwischenstecker-Schlafzimmer
-52dBm -207dBm

Temperatur-Balkon
-55dBm

Der Temperatur-/ Feuchtesensor außen ist eigentlich am weitesten weg, hat aber einen besseren Wert als die Zwischenstecker.

MfG

Die Entfernung ist meistens nicht das Problem. Wände, Decken andere Geräte welche im ‚Weg‘ sind dämpfen und stören da mehr.
Michael

Näher ist nicht zwangsläufig besser für den Empfang. HF ist mir immer schon suspekt gewesen. :rofl:

Gesendet von iPhone mit Tapatalk

Warum haben bei der RSSI Liste manche Geräte zwei Werte und andere nur einen?

Weil manche Geräte nur senden und nicht empfangen. Siehe Temperatursensor.

Der Temperatur-/ Feuchtesensor außen ist eigentlich am weitesten weg, hat aber einen besseren Wert als die Zwischenstecker.

Da haben so viele Umgebungsbedingungen Einfluss darauf, dass Hersteller meist immer nur eine Freifeldreichweite angeben um Reichweitendiskussionen von Haus aus den Saft abzudrehen.

Den sleep habe ich nur in wenigen Skripten

Lass mal tatsächlich eine Störung in Deinem HM-System passieren und die Zwangspause damit häufig auftreten und Du wirst ganz schnell merken wie leicht es ist ein System zu lähmen. Selbst IP-Symcon selber rät zu einen sehr vorsichtigen Einsatz dieses Befehls - mit gutem Grund.

Danke für die Infos.
Dann werde ich das ganze einmal optimieren und umstellen.

MfG

Hallo,

ich habe es mit einen Skript versucht, welches das Gerät einschaltet und wenn es einen Fehler gab wird noch einmal versucht das Gerät einzuschalten. Wenn das nicht erfolgreich war erfolgt eine Benachrichtigung.

Die ID des zu schaltenden Gerätes wird beim Aufruf übergeben, das geht auch beim ersten mal.
Aber nach dem Skript Timer ist die ID nicht mehr verfügbar.

Wie könnte man die ID verfügbar machen ? Oder gibt es da einen besseren Weg, das zu realisieren.


$ID = $_IPS['ID'];

if($IPS_SENDER == "RunScript") {
	$err = @HM_WriteValueBoolean($ID, "STATE", true);
	
	if ($err == false) {
		IPS_SetScriptTimer($IPS_SELF, 60);		
	}
}


if($IPS_SENDER == "TimerEvent") {

	$err = @HM_WriteValueBoolean($ID, "STATE", true);
	
	if ($err == false) {

		Telegram_SendText($id_instanz, 'Fehler beim Einschalten '+ $ID, $id_user); 
	}
    IPS_SetScriptTimer($IPS_SELF, 0);
}

Grüße

Einfach in einer Variable zwischenspeichern !

Als ersten Ansatz könnte man eine Variable vom Typ Integer hinzufügen (die die ID $VariablenID hat)
und den Wert der ID mit „SetValueInteger ( integer $VariablenID, integer $Wert )“ hinterlegen
um ihn beim nächsten Aufruf mit „GetValueInteger ( integer $VariablenID )“ wieder lesen.

Ich selber mache es etwas komplizierter:
Ich nehme eine Variable vom Typ String und schreibe und lese ein serialized array, das alle möglichen Daten für eine ganze Gruppe von HM-Variablen enthält.

Viele Grüsse
Harald