Variablenwerte vor Scriptausführung speichern und später wieder einlesen?

Hallo,

ich will folgendes realisieren. Ich steuere alle Raffstores über KNX und den entsprechenden Wochenplänen in IPS. Ich habe jetzt ein Script geschrieben, mit dem ich alle Zeitsteuerungen ausschalten bzw. einschalten kann. Das Dumme daran ist nur, daß ich beim Einschalten nicht mehr weiß, welche Raffstores ausgeschaltet bleiben sollen (vorheriger Zustand).

Kann mir hier jemand einen Tipp geben, wie ich den Urzustand speichern und dann wieder abrufen kann?

Schon mal danke im Voraus.

Gruß Wolfgang

Einfach in IPS-Variablen speichern?

Oder mal zeigen was du bisher hast an Script …

Das läuft bis jetzt mit oben genannten Einschränkungen …

<?
$i	= 0;

$WochenZeitSchalt = array( 14859, 27003, 40133, 30067, 44821, 55052, 10371, 45162  );			// ID's der Wochenpläne

$StatusZeitSteuerung = GetValueBoolean(42927);													// Id der Schaltvariablen
 
while($i < count($WochenZeitSchalt ))
{
  IF ($StatusZeitSteuerung == true)
 	{
 	IPS_SetEventActive($WochenZeitSchalt[$i], false);
	SetValueBoolean(42927, false);
	}
ELSE
	{
	IPS_SetEventActive($WochenZeitSchalt[$i], true);	
	SetValueBoolean(42927, true);
	}   
   
    $i++;
}
 
?>

Hallo,

wo legst Du denn fest, welcher Store ausgeschaltet bleiben soll? Wenn jeder Store dazu eine eigene Variable (bool) hat, könntst Du die ja auch in ein array lesen und die Werte dann vor Deiner IF Abfrage überprüfen (darf geändert werden, weiter mit if, sonst nicht).

Grüße, Gerhard

Ja es fehlen irgendwie noch Informationen. Wenn die Zustände (aktiviert oder nicht) der Zeitpläne nur durch dieses Script verändert werden, besteht ja kein Problem. Es muss also noch von irgendwoher anders an den Plänen was gedreht werden. Ich war jetzt davon ausgegangen, er kann die Raffstores von Hand, beispielsweise per Taster hoch oder runterfahren, und dabei wird gleichzeitig der Zeitplan deaktiviert. Wenn jetzt das neue Script kommt und alle gleichzeitig deaktiviert, waren vorher schon einzelne deaktiviert. Wenn das Script später die Zeitpläne wieder aktiviert, sollen die vorher per Hand deaktiverten auch deaktiviert bleiben.

Das ist hier im Skripte-Unterforum immer das selbe, es wird die Glaskugel vorrausgesetzt. Mit den gegebenen Infos ist die Frage nur: wie speicher ich einen Bool-Zustand in IPS, Antwort hab ich in #2 gegeben.

etwa so:

<?php

$i	= 0;

$WochenZeitSchalt = array( 14859, 27003, 40133, 30067, 44821, 55052, 10371, 45162  );			// ID's der Wochenpläne

$StatusZeitSteuerung = GetValueBoolean(42927);													// Id der Schaltvariablen
 
while($i < count($WochenZeitSchalt ))
{
  IF ($StatusZeitSteuerung == true)
 		{
		$vid = @IPS_GetObjectIDByIdent($WochenZeitSchalt[$i], $id);
   		if($vid===false) {
      		$vid = IPS_CreateVariable(0);
      		IPS_SetParent($vid, $id);
	  		IPS_SetIdent ($vid, $WochenZeitSchalt[$i]);
      		IPS_SetName($vid, $WochenZeitSchalt[$i]); //bei Bedarf hier Irgendwas anderes ..
			}
	  
	  	$Event = IPS_GetEvent($WochenZeitSchalt[$i]);
	  	SetValueBoolean ($vid, $Event['EventActive']);
	  
 		IPS_SetEventActive($WochenZeitSchalt[$i], false);
		SetValueBoolean(42927, false);
		}
ELSE
	{
	
	$vid = @IPS_GetObjectIDByIdent($WochenZeitSchalt[$i], $id);
   	if($vid===false)
		IPS_SetEventActive($WochenZeitSchalt[$i], true);
        Else{
	        IPS_SetEventActive($WochenZeitSchalt[$i], GetValueBoolean ($vid));	
	        SetValueBoolean(42927, true);
                }
	}   
   
    $i++;
}

Oder alternativ in ein Array, und das in eine Stringvariable speichern, das spart Variablen.

Gruß

Julian

Edit: $id, also den Variablenspeicherort natürlich noch festlegen.

Wenn du das Script in #3 selbst geschrieben hast, wärst du aber auch selbst auf die Idee gekommen, oder ? Ich glaube du hast noch nicht alle Randbedingungen erläutert und die Aufgabe ist doch eine andere …

wahrscheinlich klemmts bei mir in Bezug auf „scripten in PHP“. Ich habe bisher nur in XBASE++ programmiert und das ist ja was anderes. Was ich noch nicht verstanden habe ist, wenn das Script beendet ist, wo steht dann die Variable? Oder wo schreibt man die hin? An ein Array habe ich auch schon gedacht (ist ja auch nichts anderes als eine Variable). Aber wie gesagt, wo finde ich diese nach einem erneuten Aufruf des Scripts?

Mein rudimentäres Script hat natürlich den Fehler, daß immer alle RS angesprochen werden, egal welcher Status. Sollte auch nur der Ausgangspunkt sein. Man müßte natürlich vorher den Status abfragen und entsprechend reagieren.

Wenn ich die Stati in ein Array schreibe, ist das nach Beenden des Scripts noch da?

ahh, ok. Verstehe dein Problem, es ist nicht „scripten in PHP“, sondern „Variablenverwaltung in IPS“
Wenn du dir den Code aus meinem Post ansiehst kommst du aber denke ich weiter.

Innerhalb vom PHP Script arbeitest du mit Variablen die natürlich nach dem Scriptdurchlauf weg sind.
Man kann aber Innerhalb IPS Variablen anlegen und aus Scripten darauf zugreifen. Diese Variablen haben mit dem Script eigentlich nichts zu tun, sind aber Zugreifbar und beschreibbar. Du machst das auch schon in deinem Script in Zeile 6,13, 18
Edit dazu: was mir dabei auffällt, du setzt innerhalb der Schleife eben diese Variable immer wieder. Einmal würde doch reichen.

Siehe auch:
Variablenzugriff — IP-Symcon :: Automatisierungssoftware

In meinem Beispiel legt das Script die Variablen automatisch an, das würde auch per Hand gehen und es um die Funktionsweise zu verstehen evtl. geeignter:

Im Objektbaum an geeigneter Stelle rechtsklick --> Objekt hinzufügen --> Variable erstellen. Die so erstellte Variable lässt sich mit funktionen in Scripten nutzen.

Edit: noch ein Link zu dem Thema (Array als String speichern): String in Array
Als Array und String wärs Variablensparender und in meinen Augen eleganter als die Lösung die ich in #5 vorgeschlagen habe.

ok. alles klar. Werde das Script mal analysieren. Bin noch relativer Anfänger in IPS.

Erst mal vielen Dank. ich melde mich dann wieder.

Gruß Wolfgang

sol langsam erschließt sich mir die Logik. Das gepostete Script läuft zwar noch nicht ganz und ganz verstanden habe ich es auch noch nicht, aber es ist inzwischen vieles klarer geworden.

btw. wie anlege bzw. deklariere ich eine Variable als Array?

Schöne Ostern

Wolfgang

Nein das Script hatte ich nicht getestet, kann gut sein, dass dort kleinere Fehler drin sind.

Wie gesagt, leg die Variablen manuell an, Zugriff hatte ich oben die Doku verlinkt. Dann ists übersichtlicher fürn Anfang.

Arrays kann man so nicht in IPS anlegen, beispielsweise in einer Stringvariable ablegen geht aber, siehe link oben.

Gesendet von iPhone mit Tapatalk Pro

Es funktioniert!!!

Speicherort für $ip festlegen war ein guter Tipp:banghead:

und man sollte „Case Sensitiv“ beachten …

Die Analyse hat mir viel gebracht. Vielen Dank!

Einen Array kannst Du in einer String Variable in IP-Symcon abspeichern.
Dazu wandelst Du z.B. den Array um mit Json_encode und zurück in einen Array über json_decode.

Alternativ nutzt Du serialize

das ist mir noch zu hoch …
ich fange mal klein an.:wink:

Trotzdem danke!

Das ist ein Array


$array = [1,2,3,4,5];

So speicherst Du den Array ab


$array = [1,2,3,4,5];
$json_array = json_encode($array);
SetValue(12345, $json_array); // Speichert das JSON in der Variable mit ObjektID 12345

So liest Du den Array wieder aus und hast diesen wieder als Array zur Verfügung


$json_array = GetValue(12345);
$array = json_decode($json_array, true);

so einfach habe ich das aus dem PHP-Handbuch nicht empfunden. Scheint es aber zu sein.

Geht das mit allen Arrayarten (normales, assoziatives …) und mit allen Variablentypen -> String, numm, logisch?

Warum funktioniert sowas nicht??

$Event = 0;

$Event = IPS_GetEvent(50508);				// 50508=ID Wochenplan

IF ($Event['EventActive'] = 1) 				// Wenn Wochenplan aktiv ist, soll er deaktiviert werden 
	{ 
	IPS_SetEventActive(50508, false);
	}
ELSE
	{
	IPS_SetEventActive(50508, true);		// Wenn Wochenplan deaktiviert ist, soll er aktiviert werden
	}

Probier mal das

IF ($Event['EventActive'] == 1)

Ja das geht immer.

== das wars. Darüber bin ich schon mal gestolpert …:banghead:

Ich habe schon an meinen Programmierkünsten gezweifelt, obwohl das in meiner normalen Programmiersprache (XBase++) eigentlich ähnlich ist.

Vielen Dank!