Bin gerade an einer Blacklist für meinen Radio-Player und habe es erst einmal mit einer Abfrage wie folgt gelöst:
defmod umschalten DOIF ([Player:currentArtist] =~ m/artist/) (set Player channelUp)
Jetzt möchte ich gerne mehrere <artist> in eine Blacklist eintragen, die ich dann auch pflegen kann.
Wie geht man denn dabei am Besten vor?
Ich hab das mittels echodevice, notify und einer sub gelöst:
sub my_AutoSkipArtist($$)
{
my ($Device, $CurrentArtist) = @_;
$CurrentArtist = (split(/:/, $CurrentArtist))[1];
my @ArtistsToSkip = split(/,/, AttrVal("echoIODev", "my_IgnoreList","n.a."));
my $actArtistToSkip = "";
my $DeviceName = AttrVal($Device, "alias", "n.a.");
foreach $actArtistToSkip (@ArtistsToSkip)
{
if($CurrentArtist =~ m/$actArtistToSkip/)
{
fhem("set $Device next");
Log3(undef, 3, "my_AutoSkipArtist Artist: $CurrentArtist auf Gerät: $DeviceName skipped!");
}
}
}
Im echodevice dann ein userattr my_IgnoreList wo ich eben die zu skippenden Artisten eintrage: Komma-separierte Liste.
Wenn ein neuer Titel/Artis kommt, dann wird die Sub aufgerufen und dort dann in einer Schleife die hinterlegten Skip-Artisten geprüft und weitergeschalten, wenn es matcht.
Hier die Erweiterung beim echoAccountDevice:
attr echoIODev userattr my_IgnoreList
attr echoIODev my_IgnoreList ArtistA,ArtistB,ArtistC
hier noch das notify:
defmod nAutoSkipArtist notify ECHO_.*:currentArtist:.* { my_AutoSkipArtist($NAME, $EVENT) }
Da es beim echodevice so ist, dass es eine zentrale Verbindungsinstanz gibt echoIODev, wo ich auch die Liste pflege aber ja verschiedene Echos habe über die gespielt wird/werden kann, gebe ich auch noch das jeweilige "Abspielgerät" mit, weil ich ja genau dort umschalten muss.
Diese "Spezialitäten" musst du halt anpassen.
Auch, wenn du bei DOIF (ohne Sub) blieben willst...
Evtl. geht statt der Schleife und Einzelprüfung auch ein "grober Match" auf die gesamte Liste...
Gruß, Joachim
super, vielen Dank!
Soweit habe ich es eingebaut, die Sub läuft auch ohne Fehler, muss jetzt nur noch "warten", bis mal ein Treffer kommt.
Ich streame Radiosender wo ich leider die Playlist nicht im voraus kenne. Wenn ich den Artist auf die IgnoreListe setzte wenn er schon läuft wird ja kein Event mehr ausgelöst - Software Testen ist schon mühsam >:(
Zitat von: grappa24 am 19 November 2022, 14:58:07Ich streame Radiosender wo ich leider die Playlist nicht im voraus kenne.
Zum Testen kannst du ja auch mal den Sender wechseln, das ist der Software ja egal.
Allerdings haben die Sender, von denen ich es von früher kenne, dass sie die List vorab eingestellt hatten, inzwischen umgestellt.
Aber: schieb den Wert in eine Variable und wenn das nächste Lied/Event kommt, überträgst du die Variable statt der echen Info.
Man kann ja auch mal mogeln und ein setreading mit passendem Artist absetzen ;)
Gruß, Joachim
Joachim, jetzt musst du mir mal mit der Logik deiner Routine helfen.
$CurrentArtist = (split(/:/, $CurrentArtist))[1]
Wie sehen deine $CurrentArtist konkret aus, wie deine my_IgnoreList, verstehe nicht, warum du beim split den ":" nimmst :-\
Die Sub läuft zwar bei mir, tut aber nicht, das wass sie soll.
Bei mir wäre z.B. currentArtist "Michael Schulte" (sorry) und artist nur "Schulte", deshalb auch mein Vergleich ([Player:currentArtist] =~ m/artist/)
Du musst aufpassen: das CurrentArtist mit dem split mi Doppelpunkt ist das was über das notify ($EVENT) übergeben wird.
D.h. du musst halt schauen was du in die Sub hineinbekommst, also beim Aufruf "reinstopfst"...
Die Variable mit der Skipliste ist @ArtistsToSkip und $actArtistToSkip in der Schleife...
Du kannst ja zu Beginn eine Logausgabe machen und ausgeben lassen was rein kommt.
Hatte/habe ich auskommentiert drin aber (da eigentl. unnötig) gelöscht beim Posten...
Gruß, Joachim
Schau mal, das ist das automatisch generierte notify ausgehend vom Event Monitor wenn ich ein "setreading HEOSPlayer376628887 currentArtist Michael Schulte" ausführe:
defmod HEOSPlayer376628887_notify_1 notify HEOSPlayer376628887:currentArtist:.Michael.Schulte {}
Wie würdest du dann my_AutoSkipArtist(...) aufrufen? Irgendwie scheint das bei dir anders zu sein ...
Naja, wie geschrieben: ich übergebe ja schon mal das "auslösende Device": $NAME
Muss ich, da es ja unterschiedliche Abspielgeräte sein können.
Wenn du das nicht brauchst, nur ein Abspieldevice -> weglassen
Dann triggert MEIN notify auf jede Änderung vom Reading CurrentArtist von jedem meiner Echos.
Wenn du nur ein Abspielgerät hast, dann anpassen.
Dein notify triggert ja aktuell auf genau einen Artisten, nämlich: Michael Schulte
Du wirst doch beim Anlegen im Eventmonitor gefragt: genau für dieses Event oder für alle dieses readings oder so ähnlich -> du brauchst letzteres!
Also so:
defmod HEOSPlayer376628887_notify_1 notify HEOSPlayer376628887:currentArtist:.* {}
Aufruf dann so:
defmod HEOSPlayer376628887_notify_1 notify HEOSPlayer376628887:currentArtist:.* {my_AutoSkipArtist($NAME, $EVENT)}
oder eben ohne Device:
defmod HEOSPlayer376628887_notify_1 notify HEOSPlayer376628887:currentArtist:.* {my_AutoSkipArtist($EVENT)}
Aber dann eben auch die Sub anpassen (jaja: besser ohne "Prototyp" ;) ):
sub my_AutoSkipArtist($)
{
my ($CurrentArtist) = @_;
# $CurrentArtist = (split(/:/, $CurrentArtist))[1];
my @ArtistsToSkip = split(/,/, AttrVal("HEOSPlayer376628887", "my_IgnoreList","n.a."));
my $actArtistToSkip = "";
Log3(undef, 3, "my_AutoSkipArtist Artist: $CurrentArtist");
return;
foreach $actArtistToSkip (@ArtistsToSkip)
{
if($CurrentArtist =~ m/$actArtistToSkip/)
{
fhem("set HEOSPlayer376628887 next");
}
}
}
Aufpassen du wirst verm. Fehler bekommen, weil sich die "Aufrufstruktur" der Sub geändert hat (-> Stichwort "Prototyp")...
EDIT: evtl. Sub und notify löschen und noch mal konsistent neu. (wobei ich dachte, dass wenn man so "komplizierte Dinge" angeht man zumindest die Grundlagen usw. beherrscht 8) )...
Jetzt mal "aufrufen" (notify triggern) und ins Log schauen, da sollte dann stehen "wie" der aktuelle Artist "übergeben" wird.
Wenn das "einfach so" passt , um mit der Liste zu vergleichen -> dann kann das auskommentierte wegbleiben:
# $CurrentArtist = (split(/:/, $CurrentArtist))[1];
Wenn das was mit $EVENT reinkommt nicht passt, dann eben entsprechend passend machen, dazu ist BEI MIR diese Zeile da.
Kann bei DIR nat. unnötig sein oder anders aussehen.
Evtl. auch statt $EVENT $EVTPART1 oder so übergeben: das musst du wissen/prüfen/anpassen...
Wenn du per Logausgabe geprüft hast was/wie der Artist "übergeben" wird und das passt, dann das return oben einfach raus und besser auch die Logausgabe raus und halt die Liste (userattr am Device HEOSPlayer376628887) füllen und testen.
Gruß, Joachim
Danke für deine Geduld!
>wobei ich dachte, dass wenn man so "komplizierte Dinge" angeht man zumindest die Grundlagen usw. beherrscht
:P Ich hab lange in C/C++ programmiert, aber mit PERL werde ich mich nie anfreunden - oder ich bin mittlerweile zu alt
Mein Fehler war viel subtiler, ich hatte zunächst analog zu deinem Ansatz wie folgt codiert
HEOSPlayer_.*:currentArtist:.* { my_AutoSkipArtist($NAME, $EVENT) }
aber übersehen, dass meine HEOSPlayer keinen "Unterstrich" im Namen haben. Dieses notify konnte nicht anspringen ;D
Ohne "Unterstrich" läuft es jetzt.
Danke nochmals!
Ich habe (und tue es noch) C, C++ (C#) programmiert...
...Perl: naja ;)
...zu alt?
Quatsch: lebenslanges lernen... 8)
Na dann: [gelöst] ? :)
Viel Spaß, Joachim
Zitat von: MadMax-FHEM am 20 November 2022, 16:35:22
...zu alt?
Ich hab an der Uni noch FORTRAN mit Lochkarten codiert 8)