Z-Wave Skripte

Möchte an dieser Stelle meine Skripte Teilen

zu mir:
Ich bin Feinwerkmechaniker und hatte Keine PHP Kentnisse als ich mit IPS im August 2009 anfing, was ich über das Programieren weis, habe ich fast ausschließlich aus dem Forum.

Ich setzt überwiegend ZW komponeten ein, weswegen meine Skripte Oft auf ZW ausgelegt sind. Die Koponeten beziehe ich beim Knauber für günstigere preise als im Netz.

Ich möchte Hierüber im großem und ganzem den Werdegang und die Entwicklung meiner Skripte dokumentieren um anderen „anfängern“ das
leben zu erleichtern.

Auch werde ich Über Kosten Berichten damit man darüber auch einblick hat.

Bitte auch um Nachsicht bei Schreibfehlern in Texten.
Skripte werden nur getestet reingestellt


Meine Ersten Projekt waren die Rolladen

IPS für 99euro gekauft
ZW-Tricklestar 49,95 gekauft
ZW Rolladenaktor für ca 45 euro gekauft + jeweils Rohrmotor ca 60 euro

Motor und Rolladenaktor eingebaut

nach Anleitung den Schalter angelegt.

Dann das erste Skript! wie fängt man an???

Ich habe im objektbaum erst mal rumgeklickt um so bischen gefühl zu bekommen.
Habe eine Kategorie angelegt mit namen Haus und wieder 2 Kategorien einer mit namen Aktoren und einer mit namen Skripte die dem untergeortnet waren.

Relativ schnell ist mir aufgefallen das wenn ich einen ZW lösche und neu anlege dieser eine neue ID bekommt.

auserdem brauch man Fingerübung

Als das erste Skrip schalten des Aktors

<?
ZW_SwitchMode(00000 /*[Haus\Aktoren\EG/Wohnzimmer]*/ , True);
?>

und siehe da Rolladen Fährt hoch doch der mus ja auch wieder runter
als 2. Skript

<?
ZW_SwitchMode(00000 /*[Haus\Aktoren\EG/Wohnzimmer]*/ , False);
?>

Wenn man die Aktoren so Steuert an stelle von direkter ansprache im Ausführenden Skript ist schnell erklärt wenn man später 5 skripte hat die auf einen aktor zu greifen und der Tricklestar geht kaputt mus man in jedem skript einzeln die neue ID eintragen so kann man sagen

IPS_RunScript (00000 /*[Haus\Skripte\Wohnzimmer_rolladen_hoch]*/);

Ich glaube das waren so die ersten Skripte von mir

Ich legte nun alle rolladen im haus so an insgesamt 6 stück kosten gesammt
809 euro + etwa 20 Arbeitsstunden für kabellegen so wie gips zum zu gipsen
der geschlagenen Schlitze.

Der nächste Schritt war alle Rolladen hoch oder Runter zu fahren das ganze sah dann so aus


<?
IPS_RunScript (00000 /*[Haus\Skripte\Rolladen / 1. Geschoss / Arbeitszimmer / Hoch]*/);
IPS_RunScript (00000 /*[Haus\Skripte\Rolladen / 1. Geschoss / Gaestezimmer / Hoch]*/);
IPS_RunScript (00000 /*[Haus\Skripte\Rolladen / 1. Geschoss / Schlafzimmer / Hoch]*/);
IPS_RunScript (00000 /*[Haus\Skripte\Rolladen / E. Geschoss / Essecke / Hoch]*/);
IPS_RunScript (00000 /*[Haus\Skripte\Rolladen / E. Geschoss / Kueche / Hoch]*/);
IPS_RunScript (00000 /*[Haus\Skripte\Rolladen / E. Geschoss / Terasse / Hoch]*/);
IPS_RunScript (00000 /*[Haus\Skripte\Rolladen / E. Geschoss / Wintergaten / Hoch]*/);
?>

Das ganze natürlich auch Rückwärts
Dazu noch nen ereignis angelegt und schwupp di wupp waren die rolladen morges Oben.

Bei einem kaputten Controller musst Du nicht zwingend alle IDs in den Skripten ändern. Du brauchst nur in den alten Instanzen den Datenpunkt anpassen.

wenn man anstelle von zw_switchmode ($id, boolean) den Befehl zw_dimset ($id, int) wobei Int = zwischen 0 und 100 beträgt, kann man den Rollo zielgenau auf einen zwischen 0% (ganz zu) und 100% (ganz offen) fahren.

Ok steueren wir ganz einfach die Rolladen sonnenaufgangs gesteuert ohne arbeit!!!


<?
//grundgrüst erstellung
$SkriptSonnenaufgangID = @IPS_GetObjectIDByName("Bei_Sonnenaufgang", $IPS_SELF);
if ($SkriptSonnenaufgangID == 0)
	{
	$SkriptSonnenaufgangID = IPS_CreateScript(0);
	IPS_SetParent($SkriptSonnenaufgangID, $IPS_SELF);
	IPS_SetName($SkriptSonnenaufgangID, "Bei_Sonnenaufgang");
	}
$SkriptSonnenuntergangID = @IPS_GetObjectIDByName("Bei_Sonnenuntergang", $IPS_SELF);
if ($SkriptSonnenuntergangID == 0)
	{
	$SkriptSonnenuntergangID = IPS_CreateScript(0);
	IPS_SetParent($SkriptSonnenuntergangID, $IPS_SELF);
	IPS_SetName($SkriptSonnenuntergangID, "Bei_Sonnenuntergang");
	}
$Variablesonnenaufgang = @IPS_GetObjectIDByName("Additivsonnenaufgangszeit", $IPS_SELF);
if ($Variablesonnenaufgang == 0)
	{
	$Variablesonnenaufgang = IPS_CreateVariable(1);
	IPS_SetParent($Variablesonnenaufgang, $IPS_SELF);
	IPS_SetName($Variablesonnenaufgang, "Additivsonnenaufgangszeit");
	}
$Variablesonnenuntergang = @IPS_GetObjectIDByName("Additivsonnenuntergangszeit", $IPS_SELF);
if ($Variablesonnenuntergang == 0)
	{
	$Variablesonnenuntergang = IPS_CreateVariable(1);
	IPS_SetParent($Variablesonnenuntergang, $IPS_SELF);
	IPS_SetName($Variablesonnenuntergang, "Additivsonnenuntergangszeit");
	}
$Sommerzeit = @IPS_GetObjectIDByName("Sommerzeit", $IPS_SELF);
if ($Sommerzeit == 0)
	{
	$Sommerzeit = IPS_CreateVariable(0);
	IPS_SetParent($Sommerzeit, $IPS_SELF);
	IPS_SetName($Sommerzeit, "Sommerzeit");
	}
$zeitsonnenaufgang = @IPS_GetEventIDByName("Timer", $SkriptSonnenaufgangID);
if ($zeitsonnenaufgang == 0)
	{
$zeitsonnenaufgang = IPS_CreateEvent(1);
IPS_SetParent($zeitsonnenaufgang, $SkriptSonnenaufgangID); //Ereignis zuordnen
IPS_SetName($zeitsonnenaufgang, "Timer");
	}
$zeitsonnenuntergang = @IPS_GetEventIDByName("Timer", $SkriptSonnenuntergangID);
if ($zeitsonnenuntergang == 0)
	{
$zeitsonnenuntergang = IPS_CreateEvent(1);
IPS_SetParent($zeitsonnenuntergang, $SkriptSonnenuntergangID); //Ereignis zuordnen
IPS_SetName($zeitsonnenuntergang, "Timer");
	}
//grundgerüst erstellt





$sommerzeit = getValueBoolean ($Sommerzeit);
$longitude = 7.80;
$latitude = 50.47;
If ($sommerzeit == True )
{
if (date("I") == 1) $daylight = 5;       // Sommerzeit
if (date("I") == 0) $daylight = 4;       // Winterzeit
}
else
{
if (date("I") == 1) $daylight = 4;       // Sommerzeit
if (date("I") == 0) $daylight = 3;       // Winterzeit
}
// *** Sonnenaufgang des heutigen Tages berechnen ***
$var_sunrise = date(date_sunrise(time(), SUNFUNCS_RET_STRING, $longitude, $latitude, 90.8333, $daylight));
// *** Sonnenuntergang des heutigen Tages berechnen ***
$var_sunset = date(date_sunset(time(), SUNFUNCS_RET_STRING, $longitude, $latitude, 90.8333, $daylight));





$alleEreignisse = IPS_GetEventListByType(1);

foreach ($alleEreignisse as $Ereignis) {
    $event = IPS_GetObject($Ereignis);
    $teile = explode("_",$event["ObjectName"]);
    if ($teile[0]=="SUN"):
        if ($teile[1]=="SET"):
            // "Sonnenuntergang";
            IPS_SetEventCyclicTimeBounds($Ereignis, mktime(substr($var_sunset,0,2),substr($var_sunset,3,2)+$teile[2]), 0);
        Else:
            // "Sonnenaufgang";
            IPS_SetEventCyclicTimeBounds($Ereignis, mktime(substr($var_sunrise,0,2),substr($var_sunrise,3,2)+$teile[2]), 0);
        Endif;
    Endif;
}

$daten = explode(":", $var_sunrise);
 $zeit1=$daten[0]*0+$daten[0];
 $zeit2=$daten[0]*0+$daten[1];
$zeitvariable1 = getvalue ($Variablesonnenaufgang);

 IF ($zeitvariable1 > 0 )
		 {
		$zeit2 = $zeitvariable1+$zeit2 ;

 If (60 < $zeit2 )
		{
		$zeit1=$zeit1+1;
		$zeit2=$zeit2-60;

		}
 IF (60 < $zeit2)
      {$zeit2=$zeit2-60;
		}
 IF ($zeit2 == 60)
      {$zeit2=$zeit2-60;
      $zeit1=$zeit1+1;
		}
		}

 IF ($zeitvariable1 < 0 )
		 {
		$zeitvariable1 = $zeitvariable1*-1 ;

$zeit21=$zeit2;
		IF	($zeit2 > $zeitvariable1)
		{$zeit21=$zeit2-$zeitvariable1;}
$zeit2 = $zeit21;


		If  ($zeitvariable1 > $zeit2 )
		{$zeit1=$zeit1-1;
      $zeit2=$zeit2+60;}

		}

IF	($zeit2 == $zeitvariable1)
		{$zeit2=$zeit2-$zeitvariable1;}


IPS_SetEventCyclic($zeitsonnenaufgang, 0, 0, 0, 0, 0, 0 );
IPS_SetEventCyclicTimeBounds($zeitsonnenaufgang,
   mktime($zeit1, $zeit2, 0), 0);


 $daten = explode(":", $var_sunset);
 $zeit3=$daten[0]*0+$daten[0]; 
 $zeit4=$daten[0]*0+$daten[1]; 

$zeitvariable2 = getvalue ($Variablesonnenuntergang);

 IF ($zeitvariable2 > 0 )
		 {
		$zeit4 = $zeitvariable2+$zeit4 ;

 If (60 < $zeit4 )
		{
		$zeit3=$zeit3+1;
		$zeit4=$zeit4-60;

		}
 IF (60 < $zeit4)
      {$zeit4=$zeit4-60;
		}
 IF ($zeit4 == 60)
      {$zeit4=$zeit4-60;
      $zeit3=$zeit3+1;
		}
		}

 IF ($zeitvariable2 < 0 )
		 {
		$zeitvariable2 = $zeitvariable2*-1 ;

$zeit41=$zeit4;
		IF	($zeit4 > $zeitvariable2)
		{$zeit41=$zeit4-$zeitvariable2;}
$zeit4 = $zeit41;


		If  ($zeitvariable2 > $zeit4 )
		{$zeit3=$zeit3-1;
      $zeit4=$zeit4+60;}

		}

IF	($zeit4 == $zeitvariable2)
		{$zeit4=$zeit4-$zeitvariable2;}

		



IPS_SetEventCyclic($zeitsonnenuntergang, 0, 0, 0, 0, 0, 0 );
IPS_SetEventCyclicTimeBounds($zeitsonnenuntergang,
   mktime($zeit3, $zeit4, 0), 0);


?>

Das Skript erstellt alles selbst man haben muß, nur noch in die sich selbst erstellenden Skripte, reinschreiben was getan werden soll. das Schalten zwichen Sommerzeit und Winterzeit erfolgt via Schalter manuell mann kann die zeiten um bis zu einer stunde vor oder nach stellen. Hierfür einen wert eingeben in die integer z.b. -30 bei Additivsonnenaufgangszeit um die rolladen 30min früher zu öffnen.

normaler weise muss in diesem Skript nix geaendert werden!!!

viel Spaß

@wupperi

ja das geht auch aber mir ist aufgefallen das bei 74% mein rolladen schon zu ist. gibt es da die moglichkeit das zu ändern?

Hiermit schalte ich meinen PC Stromfrei, wenn dieser Runtergefahren ist.
Stromverbindung wir hergestellt, indem der Schalter von Hand betätigt wird.
Auch wieder ganz einfach anzupassen.
$idschalter = Stromschalter vom PC (bei mir nen Düwi Steckdosenschalter)
$ip = Die IP des Rechners der an dem Schalter hängt
$serverip = Die Ip vom Router damit, fals der router ausfällt, nicht gleich der Rechner aus geht.

<?
$idschalter = 12712 /*[Haus\Aktoren\Stromschalter\1.Stock/PC Arbeitszimmer]*/;  //Der Schalter der die Stromzufuhr zum rechner sicherstellt

$ip = "192.168.1.86";
$serverip = "192.168.1.1";
// IP des servers in meinem fall da W´lan anliegt sogar seperate
									//W´lan IP des servers

$zeit1 = 1;// wiederholungszeit in minuten
$zeit2 = 8;// Zeit die dem Rechner bleibt zwichen netzwerkverlust und kompletten runterfahren
				// also nicht zu niedrig ansetzen!!!





$name = "Variabele1";
$name2 = "Variable2";
$AktuellerPCStatus = Sys_Ping($ip, 3000);
$AktuellerserverStatus = Sys_Ping($serverip, 3000);
$parentID = IPS_GetObject($IPS_SELF);
$ObjektID = @IPS_GetObjectIDByName("$name", $IPS_SELF);
$ObjektID2 = @IPS_GetObjectIDByName("$name2", $IPS_SELF);
$status = GetValue($ObjektID);
$status2 = GetValue($ObjektID2);
$EreignisID = @IPS_GetEventIDByName(ScriptTimer,$IPS_SELF);
$zeit0 = $zeit1;
if ($ObjektID == 0)
	{
	$vab = IPS_CreateVariable(0);
	IPS_SetParent($vab, $IPS_SELF);
	IPS_SetName($vab, "$name");
	}
if ($ObjektID2 == 0)
	{
	$vab2 = IPS_CreateVariable(0);
	IPS_SetParent($vab2, $IPS_SELF);
	IPS_SetName($vab2, "$name2");
	}
	
				
				If (($status == 0) and ($AktuellerPCStatus == 1))
					{
					SetValue($ObjektID, true);
					SetValue($ObjektID2, true);
					ZW_Switchmode($idschalter, true);
					}
            If (($status2 == 0) and ($AktuellerPCStatus == 0))
					{
					if ($AktuellerserverStatus == 1)
               {
					SetValue($ObjektID, false);
					ZW_Switchmode($idschalter, false);
						}
					}
				If (($status == 1) and ($AktuellerPCStatus == 0))
					{
					SetValue($ObjektID2, false);
					$zeit0 = $zeit2;
  					}
            If (($status2 == 0) and ($AktuellerPCStatus == 0))
					{
               SetValue($ObjektID2, true);
					$zeit0 = $zeit1;
					}
IPS_DeleteEvent($EreignisID);
IPS_SetScriptTimer($IPS_SELF, $zeit0*60);//setzt im Programm event das in 10min ausgeloest wird


					




?>

Viel Spaß

Hier nochmal ein Energiesparskript :slight_smile:
Diesmal für meinen Drucker

Anzupassen sind nur die Schalter steht aber sauber im Skript.

<?
$schalter = 29875 /*[Haus\Aktoren\Stromschalter\Erdgeschoss/Drucker]*/;// die ID des zuschaltenden Schalters
$Boolean = 37349 /*[Haus\Aktoren\Stromschalter\Erdgeschoss/Drucker\Status]*/;// die ID des Status des Schalters
$zeit1 = 5; //Setzt Die Zeit die der Drucker am netz bleibt
$zeit2 = 0.5; // Setzt Die Zeit wie oft das Skript abgefragt wird passt sich nur nach einem Vorgang an

// Ab Hier mus nichts mehr geändert Werden auser es werden andere Komponenten als Z-Wave genutzt
// Für FS20 muss nur die// vor FS20_Switchmode entfernt werden und vor die ZW_Switchmode
// gesetzt werden.

$status =  GetValueBoolean ($Boolean);
$drucker = (Sys_GetSpooler());//Liefert Druckerstatus
$EreignisID = @IPS_GetEventIDByName(ScriptTimer,$IPS_SELF);


if ( $drucker ['HP Color LaserJet 2600n'])
		{
		      ZW_Switchmode ($schalter, true);// ausgelegt Für Z-Wave
		      //FS20_Switchmode ($schalter, true);// ausgelegt Für Fs20
        	   IPS_DeleteEvent($EreignisID);
           	IPS_SetScriptTimer($IPS_SELF, $zeit1*60);//setzt im Programm event das in 10min ausgeloest wird
				}
else
		{if  ( $status == True )
		      {
	   	         ZW_Switchmode ($schalter, false);// ausgelegt Für Z-Wave
	      	      //FS20_Switchmode ($schalter, false); // ausgelegt Für FS20
              	   IPS_DeleteEvent($EreignisID);
	            	IPS_SetScriptTimer($IPS_SELF, $zeit2*60);//setzt den Timer auf 30sec
				}
		}

// geschrieben by PW
?>

So jetzt dauert es erstmal ein wenig bis ich mir neue Aufgaben ausgedacht habe

MFG

PW

Ja, Du kannst die Düwi Aktoren hinsichtlich Fahrtzeit „kalibrieren“.

Fahren Sie die Jalousie bis zum Anschlag nach oben.
• Drücken Sie für 2 Sekunden gleichzeitig die „AUF“ ( 1 ) und „AB“ ( 2 ) -Taste.
• Die LED beginnt grün zu blinken.
• Fahren Sie die Jalousie durch Drücken der „AB“ ( 2 ) -Taste ganz nach unten bis der Endschalter abschaltet.
• Die LED beginnt während dieser Messzeit langsamer grün zu blinken.
• Die Steuerung signalisiert ein erfolgreiches Speichern für 3 Sekunden mit einer grünen LED-Anzeige, ein misslungenes
Speichern mit einer roten LED-Anzeige.
• Drücken Sie erneut für 2 Sekunden gleichzeitig die „AUF“ ( 1 ) und „AB“ ( 2 ) -Taste.
• Die LED beginnt grün zu blinken.
• Fahren Sie die Jalousie durch Drücken der „AUF“ ( 1 ) -Taste bis zum Anschlag nach oben bis der Endschalter abschaltet.
• Die LED beginnt während dieser Messzeit langsamer grün zu blinken.
• Die Steuerung signalisiert ein erfolgreiches Speichern für 3 Sekunden mit einer grünen LED-Anzeige, ein misslungenes
Speichern mit einer roten LED-Anzeige.

@Paresy

Die Zeiten würden sich auch direkt im Aktor einstellen lassen, indem man einen bestimmen Wert an den Aktor sendet, ich vermute mal, dass es bei z-wave dimmern ein standard register gibt, in welches der Wert geschrieben werden muss:

0x00 kein Abbruch/Dauerbetrieb
0x01-0x7F 1 Sekunde - 127 Sekunden in 1 Sekunden-Schritten
0x80-0xFE 130 Sekunden (0x80) bis 1390 Sekunden
(0xFE) in 10 Sekunden-Schritten
0xFF Werkseinstellung 120 Sekunden

Ist ein direktes Schreiben von hex werten zukünftig vorgesehen? Ungefähr so:

zw_WriteValue ($id, $register, $wert)

Wobei id = aktor, register = eines von n z-wave standard register -> keine Ahnung wieviele dass sind?, wert = hex wert)

Gruss,

wupperi

Das kalibrieren klappte sehr gut Danke

So
habe da nochmal son Skript zusammen kopiert „danke an hirschbrat“.

Das Skript legt einen Schalter an und das dazu gehörige Skript. Das ganze wirkt dann wie ein Virtueller Schalter dessen Position nutze ich um Skripte ein und aus zuschalten :wink: Bei Jedem mal ausführen entsteht ein solcher Schalter.

<?

$ScriptNAME = 'ausloeser';
$name = 'Schalter';


$Schalter = IPS_CreateVariable(0);
IPS_SetVariableCustomProfile($Schalter, "~Switch");
IPS_SetParent($Schalter, $IPS_SELF);
IPS_SetName($Schalter, "$name");



//****************************************************************************
$ScriptTEXT1 =
'<?
$schalter = ';
$ScriptTEXT2 =
'
;
$status = getValueBoolean ($schalter);
if ($status == True)
	{
	SetValueBoolean($schalter, false);
	}
	else
	{
	SetValueBoolean($schalter , true);
	}
?>';
//****************************************************************************



$ScriptID = IPS_CreateScript(0);
IPS_SetName($ScriptID, $ScriptNAME);
IPS_SetParent($ScriptID, $Schalter);
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, $ScriptTEXT1);
fwrite($fh, $Schalter);
fwrite($fh, $ScriptTEXT2);
fclose($fh);
$ScriptPath = $ScriptID.".ips.php";     //Skriptdatei
IPS_SetScriptFile($ScriptID, $ScriptPath);
IPS_SetHidden($ScriptID, true);
IPS_SetVariableCustomAction($Schalter, $ScriptID);

?>

und wieder Viel Spaß