via DOIF IT-Handsender mit HM-Dimmer verknurzeln?

Begonnen von M_I_B, 28 Mai 2016, 10:53:33

Vorheriges Thema - Nächstes Thema

M_I_B

Hallo Ihr Guten,

im Zusammenhang mit dem weiteren Ausbau steuert seit gestern ein 2CH Dimmer den Deckenventilator mit Licht im Wohnzimmer. Das funktioniert so weit problemlos. Da wir aber auch u.a. preiswerte InterTechno- Handsender zur Steuerung verwenden (speziell ITS-150), wäre es natürlich nett, wenn man damit zumindest rudimentär die Dimmer ansteuern könnte. Der erste Versuch, welcher auch funktioniert, sieht wie folgt aus:
## Gruppe A3 ##
# Deckenlicht
define DimLight DOIF ([A31] eq "on") (set HM2D1_1 33 0 10) \
DOELSEIF ([A31] eq "off") (set HM2D1_1 66 0 10) \
DOELSEIF ([A32] eq "on") (set HM2D1_1 99 0 10) \
DOELSEIF ([A32] eq "off") (set HM2D1_1 0 0 10) \
DOELSE
attr DimLight do always
# Deckenventilator
define DimVenti DOIF ([A33] eq "on") (set HM2D1_2 33 0 10) \
DOELSEIF ([A33] eq "off" ) (set HM2D1_2 66 0 10) \
DOELSEIF ([A34] eq "on" ) (set HM2D1_2 100 0 10) \
DOELSEIF ([A34] eq "off" ) (set HM2D1_2 0 0 10) \
DOELSE
attr DimVenti do always

Ich befürchte allerdings, das mit diesem Konstrukt ständig Daten an den Dimmer gesendet werden. Außerdem sind natürlich nur 3 Werte machbar, wenn man nicht die FB in den nächsten Satz umschalten will.
Daher bin ich auf die Idee gekommen, das so und so ähnlich zu probieren (das ist nur zwei von etlichen misslungenen Versuchen):
# IT zu HM Dimmer Test
# Deckenlicht
define DimLight1 DOIF ([A41] eq "on" and [HM2D1_1:pct] < 91.5) (set HM2D1_1 {([HM2D1_1:pct]+10)} 0 5,set A41 off) \
DOELSEIF ([A41] eq "off" and [HM2D1_1:pct] > 9.5) (set HM2D1_1 {([HM2D1_1:pct]-10)} 0 5,set A41 on) \
DOELSEIF ([HM2D1_1:pct] < 5) (set HM2D1_1 0 0 0) \
DOELSEIF ([HM2D1_1:pct] > 95) (set HM2D1_1 100 0 0) \
DOELSE
# Deckenventilator
define DimVenti1 DOIF ([A42] eq "on" and [HM2D1_2:pct] < 91.5) (set HM2D1_2 {([HM2D1_2:pct]+10)} 0 5) \
DOELSEIF ([A42] eq "off" and [HM2D1_2:pct] > 9.5) (set HM2D1_2 {([HM2D1_2:pct]-10)} 0 5) \
DOELSE

Das klappt so oder ähnlich natürlich nicht, weil der Status des Handsenders nur ON oder OFF sein kann; da fehlt irgendwie die Möglichkeit, einen dritten Status StandBy o.ä. zu nutzen.

Ich hatte irgendwo im Forum schon mal was gelesen, das jemand einen HM-Dimmer mit IT gesteuert hat, finde es aber leider nicht mehr...

... kann jemand helfen?

Per

DOIF wertet doch nur die Änderung aus, sprich, wenn die Taste gedrückt oder losgelassen wird (kommt natürlich auf das Protokoll der FB an).
Wenn du zwei Tasten (+/-,an/aus) hast, kannst du die direkt verwenden.
Zum Dimmen/hoch-/runterschalten kannst du mit repeatcmd arbeiten, falls das Protokoll longpress kennt, und solange Befehle senden, wie der Button gedrückt ist.

Nebenbei: ein leeres DOELSE bringt nicht viel, wenn du nicht wenigstens den cmdState oder do einsetzt.

M_I_B

Zitat von: Per am 28 Mai 2016, 12:15:45DOIF wertet doch nur die Änderung aus, sprich, wenn die Taste gedrückt oder losgelassen wird (kommt natürlich auf das Protokoll der FB an).
Wenn du zwei Tasten (+/-,an/aus) hast, kannst du die direkt verwenden.
Zum Dimmen/hoch-/runterschalten kannst du mit repeatcmd arbeiten, falls das Protokoll longpress kennt, und solange Befehle senden, wie der Button gedrückt ist.
Leider nicht. Wenn Du bei IT (zumindest all jene, die ich hier habe) die ON- Taste eines Kanals betätigst, bleibt der Status so lange auf ON, bis Du OFF betätigst und umgekehrt. Auch solche Dinge wie LongPress, +/- o.ä. kennen die nicht; die Dinger sind halt strohdoof ...
Genau das ist wohl auch der Knackpunkt, das es auf diesem Weg nicht so einfach zu machen ist. Wie gesagt hatte ich schon mal irgendwo etwas gelesen. Ob das aber eine DOIF oder eine Funktion war, geschweige denn wo ich das gelesen habe, weiß ich einfach nicht mehr  :(

Zitat von: Per am 28 Mai 2016, 12:15:45Nebenbei: ein leeres DOELSE bringt nicht viel, wenn du nicht wenigstens den cmdState oder do einsetzt.
Hab ich ehrlich gesagt noch nie drüber nachgedacht. Da das abschließende DOELSE bei (fast) allen Beispielen dazu vorhanden war, habe ich es stumpf übernommen. Scheint aber keine nachteiligen Auswirkungen zu haben?

Per

Zitat von: M_I_B am 28 Mai 2016, 12:24:58Wenn Du bei IT (zumindest all jene, die ich hier habe) die ON- Taste eines Kanals betätigst, bleibt der Status so lange auf ON, bis Du OFF betätigst und umgekehrt.
Bekommst du wenigstens ein neuen Event, wenn du eine Taste erneut drückst?

M_I_B

... ähhh .. ja, lt. Eventmonitor zumindest:
2016-05-28 13:19:18.899 IT A44 on
2016-05-28 13:19:19.736 IT A44 on
2016-05-28 13:19:20.349 IT A44 on
2016-05-28 13:19:20.937 IT A44 on
2016-05-28 13:19:21.708 IT A44 off
2016-05-28 13:19:22.956 IT A44 off
2016-05-28 13:19:23.496 IT A44 off
2016-05-28 13:19:24.041 IT A44 on

Per

Dann sollte es mit attr myDOIF do always funktionieren, die sind in den unteren Codeschnipseln zumindest nicht aufgeführt.

M_I_B

... das hatte ich schon probiert. Dann aber springt der Dimmerwert nach z.B. einem kurzen Tastendruck in den berechneten 10er- Schritten bis zum Endwert 100% resp. Anfangswert 0%. Das wiederum brachte mich dazu, direkt nach der Berechnung A4x auf OFF resp. ON zu setzen, aber das geht natürlich auch nicht, da er dann ohne weiteres Zutun in einer Endlosschleife in 10er Schritten zwischen 0 und 100 hin- und her läuft, da dann ja die andere Bedingung direkt zutrifft...

BTW: Darf man DOIF eigentlich wie z.B. IF/THEN/ELSE(IF) verschachteln? also like ...
DOIF wenn dies dann das
DOIF wenn so dann so
DOELSE oder so
DOELSEIF oder wenn dies dann das
DOIF wenn so dann anders
DOELSE oder ganz anders
DOELSE nix davon

Per

Du kannst DOIF nicht verschachteln, weil das Devices sind. Du kannst aber DOIF[/] mit IF verschachteln, womit du das gleiche Ergebnis erzielen kannst.
Und mit cmdpause (Syntax bitte selbst nachschauen, bin unterwegs) kannst du die zu schnelle Wiederholung verhindern.

M_I_B

... ahhh ja, dachte ich mir, das man das nicht verschachteln kann. Jetzt weiß ich es zumindest dank Dir mit Gewissheit ...

An die WAIT und PAUSE- Befehle hatte ich auch schon gedacht. Damit wollte ich nur gerne warten, bis ich mir klar darüber geworden bin, warum das auf dem beschrittenen Weg nicht funktioniert...
Ich werde damit mal noch eine Weile rumtesten und dann ggf. den Thread noch mal reaktivieren, wenn ich nicht weiter komme resp. ein Ergebnis habe...

Per

Vllt. stellst du mal noch einen Eventlog mit gehaltener Taste ein.

M_I_B

#10
... ich glob ich hafs  ;D

Das Problem ist, das man zwingend irgendwie mit DoAlways arbeiten muss, da die Bedingung ON ja mehrfach hintereinander vorkommen kann. Mache ich das aber direkt, hüpfelt der munter von 0 auf 100, ohne das ich was mache.
Also war meine Überlegung, das ich einen Dummy brauche, der mindestens 3 Stati annehmen kann, wobei ich in meinem Fall "0, up, dn" gewählt habe.
Nun setze ich den Dummy auf UP (bei ON auf der FB) resp DN (bei OFF auf der FB).
Nun frage ich den Dummy ab, addiere (oder subtrahiere) zum/vom Wert in :PCT 5 und setze sodann den Dummy auf "0"...

... Thema durch ...  8) Wie sagt man so schön: Blindes Huhn findet auch mal'n Korn  ;D

define DimWZx dummy
# Deckenlicht
define DimWZ1 DOIF ([A21] eq "on") (set DimWZx up1) \
DOELSEIF ([A21] eq "off") (set DimWZx dn1) \
DOELSE
attr DimWZ1 do always
define DimWZ1a DOIF ([DimWZx] eq "up1" and [HM2DI1_1:pct] < 0.5) (set HM2DI1_1 5 0 0, set DimWZx 0) \
DOELSEIF ([DimWZx] eq "up1" and [HM2DI1_1:pct] < 100 and [HM2DI1_1:pct] > 0) (set HM2DI1_1 {([HM2DI1_1:pct]+5)} 0 0, set DimWZx 0) \
DOELSEIF ([DimWZx] eq "dn1" and [HM2DI1_1:pct] > 4) (set HM2DI1_1 {([HM2DI1_1:pct]-5)} 0 0, set DimWZx 0) \
DOELSEIF ([DimWZx] eq "dn1" and [HM2DI1_1:pct] < 5) (set HM2DI1_1 0 0 0, set DimWZx 0) \
DOELSE
# Deckenventilator
define DimWZ2 DOIF ([A22] eq "on") (set DimWZx up2) \
DOELSEIF ([A22] eq "off") (set DimWZx dn2) \
DOELSE
attr DimWZ2 do always
define DimWZ2a DOIF ([DimWZx] eq "up2" and [HM2DI1_2:pct] < 0.5) (set HM2DI1_2 10 0 0, set DimWZx 0) \
DOELSEIF ([DimWZx] eq "up2" and [HM2DI1_2:pct] < 100 and [HM2DI1_2:pct] > 0) (set HM2DI1_2 {([HM2DI1_2:pct]+10)} 0 0, set DimWZx 0) \
DOELSEIF ([DimWZx] eq "dn2" and [HM2DI1_2:pct] > 9) (set HM2DI1_2 {([HM2DI1_2:pct]-10)} 0 0, set DimWZx 0) \
DOELSEIF ([DimWZx] eq "dn2" and [HM2DI1_2:pct] < 10) (set HM2DI1_2 0 0 0, set DimWZx 0) \
DOELSE

Update: Neue Version... Ein Dummy, 1+n Dimmersteuerungen
Anm.: Die erste Zeile ist nötig, da ich beim Dimmer das Attribut levelRange gesetzt habe und somit der Wert in PCT auch mal negativ werden kann, die zusätzlichen Zeilen sorgen dafür, das keine krummen Werte entstehen.

Edit: Einen Haken gibt es allerdings, den ich aber nicht nachvollziehen kann... Wenn man eine Taste zu schnell hintereinander betätigt, verhaspelt sich FHEM irgendwie. Dann geht der Dimmer entweder direkt auf OFF oder FHEM nimmt keine Tastendrücke dieser Taste mehr entgegen.

So... dann bleibt die Frage, ob man das auch irgendwie eleganter lösen kann?