FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: juemuc am 06 Januar 2017, 21:57:43

Titel: [GELÖST] SONOS_isInList in DOIF nutzen
Beitrag von: juemuc am 06 Januar 2017, 21:57:43
Hallo,

ich benötige wieder Eure Hilfe.
Ich möchte möchte in einem DOIF mittels SONOS_isInList prüfen, ob mein gespeichert Wert in currentSender_dummy in der Favoritenliste enthalten ist.
Ich erhalte folgende Fehlermeldung

Auch der Versuch

"my @Favorites mit get Sonos_Buero:Favorites" definieren und zu füllen schlagen fehl. Die Beispiele, die ich gefunden habe, habe ich leider nicht verstanden und daher auch nicht anpassen und übernehmen können.

[/code]

2017.01.06 21:51:49 2: Sonos_Buero_Appeared_DOIF: IF (SONOS_isInList(currentSender_Buero, @Favorites) > 0) (set Sonos_Buero StartFavourite currentSender_Buero NoStart): Global symbol "@Favorites" requires explicit package name (did you forget to declare "my @Favorites"?) at (eval 294) line 1.
Bareword "currentSender_Buero" not allowed while "strict subs" in use at (eval 294) line 1.


([Sonos_Buero:presence] eq "appeared" and
[Sonos_Buero:currentSender] ne [currentSender_Buero])
(IF (SONOS_isInList(currentSender_Buero, @Favorites)) > 0)
(set Sonos_Buero StartFavourite currentSender_Buero NoStart)


Viele Grüße
juemuc
Titel: Antw:SONOS_isInList in DOIF nutzen
Beitrag von: dev0 am 07 Januar 2017, 06:51:29
SONOS_isInList() ist eine Perlfunktion, die ein Scalar und ein Array als Parameter erwartet. Du müsstest erst das Reading 'Favourites' per eval in einen Hash schreiben, dann die Keys 'Title' in das benötigte Array. Den Suchbegriff kannst Du per ReadingsVal() übergeben.

Perl benötigten Grundlagen findest Du zB. hier:
https://wiki.selfhtml.org/wiki/Perl/
http://fhem.de/commandref.html#perl
Titel: Antw:SONOS_isInList in DOIF nutzen
Beitrag von: juemuc am 07 Januar 2017, 18:25:23
Hallo,

die Favoriten habe ich ja schon in der Sonos-Variablen LastActionResult über
([Sonos_Buero:presence] eq "appeared")
({fhem ("get Sonos_Buero Favourites")})

in einem "DOIF-Befehl" gelesen.

Allerdings funktioniert dann die weitere Verarbeitung über

([Sonos_Buero:presence] eq "appeared")
({fhem ("get Sonos_Buero Favourites");; 
  my $f = ReadingsVal("Sonos_Buero", "LastActionResult", "Keine"))})
   

nicht.

Es kommt die Meldung
2017.01.07 21:01:57 2: sonos_doif: {fhem ("get Sonos_Buero Favourites");;   my $f = (ReadingsVal("Sonos_Buero",            "LastActionResult", "Keine")) }: GetFavourites: "ANTENNE BAYERN","Absolut relax","Bayern 3","ENERGY München","Gong 96.3","SWR3 Elchradio","antenne 1","sunshine live"

Wie muss ich den zweiten Teil einbauen? Es sind die Werte, die ich dann in einer @-Variablen benötige.  Dies wollte ich mit dem Split-Befehl durchführen.
Übernommen habe ich das Coding von http://www.juergenstechnikwelt.de/smarthome-2/sonos-integration-in-fhem/


Viele Grüße
juemuc
Titel: Antw:SONOS_isInList in DOIF nutzen
Beitrag von: dev0 am 08 Januar 2017, 05:35:28
Zitat von: juemuc am 07 Januar 2017, 18:25:23
fhem ("get Sonos_Buero Favourites");; my $f = ReadingsVal("Sonos_Buero", "LastActionResult", "Keine")

Das funktioniert so nicht, da 'get Favourites' mWn asynchron arbeitet: In dem Scalar bekommst Du das Ergebnis, dass schon vor dem get Aufruf in dem Reading stand.
Titel: Antw:SONOS_isInList in DOIF nutzen
Beitrag von: juemuc am 08 Januar 2017, 15:54:21
Zitat von: dev0 am 08 Januar 2017, 05:35:28
Das funktioniert so nicht, da 'get Favourites' mWn asynchron arbeitet: In dem Scalar bekommst Du das Ergebnis, dass schon vor dem get Aufruf in dem Reading stand.

Hallo,

aber warum steht dann der benötigte Inhalt in der Fehlermeldung? Gibt es Alternativen?

Viele Grüße
juemuc
Titel: Antw:SONOS_isInList in DOIF nutzen
Beitrag von: dev0 am 08 Januar 2017, 16:46:22
Vmtl. weil das Reading vorher schon den Inhalt hatte. Eine mögliche Alternative habe ich oben bechrieben.
Titel: Antw:SONOS_isInList in DOIF nutzen
Beitrag von: juemuc am 19 Januar 2017, 22:32:31
Hallo zusammen,

nachdem ich nun seit Tagen verschiedenste Möglichkeiten getestet habe, benötige ich Eure Hilfe.

In einer Sonos-Variablen "Favoriten" steht eine Liste der Sender in der Form "ANTENNE BAYERN","Absolut relax","Bayern 3","ENERGY München","Gong 96.3","SWR3 Elchradio","antenne 1","sunshine live"
In einem dummy currentSender_Buero steht ebenfalls ein Sendername Bayern 3.

Nun möchte ich mit SONOS_isInList innerhalb eines DOIF prüfen, ob der Wert aus currentSender_Buero in den Favoriten enthalten ist und dann ein "set" ausführen.

Das nachfolgende Coding funktioniert nun



([Sonos_Buero:currentSender] ne "X")
({my $f="[currentSender_Buero]";;
  my $exists = SONOS_isInList($f,
   ([Sonos_Buero:Favoriten]));;
  fhem("set favoriten_true $exists")},

IF ([favoriten_true] eq "1")
(set sonos_test {(urlEncode("[currentSender_Buero]"))})
ELSE
(set sonos_test {(urlEncode("[currentSender_default]"))}))


juemuc