nachdem auch Batterie Knoten im Z-Wave Netzwerk optimiert werden möchten, das aber immer recht umständlich ist, habe ich mir folgendes kleine Script gebaut (Inspiriert durch eine Funktion der Vera).
Es reicht das Script per Cut and Paste anzulegen. Der Rest macht das Script automatisch.
Einfach ausführen.
(Settings DB Script von mir wird vorausgesetzt http://www.ip-symcon.de/forum/threads/20529)
<?
/* --------------------------------------------------------------------------
Z-Wave Battery Node Optimization Script
---------------------------------------------------------------------------
Dieses Script dient dazu Z-Wave Batterie Instanzen zu optimieren.
Sobald ein Gerät aufacht und eine entsprechende Variable ändert, wird die
Node optimierung gestartet.
Die Anzahl wie oft ein Knoten optimiert werden soll kann konfiguriert werden.
Ein Start über das Webfront oder per Execute setzt den Counter zurück und
erstellt Neue Ereignisse für dieses Script bzw. aktualisiert Alte.
Batterie Nodes werden anhand der Klasse COMMAND_CLASS_WAKE_UP identifiziert
Damit dieses Script lauffhäig ist, wird das settings.ips.php script benötigt:
http://www.ip-symcon.de/forum/threads/20529
*/
// Configuration ------------------------------------------------------------
$c_gateway = 12384 /*[Z-Wave Gateway]*/;
$max_optimize = 6;
$log_name = "Battery Node Optimization";
// --------------------------------------------------------------------------
require_once("settings.ips.php");
$set = new settings;
/* -----------------------------------------------------------------------
Script Teil I
Counter zurücksetzen und Ereignisse erstellen
----------------------------------------------------------------------- */
if($_IPS['SENDER'] == "Execute" || $_IPS['SENDER'] =="WebFront"){
$set->deletevalue("INSTANCES");
echo "Counter Zurückgesetzt.
Nodes werden bei Aktivität $max_optimize mal nacheinander optimiert.
";
// Ereignisse für dieses Script anlegen ----------------------------------
DEFINE ("COMMAND_CLASS_WAKE_UP", 132);
DEFINE ("Z_WAVE_MODUL", "{101352E1-88C7-4F16-998B-E20D50779AF6}");
$inst = IPS_GetInstanceListByModuleID(Z_WAVE_MODUL);
foreach($inst as $id){
$subids = IPS_GetChildrenIDs($id);
// Alle variablen lesen und prüfen ob battery
$node_cls = (ZW_GetNodeClasses($id));
if(in_array(COMMAND_CLASS_WAKE_UP,$node_cls)){
$subids = IPS_GetChildrenIDs($id);
$last_upd = 0; $event_varid = 0;
foreach($subids as $id_sub){
$id_info = IPS_GetObject($id_sub);
if($id_info["ObjectType"] == 2){ // 2 = Variable , 4=Ereignis
$var_info = IPS_GetVariable($id_sub);
if($var_info["VariableChanged"] > $last_upd){
$last_upd = $var_info["VariableChanged"];
$event_varid = $id_sub;
}
}
}
if($event_varid != 0){
$BattNodes[$id] = $event_varid;
}
}
}
// prüfen ob Ereignis schon vorhanden und in Monitoring liste,
// Wenn schon vorhanden aus Anlege-liste löschen, wenn nicht in Monitoring
// Liste löschen
$childs = IPS_GetChildrenIDs($_IPS['SELF']);
foreach($childs as $childID){
$info = IPS_GetObject($childID);
if($info["ObjectType"] == 4){
$e_info = IPS_GetEvent($childID);
$var_id = $e_info["TriggerVariableID"];
if(isset($BattNodes[IPS_GetParent($var_id)])){
IPS_SetEventActive($childID,true);
unset($BattNodes[IPS_GetParent($var_id)]);
} else {
echo "Altes Eevent gelöscht: ".IPS_GetName($childID)."
";
IPS_DeleteEvent($childID);
}
}
}
// Neue Events anlegen
foreach ($BattNodes as $inst => $var){
$eid = IPS_CreateEvent(0);
IPS_SetParent($eid, $_IPS['SELF']);
$e_name = "Event für ".IPS_GetName($inst);
echo $e_name." erstellt
";
IPS_SetName($eid, $e_name);
IPS_SetEventTrigger($eid,0,$var);
IPS_SetEventActive($eid,true);
}
setStatus();
return;
}
/* -----------------------------------------------------------------------
Script Teil II
Node Optimierung
----------------------------------------------------------------------- */
// Instanz lesen
if($_IPS['SENDER'] != "Variable"){
return; // Abbruch wenn nicht von einer Änderung an einer Variable gestartet.
}
// Mutter Instanz abfragen
$l_inst = IPS_GetParent($_IPS['VARIABLE']);
$instances = $set->getValue("INSTANCES");
if($instances[$l_inst] >= $max_optimize){
// Optimizing already done deactivate Event
$eid = $_IPS['EVENT'];
IPS_SetEventActive($eid,false);
} else {
if(!isset($instances[$l_inst]))$instances[$l_inst] = 0;
IPS_LogMessage($log_name, "Optimiere Node: ".IPS_GetName($l_inst)."" );
$net_id = ZW_GetNodeID($l_inst);
ZW_RoutingOptimizeNode($c_gateway,$net_id);
$instances[$l_inst] = $instances[$l_inst] + 1 ;
}
setStatus();
$set->setValue("INSTANCES",$instances );
function setStatus(){
// Count finished Events
$childs = IPS_GetChildrenIDs($_IPS['SELF']);
$e_fin = 0;
$e_open = 0;
foreach($childs as $childID){
$info = IPS_GetObject($childID);
if($info["ObjectType"] == 4){
$e_info = IPS_GetEvent($childID);
if($e_info["EventActive"] == true){
$e_open++;
} else {
$e_fin++;
}
}
}
$status_id = CreateVariableByName($_IPS['SELF'],"Erledigt", 3);
setvalue($status_id,"($e_fin/".($e_open + $e_fin).")");
}
// common helper Function
function CreateVariableByName($id, $name, $type)
{
global $IPS_SELF;
$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;
}
?>
Warning: require_once(se_helpers.ips.php): failed to open stream: No such file or directory in C:\IP-Symcon\scripts\20642.ips.php on line 24
Fatal error: require_once(): Failed opening required 'se_helpers.ips.php' (include_path='.;C:\php\pear') in C:\IP-Symcon\scripts\20642.ips.php on line 24
Abort Processing during Fatal-Error: require_once(): Failed opening required 'se_helpers.ips.php' (include_path='.;C:\php\pear')
Error in Script C:\IP-Symcon\scripts\20642.ips.php on Line 24
Die DLLs. habe ich runtergeladen und in den ext Ordner kopiert.
Die PHP.INI ist erweitert.
IPS Dienst neu gestartet (Log kontrolliert=DLLs geladen).
Nun kommt folgender Fehler:
Fatal error: Uncaught exception ‚PDOException‘ with message ‚SQLSTATE[HY000] [14] unable to open database file‘ in C:\IP-Symcon\scripts\settings.ips.php:48
Stack trace: #0 C:\IP-Symcon\scripts\settings.ips.php(48): PDO->__construct(‚sqlite:…/user/…‘) #1 C:\IP-Symcon\scripts\settings.ips.php(39): settings->initDB() #2 C:\IP-Symcon\scripts\15394.ips.php(25): settings->__construct() #3 {main}
thrown in C:\IP-Symcon\scripts\settings.ips.php on line 48
Ist doch richtig, dass ich das Script per Ausführen-Knopf im Scripteditor starte oder ?
Der Pfad zur DB muss absolut angeben werden, sonst klappt es bei mir nicht.
PHP-Code:
var $CONF_DB = "c:/ip-symcon2/webfront/user/settings.sqlite";
PHP-Code:
IPS_GetKernelDir()
in Verbindung mit der Klasse bringt leider einen Fehler. Denke aber eher das das ein Problem mit PHP ist.
Gruß
Werner
Bei mir => „c:/ip-symcon/webfront/user/settings.sqlite“
Zur Info für andere.
Hab ich gemacht, da entsteht eine ganze Seite wilder Text …
Erste Zeile:
phpinfo() PHP Version => 5.4.8 System => Windows NT SERVER1-DC 6.1 build 7601 (Windows Server 2008 R2 Standard Edition Service Pack 1) i586 Build Date => Oct 16 2012 22:26:49 Compiler => MSVC9 (Visual C++ 2008) Architecture => x86 Configure Command
Du suchst dann diese hier (weil PHP 5.4.8 !):
-> php-5.4.8-Win32-VC9-x86.zip
Speichern, auspacken (z.B. mit 7Zip). Aus dem ext Ordner (des gerade ausgepackten Pakets) die beiden o.g. DLLs suchen, in das IPS „ext“ Verzeichnis kopieren und IPS Dienst stoppen/starten.
das Script sucht sich alle Nodes aus die die Klasse WAKE_UP haben. Dh. welche die nicht wach sind.
Hast Du Batteriegeräte im Einsatz und kannst Du mal prüfen , ob diese die Battery Klasse haben?