Übersicht der routingfähigen Nachbarnodes

Hallo Freunde

hab hier ein kleines Script für euch welches von allen zWave Nodes die Routingtabelle ausleist und im WF darstellt.
Sortiert ist die Ausgabe nach Anzahl der Nachbarnodes.
So sollte es bei zickenden Nodes leichter sein rauszufinden über welche Nachbarn die überhaupt erreichbar sind.

Zu beachten ist allerdings das IPS offensichtlich alle Nachbarn auflisted, auch solche welche nicht routingfähig sind den aktiven Node nur benützen um ihre eigenen Telegramme abzusetzen.


$KnownDevices=ZW_GetKnownDevices(30164 /*[Z-Wave Configurator]*/);
$DeviceInfo = array();
$RoutingList = array();


/* Instance Name hinzufügen und Sub Device entfernen */
foreach($KnownDevices as $key=>$Device) {
	$KnownDevices[$key]['InstanceName']= IPS_GetName($Device['InstanceID']);	
	if ($KnownDevices[$key]['NodeSubID'] >0) unset ($KnownDevices[$key]);	
}


/* Array mit Index = NodeID bauen */
$DeviceNames = array();
foreach($KnownDevices as $key=>$Device) {
	$NodeID = $Device['NodeID'];
	$DeviceNames[$NodeID]['InstanceName'] = IPS_GetName($Device['InstanceID']);
	}

/* Routing Liste hinzufügen */
foreach($KnownDevices as $key=>$Device) {
		if ($Device['InstanceID'] <> 0) {
		$RoutingList = (ZW_RequestRoutingList($Device['InstanceID']));
		sort($RoutingList);
		$List = "";
		$RouteCount = 0;
		foreach ($RoutingList as $Route) {
			$List = $List.$DeviceNames[$Route]['InstanceName'].", ";
	    	$RouteCount++;
			}
		$KnownDevices[$key]['RoutingList'] = $List;
		$KnownDevices[$key]['RouteCount'] = $RouteCount;
		}
}

/* Controler rauslöschen */
foreach($KnownDevices as $key=>$Device) {
	if ($KnownDevices[$key]['InstanceID'] == 0) unset ($KnownDevices[$key]);	
}

/* Ausgabe bauen, Index ist anzahl der Routes */
$OutputList = array();
foreach($KnownDevices as $key=>$Device) {
	$Index = $Device['RouteCount'];
	$OutputList[$Index]['NodeID'] = $Device['NodeID'];
	$OutputList[$Index]['InstanceName'] = $Device['InstanceName'];
	$OutputList[$Index]['RoutingList'] = $Device['RoutingList'];
}

/* Nach Anzahl der routes sortieren */
ksort($OutputList);

//print_r ($OutputList);
// print_r ($KnownDevices);
$Nodes ="";
$Routes ="";
$Count ="";

$html ='<style>
    div.table { 
      display: table; 
      border-collapse:collapse; 
    }
    div.tr { 
      display:table-row; 
    }
    div.th { 
	  display:table-cell; 
      border:thin solid grey; 
      padding:5px;
	  padding-left:1em; 
	  font-weight: bold;
    }
    
	div.td { 
      display:table-cell; 
      border:thin solid grey; 
      padding:5px;
	  padding-left:1em;
	  font-size: small; 
    }
  </style>
';

$html.='<div class="table">';
$html.='<div class="tr">';
$html.='<div class="th">Node</div>';
$html.='<div class="th">Anzahl d. Nachbarn</div>';
$html.='<div class="th">in Reichweite befindliche Nachbarnodes</div>';
$html.='</div>';
	    

foreach($OutputList as $key=>$Device) {
$Nodes = $Nodes.$OutputList[$key]['InstanceName']."
";	
$Count = $Count.$key."
";	
$Routes = $Routes.$OutputList[$key]['RoutingList']."
";


$html.='<div class="tr">';
$html.='<div class="td">'.$OutputList[$key]['InstanceName'].'</div>';
$html.='<div class="td">'.$key.'</div>';
$html.='<div class="td">'.$OutputList[$key]['RoutingList'].'</div>';
$html.='</div>';

}
$html.= '</div>';
SetValue(44662 /*[gemeinsame Objekte\Z-Wave\FindRoutes\Table]*/,$html);

?>

Eigentlich eine nette Idee, aber mit zwei Problemen:

  1. ZW_RequestRoutingList() hat jetzt 3 Parameter - als schnellen Fix kann man die weiteren Parameter auf false setzen.

  2. Die Indexierung mit der Anzahl der Nachbarn überschreibt multiple Devices mit gleicher Anzahl von Nachbarn mit dem jeweils letzten. Habe ich drei Devices mit jeweils vier Nachbarn wird lediglich das letzte der drei Devices gelistet.


foreach($KnownDevices as $key=>$Device) {
    $Index = $Device['RouteCount'];
    $OutputList[$Index]['NodeID'] = $Device['NodeID'];
    $OutputList[$Index]['InstanceName'] = $Device['InstanceName'];
    $OutputList[$Index]['RoutingList'] = $Device['RoutingList'];
}

Als schnellen Fix kann man $Device[‚RouteCount‘] durch $Device[‚NodeID‘] ersetzen und den Tabellen-Header entsprechend anpassen.