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…