Seite 1 von 1

Skript für Multi-DIM-EXEC - Problem mit SET_STATE [gelöst]

Verfasst: 05.05.2019, 10:55
von 66er
Hallo zusammen,

ich komme nicht weiter und benötige / hoffe auf Eure Hilfe.

Um einen WLAN-RGBW-Controler zu steuern, habe ich ein System.Multi-Dim-Exec-Gerät angelegt, was grundsätzlich auch gut funktioniert. :D

Mit den Reglern kann ich jeden Farbkanal steuern und der RGBW-Controler übernimmt die Werte. :+1:
Auch die zugehörige Hersteller-App zeigt dann die geänderten Einstellungen an. :D

Nun zum Problem:

Es wäre schön, wenn die Schieberegler sich auch anpassen, wenn der RGBW-Controler über die zugehörige Hersteller-App bedient wird. Und das funktioniert nur teilweise. :?

Ich habe ein timergetriggertes Programm mit 1 Skript, welches den Controler abfragt und die Antwort nacheinander für die Farbkanäle (RGBW) auswertet :+1: und anschließend ins Multi.Dim zurückschreiben soll :-1:

Die Farbwerte (0-255) werden von Skript korrekt ausgelesen:
Bildschirmfoto vom 2019-05-05 10-33-08.png
Bildschirmfoto vom 2019-05-05 10-33-08.png (21.34 KiB) 1778 mal betrachtet
und sollen mit folgendem Teil des Scriptes in das CuxD-Gerät zurückgegeben werden (hier der Code für die Farbe rot):

Code: Alles auswählen

!**** Wert R im Multi-Dim setzen****
!CUxD-Geräteadresse UND Kanal des Multi.DIM-Device anpassen (hier: CUX2802003:2)
dom.GetObject("CUxD.CUX2802003:2.SET_STATE").State(r);
Jedoch wird der Schieberegler bei jedem Wert außer "0" direkt auf 100% gesetzt. :oops:

Wenn ich nun das CUxD-Handbuch richtig verstanden habe, müßte der Rückgabewert für das CUxD-Device nicht der Rückgabewert (0-255) sein, sondern der Prozentwert in einem Wertebereich von 0 (0%) bis 1 (100%) :!: :?:

Falls meine Interpretation richtig ist, ist das genau der Punkt, bei dem ich Hilfe brauche. Wie bekomme ich das hin?

(Eigentlich müßte ich ja nur den Rückgabewert vor der Rückgabe durch 255 teilen, aber wie ist die dafür notwendige Syntax?)

Das Ganze läuft auf dem Charly.

LG, danke schon mal und schönen Sonntag

Stefan

Edit: gelöst

Re: Skript für Multi-DIM-EXEC - Problem mit SET_STATE

Verfasst: 05.05.2019, 11:05
von nicolas-eric
Hast Du in der App mal auf Werte unter 100 gesetzt?
Stimmt die Anzeige im CuxD Gerät dann?
Wenn ja, sollte Deine Annahme stimmen.

Dann musst Du den abgefragten Wert (0-255) nur noch durch 2.55 teilen, um auf den Prozentwert (0-100) zu kommen.

Re: Skript für Multi-DIM-EXEC - Problem mit SET_STATE

Verfasst: 05.05.2019, 11:19
von 66er
Leider kann ich die Rückgabewerte in der App nicht beeinflussen. :(

1 wäre dann ja schon 100% in CuxD, 0=aus funktioniert.
nicolas-eric hat geschrieben:
05.05.2019, 11:05
...
Dann musst Du den abgefragten Wert (0-255) nur noch durch 2.55 teilen, um auf den Prozentwert (0-100) zu kommen.
Wenn Du hierzu den Code hättest, käme ich vielleicht weiter.
(Die Abfrage steht ja im Screenshot)
string (r) enthält den Wert für "rot"

hier nochmal als Code:

Code: Alles auswählen

!****Auswertung des Antwortstrings für rot  ****
!In diesem Abschnitt NICHTS ändern
string s;
foreach (s,t.Split (",")) {
   if (s.LTrim ("{").StartsWith ('"red"')) {
   string r =  (s.StrValueByIndex (":",1).RTrim ("}"));
   WriteLine(r);
   }
}  

Re: Skript für Multi-DIM-EXEC - Problem mit SET_STATE

Verfasst: 05.05.2019, 11:33
von nicolas-eric
Sorry verlesen, laut CuxD Anleitung muss der Wert ja 0-1 sein für 0-100%.
Also muss der abgefragte Wert (0-255) durch 255 geteilt werden.

In den Klammern hinter WriteLine sind ja jeweils die Buchstaben r g b drin und beim Setzen auch.

Also bisher:

Code: Alles auswählen

!****Auswertung des Antwortstrings für rot  ****
!In diesem Abschnitt NICHTS ändern
string s;
foreach (s,t.Split (",")) {
   if (s.LTrim ("{").StartsWith ('"red"')) {
   string r =  (s.StrValueByIndex (":",1).RTrim ("}"));
   WriteLine(r);
   }
}  
und

Code: Alles auswählen

!**** Wert R im Multi-Dim setzen****
!CUxD-Geräteadresse UND Kanal des Multi.DIM-Device anpassen (hier: CUX2802003:2)
dom.GetObject("CUxD.CUX2802003:2.SET_STATE").State(r);
Da einfach zusätzlich durch 255 teilen (jeweils bei r g b). Also:

Code: Alles auswählen

!****Auswertung des Antwortstrings für rot  ****
!In diesem Abschnitt NICHTS ändern
string s;
foreach (s,t.Split (",")) {
   if (s.LTrim ("{").StartsWith ('"red"')) {
   string r =  (s.StrValueByIndex (":",1).RTrim ("}"));
   WriteLine(r/255);
   }
}  
und

Code: Alles auswählen

!**** Wert R im Multi-Dim setzen****
!CUxD-Geräteadresse UND Kanal des Multi.DIM-Device anpassen (hier: CUX2802003:2)
dom.GetObject("CUxD.CUX2802003:2.SET_STATE").State(r/255);
Dann sollte ein Wert zwischen 0-1 raus kommen.

Re: Skript für Multi-DIM-EXEC - Problem mit SET_STATE

Verfasst: 05.05.2019, 11:40
von 66er
Klasse, werde das gleich testen. (und natürlich Rückmeldung geben :wink: )

Vielen Dank.

Re: Skript für Multi-DIM-EXEC - Problem mit SET_STATE

Verfasst: 05.05.2019, 11:45
von 66er
Leider funktioniert es so nicht:

Bildschirmfoto vom 2019-05-05 11-43-47.png
Bildschirmfoto vom 2019-05-05 11-43-47.png (20.03 KiB) 1740 mal betrachtet


Ich vermute, dass der String r erst in eine Zahl gewandelt werden müßte, aber wie?

Re: Skript für Multi-DIM-EXEC - Problem mit SET_STATE

Verfasst: 05.05.2019, 12:03
von uwe111
66er hat geschrieben:
05.05.2019, 10:55
Ich habe ein timergetriggertes Programm mit 1 Skript, welches den Controler abfragt und die Antwort nacheinander für die Farbkanäle (RGBW) auswertet :+1: und anschließend ins Multi.Dim zurückschreiben soll
Dazu steht folgendes in der CUxD Doku:
CUxD Doku hat geschrieben:SET_STATE
LEVEL Datenpunkt setzen, ohne eine Aktion auszuführen. Dabei werden negative LEVEL-Werte invertiert und als Ausgabewert anhand von MAX_VAL in den entsprechenden %-Wert rückgerechnet.
Beispiel: MAX_VAL = 300
SET_STATE(0.6) → LEVEL= 0.6 → 60%
SET_STATE(-90) → LEVEL= 0.3 → 30%
Also falls MAX_VAL bei Dir auf 255 gesetzt ist, musst Du den ausgelesenen Wert lediglich mit negativem Vorzeichen (ohne weitere Umrechnung!) per SET_STATE an den entsprechenden Kanal übergeben.

Viele Grüße

Uwe

Re: Skript für Multi-DIM-EXEC - Problem mit SET_STATE

Verfasst: 05.05.2019, 12:10
von 66er
Vielen Dank, Uwe.

also so :?:

Code: Alles auswählen

!**** Wert R im Multi-Dim setzen****
!CUxD-Geräteadresse UND Kanal des Multi.DIM-Device anpassen (hier: CUX2802003:2)
dom.GetObject("CUxD.CUX2802003:2.SET_STATE").State(-r);
Ja, MaxValue ist 255.

Nachtrag:
Nein, so (wie von mir umgesetzt) geht es auch nicht. :?

Wie ändere ich den String in eine negative Zahl um?

Re: Skript für Multi-DIM-EXEC - Problem mit SET_STATE

Verfasst: 05.05.2019, 13:35
von 66er
Jetzt funktioniert es. :D

Ist zwar vielleicht nicht die eleganteste Lösung :roll: , aber dafür habe ich es selbst hinbekommen. :lol:

Code: Alles auswählen

!****Auswertung des Antwortstrings für rot  ****
!In diesem Abschnitt NICHTS ändern
string s;
foreach (s,t.Split (",")) {
   if (s.LTrim ("{").StartsWith ('"red"')) {
   string r =  (s.StrValueByIndex (":",1).RTrim ("}"));
!   WriteLine(r);
   real r1= r.ToFloat();
!   WriteLine(r1);
   real r2=r1/255;
!   WriteLine(r2);

   }
}  

!**** Wert R im Multi-Dim setzen****
!CUxD-Geräteadresse UND Kanal des Multi.DIM-Device anpassen (hier: CUX2802003:2)
dom.GetObject("CUxD.CUX2802003:2.SET_STATE").State(r2);
LG
Stefan

Re: Skript für Multi-DIM-EXEC - Problem mit SET_STATE [gelöst]

Verfasst: 05.05.2019, 14:28
von nicolas-eric
Stimmt, das muss man in Gleitkomma umwandeln.
Dann sollte auch das funktionieren.

Code: Alles auswählen

...
WriteLine(r.ToFloat()/255);
...
dom.GetObject("CUxD.CUX2802003:2.SET_STATE").State(r.ToFloat()/255);


Aber jetzt läufts ja schon bei Dir.