Gelöst: Ikea on/off switch zigbee2mqtt dimmen einer hue Lampe

Begonnen von jazzor, 17 Februar 2020, 17:15:09

Vorheriges Thema - Nächstes Thema

jazzor

Hallo zusammen,

kurze Frage, vielleicht hat ja jemand direkt eine Idee:
Ich habe erfolgreich Zigbee2Mqtt mithilfe des Wikis und der guten Dokumentation von Zigbee2Mqtt eingebunden. Die Idee ist, dass ich meine Lampen mehrheitlich auf der HueBridge lassen möchte (weil die einfach generell fertig eingerichtet ist) aber das Potpourri an verschiedenen PIR-Sensoren, Tastern und Dimmern direkter nutzen und daher über zigbee2mqtt einbinden wollte.

So weit so gut.

Mein Problem ist nun, dass ich mit einem Ikea Tradfr on/off Switch per dimmfunktion einer HueLampe schalten möchte.
Allerdings bekomme ich nur beim initialen langen drücken der "On"-Taste folgendes Event:2020-02-17 17:12:51 MQTT2_DEVICE IkeaSwitch_1 click: brightness_up
Nach dem loslassen kommt dann 2020-02-17 17:12:51 MQTT2_DEVICE IkeaSwitch_1 click: brightness_stop
Leider wiederholt sich das brightness_up Event nicht so, dass ich nicht direkt die Lampe per einfachem Notify oder DOIF ansteuern kann.
Hat jemand eine Idee, evtl. sogar eine, die relativ modular ist, weil ich dann gleiches für ca. zehn andere Lampen und Lampengruppen machen würde? ;)

Viele Grüße!

Edit:
Habe gerade noch versucht, mit event-min-interval mir das Event zu wiederholen. Aber das scheint irgendwie nicht zu funktionieren oder ich versteh das Wiki falsch?!

Byte09

Ich könnte da mit einem MSwitch was bauen, würde es aber auch erst morgen abend schaffen. modular wäre es in sofern, das dieses device dann als vorkonfiguriertes device verfügbar ist und nur minimal angepasst werden müssen. Da MSwitch aber eher ein Nieschendasein führt gehe ich mal davon aus, das du bestimmt auch andere Lösungen bekommst.

ich schaue einfach morgen abend nochmal in diesen thread.

gruss Byte09

Gesendet von meinem ELE-L29 mit Tapatalk


jazzor

Nachtrag: Ich hatte mich gestern daran versucht, das Verhalten nun mit einem AT nachzubauen, scheitere aber daran, dass das Mindestinterval beim AT eine Sekunde ist, was für so einen Dimmer einfach zu langsam ist.
Gibt es echt nicht schon ein Modul, welches man hier verwenden kann? Kommt mir so komisch vor, dass es diesen Anwendungsfall noch nie gab.

Beta-User

Das Problem zu lösen, ist nicht so einfach, weil es immer darauf ankommt, was das Zieldevice "kann".

Bei HUEDevice sollte es möglich sein, einen Dimmvorgang zu starten. Du brauchst also einen Eventhandler, der den Einschaltvorgang detektiert und dann den betreffenden Dimm-Befehl absetzt, und dann einen weiteren (bzw. einen weiteren Zweig in dem einen Eventhandler), der das ganze dann stoppt.

Für zwave stand sowas z.B. dann mal hier: https://forum.fhem.de/index.php/topic,82785.msg749107.html#msg749107

Ungetestet könnte es für diese Konstellation hier in diese Richtung gehen:
defmod n_IkeaSwitch_1 notify IkeaSwitch_1.click..brightness_.* {
  if ($EVENT =~ /brightness_up/) {
    fhem "set <targetdevice> on 10";
  } elsif ($EVENT =~ /brightness_down/) {
    fhem "set <targetdevice> off 10";
  } elsif ($EVENT =~ /brightness_stop/){
    fhem "set <targetdevice> hueUp 0";
  }
}

Kann sein, dass hueUp 0 nicht funktioniert und da z.B. eine 1 hin müßte.

Generell würde ich empfehlen, das zu generalisieren und dann myUtils-Code zu verwenden; etwas Material zu diesem Thema mit einer etwas anderen Fernbedienung findest du z.B. hier: https://forum.fhem.de/index.php/topic,103493.msg972085.html#msg972085
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Thyraz

Ich habe den selben Aufbau bei der Schreitischlampe von meinem Sohn (Tradfri Dimmer + HUE Lampe).
Allerdings hängt der Dimmer an einem ConbeeII der per HUEBridge Modul angebunden ist.

Daher heißen die Events etwas anders.

Habe das mit DOIF gelöst:


([TradfriSwitch01:"1002"])
  (set HUEDevice2 pct 100)
DOELSEIF ([TradfriSwitch01:"2002"])
  (set HUEDevice2 pct 0)
DOELSEIF ([TradfriSwitch01:"1001"])
  ({
    my $value = ReadingsVal("HUEDevice2", "dimmerVal", 0);;
    $value = ($value == 0) ? $value + 1 : $value + 20;;
    if ($value < 100) {
  fhem("set HUEDevice2 pct $value 1");;
} else {
  fhem("set HUEDevice2 pct 100");;
}
  })
DOELSEIF ([TradfriSwitch01:"1003"])
  ## Do nothing, just stop repeatcmd from last condition
DOELSEIF ([TradfriSwitch01:"2001"])
  ({
    my $value = ReadingsVal("HUEDevice2", "dimmerVal", 0) - 20;;
    if ($value > 0) {
  fhem("set HUEDevice2 pct $value 1");;
} else {
  fhem("set HUEDevice2 pct 0");;
}
  })
DOELSEIF ([TradfriSwitch01:"2003"])
  ## Do nothing, just stop repeatcmd from last condition


dazu noch die Attribute do always und repatcmd 0:0:2:0:2:0
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

jazzor

Zitat von: Thyraz am 18 Februar 2020, 12:08:16
Ich habe den selben Aufbau bei der Schreitischlampe von meinem Sohn (Tradfri Dimmer + HUE Lampe).
Allerdings hängt der Dimmer an einem ConbeeII der per HUEBridge Modul angebunden ist.

Kurz zum Abschluss: Ich hab es genauso gemacht wie Thyraz.
defmod IkeaSwitch_2_DOIF_1 DOIF ([IkeaSwitch_2:"^click:.on$"])\
  (set HUEDevice26 pct 100)\
DOELSEIF ([IkeaSwitch_2:"^click:.off$"])\
  (set HUEDevice26 pct 0)\
DOELSEIF ([IkeaSwitch_2:"^click:.brightness_up$"])\
  ({\
    my $value = ReadingsVal("HUEDevice26", "pct", 0);;;;\
    $value = ($value == 0) ? $value + 1 : $value + 20;;;;\
    if ($value < 100) {\
  fhem("set HUEDevice26 pct $value 1");;;;\
} else {\
  fhem("set HUEDevice26 pct 100");;;;\
}\
  })\
DOELSEIF ([IkeaSwitch_2:"^click:.brightness_stop$"])\
  ## Do nothing, just stop repeatcmd from last condition\
DOELSEIF ([IkeaSwitch_2:"^click:.brightness_down$"])\
  ({\
    my $value = ReadingsVal("HUEDevice26", "pct", 0) - 20;;;;\
    if ($value > 0) {\
  fhem("set HUEDevice26 pct $value 1");;;;\
} else {\
  fhem("set HUEDevice26 pct 0");;;;\
}\
  })

Zusätzlich noch die Attribute do always und repeatcmd 0:0:1:0:1
Funktioniert wunderbar und meine Frau ist auch zufrieden :-)

Danke nochmal!

Damian

Aus den vier Semikolons kannst du ruhig zwei machen (in RAW-Definition), bzw. nur eins, wenn du im Web-Editor stehst. Sonst kommt der Nächste mit acht ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#7
Hier mal eine allgemeine Lösung für beliebige Fernbedienungen und Aktoren im Perlmodus. Im init-Block muss der Aktor sowie Steuerbefehle angepasst werden. Im aktion-Block muss nur noch das Trigger-Device angepasst werden, dann sollte es schon funktionieren.

defmod di_dimmer DOIF init {\
  ## eigene Angaben anpassen\
  $_aktor="lamp";;$_reading="pct";;$_on="on";;$_off="off";;$_dim_down="down";;$_dim_up="up";;$_stop_down="stop";;$_stop_up="stop";;\
}\
aktion {\
## Trigger-Device MYCONTROLDEVICE anpassen\
my $trigger=[MYCONTROLDEVICE:state];;\
\
if ($trigger eq $_on) {\
  fhem_set ("$_aktor pct 100");;\
} elsif ($trigger eq  $_off) {\
  fhem_set ("$_aktor pct 0");;\
} elsif ($trigger eq $_dim_up) {\
    dim_up();;\
} elsif ($trigger eq $_dim_down) {\
    dim_down();;\
} elsif ($trigger eq $_stop_down or $trigger eq $_stop_up) {\
  del_Exec("Timer");;\
}\
}\
\
subs {\
sub dim_up {\
  my $value = ReadingsVal($_aktor, $_reading, 0);;\
  $value = ($value == 0) ? $value + 1 : $value + 20;;\
  if ($value < 100) {\
    fhem_set("$_aktor pct $value");;\
    set_Exec("Timer",1,"dim_up()");;\
  } else {\
    fhem_set("$_aktor pct 100");;\
    del_Exec ("Timer");;\
  }\
  \
}\
\
sub dim_down {\
  my $value = ReadingsVal($_aktor, $_reading, 0) - 20;;\
  if ($value > 0) {\
    fhem_set("$_aktor pct $value");;\
    set_Exec("Timer",1,"dim_down()");;\
  } else {\
    fhem_set("$_aktor pct 0");;\
    del_Exec("Timer");;\
  } \
}\
}



EDIT: Bei Hue-Devices ist es besser den Transitionsbefehl zu verwenden, das Dimmen ist gleichmäßiger und belastet nicht unnötig den Funkverkehr

z. B.
runterdimmen:
set lampe pct 0 : transitiontime 50

hochdimmen:
set lampe pct 100 : transitiontime 50

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Thyraz

Hi Damien,

dimmt transitiontime dann nicht komplett bis zum Ende?
Oder wie breche ich das ab wenn die Dimmer-Taste losgelassen wird?
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Damian

ja, das Stop-Kommando fehlt offenbar - wäre zu schön gewesen. Vielleicht geht es irgendwie auf Umwegen, das kann vermutlich nur der Autor des Moduls beantworten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Heißt das nun, dass die Lösung von Damian nicht funktioniert?
Oder wie habt ihr das nun gelöst?

Wenn ich über die HUEDEVICE-Setter dimUp|dimDown mache, dann ist das Dimmen zu ruckelig.
Führe ich eine eigene DimValue ein, so sollte es doch flüssiger laufen, oder?
Aber ich habe das Gefühl, dass die Events von den Hue-Tastern zu langsam kommen. Ich habe einen Hue-Dimmschalter, der dimmt die gleichen Lampen ruckeliger wie Events von einem Homematic-Sensor.


Sany

Moin,

ich hab bei mir folgendes am laufen:
(Taster ist ein tradfri on/off Taster, Lampe ein HUEDevice, alles per ZigBee/Phoscon/HUEBridge an fhem angebunden)
defmod di_hueDimmerTest DOIF init {\
  my $taster = "smartTasterTradfri1";;\
  $_aktor="HUEDevice6";;\
  $_reading="pct";;\
  $_on="pct 1";;\
  $_off="off";;\
  $_dim_down="dimDown : transitiontime 5";;\
  $_dim_up="dimUp : transitiontime 5";;\
  ##fhem_set("$_aktor transitiontime 10");;\
  my $value = 0;;\
}\
\
subs {\
\
sub sendDimUp {\
  my $value = ReadingsVal($_aktor, $_reading, 0);;\
## $value = ($value == 0) ? $value + 1 : $value + 10;;\
  if ($value < 100) {\
    fhem_set("$_aktor $_dim_up");;\
    set_Exec("timerUP",0.5,"sendDimUp()");;\
  } else {\
    fhem_set("$_aktor pct 100");;\
    del_Exec ("timerUP");;\
  }\
}\
\
sub sendDimDn {\
  my $valdn = ReadingsVal($_aktor, $_reading, 0) - 10;;\
  if ($valdn > 0) {\
    fhem_set("$_aktor $_dim_down");;\
    set_Exec("timerDN",0.5,"sendDimDn()");;\
  } else {\
    fhem_set("$_aktor pct 0");;\
    del_Exec("timerDN");;\
  } \
}\
\
sub doNothing {\
my $i = 1;;\
}\
}\
\
setON {\
if (["smartTasterTradfri1:1002"]){\
   if (get_Exec("onTimer")){\
   fhem_set ("$_aktor pct 80");;\
   } else {\
   fhem_set ("$_aktor $_on");;\
   }\
   set_Exec("onTimer",2,"doNothing");;\
   }\
}\
\
setOFF {["smartTasterTradfri1:2002"];; fhem_set ("$_aktor $_off")}\
\
setDimUP {["smartTasterTradfri1:1001"];; sendDimUp()};;\
\
setDimDN {["smartTasterTradfri1:2001"];; sendDimDn()};;\
\
cancelDim {\
if (["smartTasterTradfri1:.003"]){\
   if (get_Exec("timerUP")){\
      del_Exec("timerUP");;\
   }\
   if (get_Exec("timerDN")){\
      del_Exec("timerDN");;\
   }   \
}\
}
attr di_hueDimmerTest event-on-update-reading .*


das ist aus Damians Vorschlag entstanden. Allerdings ist es mir nicht gelungen, das triggerDevice zu generalisieren, deshalb ist es zwar einer Variablen zugeordnet, aber in den Bedingungen nochmals ausgeführt.
Bedienung ist folgendermaßen:

- Lampe ist aus
- einmal on-Taster drücken (1002): Lampe schaltet auf niedrigste Stufe ein
- innerhalb von 2 sec (aber > 0,5 sec) on-Taster nochmal drücken (1002): Lampe wird auf 80% hochgedimmt
- einmal off-Taster drücken (2002): Lampe geht aus

- on-Taster gedrückt halten (1001): Lammpe dimmt hoch
- off-Taster gedrückt halten (2001): Lampe dimmt runter,
jeweils so lange bis 0 oder 100% erreicht ist oder der Taster losgelassen ((1|2)003) wird.

Vielleicht hilft es..

Viel Erfolg!
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

FunkOdyssey

Vielen Dank fürs Teilen.

Ich schaue mir die verschiedenen Möglichkeiten mal an.

Gestern ist mit aufgefallen, dass nur nur das Ändern der Helligkeit im Vordergrund steht, sondern auch das Ändern der Farbtemperatur.
Würde ich dafür aber ctDown|ctUp parallel zu dimDown|dimUp nutzen, so wird zu stark abgedunkelt. Ich denke, dass ich doch mit zwei verschiedenen Ranges arbeiten muss.
Ein Farbbereich zwischen ct150 und ct400 (Andere Werte gefallen wir nicht).
Und ein Brightness-Bereich. Hier natürlich zwischen 0 und 100.

Ich werde mir ein paar Gedanken machen.