[dss-developer] Probleme mit setValue bei mehreren Geräten / Parameterübergabe

Sebastian Scholz digitalstrom at sunshine-studios.org
Mon Dec 19 21:06:16 CET 2011


Hallo Manu

Wenn deine Anwendung es zulässt wäre es ganz gut, wenn du mit 
Szenenaufrufen arbeiten könntest. Diese können wesentlich schneller 
ausgeführt werden, als es dauert einen bestimmten Wert einzustellen. Ich 
vermute auch, dass daran dein Problem mit der Klemme, welche nicht mehr 
angeschaltet wird, liegt. Aber dazu sollte sich besser noch jemand mit 
mehr Ahnung als ich habe äussern.


Jetzt zu der konkreten Umsetzung. Zur zeitversetzten Ausführung der 
Anschalt-Methode kannst du entweder die von JavaScript mitgelieferte 
"setTimeout()"-Methode [1] oder das vom dSS zu Verfügung gestellte 
TimedEvent verwenden. Ein Beispiel wie man Parameter an ein Event 
anhängen kann, ist im Wiki dokumentiert [2].

************************Code*********************
if (raisedEvent.name == "example.turnOff") {
   var PreVal=[];

   var devices = getDevices().byZone(1);
   var i = 0;
   devices.perform(function (device) {
     PreVal[i]=device.getOutputValue(0);
     i++;	
   });

   devices.turnOff();

   var event = new TimedEvent("example.turnOn", "+10", {
     oldValue: PreVal
   });
   event.raise();
} else if (raisedEvent.name == "example.turnOn") {
   var PreVal = eval('['+raisedEvent.parameter.oldValue+']');

   var i = 0;
   devices.perform(function (device) {
     device.setValue(PreVal[i]);
     i++;
   });
}
*************************************************

Das Skript sollte zwar funktionieren, ist aber keineswegs gedacht auch 
so verwendet zu werden! Ich werde mal versuchen zu erklären, wie es 
funktioniert. Ich gehe davon aus, dass die Gerätezustand gespeichert 
werden soll, wenn das Event "example.turnOff" aufgerufen wird. Dann wird 
der gleiche Code wie bei dir ausgeführt. Am Ende wird dann ein neues 
TimedEvent erstellt und das Array als Parameter mit dem Namen "oldValue" 
übergeben. Wird das Event aufgerufen, ist der zweite Teil der 
if-Bedinung wahr. Zuerst wird der übergebene Parameter ausgelesen und in 
der Variablen PreValue gespeichert. Wie zu sehen ist, muss dazu die 
"eval()"-Methode verwendet werden, welche JavaScript Code ausführt. Hier 
ist das notwendig, weil das Array als String umgewandelt wird, wenn es 
als Parameter übergeben wird. Nachher muss der String wieder 
zurückgewandelt werden. Besser wäre es, das gleich als JSON formatierten 
String zu übergeben und später den JSON-String wieder umzuwandeln. Eine 
JSON Parser gibt es z.B. unter [3].


Ich hoffe, der Text ist nicht zu verwirrend ;). Ansonsten einfach 
nochmal nachfragen.

Gruss
Sebastian



[1] http://de.selfhtml.org/javascript/objekte/window.htm#set_timeout
[2] 
http://redmine.digitalstrom.org/projects/dss/wiki/Scripting_inside_the_dSS#Event
[3] https://github.com/douglascrockford/JSON-js/blob/master/json2.js


On 19.12.2011 14:02, Manuel Saxer wrote:
> Halo Zusammen
>
> Ich habe mir gerade ein kleines Skript erstellt mit welches bei Aufruf zuerst die aktuellen Gerätewerte abfragt, diese in einem Array (PreVal[ ]) speichert.
> Anschliessend sollen die Geräte kurz ausgeschalten und anschliessend wieder mit den selben Werten wie zuvor eingeschalten werden. Wenn ich nur
> 1 Gerät ansteuere klappt dies ganz gut. Sobald ich jedoch zwei Geräte ansteuere, schaltet jeweils nur wieder eines ein. Das andere bleibt ausgeschalten.
> Könnt ihr mir vielleicht weiterhelfen? Ich habe hierzu den Code unten kurz angefügt.
>
> Im weiteren würde ich die Geräte gerne über eine längere Zeitdauer ausgeschalten lassen. Am besten rufe ich hierzu wohl ein TimedEvent auf und
> benutze zum wieder einschalten ein zweites JS-File… sehe ich dies richtig? Soweit ich weiss, kann man noch Parameter übergeben… leider
> habe ich bisher noch kein Bsp. gefunden wo dies gemacht wurde… die zu übergebenden Parameter wären in diesem Fall die Gerätewerte vor dem
> Ausschalten. Gibt es dazu irgendwo ein kleines Bsp. wie man diese Werte in ein anderes JS-File übergeben kann?
>
> Vielen Dank für die Hilfe
>
> Gruss Manu
>
>
> ************************Code*********************
> var PreVal=[];
>
> var devices = getDevices().byZone(1);
> var i = 0;
> devices.perform(function (device) {
> PreVal[i]=device.getOutputValue(0);
> i++;	
> });
>
> devices.turnOff();
>
> var i = 0;
> devices.perform(function (device) {
> device.setValue(PreVal[i]);
> i++;
> });
>
> ****************************************************



More information about the dss-developer mailing list