Ähnlich dem Vorgehen zum Code geschützten Ein- und Ausschalten einer Alarmanlage, kann man auch den Schutz eines View Bereiches realisieren.

IPSView_ViewProtection_Console1

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

 

<?

	/**
	 * @file          IPSView_ViewProtection.ips.php
	 * @author        brownson
	 * @version
	 *   Version 1.0, 2014-11-20 brownson: Initiale Version<br/>
	 *
	 * Skript um einen Schutz eines View Bereiches mittles Codeeingabe zu
	 * realisieren.
	 *
	 * Konfiguration Einstellungen:
	 *   PROTECTION_CODE         ... Code der eingegeben werden muss um die
	 *                               Sperre auszuschalten.
	 *   PROTECTION_SHOWLASTCHAR ... Spezifiziert ob das letzt eingegebene Zeichen
	 *                               im Klartext angezeigt werden soll.
	 *   PROTECTION_MESSAGEERROR ... Spezifiziert die Fehlermeldung die im Falle
	 *                               einer ungültigen Eingabe angezeigt werden soll.
	 *   PROTECTION_MESSAGEOFF   ... Spezifiziert die Anzeige im Status Off.
	 *   PROTECTION_MESSAGEON    ... Spezifiziert die Anzeige im Status ON.
	 *
	 *   Protection_SetOn        ... Hier können Befehle platziert werden, die beim
	 *                               Einschalten der Sperre ausgeführt werden
	 *                               sollen.
	 *   Protection_SetOff       ... Hier können Befehle platziert werden, die beim
	 *                               Ausschalten der Sperre ausgeführt werden
	 *                               sollen.
	 *
	 */

	/*
	 * Konfiguration:
	 * -------------------------------------------------------------------------
	 */

	define ('PROTECTION_CODE',					'1234');
	define ('PROTECTION_SHOWLASTCHAR',		true);
	define ('PROTECTION_MESSAGEERROR',		'Code Eingabe ist NICHT korrekt!');
	define ('PROTECTION_MESSAGEOFF',      	'Entsperrt');
	define ('PROTECTION_MESSAGEON',       	'Codeeingabe erforderlich');

	function Protection_SetOn() {
	}

	function Protection_SetOff() {
	}

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

	$variableIDStatus  = CreateVariable('Status',  0, $parentID, 10, '~Switch', $scriptID);
	$variableIDHidden  = CreateVariable('Hidden',  0, $parentID, 15, '~Switch', null);
	$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)) {
		      Protection_SetOn();
		      SetValue($variableIDStatus, true);
		      SetValue($variableIDHidden, false);
				SetValue($variableIDDisplay, PROTECTION_MESSAGEON);
			} else if ($value==false and GetValue($variableIDStatus) and Protection_CodeMatches($variableIDCode)) {
		      Protection_SetOff();
		      Protection_ClearCode($variableIDCode, $variableIDDisplay);
		      SetValue($variableIDStatus, false);
		      SetValue($variableIDHidden, true);
				SetValue($variableIDDisplay, PROTECTION_MESSAGEOFF);
			} else if ($value==false and GetValue($variableIDStatus) and !Protection_CodeMatches($variableIDCode)) {
				SetValue($variableIDDisplay, PROTECTION_MESSAGEERROR);
			} else {
				// Nothing to do
			}
		} else if ($variableId == $variableIDHidden) {
		   // no Update allowed
		} 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':
					Protection_AddDigitToCode($variableIDCode, $variableIDDisplay, $value);
					break;
				case 'B':
					Protection_ClearDigitFromCode($variableIDCode, $variableIDDisplay);
					break;
				case 'C':
					Protection_ClearCode($variableIDCode, $variableIDDisplay);
					break;
				default:
				   // do nothing
				   break;
			}
		}
	}
	/*
	 * Funktionen:
	 * -------------------------------------------------------------------------
	 */
	function Protection_CodeMatches($variableIDCode) {
	   return GetValue($variableIDCode)==PROTECTION_CODE;
	}

	function Protection_ClearCode($variableIDCode, $variableIDDisplay) {
	   SetValue($variableIDCode, '');
	   SetValue($variableIDDisplay, '');
	}

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

	function Protection_AddDigitToCode($variableIDCode, $variableIDDisplay, $value) {
	   SetValue($variableIDCode, GetValue($variableIDCode).$value);
	   Protection_BuildDisplayString($variableIDCode, $variableIDDisplay);
	}

	function Protection_ClearDigitFromCode($variableIDCode, $variableIDDisplay) {
	   if (strlen(GetValue($variableIDCode)) > 0) {
	   	SetValue($variableIDCode, substr(GetValue($variableIDCode), 0, -1));
		   Protection_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;
	}

?>

Zusätzlich zu dem Script für die Alarmanlage, gibt es hier noch eine Variable Hidden, mit der man die Sichtbarkeit von Bedienelementen steuern kann. Der Wert der Variable ist immer die Umkehrung der Statusvariable.

Integration in IPSView:

Im Designer öffnet man nun die Seite der View die man mit einer Codeeingabe schützen möchte. Ich habe ich als anschauliches Beispiel einfach mal den Floorplan meines Erdgeschosses verwendet:

IPSView_ViewProtection_DesignerStart

Nun platziert man ein Label über die komplette Seite und setzt die ID der Variable „Hidden“ im Property „Variable Versteckt“. Dieses Label sorgt dafür, dass man auf der Seite nichts bedienen kann, wenn keine Codeeingabe erfolgt ist. Durch die leichte Transparenz der Hintergrundfarbe sieht man die Steuerelemente im Hintergrund im Client dann noch.

IPSView_ViewProtection_DesignerBack

ACHTUNG: Der Designer beherrscht keine Anzeige von Transparenten Steuerelementen, im Client werden sie allerdings korrekt dargestellt.

Über dieses Label platziert man nun die Elemente für die Codeeingabe, analog wie es bereits bei der Steuerung der Alarmanlage beschrieben wurde.

IPSView_ViewProtection_DesignerButton1 IPSView_ViewProtection_DesignerLabel

Zusätzlich wird hier allerdings bei jedem Element das Property „Variable Versteckt“ gesetzt. Diese Fernsteuer Option gewährleistet, dass die Steuerelemente nur sichtbar sind, wenn eine Codeeingabe erforderlich ist.

IPSView_ViewProtection_DesignerButtonOn

Zum Abschluss muss jetzt noch eine Kopie des ToggleButtons zum Ein/Ausschalten im Bereich der zu schützenden Steuerelemente platziert werden. Dieser ist erforderlich, damit man den Schutz auch wieder aktivieren kann.

Das Bearbeiten der Elemente die sich im Hintergrund (also hinter dem Label das sich über die gesamte Seite erstreckt) ist etwas tricky. Am praktikabelsten ist es, wenn man die entsprechenden Elemente markiert und über das Kontext Menü die Option „In den Hintergrund senden“ bzw. „In den Vordergrund holen“ wählt.

IPSView_ViewProtection_ExampleOn IPSView_ViewProtection_ExampleOff