Hiho,
Wie sieht das eigentlich mit der Verschachtlung von DOIF´s aus?
Das hier würde so ja nicht gehen...
DOIF ([IT_F000FFFFFF:STATE] eq "on")
DOIF([AVReceiver:power]eq "on")
(set AVReceiver:FILTER=!input=cd cd)
(set AVReceiver:FILTER=!volume=38 38)
(set AVReceiver:FILTER=!listeningMode=extendedStereo extendedStereo)
DOELSE
({GetHttpFile("192.168.0.120","/json?pass=xxxxxx&plain=[{%27data%27:%27A55A38C7%27,%20%27type%27:%27NEC%27,%20%27length%27:32,%27cdelay%27:5000},{%27data%27:%27A55A32CD%27,%20%27type%27:%27NEC%27,%20%27length%27:32}]")})
DOELSEIF([TV_Parasonic_ETW60:power] eq "on")
(set AVReceiver:FILTER=!input=hdmi1 hdmi1)
(set AVReceiver:FILTER=!volume=29 29)
DOELSE
(set AVReceiver:power=!power=off off)
Da musst Du dann IF nehmen. Das ist ein FHEM Befehl. Schaue mal in die Commandref
Dann kann ich es doch auch gleich in der 99_myUtils.pm lassen.
Oder hat es sonst noch Vorteile es direkt in FHEM abzuarbeiten?
##############################################
# Schaltlogik für Bluetooth von den Dot_Wohnzimmer
# und den AVReceiver
#
sub NotifyBluetooth($){
my ($Device) = @_;
my $BTState = ReadingsVal("IT_F000FFFFFF","state","");
my $TVSate = fhem("get TV_Parasonic_ETW60 power");
my $AVSate = fhem("get AVReceiver power");
# Einschaltlogik Bluetooth
if($Device eq "IT_F000FFFFFF")
{
if($BTState eq "on")
{
if($AVSate eq "on")
{
fhem("set AVReceiver input cd");
fhem("set AVReceiver volume 38");
fhem("set AVReceiver listeningMode extendedStereo");
}
else
{
# Über IR toggle AVReceiver und auf CD-Input wechseln mit fünf Sekunden Pause
GetHttpFile("192.168.0.120","/json?pass=xxxxx&plain=[{%27data%27:%27A55A38C7%27,%20%27type%27:%27NEC%27,%20%27length%27:32,%27cdelay%27:5000},{%27data%27:%27A55A32CD%27,%20%27type%27:%27NEC%27,%20%27length%27:32}]");
}
}
elsif($TVSate eq "on")
{
fhem("set AVReceiver input hdmi1");
fhem("set AVReceiver volume 29");
}
else
{
fhem("set AVReceiver off");
}
}
# Ausschaltlogik AVReceiver
elsif($Device eq "AVReceiver")
{
if($BTState eq "on")
{
fhem("set IT_F000FFFFFF off");
}
}
}
EDIT:
Oder geht das so ?
([IT_F000FFFFFF:STATE] eq "on")
(IF([AVReceiver:power] eq "on")(
(set AVReceiver:FILTER=!input=cd cd)
(set AVReceiver:FILTER=!volume=38 38)
(set AVReceiver:FILTER=!listeningMode=extendedStereo extendedStereo)
)
ELSE(
({GetHttpFile("192.168.0.120","/json?pass=xxxxxx&plain=[{%27data%27:%27A55A38C7%27,%20%27type%27:%27NEC%27,%20%27length%27:32,%27cdelay%27:5000},{%27data%27:%27A55A32CD%27,%20%27type%27:%27NEC%27,%20%27length%27:32}]")})
))
DOELSEIF([TV_Parasonic_ETW60:power] eq "on")
(set AVReceiver:FILTER=!input=hdmi1 hdmi1)
(set AVReceiver:FILTER=!volume=29 29)
DOELSE
(set AVReceiver:power=!power=off off)
Ja, so sollte es gehen. Allerdings triggert so die Bedingung [AVReceiver:power] das DOIF nicht. Es wird nur bewertet und entspr. die Entscheidung it/else getroffen.
Leider nein bekomme den Fehler:
2017-08-04 13:17:11 DOIF Bluetooth_AVReceiver_DOIF error: IF([AVReceiver:power] eq "on")(set AVReceiver:FILTER=!input=cd cd): Unknown command IF([AVReceiver:power], try help. ELSE({GetHttpFile("192.168.0.120","/json?pass=xxx&plain=[{'data':'7A55A38C7', 'type':'NEC', 'length':32,'cdelay'5000},{'data':'A55A32CD', 'type':'NEC', 'length':32}]")}): Unknown command ELSE, try help.
Pack mal nen Leerzeichen hinter IF.
Zitat von: Per am 04 August 2017, 13:51:38
Pack mal nen Leerzeichen hinter IF.
Japp das wars ::)
nun wird aber noch das ELSE angenörgeld..
ELSE ({GetHttpFile("192.168.0.120","/json?pass=xxxxx&plain=[{'data':'7A55A38C7', 'type':'NEC', 'length':32,'cdelay'5000},{'data':'A55A32CD', 'type':'NEC', 'length':32}]")}): Unknown command ELSE, try help.
Schon mal in der CommandRef (https://fhem.de/commandref_DE.html#IF) geschaut? Bissel viele Klammernpaare, bevor dein ELSE kommt!
Zitat von: Per am 04 August 2017, 15:18:51
Schon mal in der CommandRef (https://fhem.de/commandref_DE.html#IF) geschaut? Bissel viele Klammernpaare, bevor dein ELSE kommt!
Sicher habe ich das, aber auch wenn nur ein Klammernpaar davor stecht kommt der gleiche Fehler...
Edit:
Habe jetzt mir das ganze mal in nano angesehen, da war ein Sonderzeichen vor den Else habe es nun entfernt und es läuf....
Danke für die Unterstützung!
ZitatHabe jetzt mir das ganze mal in nano angesehen, da war ein Sonderzeichen vor den Else habe es nun entfernt und es läuf....
Wieso kann ein unsichbare Sonderzeichen da kommen? Fhem speichert die DEF nicht, bis alles korrekt ist.
:-X
Das kann ich dir leider nicht sagen....
Vllt. ein <tab>, DOIF war da anfangs auch recht sensibel.
Zitat von: amenomade am 04 August 2017, 15:33:56
Wieso kann ein unsichbare Sonderzeichen da kommen? Fhem speichert die DEF nicht, bis alles korrekt ist.
Meistens durch copy & paste. FHEM speichert alles, was DOIF nicht anmeckert. DOIF macht keinen vollständigen Syntaxcheck - es werden insbesondere im Vorfeld Klammern-Paare geprüft.
Ich habe noch mal eine Verständnisfrage, ich tue mich nun doch etwas schwer mit der Logik vom DOIF... Sorry!
Muss ich tatsächlich ein DOIF so auf bauen das auch bei den Event [IT_F000FFFFFF:state] eq "off" and [TV_Parasonic_ETW60:power] eq "on" der cmd_2 ausgeführt wird?
([IT_F000FFFFFF:state] eq "on")
(IF ([AVReceiver:power] eq "on")
(
set AVReceiver:FILTER=input!=cd input cd,
set AVReceiver:FILTER=volume!=38 volume 38,
set AVReceiver:FILTER=listeningMode!=extendedStereo listeningMode extendedStereo
)
ELSE
(
{GetHttpFile("192.168.0.120","/json?pass=xxxx&plain=[{%27data%27:%27A55A38C7%27,%20%27type%27:%27NEC%27,%20%27length%27:32,%27cdelay%27:5000},{%27data%27:%27A55A32CD%27,%20%27type%27:%27NEC%27,%20%27length%27:32}]")}
))
DOELSEIF([IT_F000FFFFFF:state] eq "off" and [TV_Parasonic_ETW60:power] eq "on")
(
set AVReceiver:FILTER=input!=hdmi1 input hdmi1,
set AVReceiver:FILTER=volume!=29 volume 29
)
Und dies reicht so nicht aus?! (man beachte die DOELSEIF Bedienung)
([IT_F000FFFFFF:state] eq "on")
(IF ([AVReceiver:power] eq "on")
(
set AVReceiver:FILTER=input!=cd input cd,
set AVReceiver:FILTER=volume!=38 volume 38,
set AVReceiver:FILTER=listeningMode!=extendedStereo listeningMode extendedStereo
)
ELSE
(
{GetHttpFile("192.168.0.120","/json?pass=xxxx&plain=[{%27data%27:%27A55A38C7%27,%20%27type%27:%27NEC%27,%20%27length%27:32,%27cdelay%27:5000},{%27data%27:%27A55A32CD%27,%20%27type%27:%27NEC%27,%20%27length%27:32}]")}
))
DOELSEIF([TV_Parasonic_ETW60:power] eq "on")
(
set AVReceiver:FILTER=input!=hdmi1 input hdmi1,
set AVReceiver:FILTER=volume!=29 volume 29
)
Hat da wer noch eine Antwort für mich?
Oder war jetzt die Frage einfach zu blöd? :)
Verstehe die Frage nicht ;)
EDIT: Ah doch, Moment. Du fragst ob das DOELSEIF im 2. Beispiel reicht
Zitat von: Shojo am 06 August 2017, 19:52:10
Hat da wer noch eine Antwort für mich?
Oder war jetzt die Frage einfach zu blöd? :)
Ich denke, du musst deine Frage präzisieren, damit man sie beantworten kann.
Antwort: abhängig von was Du willst !
Soll [IT_F000FFFFFF:state] eq "off" die 2. Branche triggern oder nicht?
Im ersten DOELSEIF werden beiden Geräte triggern (eine Änderung von [TV_Parasonic_ETW60:power] oder von [IT_F000FFFFFF:state] wird dazu führen, dass die Bedingung bewertet wird, und evtl. die Befehle durchgeführt)
Im zweiten wir nur TV_Parasonic Einfluss haben.
Oh ok :)
Wenn ich das DOIF so aufbaue läuft es wie gewollt (DOELSEIF([IT_F000FFFFFF:state] eq "off" and [TV_Parasonic_ETW60:power] eq "on")):
([IT_F000FFFFFF:state] eq "on")
(IF ([AVReceiver:power] eq "on")
(
set AVReceiver:FILTER=input!=cd input cd,
set AVReceiver:FILTER=volume!=38 volume 38,
set AVReceiver:FILTER=listeningMode!=extendedStereo listeningMode extendedStereo
)
ELSE
(
{GetHttpFile("192.168.0.120","/json?pass=1996&plain=[{%27data%27:%27A55A38C7%27,%20%27type%27:%27NEC%27,%20%27length%27:32,%27cdelay%27:5000},{%27data%27:%27A55A32CD%27,%20%27type%27:%27NEC%27,%20%27length%27:32}]")}
))
DOELSEIF([IT_F000FFFFFF:state] eq "off" and [TV_Parasonic_ETW60:power] eq "on")
(
set AVReceiver:FILTER=input!=hdmi1 input hdmi1,
set AVReceiver:FILTER=volume!=29 volume 29
)
DOELSEIF([IT_F000FFFFFF:state] eq "off" and [TV_Parasonic_ETW60:power] eq "off")
(
set AVReceiver:FILTER=power!=off off
)
Aber wenn ich das so aufbaue, wird das DOELSEIF nicht getriggert (DOELSEIF([TV_Parasonic_ETW60:power] eq "on"))
Da ich dachte das sich DOIF() DOELSEIF() wie if{}else{} verhält..
([IT_F000FFFFFF:state] eq "on")
(IF ([AVReceiver:power] eq "on")
(
set AVReceiver:FILTER=input!=cd input cd,
set AVReceiver:FILTER=volume!=38 volume 38,
set AVReceiver:FILTER=listeningMode!=extendedStereo listeningMode extendedStereo
)
ELSE
(
{GetHttpFile("192.168.0.120","/json?pass=1996&plain=[{%27data%27:%27A55A38C7%27,%20%27type%27:%27NEC%27,%20%27length%27:32,%27cdelay%27:5000},{%27data%27:%27A55A32CD%27,%20%27type%27:%27NEC%27,%20%27length%27:32}]")}
))
DOELSEIF([TV_Parasonic_ETW60:power] eq "on")
(
set AVReceiver:FILTER=input!=hdmi1 input hdmi1,
set AVReceiver:FILTER=volume!=29 volume 29
)
DOELSEIF([IT_F000FFFFFF:state] eq "off" and [TV_Parasonic_ETW60:power] eq "off")
(
set AVReceiver:FILTER=power!=off off
)
ZitatDa ich dachte das sich DOIF() DOELSEIF() wie if{}else{} verhält..
Nein. Eher wie
if{} elsif {}
Zitat von: amenomade am 06 August 2017, 20:06:13
Nein. Eher wie if{} elsif {}
Sorry, meinte ich auch.
Also muss ich nicht nochmals [IT_F000FFFFFF:state] im DOELSEIF prüfen, da ich ja das schon erledigt habe im DOIF... Richtig ?
Doch, wie oben geschrieben, wenn Du willst, dass [IT_F000FFFFFF:state] zur DOELSEIF Bedingung/trigger gehört.
Ahhhh, nun ist der Groschen gefallen .... ;D
Danke für die Erläuterung.
Gruß
Dennis