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
(([bedingung1] eq "on" and [bedingung2] eq "on) and [bedingung3]) (set xyz on)
Gesendet mit Tapatalk
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.
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) {...}
...
}
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
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.
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)\
...