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