Homematic RGBW Controller mit IP (Wired) Steuern

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
Benutzeravatar
Kattez
Beiträge: 5
Registriert: 19.09.2016, 00:14

Homematic RGBW Controller mit IP (Wired) Steuern

Beitrag von Kattez » 06.12.2020, 22:06

Hallo zusammen,
ich stand vor kurzem vor dem Problem, dass ich für einen Neubau, welcher komplett mit Homematic IP Wired aufgebaut werden soll, RGBW LED-Stripes mit steuern musste.
Also ganz einfach 3 Homematic RGBW Controller gekauft, zusammengelötet und via Direktverknüpfung mit dem 32-fach Input-Modul (HmIPW-DRI32) koppeln - :lol:
Ja, stimmt ja - das geht ja gar nicht !!! Homematic und Homematic IP sprechen ja unterschiedliche Sprachen - das gilt leider auch für die Wired-Komponenten!
Ich ahnte schlimmes und durchforstete einige Foren und fand leider nichts, was so richtig passen wollte. Ziel war es den Weiß-Kanal des RGBW- Dimmers mit Hilfe eines einzigen Buttons zu steuern. Dabei sollte ein kurzer Tastendruck die Weißen LEDs ein- bzw. ausschalten. Ein langer Tastendruck sollte den Dimmvorgang einleiten – also den weißen Kanal hoch- bzw. runterdimmern.
Wie geht man so ein Problem an? Richtig, man fängt mit der einfachsten Sache an, dem Toggeln der Weißen LED bei jedem kurzen Tastendruck. Zuerst löste ich diese Aufgabe ohne ein Skript direkt in der Homematic Programmumgebung. Dazu musste der momentane Zustand der LED erst einmal abgefragt werden und entsprechend dieser Zustand negiert werden.
So gut so einfach, aber ich stellte schnell fest – selbst hier steckt der Teufel im Detail, denn durch das langsame hoch- bzw. runterfahren der LED-Kanäle (Stichwort Ramp-Time), war ein schnell aufeinanderfolgendes Tasten nicht möglich bzw. zeigte keine Wirkung bei der angeschlossenen LED. Es musste also auch hier ein Skript her, denn hier gibt es mehr Möglichkeiten der Problemlösung. Eins vorweg – ich bin KEIN Fan der Homematic Skriptsprache – aber ich hatte ja keine Wahl!
short.png
Das dazu passende Skript sieht so aus:

Code: Alles auswählen

!        Toggle RGBW Dimmer by Kattez
!----------------------------------------------
var ADR_Dimmer = "REQ0192278"; 
var Step = 5;
var BAD_Level = dom.GetObject("BAD_RGB_Level");
var BAD_Time  = dom.GetObject("BAD_RGB_Time");
var BAD_Dir = dom.GetObject("BAD_RGB_Dir");
!----------------------------------------------

var level = dom.GetObject("BidCos-RF."#ADR_Dimmer#":1.LEVEL").State();
integer t2 = system.Date("%F %X").ToTime().ToInteger();

if ((t2-BAD_Time.Value()) > 2 ) 
 { 
   !WriteLine("Update");
   BAD_Level.State(level*100); ! Last button action was done min 1 sec before
 }

if (BAD_Level.Value() > 0)
 {
   dom.GetObject("BidCos-RF."#ADR_Dimmer#":1.LEVEL").State(0.0);
   BAD_Level.State(0);
   BAD_Dir.State(Step);
 }
else
 {
   dom.GetObject("BidCos-RF."#ADR_Dimmer#":1.LEVEL").State(1.0);
   BAD_Level.State(100);
   BAD_Dir.State(Step * -1);
 }
BAD_Time.State(t2);
!WriteLine(BAD_Time.Value());
!WriteLine(timestamp);
Das Besondere an diesem Skript ist die Verwendung der Systemzeit, um im Falle von schnell aufeinanderfolgenden Tastendrücken nicht den LED Zustand aus dem Dimmer direkt auszulesen, sondern ein Abbild zu verwenden (Systemvariable “BAD_RGB_Level“).
Nun kommen wir zum Dimmen – ja auch das geht mit Hilfe von Skripts. Hier liegt der Trick an der Tatsache, dass ein langer Tastendruck ein angeschlossenes Skript nicht einfach nur einmalig aufruft, sondern ca alle 200ms immer wieder, bis man die Taste wieder loslässt.
Dimmer.png
..und hier das Dimmer Skript:

Code: Alles auswählen

!        RGBW Dimmer by Kattez
!----------------------------------------------
var ADR_Dimmer = "REQ0192278"; 
var Step = 5;
var BAD_Level = dom.GetObject("BAD_RGB_Level");
var BAD_Time  = dom.GetObject("BAD_RGB_Time");
var BAD_Dir = dom.GetObject("BAD_RGB_Dir");
!----------------------------------------------

dom.GetObject("BidCos-RF."#ADR_Dimmer#":1.RAMP_TIME").State(0);

var level = dom.GetObject("BidCos-RF."#ADR_Dimmer#":1.LEVEL").State();
integer t2 = system.Date("%F %X").ToTime().ToInteger();

if ((t2-BAD_Time.Value()) > 2 )
{
  WriteLine("Update");
  BAD_Level.State(level*100);
  
  if ((BAD_Level.State() == 0) || (BAD_Level.State() == 100))  {
    if (BAD_Level.State() == 0) {
      BAD_Dir.State(Step);
    }
    else
    {
      BAD_Dir.State(Step * -1);
    }
  }
  else
  { 
    BAD_Dir.State( BAD_Dir.State() * -1); ! Toggle dim direction
  }
}
BAD_Time.State(t2);

WriteLine("Dir: "#BAD_Dir.State());
WriteLine("New: "#BAD_Level.State());

var newVal = BAD_Level.State() + BAD_Dir.State();
BAD_Level.State(newVal);

if ((newVal>=0) && (newVal<=100)) {  
  dom.GetObject("BidCos-RF."#ADR_Dimmer#":1.LEVEL").State(newVal / 100);
}
Last but not least - hier die verwendeten Systemvariablen:
Variablen.png

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“