Modul für WLAN Radios mit Frontier Silicon Chipsatz (SilverCrest/Medion/Hama...)

Begonnen von mumpitzstuff, 07 November 2017, 00:21:27

Vorheriges Thema - Nächstes Thema

cocojambo

"event-on-change-reading" oder sowas in der Art - gibt es nicht bei Readingsgroups.
Damit geht es jetzt, was die Aktuallisierung angeht:
attr Wlan_Radio_Kueche alias Kueche Wlan Radio
attr Wlan_Radio_Kueche compatibilityMode 0
attr Wlan_Radio_Kueche devStateIcon Ein:it_radio@green Stop:it_radio@red
attr Wlan_Radio_Kueche event-on-change-reading .*
attr Wlan_Radio_Kueche event-on-update-reading .*
attr Wlan_Radio_Kueche eventMap on:Ein off:Stop
attr Wlan_Radio_Kueche fp_Radio 12,729,2,Wlan_Radio_Kueche
attr Wlan_Radio_Kueche group Küche
attr Wlan_Radio_Kueche notifications 0
attr Wlan_Radio_Kueche onOffDevice true
attr Wlan_Radio_Kueche room Küche
attr Wlan_Radio_Kueche streamPath /opt/fhem/
attr Wlan_Radio_Kueche webCmd Ein:Stop


Aber die Play/Pause hängt sich immer noch auf. Wenn ich Pause betätige,bei das Radio stumm und erscheint in der App das  Play Symbol. Von dort kann ich das Radio auch einwandfrei wieder starten, aber nicht von FHEM aus.
Übrigens das Gleiche passieret wenn ich ein TTS Signal absetze, die Sprachausgabe geht, danach aber bleibt das Radio wieder stumm und läßt sich nicht wieder erwecken zum Play.
Deine play Commands sind die richtig mit stop und play jeweils = 0?
playCommands
0:stop,0:play,2:pause,3:next,4:previous

Dann ist ja nur play geändert, alles andere wie zB. Pause bleibt?

Gruß
Norbert
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

mumpitzstuff

Bei mir ist Stop und Play das Gleiche. Die 0 wird dann einfach als Toggle verwendet. Ich könnte mir vorstellen, das Play und Pause bei dir das Gleiche ist (nur so eine Idee). Was Passiert denn, wenn du Play drückst und danach noch mal Play? Oder was passiert wenn du Pause drückst und anstatt Play noch einmal Pause?

mumpitzstuff

Ansonsten kann man gewisse Dinge auch in der Weboberfläche ausprobieren bzw. auslesen. Ich guck mal ob ich was finde. Ist schon echt lang her das ich mich damit beschäftigt habe.

So habe jetzt mal geschaut:

Damit kannst du auslesen:
http://<deine radio ip>/fsapi/GET/netRemote.play.control?pin=<deine pin>


Hiermit kannst du setzen (value kann sich zwischen 0-4 bewegen glaube ich):
http://<deine radio ip>/fsapi/SET/netRemote.play.control?pin=<deine pin>&value=0

Mir ist beim rumspielen aufgefallen, das einige Dinge wie z.B. Pause beim Internetradio gar nicht funktionieren. Ich kann da zwar was setzen, aber bei mir passiert einfach gar nichts. Beim Internetradio geht bei mir nur Play und Stop, was bei mir als toggle mit der 0 funktioniert.

PS: http://<deine radio ip>/fsapi/GET/netRemote.play.status?pin=<deine pin> gibt es wohl auch noch (1=buffering/loading, 2=playing, 3=paused)

cocojambo

Wenn ich mit Get auslese kommt folgende Meldung:
<fsapiResponse>
<status>FS_OK</status>
<value>
<u8>1</u8>
</value>
</fsapiResponse>


und wenn ich Set eingebe:
<fsapiResponse>
<status>FS_OK</status>
</fsapiResponse>


Du hast recht, wenn ich das noch mal wiederhole, ist der Ton wieder da.
Muß ich das jetzt auch bei ValueIcon ändern oder/und in deiner 17_SIRD.pm ändern?

Gruß
Nobbi
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

mumpitzstuff

Dann musst du dir nur noch das playCommands Attribut entsprechend zusammen basteln und dann sollte es doch gehen.

cocojambo

Das commando habe ich zusammengebastelt und funktioniert.
"playStatus.playing" => "set %DEVICE stop",
"playStatus.stopped" => "set %DEVICE stop",

Im Log habe ich dann gesehen, das nach jedem Senderwechsel ein "playStatus.buffering" während der Werbung ausgegeben wird. Den habe ich dann mit einem Zahnradsymbol belegt. Geht auch. Aber wenn ich das Radio während Play über off ausschalte steht an der Stelle des Play Buttons das Wort "idle" und verschwindet wieder und die Stelle bleibt leer. Dort wollte ich ebenfalls "playStatus.idle" (steht so im EventMonitor) durch ein Icon ersetzen, das kriege ich leider nicht hin.
"playStatus.playing" => "rc_PAUSE@#e56524",
"playStatus.stopped" => "rc_PLAY",
"playStatus.buffering" => "rc_SETUP",
"playStatus.idle" => "rc_PLAY",


Beim Einschalten der Radios, ist mir aufgefallen, werden die Input und Preset Einstellungen vom InternetRadio nicht abgerufen werden (syncronisiert werden). Es wird immer in der Preset Pull-Down Listefeld der oberste Sender angezeigt unabhängig davon welcher Sender als Letzter beim Auschalten lief und jetzt wiedergegeben wird. Daher ist es nicht möglich diesen Sender anzuklicken, sondern man muß erst einen x-beliebigen Sender anwählen, und kann dann zurück um den vorher angezeigten Sender abzuspielen.
Na ich muß zugeben, ist was umständlich erklärt aber vielleicht weiß du ja was ich meine.

Gru
Nobbi
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

mumpitzstuff

Das mit dem idle kann ich mir nur so erklären, das der Zustand nur ein kurzer Übergangszustand ist und deshalb die Zeit zu kurz ist ist.
Das mit den Presets habe ich verstanden und muss ich mir mal ansehen. Ich melde mich diesbezüglich noch einmal.

mumpitzstuff

Das Problem mit den Presets konnte ich zwar nachvollziehen, ich habe aber keine Lösung dafür finden können. Im Prinzip müsste man dem Dropdown einen Default mitgeben. Ich konnte aber nichts darüber finden ob und wenn ja, wie das möglich ist.
Vom Prinzip her ist die Information aber vorhanden, denn wenn man sich die RAW defintion ansieht, dann findet man da diesen Eintrag:

setstate RADIO_WOHNZIMMER 2022-12-20 18:28:45 .lastPreset <0-X>

Das wäre quasi auch der Initialisierungswert für das Dropdown Menü.

Ich fürchte, mit der Einschränkung wirst du leben müssen.

PS: Eventuell könnte man die Liste aber noch in der Funktion filterReading sortieren, so das der aktuell aktive Eintrag als erstes in der Liste steht. Muss ich noch mal drüber nachdenken...

mumpitzstuff

Versuch mal bitte folgendes:

Zuerst ersetzt du in der myUtils die filterReading Funktion durch diese hier:

sub filterReading($;$)
{
  my ($reading, $default) = @_;
 
  if (defined($default) && ('' ne $default))
  {
    my @list = split(',', $reading);
    if (($default > 0) && ($default <= $#list))
    {
      my $newreading = '';
      # copy element to the front of the array
      splice(@list, 0, 0, $list[$default]);
      # remove the original element
      splice(@list, $default + 1, 1);
      foreach my $elem (@list)
      {
        if ('' eq $newreading)
        {
          $newreading = $elem;
        }
        else
        {
          $newreading .= ','.$elem;
        }
      }
      $reading = $newreading;
    }
  }
  $reading =~ s/\d+://g;

  return $reading;
}


Danach ersetzt du dann in der ReadingsGroup in den Commands die preset Zeile mit dem hier:

"preset" => ReadingsVal($DEVICE, 'input', '')."preset:".filterReading(ReadingsVal($DEVICE, '.'.ReadingsVal($DEVICE, 'input', '').'presets', ''), ReadingsVal($DEVICE, '.lastPreset', '')),

Das ist mit sehr heisser Nadel gestrickt...

yersinia

Hi mumpitzstuff,

Danke für das Modul, läuft super. :)

Kannst du diese filterReading Funktion mal testen?
sub filterReading {
  my $reading = shift;
  my $default = shift;

  my @allpresets;
  my @list = split(',', $reading); #reading contains sorted list: 1:radio1,2:radio2,3:radio3,5:radio5,7:radio7
  foreach my $elem(@list) {
  my ($id,$preset)= split(':', $elem);
if($id eq $default) {
#add current selection as first list item
unshift (@allpresets, $preset);
} else {
#add elements at end of array
push (@allpresets, $preset);
}
  }
  return join(',',@allpresets);
}

Dies erzeugt zumindest bei mir eine Liste der Presets mit dem gewählten Sender als ersten Eintrag. reading ist ja im prinzip eine sortierte liste
1:Radio,2:Radio3,5:Radio,6:Radio
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

mumpitzstuff

Ohh cool. Das sollte ebenfalls funktionieren (ich hoffe meine Funktion von oben liefert ähnliche Ergebnisse :)). Bei dir ist allerdings der Default nicht optional, deshalb wird das ja dann auch bei der Auswahl des Inputs verwendet (also Internetradio, Spotify usw.). Was hast du denn dort als default in der ReadingsGroup verwendet?
Input wäre auch ein reading, das man verwenden könnte, dann müsste man nur im Falle der Presets auf die Nummer gucken und im Falle des Inputs auf den Namen. Mit deiner Variante als Grundlage, sollte das möglich sein. Ich denke noch mal drüber nach...
Danke auf jeden Fall für deine Funktion und die Anregungen darin. Ich versuche das noch etwas auszuarbeiten und dann eine hoffentlich finale Lösung für alle zu präsentieren.

yersinia

Neee, deine Funktion hat bei mir nichts geliefert weil mein Array nicht 7 Elemente hatte und somit $default=7 nie zog.

Zitat von: mumpitzstuff am 22 Dezember 2022, 10:13:50Bei dir ist allerdings der Default nicht optional, deshalb wird das ja dann auch bei der Auswahl des Inputs verwendet (also Internetradio, Spotify usw.).
Dann machen wir es optional:
  my $reading = shift // return "enter first parameter";
  my $default = shift // "";

(keine Ahnung ob das ein guter perl stil ist)

Zitat von: mumpitzstuff am 22 Dezember 2022, 10:13:50Was hast du denn dort als default in der ReadingsGroup verwendet?
Nichts spezifisches jdfs. Jdfs nutze ich hier deinen code (btw, für die Funktionen nutze ich einen prefix SIRD_ - just in case):
"input" => "input:".SIRD_filterReading(ReadingsVal($DEVICE, '.inputs', '')),
"preset" => ReadingsVal($DEVICE, 'input', '')."preset:".SIRD_filterReading(ReadingsVal($DEVICE, '.'.ReadingsVal($DEVICE, 'input', '').'presets', ''), ReadingsVal($DEVICE, '.lastPreset', '')),


Ich hab das jetzt mit DAB getestet - und wenn SIRD das Device aktualisiert, passt dies auch. Es dauert halt nur ein wenig.

Zitat von: mumpitzstuff am 22 Dezember 2022, 10:13:50Input wäre auch ein reading, das man verwenden könnte, dann müsste man nur im Falle der Presets auf die Nummer gucken und im Falle des Inputs auf den Namen. Mit deiner Variante als Grundlage, sollte das möglich sein. Ich denke noch mal drüber nach...
Input oder .inputs? Letzteres würde auch gehen, funktioniert bei mir auch so.

Da ich mehrere WLAN Radios habe, nutze ich eine rg für alle, deine Version nur im DEF etwas abgewandelt - ist alles in einer Zeile:
defmod rg_WLAN_Radios readingsGroup TYPE=SIRD:input,!preset,volumeStraight,mute,repeat,shuffle,!previous,playStatus,!next,state,<{SIRD_getCoverTitleRG($DEVICE)}@state>
attr rg_WLAN_Radios alias WLAN Radio Steuerung
attr rg_WLAN_Radios commands {\
"state.off" => "set %DEVICE on",\
"state.on" => "set %DEVICE off",\
"input" => "input:".SIRD_filterReading(ReadingsVal($DEVICE, '.inputs', '')),\
"preset" => ReadingsVal($DEVICE, 'input', '')."preset:".SIRD_filterReading(ReadingsVal($DEVICE, '.'.ReadingsVal($DEVICE, 'input', '').'presets', ''), ReadingsVal($DEVICE, '.lastPreset', '')),\
"volumeStraight" => "volumeStraight:slider,0,1,".ReadingsVal($DEVICE, '.volumeSteps', 1),\
"playStatus.playing" => "set %DEVICE stop",\
"playStatus.stopped" => "set %DEVICE play",\
"mute" => "set %DEVICE mute toggle",\
"repeat.on" => "set %DEVICE repeat off",\
"repeat.off" => "set %DEVICE repeat on",\
"shuffle.on" => "set %DEVICE shuffle off",\
"shuffle.off" => "set %DEVICE shuffle on",\
"previous" => "set %DEVICE previous",\
"next" => "set %DEVICE next"\
}
attr rg_WLAN_Radios valueIcon {\
"state.on" => "radio_checked@#e56524",\
"state.off" => "radio_unchecked",\
"mute.on" => "rc_MUTE@#e56524",\
"mute" => "rc_VOLUP",\
"repeat.on" => "rc_REPEAT@#e56524",\
"repeat" => "rc_REPEAT",\
"playStatus.playing" => "rc_PAUSE@#e56524",\
"playStatus" => "rc_PLAY",\
"shuffle.on" => "rc_SHUFFLE@#e56524",\
"shuffle" => "rc_SHUFFLE",\
"previous" => "rc_PREVIOUS",\
"next" => "rc_NEXT"\
}
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

mumpitzstuff

Hmm komisch. Ich hätte erwartet, das auch deine Version nicht funktioniert, wenn dort ein nicht existierender default Wert übergeben wird. Aber wie auch immer, ich habe jetzt deinen Code übernommen, vor allem weil er sauberer aussieht.

Der erste Beitrag wurde jetzt entsprechend verändert. Vielen Dank!

cocojambo

Hallo,
ich habe jetzt mal wieder Zeit gefunden mir deine neue Version mal anzusehen.
Das mit den Sendern funktioniert einwandfrei auch wenn von extern die Sender geändert werden.
Das funktioniert sogar mit der Lautstärke. Toll, sehr gut.
In der Dropdownliste kann man aber noch nicht den angezeigten Sender anklicken um umzuschalten wenn von extern ein anderer Sender gespielt wurde,
was aber nicht schlimm ist, wenn man es weiß, schaltet man einfach mal hin und her bis zum gewünschten Sender.
Was aber leider "verloren gegangen" ist, das Sender mit der Programm Nr. 20 bis 30 nicht angezeigt werden.
Deine Änderung dafür, die du mal eingebaut hattest, finde ich nicht mehr.

Gruß aus Kölle
Norbert
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

mumpitzstuff

Der Code funktioniert jetzt etwas anders, sollte aber in jedem Fall ebenfalls mit zweistelligen Zahlen zurecht kommen. Mir fällt absolut nichts auf, weshalb das nicht funktionieren sollte. Kannst du mir bitte mal deine RAW Definition zukommen lassen nd einen Screenshot von den Presets in der ReadingsGroup?