Hier ist einmal ein Beispiel, wie man eine Alarmanalage oder eine andere Funktion mit einer Code Eingabe schützen kann.

Folgende Objekte werden in IP-Symcon benötigt:

  • Script (Script zur Steuerung)
  • Status, Variable vom Type Boolean (aktueller Status der Alarmanlage)
  • Code, Variable vom Type String (aktuelle Code Eingabe in Klartext)
  • Display, Variable vom Type String(zur Anzeige der aktuelle Eingabe)

IPSView_AlarmProtection_Console1

Wichtig ist hierbei, dass die Statusvariable das Skript als ActionScript zugewiesen hat, um eine Code Kontrolle beim Ein- und Ausschalten zu gewährleisten.

Folgendes Skript beinhaltet die komplette Programmlogik und erzeugt nach dem erstmaligen Ausführen auch alle benötigten Variablen:

<?
	/**
	 * @file          IPSView_AlarmSystemProtection.ips.php
	 * @author        brownson
	 * @version
	 *   Version 1.0, 2014-11-19 brownson: Initiale Version<br/>
	 *
	 * Skript zum Ein-/Ausschalten einer Alarmanlage mit Code Schutz.
	 *
	 * Konfiguration Einstellungen:
	 *   ALARMSYSTEM_CODE         ... Code der eingegeben werden muss um die 
	 *                                Alarmanlage auszuschalten.
	 *   ALARMSYSTEM_SHOWLASTCHAR ... Spezifiziert ob das letzt eingegebene Zeichen
	 *                                im Klartext angezeigt werden soll.
	 *   ALARMSYSTEM_MESSAGEERROR ... Spezifiziert die Fehlermeldung die im Falle
	 *                                einer ungültigen Eingabe angezeigt werden soll.
	 *   ALARMSYSTEM_MESSAGEOFF   ... Spezifiziert die Anzeige im Status Off.
	 *   ALARMSYSTEM_MESSAGEON    ... Spezifiziert die Anzeige im Status ON.
	 *
	 *   AlarmSystem_SetOn        ... Hier können Befehle platziert werden, die beim
	 *                                Einschalten der Alarmanlage ausgeführt werden
	 *                                sollen.
	 *   AlarmSystem_SetOff       ... Hier können Befehle platziert werden, die beim
	 *                                Ausschalten der Alarmanlage ausgeführt werden
	 *                                sollen.
	 *
	 */

	/*
	 * Konfiguration:
	 * -------------------------------------------------------------------------
	 */
	
	define ('ALARMSYSTEM_CODE',				'1234');
	define ('ALARMSYSTEM_SHOWLASTCHAR',		true);
	define ('ALARMSYSTEM_MESSAGEERROR',		'Code Eingabe ist NICHT korrekt!');
	define ('ALARMSYSTEM_MESSAGEOFF',      'Alarmanlage Aus');
	define ('ALARMSYSTEM_MESSAGEON',       'Alarmanlage Ein');

	function AlarmSystem_SetOn() {
	}

	function AlarmSystem_SetOff() {
	}

	/*
	 * Programmlogik:
	 * -------------------------------------------------------------------------
	 */
	$scriptID     = $_IPS['SELF'];
	$sender       = $_IPS['SENDER'];
	$parentID     = IPS_GetParent($scriptID);

	$variableIDStatus  = CreateVariable('Status',  0, $parentID, 10, '~Switch', $scriptID);
	$variableIDDisplay = CreateVariable('Display', 3, $parentID, 20, '~String', null);
	$variableIDCode    = CreateVariable('Code',    3, $parentID, 30, '~String', null);

	if ($sender=='Execute') {
	   // Only create Variables in manuell Mode
	} else {
		$variableId   = array_key_exists('VARIABLE', $_IPS) ? $_IPS['VARIABLE'] : 0;
		$value        = $_IPS['VALUE'];
		if ($variableId == $variableIDStatus) {
		   if ($value==true and !GetValue($variableIDStatus)) {
		      AlarmSystem_SetOn();
		      SetValue($variableIDStatus, true);
				SetValue($variableIDDisplay, ALARMSYSTEM_MESSAGEON);
			} else if ($value==false and GetValue($variableIDStatus) and AlarmSystem_CodeMatches($variableIDCode)) {
		      AlarmSystem_SetOff();
		      AlarmSystem_ClearCode($variableIDCode, $variableIDDisplay);
		      SetValue($variableIDStatus, false);
				SetValue($variableIDDisplay, ALARMSYSTEM_MESSAGEOFF);
			} else if ($value==false and GetValue($variableIDStatus) and !AlarmSystem_CodeMatches($variableIDCode)) {
				SetValue($variableIDDisplay, ALARMSYSTEM_MESSAGEERROR);
			} else {
				// Nothing to do
			}
		} else if ($variableId == $variableIDDisplay) {
		   // no Update allowed
		} else if ($variableId == $variableIDCode) {
		   // no Update allowed
		} else {
			switch ($value) {
				case '0':
				case '1':
				case '2':
				case '3':
				case '4':
				case '5':
				case '6':
				case '7':
				case '8':
				case '9':
					AlarmSystem_AddDigitToCode($variableIDCode, $variableIDDisplay, $value);
					break;
				case 'B':
					AlarmSystem_ClearDigitFromCode($variableIDCode, $variableIDDisplay);
					break;
				case 'C':
					AlarmSystem_ClearCode($variableIDCode, $variableIDDisplay);
					break;
				default:
				   // do nothing
				   break;
			}
		}
	}
	/*
	 * Funktionen:
	 * -------------------------------------------------------------------------
	 */
	function AlarmSystem_CodeMatches($variableIDCode) {
	   return GetValue($variableIDCode)==ALARMSYSTEM_CODE;
	}
	 
	function AlarmSystem_ClearCode($variableIDCode, $variableIDDisplay) {
	   SetValue($variableIDCode, '');
	   SetValue($variableIDDisplay, '');
	}

	function AlarmSystem_BuildDisplayString($variableIDCode, $variableIDDisplay) {
	   $display = '';
	   $code    = GetValue($variableIDCode);
	   $len     = strlen($code);
	   for ($pos=0; $pos<$len ; $pos++) {
	      if ($pos+1==$len and ALARMSYSTEM_SHOWLASTCHAR) {
		      $display = $display.substr($code, -1);
	      } else {
		      $display = $display.'*';
	      }
	   }
	   SetValue($variableIDDisplay, $display);
	}

	function AlarmSystem_AddDigitToCode($variableIDCode, $variableIDDisplay, $value) {
	   SetValue($variableIDCode, GetValue($variableIDCode).$value);
	   AlarmSystem_BuildDisplayString($variableIDCode, $variableIDDisplay);
	}

	function AlarmSystem_ClearDigitFromCode($variableIDCode, $variableIDDisplay) {
	   if (strlen(GetValue($variableIDCode)) > 0) {
	   	SetValue($variableIDCode, substr(GetValue($variableIDCode), 0, -1));
		   AlarmSystem_BuildDisplayString($variableIDCode, $variableIDDisplay);
	   }
	}

	function CreateVariable ($name, $type, $parentId, $position=0, $profile="", $action=null) {
		$variableId = @IPS_GetObjectIDByIdent($name, $parentId);
		if ($variableId === false) {
 			$variableId = IPS_CreateVariable($type);
			IPS_SetParent($variableId, $parentId);
			IPS_SetName($variableId, $name);
			IPS_SetIdent($variableId, $name);
			IPS_SetPosition($variableId, $position);
  			IPS_SetVariableCustomProfile($variableId, $profile);
 			IPS_SetVariableCustomAction($variableId, $action);
		}
		return $variableId;
	}

?>

 

Was macht der Code:

Im oberen Teil des Skriptes befindet sich der Konfigurationsteil, hier kann man die eigentlichen Schaltbefehle und den Code eintragen.

Darunter die Programm Logik, die den Aufruf entsprechende der Variable analysiert:

  • Statusvariable auf true (Einschalten der Alarmanlage) – kann jederzeit gemacht werden, es erfolgt keine Überprüfung des Codes
  • Statusvariable auf false (Ausschalten der Alarmanlage) – es wird die aktuelle Code Eingabe überprüft, nur wenn OK wird ausgeschaltet. Ansonsten wird eine Fehlermeldung in die Display Variable geschrieben
  • Code Tasten 0-9, schreibt das jeweilige Zeichen in die Code Variable in Klartext und setzen die Display Variable entsprechend der Codeeingabe (letztes Zeichen in Klartext, alle anderen als *)
  • Taste „Back“ löscht das letzte Zeichen aus der Codeeingabe

Im untersten Teil des Skriptes ist noch der Teil für die Installation, der alle benötigten Variablen anlegt.

 

Integration in IPSView:

In IPSView erstellt man nun folgende Steuerungselemente:

  • VarLabel, Anzeige der aktuellen Code Eingabe, als ID wird die Display Variable spezifiziert

IPSView_AlarmProtection_DesignerLabel

  • Button, Ziffernfeld 0-9, als ID wird das Skript spezifiziert, als Wert die jeweilige Code Ziffer angegeben

IPSView_AlarmProtection_DesignerButton1

  • Button, Taste Back, als ID wird das Skript spezifiziert, als Wert der Buchstabe „B“

IPSView_AlarmProtection_DesignerButtonB

  • ToggleButton, zum eigentlichen Ein-/Ausschalten der Alarmanlage, als ID wird die Status Variable angegeben, Text und Farben entsprechend den persönlichen Vorstellungen

Im Client kann die Alarmanlage nun nur mehr ausgeschaltet werden, wenn eine richtige Codeeingabe erfolgt ist:

IPSView_AlarmProtection_ExampleOn IPSView_AlarmProtection_ExampleOff

Alternativ kann mit diesem Script auch ein spezieller Bereich in der View auf visible gesetzt werden: