FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Snobs am 25 August 2018, 19:23:20

Titel: DOIF eleganter/schlanker gestalten
Beitrag von: Snobs am 25 August 2018, 19:23:20
Hallo,
ich würde gerne meine DOIF`s grundsätzlich von Helligkeit und eingeschaltetem Receiver abhänig machen.

Kann man mein Bespiel irgendwie so verändern, das einfach vorne weg die beiden Bedienungen erfüllte sein müssen, bevor dann ggf DOIFs ausgeführt werden.

Zitatdefmod DOIF_Kodi_Lichtsteuerung DOIF ([Kodi:playStatus] eq "playing" and \
[Kodi:currentMedia] ne "" and \
[Bewegungsmelder_Motion:brightness] < 70 and \
[AV_Receiver:state] eq "on" and \
([Kodi:type] eq "episode" or [Kodi:type] eq "movie" or [Kodi:type] eq "unknown")) \
(set LZ_Kino scene AllesAus)\
DOELSEIF\
([Kodi:playStatus] eq "paused" and \
[Kodi:currentMedia] ne "" and \
[Bewegungsmelder_Motion:brightness] < 70 and \
[AV_Receiver:state] eq "on" and \
([Kodi:type] eq "episode" or [Kodi:type] eq "movie" or [Kodi:type] eq "unknown")) \
(set LZ_Kino scene MoviePause)\
DOELSEIF\
([Kodi:playStatus] eq "stopped" and \
[Kodi:currentMedia] ne "" and \
[Bewegungsmelder_Motion:brightness] < 70 and \
[AV_Receiver:state] eq "on" and \
([Kodi:type] eq "episode" or [Kodi:type] eq "movie" or [Kodi:type] eq "unknown")) \
(set living_room_lamp ON)

Schon alleine ohne Helligkeit, schaltet er es eben auch am Tag :)
Für Unterstützung wäre ich dankbar.

VG
Sascha
Titel: Antw:DOIF eleganter/schlanker gestalten
Beitrag von: satprofi am 25 August 2018, 19:33:19
(([bedingung1] eq "on" and [bedingung2] eq "on)  and [bedingung3]) (set xyz on)

Gesendet mit Tapatalk

Titel: Antw:DOIF eleganter/schlanker gestalten
Beitrag von: Snobs am 25 August 2018, 19:38:01
Das habe ich ja genau so, ich wollte nur ungefähr so

Zitat
(Licht < 70 und AV Receiver an) (
   doif (erste Bediung) (set a)
   doelseif (andere Bedingung) (set c)
   doelseif (ganz andere Bedingung (set c)
)

So ganz grob, ich wollte Receiver und Helligkeit vorab prüfen und wenn die nicht WAHR sind den Rest gar nicht erst machen und nicht jedes mal alles Testen.

Titel: Antw:DOIF eleganter/schlanker gestalten
Beitrag von: Ellert am 25 August 2018, 19:51:04
Zitat von: Snobs am 25 August 2018, 19:38:01
Das habe ich ja genau so, ich wollte nur ungefähr so

So ganz grob, ich wollte Receiver und Helligkeit vorab prüfen und wenn die nicht WAHR sind den Rest gar nicht erst machen und nicht jedes mal alles Testen.

Sowas ist mit DOIF im Perl-Modus möglich, das ist aber eine andere Art und Weise der Programmierung, siehe https://commandref.fhem.de/commandref_DE.html#DOIF_Perl_Modus

Damit kannst Du if verschachteln

if (Bed 1) {
  if (Bed 2) {...}
  elsif (Bed 3) {...}
  elsif (Bed 4) {...}
  ...
}
Titel: Antw:DOIF eleganter/schlanker gestalten
Beitrag von: Snobs am 25 August 2018, 19:59:00
Danke für die Antwort, da steige ich gar nicht mehr durch :)
Ich habe es jetzt mal so eingetragen und keinen Fehler beim Speichern. Mal sehen ob es funktioniert und er bei Helligkeitsänderung nicht durchdreht :)
ZitatInternals:
   DEF        [Bewegungsmelder_Motion:brightness] < 70 and [AV_Receiver:state] eq "on" (
  ([Kodi:playStatus] eq "playing" and [Kodi:currentMedia] ne "" and ([Kodi:type] eq "episode" or [Kodi:type] eq "movie" or [Kodi:type] eq "unknown"))(set LZ_Kino scene AllesAus)
  DOELSEIF
  ([Kodi:playStatus] eq "paused" and [Kodi:currentMedia] ne "" and ([Kodi:type] eq "episode" or [Kodi:type] eq "movie" or [Kodi:type] eq "unknown")) (set LZ_Kino scene MoviePause)
  DOELSEIF
  ([Kodi:playStatus] eq "stopped" and [Kodi:currentMedia] ne "" and ([Kodi:type] eq "episode" or [Kodi:type] eq "movie" or [Kodi:type] eq "unknown")) (set living_room_lamp ON)
 
)
   MODEL      Perl
   NAME       DOIF_Kodi_Lichtsteuerung
   NR         168
   NTFY_ORDER 50-DOIF_Kodi_Lichtsteuerung
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-08-25 19:54:15   mode            enabled
     2018-08-25 19:54:15   state           initialized
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0         
   devices:
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   itimer:
   perlblock:
     0         
   uiState:
   uiTable:
Attributes:
   room       35.DOIF
VG
Sascha
Titel: Antw:DOIF eleganter/schlanker gestalten
Beitrag von: Damian am 25 August 2018, 23:23:49
Man kann allgemein sagen: Wiederholende Strukturen lassen sich immer eleganter (kürzer) erledigten, wenn man ein gewisses Verständnis für Programmierung mitbringt. DOIF-Perl bringt inzwischen einiges mit, um strukturiert, kurz und damit elegant komplexere Automatisierungsabläufe zu "programmieren". Die Kehrseite der Medaille ist: Programmierkenntnisse als Voraussetzung. Wenn man sie nicht hat, dann ist es einfacher im DOIF-FHEM-Modus mit Wiederholungen zu leben. Das ist nicht schlimm und führt etwas weniger "elegant" zum Erfolg.  Das ist allerdings der Normalfall im FHEM-Forum, da die meisten "Automatisierer" hier keine Programmierkenntnisse mitbringen.
Titel: Antw:DOIF eleganter/schlanker gestalten
Beitrag von: Per am 27 August 2018, 13:43:47
Ob es sich bei zwei konstanten Bedingungen lohnt, musst du entscheiden, aber du kannst DOIFReadings (https://fhem.de/commandref_DE.html#DOIF_Readings) nutzen. Wobei ich zumindest in deinem Beispiel 5 konstante finde (ich habe es zum besseren Verständnis mal getrennt gelassen).
attr DOIFReading konst:([Bewegungsmelder_Motion:brightness] < 70 and [AV_Receiver:state] eq "on"),rest:([AV_Receiver:state] eq "on" and ([Kodi:type] eq "episode" or [Kodi:type] eq "movie" or [Kodi:type] eq "unknown"))
und dann im DOIF
defmod DOIF_Kodi_Lichtsteuerung DOIF \
([Kodi:playStatus] eq "playing" and \
$SELF:konst and $SELF:rest \
(set LZ_Kino scene AllesAus)\
DOELSEIF\
([Kodi:playStatus] eq "paused" and \
$SELF:konst and $SELF:rest \
(set LZ_Kino scene MoviePause)\
...