Philips Hue mit Funktasterschnittstelle dimmen

Begonnen von hnnmn, 02 Januar 2022, 15:40:42

Vorheriges Thema - Nächstes Thema

hnnmn

Hallo zusammen

Ich würde gerne einen bestehend installierten HM-PBI-4-FM nutzen, um damit per langem Tastendruck eine Philips Hue zu dimmen.

Zuerst dachte ich, ich könnte das hier nutzen, aber ich verstehe davon zu wenig: https://forum.fhem.de/index.php?topic=46558.0

Ich dachte, man könnte das generell aufbauen. Eine Status-Variable für den aktuellen Prozent-Wert, eine andere für die zuletzt genutzte Dimm-Richtung (hoch/runter) und dann einfach alle n long-messages um m% hochzählen. Zuletzt den %-Wert im Ziel-Gerät (bei mir eben eine Hue) setzen.

Kann mir hier jemand helfen?

Beste Grüsse
Martin

Thorsten Pferdekaemper

Hi,
das, was Du da schreibst, ist doch ganz vernünftig. Wo genau brauchst Du da Hilfe?
Gruß,
   Thorsten
FUIP

justme1968

du bekommst doch regelmässig events. schau im event monitor. über ein notify kannst do pro event ein dimUp oder dimDown absetzen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Otto123

Hi,

Du brauchst beim Dimmen ein Feedback, eine Variable hochzählen und dann was ausführen wird beim Bediener nicht gut ankommen.

Mal so als Test (kann man besser machen). Nicht wundern, meine Tasten werden erst per MQTT in eine andere Instanz übertragen:
defmod Button_Dim_notify notify MQTT2_mqtt2c:FB12_Btn_02:.trigger:.Long_.*|MQTT2_mqtt2c:FB12_Btn_01:.trigger:.Long_.* { \
if ( $EVENT =~ /Btn_02/ ) { fhem("set HUEGroup4 dimUp") };;\
if ( $EVENT =~ /Btn_01/ ) { fhem("set HUEGroup4 dimDown") }\
}
attr Button_Dim_notify disabledAfterTrigger 6


Das dimmen der Hue Lampen dauert etwas und mit dim Befehlen während des Dimmens kommen zumindest meine durcheinander. Deswegen reagiert das notify nur alle 6 Sekunden, damit könnte man experimentieren.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

hnnmn

Danke euch allen! Ich probiere das aus.

@Otto: Danke für das Beispiel - probiere ich aus. Direktes Feedback vs. Bediener-Experience: guter Punkt!
@JustMe/@Thorsten: Danke - im EventMonitor und mit dimup/down ... klar eigentlich. Der Punkt ist, ich mache leider viel zu wenig und starte daher gefühlt jedes Mal wieder bei 0. Das Beispiel von Otto schliesst die Lücke - sowas hatte ich gesucht.



hnnmn

#5
Hallo zusammen

Hier mal ein funktionierendes Zwischenergebnis im Testaufbau (anstatt Funktasterschnittstelle eine Fernbedienung, ...):


defmod ntf_HUE_dim notify HM_119823_Btn_09:.*trigger:.Long.*|HM_119823_Btn_10:.*trigger:.Long.*|HM_119823_Btn_09:.*trigger:.Short.*|HM_119823_Btn_10:.*trigger:.Short.*\
{\
    if ( $EVENT =~ /Short/ && $NAME =~ /Btn_09/ ) {fhem("set OG_BUERO_Bloom off")}\
    if ( $EVENT =~ /Short/ && $NAME =~ /Btn_10/ ) {fhem("set OG_BUERO_Bloom pct 100")}\
    if ( $EVENT =~ /Long/  && $NAME =~ /Btn_09/ ) {fhem("set OG_BUERO_Bloom dimDown")}\
    if ( $EVENT =~ /Long/  && $NAME =~ /Btn_10/ ) {fhem("set OG_BUERO_Bloom dimUp")}\
    {fhem("set hue_debug ".ReadingsVal("OG_BUERO_Bloom", "state", ""))}\
}
attr ntf_HUE_dim room BUERO


@Otto: bei mir funktioniert es übrigens problemlos auch ohne die Begrenzung "disabledAfterTrigger 6"

Folge-Herausforderung Nr. 1:
Dass ich auch "Short" eingebaut habe, liegt daran, dass bei einem langen "dimUp" die Lampe automatisch von "pct 100" auf "on" wechselt, allerdings bei einem langen "dimDown" und auch bei mehrmalig langem "dimDown" ein "pct 6" Status nicht unterschritten wird - will sagen, die Lampe geht nicht aus. Es ist also mehr ein Workaround und unschön.
=> hat jemand hierzu einen Gedanken? Wie kann ich mit lange dimDown auf 0 kommen resp. warum macht er das hier nicht?

Folge-Herausforderung Nr. 2a:
Eigentlich will ich ja mit einem Button bedienen, ich muss also noch irgendwie den Status (hoch/runter) wegschreiben und zwar pro 'langem Tastendruck', also nicht bei jeder Ausführung immer die Richtung toggeln. Ich muss sozusagen eine Long-Press-'Session' erkennen - oder einen anderen Ansatz fahren.
=> wie könnte ich das lösen? Zwei Knöpfe, wie bei Otto und in meinem Testaufbau sind keine Option, in der Wand ist (und bleibt  :) ) nur ein Taster.

Folge-Herausforderung Nr. 2b:
Wenn ich den Status eines Device verändere und ich diesen im geänderten Zustand gerne auslesen und wegspeichern möchte, kann ich das in einem Aufruf (in meinen Versuchen jedenfalls) nicht machen, da er ja erst nach Beendung wirklich dort vorhanden ist. Meine Erklärung hierfür ist, dass das Script ja geparst wird und zu diesem Zeitpunkt die Werte eingesetzt werden und zu dem Zeitpunkt ist der neue Wert noch nicht gesetzt. Ich bräuchte etwas, wie "eval()", damit das erst zum Laufzeit-Zeitpunkt gelesen wird.
=> gibt es in FHEM die Möglichkeit für so etwas?

Grundverständnis-Frage:
In Otto's Code wird ja diese 'Perl-Schreibweise' verwendet. Praktisch, wenn ich wie in meinem Beispiel oben bspw. die "ReadingsVal()" verwenden möchte. Kann ich das auch in der nicht-Perl-Schreibweise, also wenn ich mich quasi auf dem FHEM-Level bewege?

Beste Grüsse
Martin

Otto123

Zitat von: hnnmn am 04 Januar 2022, 14:57:29
Grundverständnis-Frage:
In Otto's Code wird ja diese 'Perl-Schreibweise' verwendet. Praktisch, wenn ich wie in meinem Beispiel oben bspw. die "ReadingsVal()" verwenden möchte. Kann ich das auch in der nicht-Perl-Schreibweise, also wenn ich mich quasi auf dem FHEM-Level bewege?
Hallo Martin,

schnelle Antwort auf diese Frage: Ja - aber! Du kannst FHEM IF verwenden - eigentlich ist das nicht viel anders / kürzer - und der Perl Level ist meist besser / lesbarer / universeller ...

Du kannst set magic verwenden, da sist bei den Spezies aber auch "umstritten". Ich nehme es gern. ;)
{fhem("set hue_debug [OG_BUERO_Bloom:state]")}

Zu der Ein Knopf Bedienung: Jede Long Serie hat eine "Nummer", damit könntest Du bei jedem langem Tastendruck die Richtung wechseln. Oder willst Du immer erst auf 100 % fahren und dann wechseln?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

hnnmn

Danke Otto

Das mit dem Magic probiere ich später aus, danke - hatte irgendwie den Eindruck, das würde wegen des 'Perl-Level' (vs. FHEM-Level) nicht gehen.

Diese Nummer pro Long-Event hatte ich neben der Zählernummer gar nicht wahrgenommen - Danke!
Nun muss ich sie noch aus dem "$EVTPART1" raus bekommen, dort steht "Long_12" drin.

Einknopfbedienung: wollte ich bei jedem Long-Press die Richtung ändern (das ist ja meisten so und damit dann auch Intuitiv für den Bediener). Also evtl. komme ich sogar um die Regexp-Extraktion von meinem o.g. Beispiel "Long_12" herum und schreibe die einfach weg, vergleiche dann gegen den Wert und wenn der ungleich ist, nehme ich die andere Richtung.

Ohne es ausprobiert zu haben, vermutlich scheitert das dann aber wieder an meinem u.g. "Folge-Herausforderung Nr. 2b:" - die eval()-Thematik. Aber das muss ich ausprobieren.

Beste Grüsse
Martin

Otto123

Du könntest auch noch LongRelease auswerten - den gibt es aber nur bei gepeerten Tasten. Man könnte mit einem virtuellem Channel der VCCU peeren, aber bei dem PIB siehst Du ja die grüne Quittung nicht. Ich bin da unschlüssig.
Du kannst ja $EVTPART1 einfach in ein Reading schreiben, immer wenn das nicht mehr gleich ist schreibst Du die Richtung in einem Reading um. Die Richtung nimmst Du dann konsequent aus dem Reading.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

hnnmn

Funktioniert prächtig:



HM_119823_Btn_11:.*trigger:.Long.*|HM_119823_Btn_11:.*trigger:.Short.*
{fhem("set hue_debug $EVENT $TYPE $NAME $EVTPART0 --- $EVTPART1")}
{ if  (ReadingsVal("hue_debug", "longpressid", "") =~ /$EVTPART1/) { \ # if longpressid changed: set current & persist dimdir in opposite direction to current
    fhem("setreading hue_debug debug longpress_equal__or__shortpress") \
  } else { \
    fhem("setreading hue_debug debug longpress_UNequal__or__shortpress");\
    fhem("setreading hue_debug longpressid ".$EVTPART1);\
    if ( ReadingsVal("hue_debug", "dimdir", "ERROR_NO_VAL_dimdir")  =~ /up/) {\
        fhem("setreading hue_debug dimdir down")\
    } elsif ( ReadingsVal("hue_debug", "dimdir", "ERROR_NO_VAL_dimdir")  =~ /down/) {\
        fhem("setreading hue_debug dimdir up")}
    else {fhem("setreading hue_debug dimdir ERROR")}
  }
if ( $EVENT =~ /Short/ && $NAME =~ /Btn_11/ ) {fhem("set OG_BUERO_Bloom toggle")}
if ( $EVENT =~ /Long/  && ReadingsVal("hue_debug", "dimdir", "") =~ /down/ ) {fhem("set OG_BUERO_Bloom dimUp")}
if ( $EVENT =~ /Long/  && ReadingsVal("hue_debug", "dimdir", "") =~ /up/ ) {fhem("set OG_BUERO_Bloom dimDown")}
}


VIELEN DANK FÜR EURE HILFE!!!

Beste Grüsse
Martin


PS: @Otto: VCCU... iiiirgendwann mal - bin noch ohne Virtualisierung unterwegs und das alles umzustellen erscheint mir ein Mammut-Projekt.