Z-Wave Devices pingen?

Ich hatte jetzt schon öfter das Problem, das mein Z-Wave Stick nicht mehr funktioniert hat. (Aeon Labs)

Um das frühzeitig zu erkennen, möchte ich den Stick in regelmäßigen Abständen quasi anpingen und überprüfen ob er verfügbar ist und reagiert.

Habt ihr eine Idee wie ich das machen kann bzw. wie das geht?

Das Problem hab ich auch…

sehr selten, hängt der AEON Labs Stick. Das merkt man in aller Regel nicht sofort :wink:
Bei mir wars aber immer so, dass der Stick in IPS fehlerhaft markiert war.
Ich mein unter SPLITTER INstanzen - Z-Wave Gateway… war vorne ein rotes Ausrufezeichnen.
Vielleicht kann man hier ansetzen, und sich ne Mail schicken lassen, wenn der Stick von IPS nicht mehr erkannt wird.

Oder man prüft mit einem Skript zyklisch, dass aktualisierungsdatum eines Zwave Endgerätes. Und wenn das älter als z.B. 1 Std. ist… dann Mailbenachrichtigung…

Also wenn die Instanz dann als fehlerhaft markiert wird, dann kann sein, daß das hier klappt. Ich verwende es derzeit nur für die FHZ:


$instancecodes = array(100 => "Basic status",
               101 => "Module is being created",
               102 => "Module created and running",
               103 => "Module is being deleted",
               104 => "Module is not beeing used",
               200 => "Default errorcode",
               201 => "Instance could not be created");

....

$instanceID = $geraeteInfo['Instance'];
$instance = IPS_GetInstance(intval($instanceID));
if ($instance['InstanceStatus'] == 102)
{
	echoIt("UpdateRessourceTS - INSTANCE: Ressource [$geraeteName] ($instanceID) is ok",$debugMe);
}
else
{
	echoIt("UpdateRessourceTS - INSTANCE: Ressource [$geraeteName] ($instanceID) failed",$debugMe);
}

Ich habe ein Script laufen, das jede 5 Minuten ein Array durchgeht. In dem Array ist die Methode der Überprüfung drin (1 = Ping, 2 = ARP, 3 = COMPort, 4 = Instanz, …). Failed eins der Devices setzt das Script eine „Ressourcen-Fehler“-Variable.

Alternativ bin ich gerade per Suche drüber gestolpert:

Ein IPS Modul von Nall Chan.
In der Doku ist alles beschrieben… fast selbst erklärend…

http://www.ip-symcon.de/forum/threads/26226-Modul-NoTrigger-%C3%9Cberwachen-von-IPS-Variablen-auf-Aktualisierung-oder-Ver%C3%A4nderung

Damit werden Variablen auf deren Aktualisierungsintervall geprüft. Wenn der Intervall nicht passt, dann wird ein nachfolgendes Skript ausgeführt (sms, email…)

Da unter die „HomeID“ des AEON Sticks z.B. eine Variable ist, die regelmässig abgefragt wird… kann man diese verwenden. Und somit bekommt man damit ebenfalls mit, ob der Stick noch funktioniert…
Ich denke das reicht mir… :wink:

Ich muss mir nur noch Gedanken machen, wie ich benachrichtigt werden möchte…:smiley:

Das Event Control überwacht von Haus aus Instanzen (IO und Splitter glaube ich auch) und kann ein Script ausführen wenn es den Status ändert.
Event Control — IP-Symcon :: Automatisierungssoftware
Alternativ auch, wie schon erwähnt auch mein Modul (unter Windows) solange es eine Variable gibt, welche überwacht werden kann.
Hier sind jetzt die Fragen:
Wie oft wird diese Variable vom Stick aktualisiert?
Oder geht die Instanz immer gleich in Fehlerzustand, oder erst nach x min, oder erst nach fehlgeschlagenen schalten ?
Michael

Wann es genau auftritt kann ich euch nicht sagen.

Ich heize damit bzw. steuere damit die Heizlüfter bei uns in der Werskstatt.

Die letzten beiden Wochen ging es zweimal in der früh auf einmal nicht mehr und mein Vater hat mich angerufen,
das die Heizung nicht geht etc. Habe mich dann aufgeschalten und gesehen das, wie von mastermind1, der beschriebene Fehler aufgetreten ist.

Dachte mir ich starte das Gerät einfach mal neu, also den Server, aber das hat nichts gebracht.
Dann habe ich den Stick einmal ein- und ausstecken lassen und dann ging es wieder.

Nach bzw. bei welchem Vorgang kann ich leider nicht sagen.

Der Stick ist ja über einen COM Port angebunden. Bei meinem WDE reicht meistens bei Unerreichbarkeit per Script den COM Port zuzumachen, wieder aufmachen und Apply aufzurufen.

Hallo Grooooog,
hast du dafür vielleicht auch schon ein fertiges Skript?

Nall Chans Variante werde ich auch noch ausbrobieren.

Also was ganz fertiges gibts nicht, weil ich meine Ressourcenverwaltung anders mache. Wie gesagt, ich frage bei mir zyklische alle Ressourcen ab und schreibe die in Variablen. Wenn da was down geht, wie z.B. der WDE, dann rufe ich passend die Scripte OnXXXDown.php auf.

Das eine Script habe ich ja schon gepostet, wo ich checke, ob die Instanz noch lebt. Einfach zyklisch den Modulstatus wie beschrieben abfragen.

Wenn die Instanz weg ist, dann sollte das hier funktionieren:


<?
if($dead == true)
{
	//ID
	$portID = 31895 ;


	//Port zumachen
	COMPort_SetOpen($portID,false);
	IPS_ApplyChanges($portID);

	//Wieder warten
	sleep(2);

	//Port wieder aufmachen
	COMPort_SetOpen($portID,true);
	IPS_ApplyChanges($portID);

	//Fertig
}

?>

Da ich nur zwei Systeme zum überwachen habe, habe ich mir das Überwachungsmodul von „Nall Chan“ + den Code von „Groooog“ zusammen"geklaut".

Hier mein Ergebnis, als Hilfe frür andere: (Ist natürlich ausbaufähig, d.h. Emailbenachrichtigung fehlt usw…)

  • Eckdaten:
    Bei mir wird der AEON Labs Zwave Stick überwacht. (Mir ist dabei aufgefallen, dass der Stick minütlich die HomeID aktualisiert/abfrägt.
    Das nütze ich, d.h. sobald diese HomeID längere Zeit nicht „aktualisiert“ wird, funktioniert der Zwave Gateway nicht.
    Das ist mir in der Vergangenheit schon ein paar mal aufgefallen, kommt aber sehr sehr selten vor.
    D.h. mir reichts aus, wenn der Stick die HomeID über 10 Minuten (600 Sek.) nicht aktualisiert hat, dann läuft die Routine los.

Hier die Screenshots:

Ueberwachung.JPG

Hier der Code zum schliessen + öffnen des Zwave Gateways.

$alarm=GetValueBoolean(16011 /*[Ueberwachung ZWAVE\STATE]*/);
// 0 = OK, d.h. Gateway erreichbar
// 1 = ALARM, d.h. Gateway nicht erreichbar

if($alarm == 1)
{
    //ID - Unter I/O Instanzen - Serial Port Zwave
    $portID = 25892 /*[Serial Port ZWAVE]*/ ;

    //Port zumachen
    COMPort_SetOpen($portID,false);
    IPS_ApplyChanges($portID);

    //Wieder warten
    sleep(5);

    //Port wieder aufmachen
    COMPort_SetOpen($portID,true);
    IPS_ApplyChanges($portID);

    //Fertig
}

P.S. Ich hatte die Zwave Abstürze am Anfang häufiger! (obwohl nur wenige Aktoren im Einsatz)… Ich hab mir daraufhin einen Aktiven USB HUB (Dlink) besorgt. Und der Zwave Stick hängt daran mit einem „dicken“ USB Kabel 50cm lang.
Seither - ganz ganz selten ein Absturz… wobei die letzten Abstürze auch durch andere Ursachen möglich waren (Windows Updates, Trennung Strom USB Hub…)

Aber sicher ist sicher…

Das ganze lässt sich natürlich auch auf 1Wire übertragen… Das bastle ich mir ebenfalls noch anhand meines Zwave Beispiels zusammen… Und schon bin ich Safe :slight_smile:

@ mastermind1:

Nimm lieber statt GetValueBoolean doch gleich die Systemvariable $_IPS[‚VALUE‘].
Die Systemvariablen vom Modul stehen in der Doku vom Modul unter Kapitel 6.

Davon unabhängig…

Das EventControl erkennt fehlerhafte Instanzen und führt nach 60sek. eine ApplyChange selbstständig durch, so meine Erfahrung.
Problematisch ist es wohl, dass die I/O-Instanz ja wohl ‚Active‘ bleibt und nur das Gateway (Splitter-Instanz) aussteigt.
Allerdings sollte auch hier der Stick durch das ‚Applychange‘ wieder neu initialisiert werden und somit nach 60 sek. wieder laufen ?! Ohne das hier was von Hand erstellt, gescriptet wird… Oder sehe ich das falsch ?

Statusänderungen von Übergeordneten Instanzen (I/O) werden eigentlich von den untergeordneten Instanzten (Splitter) erkannt und dann wird z.b. die Hardware an dem I/O-Port neu initialisiert.
Ein reines Applychanges vom I/O-Port bringt nix, da die I/O-Instanz ja voher aktiv und dannach noch immer aktiv ist. => Keine Statusänderung => untergeordnete Instanz (Splitter) bekommt dies nicht mit.
Ein Öffen und Schließen des Ports, ist aber eine (eher zwei) Statusänderung (active => inactive und inactive=>active) und die bekommt der Splitter mit, und initialisiert die Hardware neu.

Nun habe ich leider keinen Stick zum testen…
Ist das ein Bug in der Splitter-Instanz ? Oder vielleicht überwacht das EventControl keine Splitter instanzen ?
Vielleicht kann Paresy ja hier mal Licht ins Dunkel bringen :smiley:

Reicht denn das hier um den Stick wieder betriebsbereit zu bekommen ?


 IPS_ApplyChanges($SplitterID);  // ID vom Z-Wave Gateway

Michael

Danke für den Tipp…

ich hab mich mit IPS-EventControl noch nicht beschäftigt… Ich bin da noch skeptisch was IPS eigene Dinge angeht:-)
Scripttimer z.B. funktionierte ne Zeit lang… dann update von 3.0 auf 3.1 bzw. 3.2… schon gingen einige Scripttimer nicht mehr…
Heute wieder ein Skripttimer der nach einschalten einer Aussenleuchte (durch Bewegungsmelder) ausgelöst… wieder ausschalten sollte… was ist passiert nichts :-)…
Dasselbe ist mir mal in einem Windwächterskript passiert… Gut das ich zuhause war, sonst wären die Jalousien im Garten gelandet… Mit an/aus Schaltern und ein, zwei Ereignissen klappts nun zuverlässig…

Von daher bau ich mir da mittlerweile lieber eigene Logiken…
Recht rudimentär mit Ereignissen und Schaltern on/off… aber das klappt wesentlich stabiler… und hat bisher noch jedes IPS Update überlebt…:loveips:

P.S. meine Umgebung ist MINI (ein paar Zwaves… 3x 1 Wire…)

Ich überwache meine wichtigsten Instanzen über folgendes Skript:
Sofern was nicht in Ordnung ist (keine Updates) wird eine Variable gesetzt - kann ja dann ein mailing script auslösen etc.

Ist im Prinzip Unabhängig vom Gerätetyp:


<?
 /* ---------------------------------------------------------------------------
                  Geräte auf Lebenszeichen prüfen
  -----------------------------------------------------------------------------
  (c) 2014, S. Epple
  
  Dieses Script prüft, sämtlich relevanten Instanzen, ob Sie aktualisiert wurden.
  Dh. ob das Gerät noch arbeitet.
  Die zu prüfenden Geräte werden wie folgt ermittelt:
  - Anhand von Profilen von untergeordneten Variablen (c_prof)
  - Manuell durch angabe der ID zu r_inst

  - Geräte mit langer Antwortzeit (z.b. einmal pro Woche werden bei
	 r_instE angegeben.
	 
  mit lastup_maxN wird definiert, ab wann ein Gerät tot gemeldet wird.
  mit lastup_maxE wird definiert, ab wann lang antwortende Geräte als tot
                  gemeldet werden
  
  c_warn_name definiert den Namen der Variablen für Meldung
  
  ---------------------------------------------------------------------------*/
 $c_warn_name = "Geräte Warnung";

  
// Geräte mit Variablen und folgenden Profilen überwachen
 $c_prof[] = "~Battery";
 $c_prof[] ="~Battery.100";

// Geräte anhand ID überwachen
 $r_inst[] = 24223 /*[Objekte\Oregon Wettersensoren\Regensensor]*/;
 $r_inst[] = 32193 /*[Objekte\Oregon Wettersensoren\Windsensor]*/;
 $r_inst[] = 26875 /*[Objekte\1-Wire\Helligkeitssensor]*/;
 $r_inst[] = 13251 /*[Objekte\1-Wire\Temperatur (2) (Außen Nord)]*/;
 $r_inst[] = 50271 /*[Objekte\1-Wire\Temperatur (1) (rot, EG Wohnzimmer)]*/;
 $r_inst[] = 53702 /*[Objekte\1-Wire\Temperatur (3) (grün, Büro)]*/;
 $r_inst[] = 59177 /*[Objekte\1-Wire\Temperatur (4) (blau, außen Süd)]*/;
 $r_inst[] = 10553 /*[Objekte\Alarm-Instanzen\Fibaro Binärsensor Heizraum\Binärsensor Heizung Gerät 4 (Solar)]*/;
 $r_inst[] = 47042 /*[WebCam Haustüre.jpg]*/;
 $r_inst[] = 14469 /*[WebCam Balkon.jpg]*/;


 // Geräte anhand ID mit langer Antwortzeit zu überwachen:
 $r_instE[] = 35876 /*[Objekte\Alarm-Instanzen\Alarmmelder]*/;
 $r_instE[] = 13150 /*[Objekte\Alarm-Instanzen\Fibaro Binärsensor Heizraum\Binärsensor Heizung Gerät 2 (Wassersensor)]*/;
 $r_instE[] = 24529 /*[Objekte\Alarm-Instanzen\Fibaro Binärsensor Heizraum\Binärsensor Heizung Gerät 1 (Gassensor)]*/;
 $r_instE[] = 29797 /*[Objekte\Alarm-Instanzen\Wassersensor Waschmaschine]*/;

 $lastup_maxN =  24 ;  // in Stunden für Normale Prüfung - Normale Geräte
 $lastup_maxE =  24*7; // in Stunden für Geräte mit langer Pause
 
 /*---------------------------------------------------------------------------*/
 
 $lastup_maxN = $lastup_maxN * 3600;
 $lastup_maxE = $lastup_maxE * 3600;

 $WardnID = CreateVariableByName($_IPS['SELF'],$c_warn_name, 0, "~Alert");
 $vars = IPS_GetVariableList();

// Zuerst alle Instanzen ermitteln
// Alle Instanzen mit Batteriemodul bzw. Variablenprofil
// + Oben angegebene
 foreach($vars as $varID){
	 if($varID != $WardnID){
		 $varInfo = IPS_GetVariable($varID);
	    $varVal = GetValue($varID);
	    $varProf = IPS_VariableProfileExists($varInfo['VariableProfile']) ?
		             $varInfo['VariableProfile'] : "";
	    $varProf = (strlen($varInfo['VariableCustomProfile']) > 0 &&
		            IPS_VariableProfileExists($varInfo['VariableCustomProfile']))?
						$varInfo['VariableCustomProfile'] : $varProf;

		 foreach($c_prof as $prof){
		   if($prof == $varProf){
				$objid  = IPS_GetParent($varID);
				$obj = IPS_GetObject($objid);
				if(!stristr($obj["ObjectInfo"],"NO_UPCHECK"))$r_inst[] = $objid;
		   }
		}
	}
 }
 // Extended Geräte hinzufügen
 foreach($r_instE as $id){
	$r_inst[] = $id;
 }
 //Doppelte IDs löschen
 $r_inst = array_unique($r_inst);

// über alle Instanzen und letztes update prüfen anhand der sub-variablen
foreach($r_inst as $id){
	$lastup = 0;
	// Prüfen ob variable überwacht werden soll:
	$idInfo = IPS_GetObject($id);
	if($idInfo["ObjectType"] == 5){      // Bei Medienobjekt
		$mediadata = IPS_GetMedia($id);
		$lastup = $mediadata["LastUpdate"];
	}elseif($idInfo["ObjectType"] == 2){ // Bei direkter Variable
		$vardata = IPS_GetVariable($id);
		$lastup = $vardata["VariableUpdated"];
	}else {                               // Bei Instanz
			foreach(IPS_GetChildrenIDs($id) as $subid){
				$subInfo = IPS_GetObject($subid);
				if($subInfo["ObjectType"] == 2){
					if($vardata = IPS_GetVariable($subid)){;
					   $t_lastup =   $vardata["VariableUpdated"];
						if( $lastup < $t_lastup)$lastup = $t_lastup;
					}
				} // Subinfo, wenn Variable
			}
	}
	$Inst[$id] = $lastup;
}
arsort($Inst);
// Nun ausgeben und auswerten
$warnTotal = false;
foreach($Inst as $id => $up){
   // Lastup setzen für normale Geräte oder lang antwortdende Geräte
	$lastupM = (in_array($id,  $r_instE))?$lastup_maxE : $lastup_maxN; 
   if($up < (time() - $lastupM)){$warnTotal = true; $warn ="WARNUNG!";}
	                             else { $warn="OK"; }
	echo IPS_GetName($id)." zuletzt online am ".
	     date("d.m.Y, H:i",$up)."h --> ".$warn." <br>
";
}

if($warnTotal){
	echo "Geräte UP Check: ACHTUNG FEHLER GEFUNDEN!";
}else{
	echo "Geräte UP Check: ALLES OK";
}
SetValue($WardnID,$warnTotal);


	function CreateVariableByName($id, $name, $type, $profile = "")
	{
		# type: 0=boolean, 1 = integer, 2 = float, 3 = string;
	    global $_IPS;
	    $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']);
	        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
	    }
	    return $vid;
	}
?>


Wird das Script im Webfrontend oder direkt ausgeführt, dann zeigt es die Instanzen mit den Stauts an.
Somit bekomme ich jederzeit innerhalb von 24h mit, wenn irgendwelche wichtige Geräte nicht mehr da sind.

Hi Stele!

Schönes Script :slight_smile: Da werde ich das ein oder andere in meine Aktoren-Überwachung übernehmen :slight_smile:

Da nicht alle bei den Batterien ein Variablenprofil haben, bin ich diesen Weg gegangen:

// HomeMatic
$HMinstanceIdList = IPS_GetInstanceListByModuleID("{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}");
foreach ($HMinstanceIdList as $HMinstanceId) {
   $variableId = @IPS_GetVariableIDByName('LOWBAT', $HMinstanceId);
	if ($variableId!==false) {
		$HM_BatCheck = GetValue($variableId);
..........
// Z-Wave
$ZWinstanceIdList = IPS_GetInstanceListByModuleID("{101352E1-88C7-4F16-998B-E20D50779AF6}");
foreach ($ZWinstanceIdList as $ZWinstanceId) {
   $variableId = @IPS_GetVariableIDByName('Low Battery', $ZWinstanceId);
	if ($variableId!==false) {
        $ZW_BatCheck = GetValue($variableId);
..........

Könnte man in dein Script vlt. noch mit integerieren und das alles dann kombinieren :slight_smile: Am Ende ein unique auf das Array und dann ist es egal, wie die Variable gefunden wurde, ob über das Variablenprofil oder den Variablennamen.

Grüße,
Chris