Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

Begonnen von Otto123, 31 Mai 2020, 18:30:55

Vorheriges Thema - Nächstes Thema

Otto123

Klares Ja! Ich verhake mich manchmal in anderen Dingen, dann wird es nicht gleich ;)

Dann schau ich jetzt mal, wie es mit mehr als einem Reading geht. Ich will nicht diesen ganzen Korb an redundanten Readings übernehmen.
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

Otto123

#1066
So da wären jetzt die 3 Readings :)
sub sonos2mqtt_reading
{
my ($NAME,$EVENT,$TOPIC)=@_;
my $uuid = ReadingsVal($NAME,'uuid','');
my $player = lc( ReadingsVal($NAME,'name','') );
$TOPIC =~ m,.*/status/(.*)/avtransport,;
if ( $1 eq $uuid or $1 eq $player )  {
    my %hash;
    if ($EVENT =~ m/"AlarmRunning":(true|false)/) {$hash{"AlarmRunning"}=$1}
    if ($EVENT =~ m/"SleepTimerGeneration":(\d+)/) {$hash{"SleepTimerGeneration"}=$1}
    if ($EVENT =~ m/"SnoozeRunning":(true|false)/) {$hash{"SnoozeRunning"}=$1}
    return \%hash
  }
}

Jetzt müsste man Snooze auch noch einbauen? Oder geht das auch am Gerät oder in der App? Bin irgendwie zu doof. Ich bekomme das nur mit dem Sonos Modul von Reiner hin. ;)
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

Ralli

 :)

Für ein per FHEM auszulösendes Snooze hatte ich bislang keinen Anwendungsfall, muss ich mich selbst erst einmal schlau machen. Ich reagiere nur auf das Reading, will also in FHEM mitbekommen, dass einer auf den berühmten Knopf gedrückt hat  8).
Gruß,
Ralli

Proxmox 8.1 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.6.20240316) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

Otto123

#1068
Wobei es keinen echten Knopf gibt sondern nur die Funktion in der App? Steht in irgendeiner Beschreibung, ich sehe ihn nicht  :'(

Von FHEM aus kann man den SnoozeKnopf so drücken - x_raw_payload:
{
  "command": "adv-command",
  "input": {
    "cmd": "AVTransportService.SnoozeAlarm",
    "val": {
      "InstanceID": 0,
      "Duration": "00:05:00"
      }
  }
}
siehe https://svrooij.io/node-sonos-ts/sonos-device/services/av-transport-service.html#snoozealarm
Kann man ja noch einbauen.  ;D
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

svrooij

Zitat von: Otto123 am 26 Mai 2021, 10:30:48
Hallo Karsten,

so ist es und so ist die default Einrichtung. Steht auch so im Wiki https://wiki.fhem.de/wiki/Sonos2mqtt

Zu sonos-tts-polly: Es ist alles eine Erweiterung der Erweiterung :) letztlich ist es ein Zoo aus nodejs Modulen.
Man kann npm sicher sagen: Installiere nicht in default sondern in diesen Pfad, hab ich aber irgendwie nicht verstanden wie.
Man kann auch sicher dieses /usr/bin/sonos-tts-polly Script starten - ich habe aber auch nicht verstanden wie :)
Letztlich hat das Ding ein paar Parameter beim Aufruf - find ich nicht so kompliziert. Die nodejs Dokumentation sind zum großen Teil automatisch generiert, besser als nix aber eben auch nur so gut wie sich es der Programmierer ausgedacht hat. Und der weiß ja wie sein Programm funktioniert ;)

Gruß Otto

Did you see the documentation on sonos-tts-polly? https://github.com/svrooij/node-sonos-tts-polly#run-your-own-server-in-node

It's a small webserver, to start it you'll need 1. a free port to host on 2. an amazon key (see documentation). It then runs in the background and you can use it to generate mp3 files. The problem with Sonos is that to be able to play an mp3 from some webserver, the file name has to end with .mp3 for it to be recognized
Hardcore software developer. See https://github.com/svrooij/

Otto123

#1070
Ich habe mal das Alarmhandling in die Utils eingebaut
Funktionsumfang
  • Wecker auslesen und Einstellungen aktualisieren, aktivieren, deaktivieren
  • Feststellen ob Wecker aktiv
  • Wecker unterbrechen
Der Wecker ist gekennzeichnet mit einer ID!, weitere Beschreibung der Parameter https://svrooij.io/node-sonos-ts/sonos-device/services/alarm-clock-service.html#updatealarm
Achtung: Es funktionieren nach meinen Tests nicht alle Parameter! Mir gelingt es z.B. nicht IncludeLinkedZones zu setzen.

Den Einbau in die sonos2mqtt_utils habe ich ein klein wenig anders gemacht als Ralli, aber danke für die Vorarbeit - die ich genutzt habe!  ;)
ich habe mich am Sonos Modul von Reiner orientiert.
Bridge
get SonosBridge listalarms liefert das Reading Alarms in der SonosBridge ( listalarms:noArg $DEVICETOPIC/cmd/listalarm)
set SonsoBridge setalarm - in der SonosBridge schreibt die Veränderung der Alarms zurück setList setalarm:textField $DEVICETOPIC/cmd/setalarm
Mit der Sub sonos2mqtt_alarm('SonosBridge','') werden die Readings AlarmListIDs und AlarmList in den Playern daraus erzeugt/zugeordnet. Das kann man mit einem "Dummy" userReadings in der Bridge automatisch machen. Dieser Teil ist noch nicht im Setup! Diese wird mit einem bedingten sleep von listalarms aufgerufen
Player
AVTransport liefert über eine Sub die Readings AlarmRunning, SleepTimerGeneration, SnoozeRunning mittels $DEVICETOPIC/status/(.*)/avtransport:.* { sonos2mqtt_reading($NAME,$EVENT,$TOPIC) }
Die sub sonos2mqtt_alarms:  realisiert die Funktion alarm enable|disable|update all|ids|json
Die Kommandos werden um snoozeAlarm erweitert. 5 Minuten weiter schlafen:
set alias=Arbeitszimmer snoozeAlarm 00:05:00Der setList und readingList werden über setup in Bridge und Player eingebaut.
Beispiele:
set alias=Arbeitszimmer alarm disable all
set alias=Arbeitszimmer alarm disable 73
set alias=Arbeitszimmer alarm enable 73,97,100
set alias=Arbeitszimmer alarm update {"ID":73,"Duration":"04:00:00"}
set alias=Arbeitszimmer alarm {(my $start = strftime("%H:%M:%S",localtime(time+5));; return qq(update {"ID":73,"StartLocalTime":"$start","Enabled":true,"Volume":20}))}
Achtung letztes Beispiel ist set magic mit Perl! Vorletztes Beispiel ist einfach ein json String!
Die verwendbaren Inhalte entnimmt man einfach den Readings AlarmList oder AlarmListIDs.
Das letzte Beispiel nutzt die Weckfunktion für einen zeitlich begrenzten Softstart in Kürze (5 sec)  8)

Die neue Utils sollte kompatibel zur alten sein! Wer sie runterladen will Achtung: Vorhandene wird überschrieben!
{ Svn_GetFile("contrib/AttrTemplate/99_sonos2mqttUtils.pm", "FHEM/99_sonos2mqttUtils.pm", sub(){ CommandReload(undef, "99_sonos2mqttUtils") }) }Dann einmal setup machen um die definitionen anzupassen
{sonos2mqtt_setup();;sonos2mqtt_setup('a:model=sonos2mqtt_bridge')}
Edit Dezember 2023:
diese Erweiterung eingebaut https://forum.fhem.de/index.php?topic=111711.msg1267736#msg1267736

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

Ralli

#1071
Super, vielen Dank - und gerne  ;).

Zitat
Mit der Sub sonos2mqtt_alarm('SonosBridge','') werden die Readings AlarmListIDs und AlarmList in den Playern werden daraus erzeugt/zugeordnet. Das kann man mit einem "Dummy" userReadings in der Bridge automatisch machen. Dieser Teil ist noch nicht im Setup!


userReadings alarmLists:Alarms:.* {sonos2mqtt_alarm($name,'alarmlist')}


Mit dem von dir vorgeschlagenen Userreading klappt das bei (noch) nicht. Stattdessen behelfe ich mir so:


def SonosBridgeAlarmHelper notify MQTT2_SonosBridge:Alarms.* {sonos2mqtt_alarm('MQTT2_SonosBridge','')}
Gruß,
Ralli

Proxmox 8.1 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.6.20240316) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

svrooij

Sorry for my English, while I can read Deutsch my writing is not that good.

You can load all alarms by calling the global command https://svrooij.github.io/sonos2mqtt/global-commands.html *ListAlarm* (bug, in beta renamed to *ListAlarms*). The alarms will then be published to sonos/alarms

There is also an advanced command https://svrooij.github.io/sonos2mqtt/control/advanced.html to update a few parameters of an alarm. The UpdateAlarm needs all parameters. The *PatchAlarm* loads the old values so you don't have to. It's "undocumented" because it's not available in the speaker, but I've build it myself.

Here is the code https://github.com/svrooij/node-sonos-ts/blob/08198914ab7b09eec2350c59a3bf08cd8e207c03/src/services/alarm-clock.service.extension.ts#L66

You can call it with the Advanced Command.

{
  "command": "adv-command",
  "input": {
    "cmd": "AlarmClockService.PatchAlarm",
    "val": {
      "ID": 1230,
      "Enabled": true
    }
  }
}

For other parameters see the above code link.

Hardcore software developer. See https://github.com/svrooij/

Otto123

@Stephan thanks that you attend to the discussion :)
as I understand, the global command setalarm is doing the same job than PatchAlarm? Or setalarm is using the PatchAlarm?
So I can update certain Elements  like "Enabled" or "StartLocalTime" - I can see the code. This clarifies, that not all Parameter will working.

Ok. If I want doing more than setalarm, I have to use UpdateAlarm with a full qualified json - right?
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

Ralli

#1074
Lieber Otto,

für die nächste Veränderung/Erweiterung hätte ich noch eine Bitte:

Das Einstellen der Lautstärke mit volume xy sollte m.E. nicht per default mit Rampe sein sondern direkt. Eine Einstellung mit Rampe sollte dann eher mit einem zusätzlichen Parameter aktiviert werden.

Ich behelfe mir momentan mit "set Speaker 25 25", um direkt die Lautstärke 25 einzustellen. Das entspricht aber nicht dem sonst üblichen "Standard" in FHEM, denn als zusätzlicher Parameter wird eher die Ramptime angegeben (oder ein Startwert).

Also:

"set Speaker volume 25" sollte m.E. direkt auf 25 gehen,
"set Speaker volume 25 10" könnte das Verhalten, welches du bereits implementiert hast, abbilden - also von 10 auf 25 erhöhen. Die Kür wäre, wenn mit einem "set Speaker volume 25 -1" ein sukzessives Erhöhen oder eine sukzessive Reduktion vom aktuellen volume-Wert durchgeführt würde.

Gerade habe ich noch festgestellt, dass das Reading "Master" nicht korrekt gesetzt wird. Ist im Namen des Speakers ein Leerzeichen, wird bei diesem Reading abgeschnitten. Es steht also in dem Reading "Rumpelstilzchens" statt "Rumpelstilzchens Roam" drin.
Gruß,
Ralli

Proxmox 8.1 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.6.20240316) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

Otto123

Zitat von: Ralli am 11 Juni 2021, 14:17:24
Mit dem von dir vorgeschlagenen Userreading klappt das bei (noch) nicht. Stattdessen behelfe ich mir so:


def SonosBridgeAlarmHelper MQTT2_SonosBridge:Alarms.* {sonos2mqtt_alarm('MQTT2_SonosBridge','')}

Ich habe jetzt ne Weile überlegt und hingeschaut, aber was machst Du mit der DEF (ein notify?) anders als ich mit dem userReadings? Der zweite Parameter ist völlig egal und der erste muss der Name der Bridge sein. Das ist er ja mit $name...
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

Ralli

#1076
Tja, mmh, es klappt halt mit dem userReading nicht, aber mit dem notify ...

Sorry, du hast natürlich Recht, in der Def fehlt das "notify" - ja, es ist eins  ::)

Edit:
Fehler gefunden. In den userReadings fehlte vor dieser neu eingefügten Zeile das Komma. Jetzt klappt's auch mit deinem Ansatz und ohne notify.
Gruß,
Ralli

Proxmox 8.1 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.6.20240316) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

binford6000

ZitatIch behelfe mir momentan mit "set Speaker 25 25", um direkt die Lautstärke 25 einzustellen. Das entspricht aber nicht dem sonst üblichen "Standard" in FHEM, denn als zusätzlicher Parameter wird eher die Ramptime angegeben (oder ein Startwert).

+1 8)

Otto123

#1078
Zitat"set Speaker volume 25" sollte m.E. direkt auf 25 gehen,
"set Speaker volume 25 10" könnte das Verhalten, welches du bereits implementiert hast, abbilden - also von 10 auf 25 erhöhen. Die Kür wäre, wenn mit einem "set Speaker volume 25 -1" ein sukzessives Erhöhen oder eine sukzessive Reduktion vom aktuellen volume-Wert durchgeführt würde.
Hab ich so eingebaut, die Lösung gefällt mir besser! Und mit dem bisherigen Code war ich sowieso nicht sehr glücklich...

Das mit dem Master Reading habe ich gefunden: im userReading muss das + im split escaped werden  :-X  --> ' \+'
Edit: hab ich im Template gefixed, würde aber ein manuelles Fix am existierenden Player empfehlen :)
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

Ralli

Vielen Dank, Otto.

Korrektur vom userReading klappt.
Gruß,
Ralli

Proxmox 8.1 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.6.20240316) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa