WiP Z-Wave Optimierung

Hallo,

mal was kleines „Work in Progress“.
Ich habe mit meinen Z-Wave Geräten das Problem, das sie Ihre Routen verlieren wenn sie Spannungslos sind.
Bei den Steckerschaltern ist das oft ärgerlich.
Bis jetzt hab ich entweder die Optimierung im IPS-Gateway komplett gemacht oder mit Z-Tool einzelne Geräte optimiert (geroutet).
Ich hab mir ein kleines Script gebastelt, das unter jeden Z-Wave Node ein Script generiert. Dieses Script löst dann die Optimierung des Node aus und gibt das Ergebnis aus.
Wenn ich nun einen Stecker umsetze muss ich nur einen oder mehrere Nachbarnodes über WebFront optimieren und ich hab ihn wieder im System.

Irgendwie scheint mir die Standard Optimierung aller Geräte nicht optimal. Es werden alle Nodes aufsteigend optimiert. Wenn nun ein Node mit dniedriger ID hinter einem Node mit hoher ID ist braucht es min. 2 Durchläufe, damit die Optimierung des kleinen Nodes erfolgen kann.
Werd mal etwas experimentieren, ob man das per Script besser lösen kann.

Hier das Script:

<?

/////////////////////////////////////////////////////////////////////
//
// Dieses Script optimiert einen einzelnen Z-Wave Node
//


// Konfigurationsteil
$name = 'optimieren';   // Name des Optimierungscripts (taucht dann auch im WebFront auf)




// Programmteil


$ZW_GW = 0;
// Ermittlung des Z-Wave Gateways
foreach (IPS_GetInstanceList() as $inst)
	if (IPS_GetInstance($inst)['ModuleInfo']['ModuleID'] == '{4EF72D56-BF9F-4347-8F0A-2035D241116F}')
	   $ZW_GW = $inst;


switch($_IPS['SENDER'])
{
	case 'Execute':
		$opt_script_id = $_IPS['SELF'];

		$z_devices = array();
		// Alle IPS Z-Wave Nodes raussuchen
		$devices = IPS_GetInstanceList();
		foreach ($devices as $dev)
			if (IPS_GetInstance($dev)['ModuleInfo']['ModuleID'] == '{101352E1-88C7-4F16-998B-E20D50779AF6}')
			{
			   $z_devices[ZW_GetNodeID($dev)] = $dev;
			   foreach(IPS_GetChildrenIDs($dev) as $child)
			      if (IPS_GetName($child) ==$name)
			         IPS_DeleteScript($child, true);

			   $script = CreateScriptByName($name, $dev, '<? include "'.$opt_script_id.'.ips.php"; ?>');
			   IPS_SetPosition($script, 100);
			   IPS_SetHidden($script, false);
			   echo "Script unter Node \"". IPS_GetName($dev) . "\" angelegt.
";
			}
	   break;
	case 'WebFront':
	   $parent = IPS_GetParent($_IPS['SELF']);
		$instance = IPS_GetInstance($parent);
		$z_devices = array();
		// Alle IPS Z-Wave Nodes raussuchen
		$devices = IPS_GetInstanceList();
		foreach ($devices as $dev)
			if (IPS_GetInstance($dev)['ModuleInfo']['ModuleID'] == '{101352E1-88C7-4F16-998B-E20D50779AF6}')
			   $z_devices[ZW_GetNodeID($dev)] = IPS_GetName(IPS_GetParent($dev)) ."/".IPS_GetName($dev);

		if ($instance['ModuleInfo']['ModuleID'] == '{101352E1-88C7-4F16-998B-E20D50779AF6}')
		{  // Es handelt sich um einen Z-Wave Node
			$NodeID = ZW_GetNodeID($parent);
			if (ZW_RoutingOptimizeNode($ZW_GW, $NodeID))
			{  // Routing war erfolgreich. Lese die aktuellen Routingnods aus.
			   echo "Optimierung war erfolgreich.<br />
";
				echo "Der Node hat Verbindung zu folgenden Nodes:<br /><p>
";
				foreach (ZW_RoutingGetNodes($ZW_GW, $NodeID) as $node)
				   echo $z_devices[$node] . "<br />
";
				echo "</p>
";
			}
			else
			   echo "Optimierung war nicht erfolgreich.<br />
";
		}
	   break;
}

function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT)
{
    $ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
    if ($ScriptID == 0){

       $ScriptID = IPS_CreateScript(0);
       IPS_SetName($ScriptID, $ScriptNAME);
       IPS_SetParent($ScriptID, $ParentID);
       IPS_SetInfo($ScriptID, "This script was created by: ".$_IPS['SELF']);
        $fh = fopen(IPS_GetKernelDir()."scripts\\".$ScriptID.".ips.php", 'w') or die("can't open file");
        fwrite($fh, $ScriptTEXT);
        fclose($fh);
        $ScriptPath = $ScriptID.".ips.php";     //Skriptdatei
        IPS_SetScriptFile($ScriptID, $ScriptPath);
        IPS_SetHidden($ScriptID, true);
       // echo "Die Skript-ID lautet: ". $ScriptID;
       return $ScriptID;
    }
}

?>

Script erstellen, das Script da rein. Einmal ausführen. Der Rest geht von alleine. Einstellen lässt sich noch der Name des Scriptes, das unter jeden Node erstellt wird.

Übrigens:
Bei Aktoren die den Stromverbrauch übermitteln hab ich öfter das Problem, das IPS einen Timeout bei Statusabfrage meldet. Die Daten kommen dann aber. Könnte man den Timeout etwas hochsetzen oder gar parametrierbar machen?

cu…

das sie Ihre Routen verlieren wenn sie Spannungslos sind.

meine nicht. Allerdings sieht z-wave nicht vor, dass Aktoren ohne Abmelden und wieder anmelden am Netz verschoben werden.

Aber warum machst Du nicht einfach jede Nacht zur Sicherheit ein


ZW_RoutingOptimize($gw);

Das optimiert Dein gesamtes Netz (gerne auch 3x falls Du einzelne Nodes nicht erreichst) dann jede Nacht automatisch.

Ich hatte es öfters, dass ein GesamtRouting für manche Nodes nicht klappte.
Wenn ich aber die Nodes einzeln geroutet habe hat er sie gefunden.
Aber ein richtiges System hab ich noch nicht erkannt.

cu…

Jetzt hatte ich gerade den Fall, das der Server neugestartet ist.
Alle Routinginformationen waren weg. Heisst das, dass wenn Gerät x einen Befehl an Gerät y über eine Route senden will das Packet immer über den Controller geht?
Funktioniert Routing ohne Controller nicht?
Mal überlegen wie ich das testen kann.

Edit:
Hab gerade nircmd im Forum gefunden. Damit konnte ich den Server remote neustarten. Danach waren noch alle Routen aktiv.
Ich forsche weiter nach wenn ich zu Hause bin. Vielleicht wars ja auch ein Stromausfall.

cu…

Die routen haben mit dem Server nichts zu tun. Der IPS Server ist nicht der Controller. Der Controller ist entweder ein mobiles Devices (z.B. eine Fernbedienung) oder aber zur zeit noch ein USB Dongle.

Die Routen werden in den z-wave controllern (ICs) in den z-wave Geräten gespeichert.

Ich empfehle Dir, dass Du Dich mal ein wenig mit der Funktionsweise von z-wave (SUC/SIS, etc) schlau machst. Das wird eine ganze Menge Fragen beantworten.

Genau das meinte ich ja.
Das IPS nicht die Routen verwaltet ist mir klar. Aber bei einem Spannungsausfall ist ja auch der Controller (der USB-Stick) spannungslos.
Entweder hat dieser die Informationen verloren, oder die einzelnen Nodes.

In den Z-Wave pdfs ist immer davon die Rede, dass ein Controller für das Netz nötig ist.
Ich bin aber bis jetzt davon ausgegangen, dass jeder Node seine „Nachbarn“ selber speichert. Nur speichert er auch Nodes die nur über x Hops erreicht werden können?
Daher meine Frage, ob die Pakete immer über den Controller laufen müssen.

In den Routingbeispielen die ich gesehen habe ist der Controller immer Sender oder Empfänger. Ein Beispiel für Gerätekommunikation über Routing ohne Controller kam mir noch nicht unter.

Edit:
Gerade ein pdf gefunden. Scheint wirklich so zu sein. Die Routen gehen immer über den SUC. Daher taucht der auch immer bei der Routingausgabe auf.
Gibt wohl spezielle Routingslaves die das auch selber können. Aber das scheinen nicht die Schalter zu sein.
Hat also doch Vorteile einen getrennten SUC zu haben. Andereseits ists ja auch kein Problem bei IPS Start die Routen neu zu berechnen.

cu…

Ich glaube du vermischt zwei Dinge: Die Optimierung und das Vorhandensein von Routen in einem Gerät.

Nach meinem Kenntnisstand, sind die Routen nach der Optimierung immer im Controller vorhanden. Auch nach einem Power Outage, der Controller müsste ein NVRAM haben.
Das Optimieren heisst lediglich, dass jeder Node schaut, welche Node IDs er selbst per Funk erreichen kann und diese an den Controller zurückmeldet, der daraus eine routing tabelle errechnet.

Ohne aktiven Controller kann das z-wave Netz also nicht funktionieren.