[alexa-fhem] flexible Schalter und Skripte mit DOIF ohne DUMMY - How-To

Begonnen von AitschPi, 05 Januar 2018, 11:09:38

Vorheriges Thema - Nächstes Thema

AitschPi

Moin moin,

mich hatten die Vorschläge mit dem Anlegen von dummys und dem Auswerten über doif nicht begeistert, da man dann immer zwei Geräte anlegen muss. Einfacher finde ich es, allein mit einem DOIF zu arbeiten, das sich selbst auswertet. Das kann man als Ersatz für einen Schalter oder auch für komplexere Schaltabläufe nutzen. Gleichzeitig erspart es das Einbinden vorhandener Geräte, die man vielleicht mit group/room schon schön strukturiert hat. Auch kann man so Sachen schalten, die eigentlich mit SmartHome nicht gehen.
Einzig den aktuellen Schaltzustand des Schalters "dahinter" kann man nicht so abrufen. Dazu wäre mehr Arbeit notwendig, die ich nicht betreiben wollte.
Hier aber die Theorie mit praktischen Varianten in einfach und etwas komplexer:

Theoretisch sieht es so aus:
defmod Schalter_doif DOIF ($SELF eq "on")\
(\
[Schaltebefehle für "an"]\
) \
DOELSEIF ($SELF eq "off")\
(\
[Schaltbefehle für "aus"]\
)\

attr Schalter_doif alexaName Schalter
attr Schalter_doif alexaRoom Zimmer
attr Schalter_doif cmdState on|off
attr Schalter_doif devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr Schalter_doif genericDeviceType switch
attr Schalter_doif room Alexa
attr Schalter_doif setList on off

setstate Schalter_doif off

Das DOIF mit $SELF verweist auf sich selbst. Die Attribute sorgen für die Schaltbarkeit bei Alexa und auch über das Webinterface von FHEM. Das setstate habe ich immer noch für einen schönen optischen Ausgangszustand hinzugefügt.

Beispiel 1: Die einfache Nachttischlampe
defmod OGSZ_NachttischLinks_doif DOIF ($SELF eq "on")\
(\
set HM_2D379xx_Sw_01 on\
) \
DOELSEIF ($SELF eq "off")\
(\
set HM_2D37xx_Sw_01 off\
)\

attr OGSZ_NachttischLinks_doif alexaName Nachttisch links
attr OGSZ_NachttischLinks_doif alexaRoom Schlafzimmer
attr OGSZ_NachttischLinks_doif cmdState on|off
attr OGSZ_NachttischLinks_doif devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr OGSZ_NachttischLinks_doif genericDeviceType switch
attr OGSZ_NachttischLinks_doif room Alexa
attr OGSZ_NachttischLinks_doif setList on off

setstate OGSZ_NachttischLinks_doif off



Beispiel 2: Ein asymetrisches Schaltskript - Licht in gesamter Wohnung aus, aber nur teilweise an:
Hintergrund ist, dass ich beim Verlassen der Wohnung überall Licht ausmachen möchte, aber wenn ich wieder komme, erst einmal nur im Flur, auf der Treppe und im (zentralen) Esszimmer Licht haben möchte. Theoretisch könnte ich auch noch gleich beim Verlassen den Fernseher ausschalten, die Alarmanlage schalten, eine Nachricht mit Pushover schicken oder was auch immer. Und alles lege ich getrennt für an und aus fest.
defmod OG_LichtWohnungGesamt_doif DOIF ($SELF eq "on")\
(\
  set HM_3776xx on;; \
  set HM_2F03xx on;; \
  set HM_3777xx on \
) \
DOELSEIF ($SELF eq "off")\
(\
  set ESPEasy_sonoff_bas_01_SWITCH off;; \
  set ESPEasy_sonoff_bas_02_SWITCH off;; \
  set TRX_ARC_x off;; \
  set TRX_ARC_y off;; \
  set TRX_ARC_z off;; \
  set HM_3AC7xx off;; \
  set HM_3AC6xx off;; \
  set HM_3776xx off;; \
  set HM_3AEFxx off;; \
  set HM_3777xx off;; \
  set HM_3AC6xx off;; \
  set HM_2F03xx off;; \
  set HM_3777xx off;; \
  set HM_3AC6xx off;; \
  set HM_3777xx off  \
)\

attr OG_LichtWohnungGesamt_doif alexaName Licht in Wohnung
attr OG_LichtWohnungGesamt_doif alexaRoom Wohnzimmer
attr OG_LichtWohnungGesamt_doif cmdState on|off
attr OG_LichtWohnungGesamt_doif devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr OG_LichtWohnungGesamt_doif genericDeviceType switch
attr OG_LichtWohnungGesamt_doif room Alexa
attr OG_LichtWohnungGesamt_doif setList on off

setstate OG_LichtWohnungGesamt_doif off


Beispiel 3: Fernsehen an und aus
Hier schalte ich den SAT-Reciever an, den Verstärker und den Fernseher. Gleichzeitig wähle ich beim Verstärker die korrekte Quelle. Man könnte noch das richtige Programm, die Anfangslautstärke, etwas Licht oder was auch immer wählen. Beim Ausschalten ist es dann wieder einfacher: Die Geräte sollen nur ausgeschaltet werden.
defmod OGWZ_FernsehenWZ_doif DOIF ($SELF eq "on")\
(\
set SonyWZ_wol on;;\
set SonyWZ on;;\
set GigaBlue_OGWZ on;;\
set YamahaReceiver on;;\
set YamahaReceiver input hdmi2\
) \
DOELSEIF ($SELF eq "off")\
(\
set SonyWZ off;;\
set GigaBlue_OGWZ off;;\
set YamahaReceiver off\
)\

attr OGWZ_FernsehenWZ_doif alexaName Wohnzimmer Fernsehen
attr OGWZ_FernsehenWZ_doif alexaRoom Wohnzimmer
attr OGWZ_FernsehenWZ_doif cmdState on|off
attr OGWZ_FernsehenWZ_doif devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr OGWZ_FernsehenWZ_doif genericDeviceType switch
attr OGWZ_FernsehenWZ_doif room Alexa
attr OGWZ_FernsehenWZ_doif setList on off

setstate OGWZ_FernsehenWZ_doif off


Der Code ist so formatiert, so dass er in ein Fenster mit RAW-Definition direkt eingefügt werden kann.
Echte Männer essen keinen Honig, sie kauen Bienen.

justme1968

ich verstehe nicht warum du hier DOIF verwendest und auch nicht warum du auf dummy und DOIF verweist.

fall 1 geht über ein normales homebridgeMapping im device in dem du cmdOn und cmdOff konfigurierst. und du hast noch den vorteil das du den echten device zustand sehen kannst. ganz ohne zusätzliches device.

fall 2 und 3 geht genau so mit structure, lightScene, readingsProxy. du brauchst ein zusätzliches device. oder man legt sich eine passendes routine in der alexa app an. oder man nimmt einen fhem intent im custom skill.

wenn man DOIF nicht mag muss man wegen alexa nicht damit anfangen. wie fast immer gibt es genügend andere wege die nicht aufwändiger sind.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

AitschPi

Fall 1 war auch eher für einen einfachen Start. Natürlich kann man das ursprüngliche Gerät nutzen - und das mache ich auch zu 90%. Nur gerade für die Fälle 2 und 3 wollte ich die Möglichkeit von asymmetrischen Schaltvorgängen aufzeigen. Da habe ich keine anderen Wege aktuell gefunden. Oder wie kann man beim Ausschalten 10 Geräte ausschalten, beim Einschalten nur 2 oder 3? Oder beim Fernsehen noch zusätzlich Kanäle oder Quellen wählen?

Wie im Wiki erst dummy und dann doif hatte ich auch zuerst. Nur fand ich das unnötig doppelt angelegt - das war ja auch das Argument gegen den Fall1. ;o)

Und: So kann ich schon jetzt ein Schloß steuern, das ja momentan noch nicht unterstützt wird. Es sollte hier vor allem zeigen, wie man die Möglichkeit eines Schalter "missbrauchen" kann, um irgendwas anderes zu steuern.
Echte Männer essen keinen Honig, sie kauen Bienen.

justme1968

so lange ein set kommando reicht geht es über homebridgeMapping auch bei deinem schloss. zum 'missbrauchen' braucht es nur die On characteristic im homebridgeMapping. nichts sonst.

wenn es mehrere alternativen in einem device geben soll geht das für homekit auch über das homebridgeMapping, bei alexa leider nicht.

wenn mehr als ein set nötig ist braucht man pro schalter meist ein zusätzliches device. das muss aber nicht DOIF sein.

zwei zusätzliche devices die dummy und notify oder dummy und DOIF sind niemals nötig.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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