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
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]))
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
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
Zeig mal ein list des DOIFs
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 { }
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
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
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
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
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
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
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
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)
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
Moin
Kurz noch mal eine Nachfrage von mir, trotz closed. Hast du jetzt #2 oder #3 genommen? #2 ist ja nur aus Deiner Anfrage entstanden, ist aber unnoetig kompliziert, durch das "IF"!
Gruss Christoph
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
Wo siehst Du bei der zweiten
ANTWORT ein IF?
Upps
Sorry, es ist der zweite Post, der die Nummer #1 traegt!
Mea culpa est!
Gruss Christoph
Siehste, liege gehe ich um die Uhrzeit immer schon im Bett ;D
Schönen Tag gewünscht