Das UNREACH-Problem mal wieder

Hallo,

bekanntlich gibt es ja bei einzelnen Geräten gern mal die Problematik, dass diese irgendwann mit UNREACH geflaggt werden, und dieser Status aber nie zurückgesetzt wird, egal was man tut. Das Gerät kann munter Daten an die Zentrale senden, die auch korrekt verarbeitet werden, es kann auch Befehle empfangen und umsetzen, man kann Servicemeldungen bestätigen, es hilft alles nichts. Die Variable UNREACH bleibt auf true.

Nun ist es ja eigentlich ganz nett in IPS zu wissen, ob ein Gerät Empfangsprobleme hat, aber dann müsste diese Anzeige auch verlässlich sein. Wie es aussieht gibt es (nur oder vorwiegend) „false positives“, sprich: Der Status ist manchmal fälschlicherweise (noch) gesetzt obwohl eigentlich kein Problem (mehr) besteht.

Um die UNREACH-Variablen auswerten zu können, aber trotzdem nicht ewig irgendwelche längst vergangenen Störungen im Speicher zu halten, ist mir die Idee gekommen, die Zeitstempel der Statusvariablen zu vergleichen. Sollte also UNREACH auf true sein, aber eine andere Statusvariable hat einen neueren Zeitstempel, so wird dieser Status ignoriert und das Gerät, nicht mehr als unerreichbar gelistet.

Was haltet ihr von dem Ansatz? Lösung, veritabler Workaround, oder ist mir ein fataler Denkfehler unterlaufen?

Für die CCU gibt es da ein Skript welches die Unreach-Meldungen bestätigt. Für reine LAN-Adapter-Lösungen ist das sicher ein Ansatz die Meldungen auszufiltern.

Hallo sokkederheld,

hast Du Deine Idee mal umgesetzt?
Wäre interessiert an einen Beispielskript.

Gruss

gros_ibou

Man kann die Variable auch ignorieren :wink:

Ich setze das so ein und bin ganz happy damit:

<?

$instances = IPS_GetInstanceListByModuleId('{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}');

foreach($instances as $thisInstance)
{
	if(IPS_GetName($thisInstance)== 'MAINTENANCE')
	{
		$unreachId = @IPS_GetVariableIDByName('UNREACH', $thisInstance);
		$unreachCleanId = CreateVariableByName($thisInstance, 'UNREACH_CLEAN', 0);
		
		$reachable = true;
		
		if($unreachId)
		{
			if(GetValue($unreachId))
			{
			   $reachable = false;

				$obj = IPS_GetVariable($unreachId);
				$unreachTime = $obj['VariableUpdated'];
				
				$subNodes = IPS_GetChildrenIDs(IPS_GetParent($thisInstance));
				
				foreach($subNodes as $thisNodeId)
				{
				   if(@IPS_InstanceExists($thisNodeId) && ($thisNodeId != $thisInstance))
				   {
				      foreach(IPS_GetChildrenIDs($thisNodeId) as $thisVarId)
				      {
				         $obj = @IPS_GetVariable($thisVarId);
				         
				         if($obj)
				         {
				            if($obj['VariableUpdated'] > $unreachTime)
				            {
					            $reachable = true;
					            break 2;
				            }
				         }
				      }
				   }
				}
			}
		}
		
		SetValue($unreachCleanId, !$reachable);
		
		if(!$reachable) echo IPS_GetName(IPS_GetParent($thisInstance)) . " is really unreachable.\r";
	}
}

function CreateVariableByName($id, $name, $type)
{
	$vid = @IPS_GetVariableIDByName($name, $id);
	if($vid === false)
	{
		$vid = IPS_CreateVariable($type);
		IPS_SetParent($vid, $id);
		IPS_SetName($vid, $name);
		IPS_SetInfo($vid, "This Variable was created by Script #".$_IPS['SELF']);
	}
	return $vid;
}
?>

Das Skript muss man per Ereignis periodisch starten. Es legt dann unterhalb aller MAINTENANCE-Instanzen eine Variable UNREACH_CLEAN an, die nur dann true ist, wenn UNREACH der Instanz true ist und in keiner der auf der selben Ebene gelegenen Homematic-Instanz irgendeine Variable aktueller ist als der Wert von UNREACH.

Voraussetzung damit das funktioniert ist, dass man jeweils die „Nutz-Instanzen“ pro Gerät in einer Kategorie mit der zugehörigen MAINTENANCE-Instanz hat und für jedes Gerät eine eigene Kategorie.


+ [MeinDimmer]
++ [DIMMER]
++ [MAINTENANCE]
+ [MeinSchalter]
++ [SWITCH]
++ [MAINTENANCE]

usw.

coole Sache…werde ich heute abend mal testen…das unreach Problem habe ich nämlich auch…

Falls es nur um die Status-Variable in IPS geht, hab ich herausgefunden, dass eine Abfrage über


HM_RequestStatus(id, "UNREACH");

die Variable korrekt zurücksetzt. Aus dem Grund lass ich die Abfrage über Mitternacht automatisch laufen.
Schade ist, dass der BidCos-Service das anscheinend nicht an IPS übermittelt, wenn ein Aktor wieder erreichbar ist.
Vermute also das Problem im BidCos-Service.

Gruß
dfhome

klappt das auch bei Batteriebetriebenen ???

Die haben ja meist das größere Problem mit Unreach…

Eben geschaut; meiner Meinung nach ja, denn die Uhrzeit der Aktualisierung zeigt mir Mitternacht an - auch bei den batteriebetriebenen Aktoren bzw. Sensoren.

Ist es nicht so, dass bei batteriebetriebenen nur der aktuelle Status von der Zentrale zurückgegeben wird und nicht der vom Aktor?

Wobei, jetzt mal logisch gedacht, ist ja die Zentrale eigentlich die Instanz die sagen kann, wer oder was unerreichbar ist… hmm.

Bei batteriebetriebenen HM-Geräten kann von der Zentrale (Bidoc oder CCU) immer nur der dort bekannte letzte (!) Status abgefragt werden. Das muss nicht immer zwingend der tatsächliche sein. Beispiel - es hat sich der Status eines TFKs geändert wärend der BidCos/die CCU Offline war.

Bei den meisten Geräten kann man aber einstellen ob Sie sich einmal täglich melden sollen - nach dem Motto „ich lebe noch“. Dabei wird dann auch der tatsächliche Status übertragen. Wenn dieser Keep-Alive ausbleibt kommt auch ein UNREACH - selbst wenn eigentlich alles in Ordnung ist.

Die CCU bzw. der BIDCOS können batteriebetriebene Geräte nicht direkt ansprechen um deren Status abzufragen. Diese nehmen Ihr Funkmodul aus Gründen der Batterielebensdauer nur von sich aus in Betrieb. Ausnahme ist soviel ich weiss derzeit nur der batteriebetriebene Schaltaktor.

@kronos: Das ist aber interessante Info, die mir zumindest völlig unbekannt war. Wo kann man denn einstellen, dass die batteriegetriebenen Geräte ihr „bin am Leben“ schicken und wann.
Ich bin im Moment auf Reisen und kann deswegen nicht auf meine Homematic Geräte gucken…

Gruss (aus Jerusalem)

gros_ibou

„zyklisch Status senden“ oder so ähnlich…komme gerade auch nicht drauf

ALLERDINGS: geht das massiv zu Lasten der Batterielaufzeit - daher habe ich bisher darauf verzichtet.

Außer bei ortsunabhängigen Sender/Empfänger denke ich braucht man es nicht.

Mein Fenstersensor war beim anlernen in Reichweite und bleibt es auch. auch wenn der Lan-Adapter anderer Meinung ist. Bisher habe ich alle Stati trotzdem zuverlässig bekommen

ALLERDINGS: geht das massiv zu Lasten der Batterielaufzeit - daher habe ich bisher darauf verzichtet.

Kann ich nicht nachvollziehen. Das ist ja nur ein Sendevorgang pro Tag.

Ich lasse das aktiviert weil die Firmware der CCU da mal einen BUG hatte oder hat (oder es war ein Feature ;)). Wenn die zyklische Meldung ausgeschaltet war kam bei den betreffenden HM-Geräten der UNREACH. Nagelt mich aber bitte nicht auf eine Firmware-Version fest.

Bei Sendern die sowieso einmal pro Tag ausgelöst werden kann man sich das Keep-Alive theoretisch sparen. Ich habe aber auch z.b. Fensterdrehgriffe die über Tage/Wochen nicht betätigt werden. Und wenn die Kids da gerade mal wieder die Batterie ausgebaut haben möchte ich das gerne wissen wenn der Sender sich längere Zeit nicht mehr gemeldet hat.

das sind 365 unnötige Aktivierungen im Jahr - zum Beispiel bei meinem Wassermelder (der ja hoffentlich nicht einmal am Tag auslöst :rolleyes: )

Aber natürlich ist das „kleinkariert“

zum Beispiel bei meinem Wassermelder

Bei dem es aber um so wichtiger ist, dass er sicher funktioniert.

Aber natürlich ist das „kleinkariert“

In anbetracht der Wichtigkeit eines Wassermelders - uneingeschränkt JA. :smiley:

Bei den Fensterdrehgriffen kann man die Sabotage-Meldung ausgeben lassen, wenn das Batteriefach geöffnet wird. So habe ich es hier am laufen.

Gruß,
Christoph

Danke für den Hinweis aber ich habe leider zumindest einen Grobmotoriker im Haus der Fenster mitunter so zu haut, dass der Batteriedeckel samt Knopfzellen das Weite sucht. Und dann ist auch mit einer Sabotagemeldung nichts mehr zu wollen :rolleyes:.