Z-Wave Batterie Instanzen / Module automatisch optimieren

Hallo zusammen,

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;

}  
?>

Hi Stele,

also ich bekomme folgenden Fehler:


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

Hast Du die beiden include Skripte auch im Pfad:


require_once("se_helpers.ips.php"); 
require_once("settings.ips.php"); 

?

Sorry, hatte vergessen,

kommentier das se_helpers aus und füge folgendes ans ende des scripts:


// 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;

}  

habs oben schon korrigiert

Fehlt immer noch die

 require_once("settings.ips.php");

oder?
Mach doch einen link dorthin, wo man sie bekommt.

hier: http://www.ip-symcon.de/forum/threads/20529

Hallo stele99

Habe mal schnell dein Script kopiert und eingefügt (mit dem fixen Namen).
Mit dem ausführen erscheint folgende Meldung:

Fatal error: Uncaught exception ‚PDOException‘ with message ‚could not find driver‘ 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

(Settings DB Script von mir wird vorausgesetzt http://www.ip-symcon.de/forum/threads/20529)

Habe den Thread gelesen. Finde aber keine Hinweise was mir fehlt.
Ich habe kein SQL Lite auf dem Server. Das wird es wohl sein. Was ist zu tun ?

Gruß
Lutz

Hallo Lutz,

PHP PDO Unterstützung sollte aktiviert sein.
Im IP-Symcon Verzeichnis ggf. PDO für SQLITE aktivieren:

In die PHP.INI muss folgende Extensions rein:

extension = php_pdo.dll
extension = php_pdo_sqlite.dll
extension = php_sqlite3.dll

Sicherstellen, dass die php_pdo_sqlite.dll im ext Verzeichnis liegt.

Hallo stele99.
Brauche nochmal eine kleine Hilfe.

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 ?

Gruß
Lutz

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.

Danke Werner
Genau das war’s !

War ich nicht alleine. Hatte Unterstützung aus dem hohen Norden :smiley:

Ich bekomme immer noch:

Fatal error:  Uncaught exception 'PDOException' with message 'could not find driver' in C:\IP-Symcon\scripts\settings.ips.php:48
Stack trace:
#0 C:\IP-Symcon\scripts\settings.ips.php(48): PDO->__construct('sqlite:c:/ip-sy...')
#1 C:\IP-Symcon\scripts\settings.ips.php(39): settings->initDB()
#2 C:\IP-Symcon\scripts\20642.ips.php(25): settings->__construct()
#3 {main}
  thrown in C:\IP-Symcon\scripts\settings.ips.php on line 48
Abort Processing during Fatal-Error: Uncaught exception 'PDOException' with message 'could not find driver' in C:\IP-Symcon\scripts\settings.ips.php:48
Stack trace:
#0 C:\IP-Symcon\scripts\settings.ips.php(48): PDO->__construct('sqlite:c:/ip-sy...')
#1 C:\IP-Symcon\scripts\settings.ips.php(39): settings->initDB()
#2 C:\IP-Symcon\scripts\20642.ips.php(25): settings->__construct()
#3 {main}
  thrown
   Error in Script C:\IP-Symcon\scripts\settings.ips.php on Line 48

hallo herbert,
hast du die dlls passend zur PHP Version im ext. Ordner?
die PHP INI im IPS Ordner angepasst?

leg mal eine datei in webfront/user mit dem namen phpinfo.php

Inhalt

<?php
phpinfo();
?>

dann ruf mal die seite auf, pfade entsprechend anpassen
http://deinhost:8080/user/phpinfo.php

Gruss

Und nimm mal die:

extension=php_pdo.dll

mit in die php.ini

Jetzt kommt:


Fatal error:  Uncaught exception 'PDOException' with message 'could not find driver' in C:\IP-Symcon\scripts\settings.ips.php:48
Stack trace:
#0 C:\IP-Symcon\scripts\settings.ips.php(48): PDO->__construct('sqlite:c:/ip-sy...')
#1 C:\IP-Symcon\scripts\settings.ips.php(39): settings->initDB()
#2 C:\IP-Symcon\scripts\20642.ips.php(25): settings->__construct()
#3 {main}
  thrown in C:\IP-Symcon\scripts\settings.ips.php on line 48
Abort Processing during Fatal-Error: Uncaught exception 'PDOException' with message 'could not find driver' in C:\IP-Symcon\scripts\settings.ips.php:48
Stack trace:
#0 C:\IP-Symcon\scripts\settings.ips.php(48): PDO->__construct('sqlite:c:/ip-sy...')
#1 C:\IP-Symcon\scripts\settings.ips.php(39): settings->initDB()
#2 C:\IP-Symcon\scripts\20642.ips.php(25): settings->__construct()
#3 {main}
  thrown
   Error in Script C:\IP-Symcon\scripts\settings.ips.php on Line 48

Keine Ahnung - wie bestimme ich denn dies?

JA

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

ok, irgendwo müsste auf dieser seite die pdo extension aufgeführt werden.
such mal nach
sqlite
und
pdo

findet er was?

@herbertf

Schau mal hier:
http://windows.php.net/downloads/releases/archives/

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.

Viel Erfolg.

Lutz

:confused:

Hallo stele99.

Ich hbae ca. 20 Generic Controller gleichen Typs und Einrichtung im Netz.
Trotzdem wird nur dieser Eine als Ereignis angelegt.
Ist da richtig so?

Lutz

Hallo,

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?