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

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

Antworten
66er
Beiträge: 3083
Registriert: 23.08.2015, 11:06
System: CCU
Hat sich bedankt: 116 Mal
Danksagung erhalten: 111 Mal

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

Beitrag von 66er » 05.05.2019, 10:55

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) 1767 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
Zuletzt geändert von 66er am 05.05.2019, 13:53, insgesamt 1-mal geändert.
Ich übernehme keine Haftung für von mir gegebene Antworten, Tipps und veröffentlichte Projekte! Jeder ist für sich selbst verantwortlich! Arbeiten an 230V sind von einer Elektrofachkraft auszuführen!

Homematic in Betrieb seit 15.08.2015, > 60 HM-Komp. | 3x USV APC ES400 | Visualisierung auf ioBroker | Audio: Home24-Apps

Raspberrymatic auf DS923+ in VMM (Produktivsystem1)
Rollläden, SSD, Wetter, Logging, Licht, RM, Sonos, Shelly

Raspberrymatic auf DS923+ in VMM (Produktivsystem2 )
Erweiterung GMA, Heizung, Licht, Shelly, SSD, Sonos

>100 Shelly-Geräte an Homematic | CCU2 endgültig in Rente | 3 Raspis als Rückfallebene für Raspimatic und ioBroker

Shelly an Homematic | Infrarot-Heizungssteuerung | Fensteröffnungszeit überwachen

nicolas-eric
Beiträge: 3302
Registriert: 07.01.2015, 23:26
Wohnort: Scheeßel
Hat sich bedankt: 21 Mal
Danksagung erhalten: 11 Mal

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

Beitrag von nicolas-eric » 05.05.2019, 11:05

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.

66er
Beiträge: 3083
Registriert: 23.08.2015, 11:06
System: CCU
Hat sich bedankt: 116 Mal
Danksagung erhalten: 111 Mal

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

Beitrag von 66er » 05.05.2019, 11:19

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);
   }
}  

nicolas-eric
Beiträge: 3302
Registriert: 07.01.2015, 23:26
Wohnort: Scheeßel
Hat sich bedankt: 21 Mal
Danksagung erhalten: 11 Mal

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

Beitrag von nicolas-eric » 05.05.2019, 11:33

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.

66er
Beiträge: 3083
Registriert: 23.08.2015, 11:06
System: CCU
Hat sich bedankt: 116 Mal
Danksagung erhalten: 111 Mal

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

Beitrag von 66er » 05.05.2019, 11:40

Klasse, werde das gleich testen. (und natürlich Rückmeldung geben :wink: )

Vielen Dank.

66er
Beiträge: 3083
Registriert: 23.08.2015, 11:06
System: CCU
Hat sich bedankt: 116 Mal
Danksagung erhalten: 111 Mal

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

Beitrag von 66er » 05.05.2019, 11:45

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) 1729 mal betrachtet


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

Benutzeravatar
uwe111
Beiträge: 4819
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 245 Mal
Kontaktdaten:

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

Beitrag von uwe111 » 05.05.2019, 12:03

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
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

66er
Beiträge: 3083
Registriert: 23.08.2015, 11:06
System: CCU
Hat sich bedankt: 116 Mal
Danksagung erhalten: 111 Mal

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

Beitrag von 66er » 05.05.2019, 12:10

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?

66er
Beiträge: 3083
Registriert: 23.08.2015, 11:06
System: CCU
Hat sich bedankt: 116 Mal
Danksagung erhalten: 111 Mal

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

Beitrag von 66er » 05.05.2019, 13:35

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

nicolas-eric
Beiträge: 3302
Registriert: 07.01.2015, 23:26
Wohnort: Scheeßel
Hat sich bedankt: 21 Mal
Danksagung erhalten: 11 Mal

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

Beitrag von nicolas-eric » 05.05.2019, 14:28

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.

Antworten

Zurück zu „CUxD“