[Gelöst] DOIF führt Befehl aus obwohl Bedingung nicht erfüllt sein sollte

Begonnen von juemuc, 10 September 2017, 22:15:33

Vorheriges Thema - Nächstes Thema

juemuc

Hallo,
ich verstehe nicht, warum die Befehl im doif nach der if-Abfrage ausgeführt werden.
(["Sonos_Buero:appeared"])
(if (ReadingsVal('Sonos_Buero','currentFavouriteName','') eq "") and
    (ReadingsVal('Sonos_Buero','transportState','') ne "PLAYING"))
({ my $cFN = ReadingsVal('Sonos_Buero','currentFavouriteName','');;
   my $tS  = ReadingsVal('Sonos_Buero','transportState','');;
   fhem("set Test1 $cFN");;
   fhem("set Test2 $tS")})


In Test1 steht dann ein Sendername und in Test2 "PLAYING". Sieht jemand den Fehler?

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

amenomade

Das Fhem Befehl lautet IF und nicht if.
([Sonos_Buero:"appeared"])
(IF ([Sonos_Buero:currentFavouriteName] eq "" and [Sonos_Buero:transportState] ne "PLAYING")
    (set Test1 [Sonos_Buero:currentFavouriteName], set Test2 [Sonos_Buero:transportState]))
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

#2
oder
([Sonos_Buero:"appeared"] and [?Sonos_Buero:currentFavouriteName] eq "" and [?Sonos_Buero:transportState] ne "PLAYING")
    (set Test1 [Sonos_Buero:currentFavouriteName], set Test2 [Sonos_Buero:transportState])


Wobei ich nicht verstehe, warum Du Test1 auf Sonos_Buero:currentFavouriteName setzen willst, wenn dieser gleich "" ist. Du könntest einfach set Test1 "" schreiben
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

juemuc

Hallo,

Sonos_Buero:currentFavouriteName ist eben nicht gleich "" sondern beinhaltet den Namen eines Senders. D.h. das die beiden set-Befehle nicht ausgeführt werden dürften. Diese dienen auch nur zur Fehleranalyse.
Eine Änderung in IF hat keine Verbesserung gebracht. Die Befehle wurden trotzdem ausgeführt.

Viele Grüße
Jürgen
 
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

amenomade

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

CoolTux

Zitat von: juemuc am 10 September 2017, 22:37:06
Hallo,

Sonos_Buero:currentFavouriteName ist eben nicht gleich "" sondern beinhaltet den Namen eines Senders. D.h. das die beiden set-Befehle nicht ausgeführt werden dürften. Diese dienen auch nur zur Fehleranalyse.
Eine Änderung in IF hat keine Verbesserung gebracht. Die Befehle wurden trotzdem ausgeführt.

Viele Grüße
Jürgen


So kann das auch nichts werden. Egal ob ich oder IF die Funktion ReadingsVal ist eine Perlfunktion. Du musst auf Perlebene gehen { }
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

CoolTux

Zitat von: amenomade am 10 September 2017, 22:30:14
oder
([Sonos_Buero:"appeared"] and [?Sonos_Buero:currentFavouriteName] eq "" and [?Sonos_Buero:transportState] ne "PLAYING")
    (set Test1 [Sonos_Buero:currentFavouriteName], set Test2 [Sonos_Buero:transportState])


Wobei ich nicht verstehe, warum Du Test1 auf Sonos_Buero:currentFavouriteName setzen willst, wenn dieser gleich "" ist. Du könntest einfach set Test1 "" schreiben

Warum nimmst Du nicht diese Vorlage. Die ist doch ok
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

juemuc

Ich mache ja alles was Ihr mir vorschlagt. Aber weiterhin erfolglos.
ZitatInternals:
   DEF        (["Sonos_Buero:appeared"])
([?Sonos_Buero:currentFavouriteName] eq "" and [?Sonos_Buero:transportState] ne "PLAYING")
({ my $cFN = ReadingsVal('Sonos_Buero','currentFavouriteName','');;
   my $tS  = ReadingsVal('Sonos_Buero','transportState','');;
   fhem("set Test1 $cFN");;
   fhem("set Test2 $tS")})
   NAME       Sonos_Buero_appeared_DOIF
   NR         116
   NTFY_ORDER 50-Sonos_Buero_appeared_DOIF
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2017-09-11 20:34:39   cmd             0
     2017-09-11 20:34:39   state           initialized
   condition:
     0          EventDoIf('Sonos_Buero',$hash,'appeared',0)
   devices:
   do:
     0:
       0          [?Sonos_Buero:currentFavouriteName] eq "" and [?Sonos_Buero:transportState] ne "PLAYING"
       1          { my $cFN = ReadingsVal('Sonos_Buero','currentFavouriteName','');;    my $tS  = ReadingsVal('Sonos_Buero','transportState','');;    fhem("set Test1 $cFN");;    fhem("set Test2 $tS")}
     1:
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   itimer:
   regexp:
     0:
       0          Sonos_Buero:appeared
     all:
       0          Sonos_Buero:appeared
   state:
     STATE:
Attributes:
   do         always

Im Reading Sonos_Buero:currentFavouriteName steht Antenne 1
Im Reading Sonos_Buero:transportState            steht PLAYING
Auf dem Sonosplayer läuft also Musi von Antenne 1.
Im Dummy Test1                                                  steht xxx
Im Dummy Test2                                                  steht yyy

Wenn ich nun einen Fhem restart (shutdown restart) durchführe, steht anschließend (nachdem das Ereignis Sonos_Buero:appeared eingetreten ist) in
Test1       Antenne 1
Test2       PLAYING

Dies hätte aber nicht sein dürfen, da dies durch die IF-Abfrage ja ausgeschlossen werden soll.

Ich hoffe, ich habe es verständlich erklärt.

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

pc1246

Moin
Sorry, aber das Posten des Lists als Zitat ist nicht gerade hilfreich! Versuchs doch mal mit "code einfuegen" stat "Zitat einfuegen"! Und wenn ich mir das als Laie so ansehe, dann kann das nichts werden! Warum allerdings DOIF das so umsetzt, ist auchnoch fraglich. Eine erste Vermutung laesst annehmen, dass die Klammern das bewirkt haben. Wenn Du Dich an Amenomades Vorschlag gehalten haettest, dann waerst Du bestimmt schon weiter. Diese kleinen "ands" sind schon gar nicht so unwichtig!
Gruss Christoph
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

Otto123

Hallo Jürgen,

Du solltest Dir eine Tasse Tee eingießen, tief durchatmen und dann bei Antwort #2 nochmal in aller Ruhe anfangen zu lesen.
Das was in Deinem DOIF jetzt steht kann nicht funktionieren.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

juemuc

#10
Vielleicht stehe ich auch nur auf dem "Schlauch".

- Der Code steht  in meinem 1. Code.
- Ich die IF-Abfrage aus Antwort #2 per Copy und paste übernommen. (Es geht nicht um die Befehle danach, sondern, dass diese ausgeführt werden ohne dass aus meiner Sicht die Bedingung wahr ist
- Das List war ja angefordert  ???
Hier noch einmal der aktuelle Code
defmod Sonos_Buero_appeared_DOIF DOIF (["Sonos_Buero:appeared"])\
(IF ({ReadingsVal("Sonos_Buero", "currentFavouriteName", "")} eq "") and\
    ({ReadingsVal("Sonos_Buero", "transportState", "")} ne "PLAYING"))\
({ my $cFN = ReadingsVal('Sonos_Buero','currentFavouriteName','');;;;\
   my $tS  = ReadingsVal('Sonos_Buero','transportState','');;;;\
   fhem("set Test1 $cFN");;;;\
   fhem("set Test2 $tS")})


Wir hilft mir vom "Schlauch"  :-\

Ich möchte, dass die Befehle nur dann ausgeführt werden, wenn die Sonosbox nicht den "Status" PLAYING hat und das Reading "currentFavouriteName" leer ist.

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

schnitzelbrain

Vielleicht steh ich ja auf dem Schlauch aber nach dem if hast du zweimal die klammern Reihenfolge vertauscht.
Erst ({ dann)}

Muss das nicht ({ und}) sein?

Gesendet von meinem SM-G930F mit Tapatalk


CoolTux

Zitat von: amenomade am 10 September 2017, 22:30:14
oder
([Sonos_Buero:"appeared"] and [?Sonos_Buero:currentFavouriteName] eq "" and [?Sonos_Buero:transportState] ne "PLAYING")
    (set Test1 [Sonos_Buero:currentFavouriteName], set Test2 [Sonos_Buero:transportState])


Sieht irgendwie anders aus wie das was Du übernommen haben willst
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

Otto123

#13
Schlauch:
In #2 steht der Code der Deinen Code komplett ersetzt! Ich habe das nicht geprüft, aber sieht gut aus.
Du hast jetzt in #7 irgendwaszusammengewurschtelt.  :'(

Man kann zwar im DOIF auch noch IF Bedingungen in der Tiefe einbauen. Du willst aber etwas relativ simples und genau dies hat Dir amenomade in #2 konstruiert.

DOIF Grundprinzip: Wenn etwas wahr ist -> Dann tue etwas
(Bedingung)(Ausführung)(eventuell Ausführung 2)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

juemuc

Das kommt davon wenn man versucht das Problem in verschiedenen Konstellationen nachzustellen.

Was soll ich sagen: Kaum macht man es richtig (kopiert vollständig)  ::) funktioniert es auch.  ;D

Danke für Eure Geduld und Tipps.

Viele Grüße

Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).