Hauptmenü

[gelöst] DOIF Verschachtelt

Begonnen von Shojo, 04 August 2017, 12:01:07

Vorheriges Thema - Nächstes Thema

Shojo

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)
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

CoolTux

Da musst Du dann IF nehmen. Das ist ein FHEM Befehl. Schaue mal in die Commandref
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Shojo

#2
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)


FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Shojo

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.
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

Per

Pack mal nen Leerzeichen hinter IF.

Shojo

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.
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

Per

Schon mal in der CommandRef geschaut? Bissel viele Klammernpaare, bevor dein ELSE kommt!

Shojo

#8
Zitat von: Per am 04 August 2017, 15:18:51
Schon mal in der CommandRef 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! 
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

amenomade

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
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Shojo

Das kann ich dir leider nicht sagen....
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

Per

Vllt. ein <tab>, DOIF war da anfangs auch recht sensibel.

Damian

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

Shojo

#13
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
)
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

Shojo

Hat da wer noch eine Antwort für mich?
Oder war jetzt die Frage einfach zu blöd? :)
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

amenomade

#15
Verstehe die Frage nicht ;)

EDIT: Ah doch, Moment. Du fragst ob das DOELSEIF im 2. Beispiel reicht
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

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

amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Shojo

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
)
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

amenomade

ZitatDa ich dachte das sich DOIF() DOELSEIF() wie if{}else{} verhält..

Nein. Eher wie if{} elsif {}
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Shojo

#20
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 ?
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

amenomade

#21
Doch, wie oben geschrieben, wenn Du willst, dass [IT_F000FFFFFF:state] zur DOELSEIF Bedingung/trigger gehört.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Shojo

Ahhhh, nun ist der Groschen gefallen ....  ;D

Danke für die Erläuterung.

Gruß
Dennis
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It