DOIF eleganter/schlanker gestalten

Begonnen von Snobs, 25 August 2018, 19:23:20

Vorheriges Thema - Nächstes Thema

Snobs

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

satprofi

(([bedingung1] eq "on" and [bedingung2] eq "on)  and [bedingung3]) (set xyz on)

Gesendet mit Tapatalk

gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Snobs

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.


Ellert

#3
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) {...}
  ...
}

Snobs

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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Ob es sich bei zwei konstanten Bedingungen lohnt, musst du entscheiden, aber du kannst DOIFReadings 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)\
...