UPNPController, DLNAController und Multiroom

Begonnen von KölnSolar, 11 Februar 2022, 17:24:12

Vorheriges Thema - Nächstes Thema

KölnSolar

Hi Michael,
dieser Thread nur für uns beide, um das ans Rennen zu kriegen.
Grüße
Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

MichaelT

Fein,

Ich versuche gerade mit der munet app das zeugs wieder am laufen zu bekommen.
Problem war, das diese nur bis Android 6 läuft. Hab jetzt mein altes tablet wieder downgraded
Und kann wieder multiroom und stereo testen.

Ich versuche es nun nochmal zu sortieren.

Großes Mischmasch aus HM, Philips, WLAN und Eigenprojekte.
ABER alles mit FHEM.

KölnSolar

#2
Ich kopier mal wesentliche alte Dinge der peaq munet. Geduld.

Du hast 3 Geräte
uuid:93b2abac-cb6a-4857-b891-Buero
uuid:93b2abac-cb6a-4857-b891-Schlafen
uuid:93b2abac-cb6a-4857-b891-Bad
(also offensichtlich 4 Gruppen fix und die letzte individuell für das physische device)

IPs sind fix, aber Ports wechseln im Betrieb.

Caskeid(aus event "Groups" von service SpeakerManagement)
<?xml version="1.0" ?><groups version="1.0"><group><id>4DAA44C0-8291-11E3-BAA7-0800200C9A66</id><name>Bluetooth</name></group></groups>
(und so wurde es im DLNARenderer geprüft: 4DAA44C0-8291-11E3-BAA7-0800200C9A66 Also zumindest bei peaq eine fixe id)

services der Geräte
DLNA
- AVTransport
- RenderingControl
- SpeakerManagement
- SessionManagement
- ConnectionManager
unbekannt
- RTSPGateway
- NetworkManagement

SpeakerManagement http://IP:Port/xml/SpeakerManagement.xml

<!-- ============================================================Title: UPnP SpeakerManagement Service TemplatePurpose:To identify the required/optional actions and state variablesand the required allowed values defined by this service type.This is a custom Pure Service designed to provide configurationmanagement options for Pure media renderer devices.Note:This file uses tabs (not spaces) for block indentation.Any updates to this file should maintain this convention.This includes disabling any automatic tab-to-space conversionfeature provided by your editor.================================================================ -->
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<serviceStateTable>
<stateVariable sendEvents="no">
<name>MCSType</name>
<dataType>string</dataType>
<allowedValueList>
<allowedValue>STEREO</allowedValue>
<allowedValue>STANDALONE</allowedValue>
</allowedValueList>
</stateVariable>
<stateVariable sendEvents="no">
<name>MCSID</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>MCSFriendlyName</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>SpeakerChannel</name>
<dataType>string</dataType>
<allowedValueList>
<allowedValue>LEFT_FRONT</allowedValue>
<allowedValue>RIGHT_FRONT</allowedValue>
<allowedValue>STANDALONE_SPEAKER</allowedValue>
</allowedValueList>
</stateVariable>
<stateVariable sendEvents="no">
<name>SpeakerOrientation</name>
<dataType>string</dataType>
<allowedValueList>
<allowedValue>HORIZONTAL</allowedValue>
<allowedValue>VERTICAL</allowedValue>
</allowedValueList>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_GroupID</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_GroupName</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_GroupMetadata</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="yes">
<name>Groups</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_Type_IdentifyPattern</name>
<dataType>string</dataType>
<allowedValueList>
<allowedValue>DEFAULT</allowedValue>
</allowedValueList>
</stateVariable>
<stateVariable sendEvents="yes">
<name>SessionID</name>
<dataType>string</dataType>
</stateVariable>
</serviceStateTable>
<actionList>
<action>
<name>SetMultiChannelSpeaker</name>
<argumentList>
<argument>
<name>NewMCSType</name>
<direction>in</direction>
<relatedStateVariable>MCSType</relatedStateVariable>
</argument>
<argument>
<name>NewMCSID</name>
<direction>in</direction>
<relatedStateVariable>MCSID</relatedStateVariable>
</argument>
<argument>
<name>NewMCSFriendlyName</name>
<direction>in</direction>
<relatedStateVariable>MCSFriendlyName</relatedStateVariable>
</argument>
<argument>
<name>NewSpeakerChannel</name>
<direction>in</direction>
<relatedStateVariable>SpeakerChannel</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetMultiChannelSpeaker</name>
<argumentList>
<argument>
<name>CurrentMCSType</name>
<direction>out</direction>
<relatedStateVariable>MCSType</relatedStateVariable>
</argument>
<argument>
<name>CurrentMCSID</name>
<direction>out</direction>
<relatedStateVariable>MCSID</relatedStateVariable>
</argument>
<argument>
<name>CurrentMCSFriendlyName</name>
<direction>out</direction>
<relatedStateVariable>MCSFriendlyName</relatedStateVariable>
</argument>
<argument>
<name>CurrentSpeakerChannel</name>
<direction>out</direction>
<relatedStateVariable>SpeakerChannel</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetSpeakerOrientation</name>
<argumentList>
<argument>
<name>NewSpeakerOrientation</name>
<direction>in</direction>
<relatedStateVariable>SpeakerOrientation</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetSpeakerOrientation</name>
<argumentList>
<argument>
<name>CurrentSpeakerOrientation</name>
<direction>out</direction>
<relatedStateVariable>SpeakerOrientation</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>IdentifyMe</name>
<argumentList>
<argument>
<name>IdentifyPattern</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_Type_IdentifyPattern</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>AddToGroup</name>
<argumentList>
<argument>
<name>ID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_GroupID</relatedStateVariable>
</argument>
<argument>
<name>Name</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_GroupName</relatedStateVariable>
</argument>
<argument>
<name>Metadata</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_GroupMetadata</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>RemoveFromGroup</name>
<argumentList>
<argument>
<name>ID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_GroupID</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetGroups</name>
<argumentList>
<argument>
<name>CurrentGroups</name>
<direction>out</direction>
<relatedStateVariable>Groups</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetSession</name>
<argumentList>
<argument>
<name>SessionID</name>
<direction>out</direction>
<relatedStateVariable>SessionID</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetSession</name>
<argumentList>
<argument>
<name>SessionID</name>
<direction>in</direction>
<relatedStateVariable>SessionID</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>ClearSession</name>
<argumentList>
<argument>
<name>SessionID</name>
<direction>in</direction>
<relatedStateVariable>SessionID</relatedStateVariable>
</argument>
</argumentList>
</action>
</actionList>
</scpd>


events:
- <stateVariable sendEvents="yes"> <name>Groups</name> <dataType>string</dataType> </stateVariable>
- <stateVariable sendEvents="yes"> <name>SessionID</name> <dataType>string</dataType> </stateVariable>
actions:
- Set(Get)MultiChannelSpeaker, Set(Get)SpeakerOrientation, IdentifyMe, AddTo(RemoveFrom)Group,GetGroups,Set(Get,Clear)Session

SessionManagment  http://IP:Port/xml/SessionManagment.xml


<!-- ============================================================Title: UPnP Session Management Service TemplatePurpose:To identify the required/optional actions and state variablesand the required allowed values defined by this service type.This is a custom Pure Service designed to allow Control Pointsto create/destroy a session and to add/remove UPnP media renderers toand from a session.Note:This file uses tabs (not spaces) for block indentation.Any updates to this file should maintain this convention.This includes disabling any automatic tab-to-space conversionfeature provided by your editor.================================================================ -->
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<serviceStateTable>
<stateVariable sendEvents="yes">
<name>SessionID</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>SessionMetadata</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_UUID</name>
<dataType>string</dataType>
</stateVariable>
</serviceStateTable>
<actionList>
<action>
<name>CreateSession</name>
<argumentList>
<argument>
<name>SessionID</name>
<direction>out</direction>
<relatedStateVariable>SessionID</relatedStateVariable>
</argument>
<argument>
<name>Metadata</name>
<direction>in</direction>
<relatedStateVariable>SessionMetadata</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetSession</name>
<argumentList>
<argument>
<name>SessionID</name>
<direction>out</direction>
<relatedStateVariable>SessionID</relatedStateVariable>
</argument>
<argument>
<name>Metadata</name>
<direction>out</direction>
<relatedStateVariable>SessionMetadata</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>DestroySession</name>
<argumentList>
<argument>
<name>SessionID</name>
<direction>in</direction>
<relatedStateVariable>SessionID</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>AddUnitToSession</name>
<argumentList>
<argument>
<name>SessionID</name>
<direction>in</direction>
<relatedStateVariable>SessionID</relatedStateVariable>
</argument>
<argument>
<name>UUID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_UUID</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>RemoveUnitFromSession</name>
<argumentList>
<argument>
<name>SessionID</name>
<direction>in</direction>
<relatedStateVariable>SessionID</relatedStateVariable>
</argument>
<argument>
<name>UUID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_UUID</relatedStateVariable>
</argument>
</argumentList>
</action>
</actionList>
</scpd>


event: <stateVariable sendEvents="yes"> <name>SessionID</name><dataType>string</dataType></stateVariable>
actions: Create(Get,Destroy)Session,AddUnitTo(RemoveUnitFrom)Session

subscription u. events SessionManagement SpeakerManagement
2021.03.10 19:16:23.660 4: UPNPController: subscribe: reading  IP_Port-zs-SessionManagement, uniquedevice IP_Port, service SessionManagement
2021.03.10 19:16:23.661 5: UPNPController: SessionManagement: urn:schemas-pure-com:service:SessionManagement:1 found. OK.
2021.03.10 19:16:23.661 5: UPNPController: SessionManagement: urn:schemas-pure-com:service:SessionManagement:1 found. OK.
2021.03.10 19:16:23.840 5: UPNPController: Received event: by IP_Port-zs-SessionManagement UPnP::ControlPoint::Service=HASH(0x74c7f94) $VAR1 = 'SessionID';
$VAR2 = '';

2021.03.10 19:16:23.840 5: UPNPController: Received event: by IP_Port-zs-SessionManagement original property:
2021.03.10 19:16:23.840 5: UPNPController: Received event: by IP_Port-zs-SessionManagement property:
2021.03.10 19:16:23.854 5: UPNPController: SYS_UPNP: event of service urn:schemas-upnp-org:metadata-1-0/RCS, message
2021.03.10 19:16:23.854 5: UPNPController: SYS_UPNP: event of service urn:schemas-upnp-org:metadata-1-0/AVT, message
2021.03.10 19:16:23.854 4: UPNPController: SYS_UPNP: service  event SessionID not yet implemented
2021.03.10 19:16:50.870 4: UPNPController: subscribe: reading  IP_Port-zs-SpeakerManagement, uniquedevice IP_Port, service SpeakerManagement
2021.03.10 19:16:50.870 5: UPNPController: SpeakerManagement: urn:schemas-pure-com:service:SpeakerManagement:1 found. OK.
2021.03.10 19:16:50.871 5: UPNPController: SpeakerManagement: urn:schemas-pure-com:service:SpeakerManagement:1 found. OK.
2021.03.10 19:16:51.112 5: UPNPController: Received event: by IP_Port-zs-SpeakerManagement UPnP::ControlPoint::Service=HASH(0x21debe0) $VAR1 = 'SessionID';
$VAR2 = '';
$VAR3 = 'Groups';
$VAR4 = '&lt;?xml version=&quot;1.0&quot; ?&gt;&lt;groups version=&quot;1.0&quot;&gt;&lt;group&gt;&lt;id&gt;4DAA44C0-8291-11E3-BAA7-0800200C9A66&lt;/id&gt;&lt;name&gt;Bluetooth&lt;/name&gt;&lt;/group&gt;&lt;/groups&gt;';

2021.03.10 19:16:51.113 5: UPNPController: Received event: by IP_Port-zs-SpeakerManagement original property:
2021.03.10 19:16:51.113 5: UPNPController: Received event: by IP_Port-zs-SpeakerManagement property:
2021.03.10 19:16:51.126 5: UPNPController: SYS_UPNP: event of service urn:schemas-upnp-org:metadata-1-0/RCS, message
2021.03.10 19:16:51.126 5: UPNPController: SYS_UPNP: event of service urn:schemas-upnp-org:metadata-1-0/AVT, message
2021.03.10 19:16:51.126 4: UPNPController: SYS_UPNP: service  event SessionID not yet implemented
2021.03.10 19:16:51.126 5: UPNPController: Received event: by IP_Port-zs-SpeakerManagement original property: &lt;?xml version=&quot;1.0&quot; ?&gt;&lt;groups version=&quot;1.0&quot;&gt;&lt;group&gt;&lt;id&gt;4DAA44C0-8291-11E3-BAA7-0800200C9A66&lt;/id&gt;&lt;name&gt;Bluetooth&lt;/name&gt;&lt;/group&gt;&lt;/groups&gt;
2021.03.10 19:16:51.127 5: UPNPController: Received event: by IP_Port-zs-SpeakerManagement property: <?xml version="1.0" ?><groups version="1.0"><group><id>4DAA44C0-8291-11E3-BAA7-0800200C9A66</id><name>Bluetooth</name></group></groups>
2021.03.10 19:16:51.127 5: UPNPController: SYS_UPNP: event of service urn:schemas-upnp-org:metadata-1-0/RCS, message <?xml version="1.0" ?><groups version="1.0"><group><id>4DAA44C0-8291-11E3-BAA7-0800200C9A66</id><name>Bluetooth</name></group></groups>
2021.03.10 19:16:51.127 5: UPNPController: SYS_UPNP: event of service urn:schemas-upnp-org:metadata-1-0/AVT, message <?xml version="1.0" ?><groups version="1.0"><group><id>4DAA44C0-8291-11E3-BAA7-0800200C9A66</id><name>Bluetooth</name></group></groups>
2021.03.10 19:16:51.127 4: UPNPController: SYS_UPNP: service <?xml version="1.0" ?><groups version="1.0"><group><id>4DAA44C0-8291-11E3-BAA7-0800200C9A66</id><name>Bluetooth</name></group></groups> event Groups not yet implemented

RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

KölnSolar

#3
Hi Michael,

so ganz verstehe ich Dominiks Ansatz nicht. Er nutzt caskeid als Multiroom-Indikator. Ich hab jetzt mal das event groups vom speakermanagement genommen.

Vielleicht bekommst Du ja mit der Äpp etwas mehr Klarheit, ob die speaker über Bluetooth verbunden sind oder nicht bzw. einer konkreteren Bedeutung von caskeid.

Attached die aktuellen  ;) Testversionen. reload sollte genügen.

Grüße Markus

Edit: temporary modul versions removed
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

MichaelT

Morgen Markus,

danke für deine Erläuterung.

Zu den PMN300 und der Äpp:
Es gibt drei Feature bei diesen Dingern:

  • Multiroom über app (hier wird die SessionID verwendet)
  • Multiroom über BT (Caskeid, hier wird die Group verwendet)
  • Stereo-Paare über app (man kann zwei devices als Stereo-Paar konfigurieren)

Zur MR BT:
In jedem Device kann man BT Caskeid aktivieren, dann wird die von dir bereits benannte GroupID eingetragen. Koppelt man nun eine
BT-Quelle mit einem Lautsprecher, spielt diese den Stream. Schaltet man bei einem weiteren Device BT-Caskeid ein, holt sich dieser anscheinend über die
GroupID mittels "rtsp://IP:8554/stream" den Stream und spielt in auch ab. Jedes weitere mach es auch so.

Zu MR App:
Man kann einen Stream von der App auf einem Device abspielen. Mit CheckBoxen kann ich weitere Devices hinzu schalten.
Hier ist es anscheinend so, dass die App beim ersten Stream eine SessionID im Device erzeugt und alle weiteren Devices den "Master" über die SessionID ermitteln und dann im Master das RTSPGateway enabled und im Salve mittels rtsp://IP-Master der Stream geholt und abgespielt.

Zu Stereo-Paare:
In der App kann man von den verfügbaren devices ein oder mehrere Stereo-Paare bilden. Man wählt den Master, dann das Linke und Rechte device, wobei einer der Beiden der Master sein muss. Nun wird im Master das RTSPGateway enabled und im Salve mittels rtsp://IP-Master der Stream geholt und abgespielt. Ich vermute, das die App links und rechts aufteilt und einen Kanal direkt an den Master und den zweiten Kanal über den Master (Gateway) zum Slave schickt. Balance wird und der App angeboten und regelt dies über Volume der devices.
Im SpeakerMgm kann man mit Set/GetMultiChannelSpeaker kann man den Mode (STEREO), den Name der Gruppe, die Aufgabe (Links/Rechts) und eine MultiChannelSpeakerSessionID setzen/ermitteln. Die normale SessionID ist auch gesetzt, unterscheidet sich aber von der MCSP-ID

Anmerkung:
- Alles nur Vermutungen nach der Analyse der UPnP-Abfragen, ggf. noch etwas falsch.
- mute funktioniert nun, danke

Weitere Infos auf Nachfrage, wie du bemerkt hast, habe ich immer ein wenig Reaktionszeit ;-)

Gruß Michael.


Großes Mischmasch aus HM, Philips, WLAN und Eigenprojekte.
ABER alles mit FHEM.

KölnSolar

Zitatwie du bemerkt hast, habe ich immer ein wenig Reaktionszeit
So ist das bei Hobbies.

Das verstehe ich dann so, dass wir Bt enable/disable können sollten und den entsprechenden state anzeigen.

Für 1./3. multiroom/stereo. Dafür sind dann die anderen Funktionen also. Die groups für eine allgemeine Definition(Kopplung von Speakern) und die session-id, wenn tatsächlich etwas abgespielt wird. Das erfolgt dann für alle speaker der group. Und stereo ist vermutlich der Sonderfall dazu.

Dann guck mal, ob Du jetzt etwas hinbekommst...

Ich ändere mal die Zuordnung der setter.

Sowas wie Jens bei den Teufeln(virtual devices) hast Du nicht, oder ? Immer nur 1 FHEM-device/physischem-speaker ?

Weiter sonnigen Sonntag
Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

MichaelT

Das verstehe ich dann so, dass wir Bt enable/disable können sollten und den entsprechenden state anzeigen.
Ja.

Für 1./3. multiroom/stereo. Dafür sind dann die anderen Funktionen also. Die groups für eine allgemeine Definition(Kopplung von Speakern) und die session-id, wenn tatsächlich etwas abgespielt wird. Das erfolgt dann für alle speaker der group. Und stereo ist vermutlich der Sonderfall dazu.
Also bei MR und ST sind die groups im SpeakerMgm außen vor. Du meinst aber die "caskeidClients" im Module, oder? Das geht alles über die sessionId.
Großes Mischmasch aus HM, Philips, WLAN und Eigenprojekte.
ABER alles mit FHEM.

KölnSolar

Nein, ich meinte schon die groups.

Wenn alle speaker aus sind, dann gibt es doch vermutlich keine session-id. Erst, wenn etwas gestreamed wird. Und dann kann man erst einen weiteren speaker verknüpfen ? Ich hätte gedacht, dass das die Gruppen sind und man startet mit "stream auf Gruppe1". :-\
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

MichaelT

#8
Hallo Markus,

erster Zwischenstand:

+ Ich habe noch caskeid auf 1 gesetzt, damit auch addUnit und removeUnit usw. funktioniert.
+ also add und remove funktionieren dann
+ Ich habe noch "DLNAController_addUnit" erweitert, so dass die multiRoomUnits korrekt ergänzt werden. Bei playEverywherer wurde dies schon gemacht. Kann man wahrscheinlich dann besser in einer Funktion auslagern.

- multiRoomVolume macht noch seltsame Effekte (device kurz offline)
- die SessionID wird noch nicht in fhem übernommen, angezeigt

Diff gegen deiner letzten Version
528,533c528
<
<       my $multiRoomUnits = ReadingsVal($hash->{NAME}, "multiRoomUnits", "");
<
<       $multiRoomUnits .= "," if($multiRoomUnits ne "");
<       $multiRoomUnits .= ReadingsVal($client->{NAME}, "friendlyName", "");
<       readingsSingleUpdate($hash, "multiRoomUnits", $multiRoomUnits, 1);
---
>       DLNAController_updateMultiRoomUnits($hash,$client);
558a554
>       DLNAController_updateMultiRoomUnits($hash,$client);
563a560,573
>
> sub DLNAController_updateMultiRoomUnits {
>
>   my ($hash, $client) = @_;
>
>   my $multiRoomUnits = ReadingsVal($hash->{NAME}, "multiRoomUnits", "");
>
>   $multiRoomUnits .= "," if($multiRoomUnits ne "");
>   $multiRoomUnits .= ReadingsVal($client->{NAME}, "friendlyName", "");
>   readingsSingleUpdate($hash, "multiRoomUnits", $multiRoomUnits, 1);
>
>   return undef;
> }
>
904a915
>     $hash->{helper}{caskeid} = 1;
1235a1247



Edit: Nachtrag log SessionID
2022.02.13 17:55:01.877 5: UPNPController: Received event: by 192.168.4.31_46544-zs-SpeakerManagement UPnP::ControlPoint::Service=HASH(0x3006460) $VAR1 = 'Groups';
$VAR2 = '&lt;?xml version=&quot;1.0&quot; ?&gt;&lt;groups version=&quot;1.0&quot;&gt;&lt;/groups&gt;';
$VAR3 = 'SessionID';
$VAR4 = '96791177-a26a-441b-887e-cb89dff636f2';

2022.02.13 17:55:01.878 5: UPNPController: SYS_UPNP: event of service SpeakerManagement, message &lt;?xml version=&quot;1.0&quot; ?&gt;&lt;groups version=&quot;1.0&quot;&gt;&lt;/groups&gt;
2022.02.13 17:55:01.878 5: SYS_UPNP: dispatch SpeakerManagement|192.168.4.31_46544|Groups|&lt;?xml version=&quot;1.0&quot; ?&gt;&lt;groups version=&quot;1.0&quot;&gt;&lt;/groups&gt;
2022.02.13 17:55:01.878 4: DLNAController: message from SYS_UPNP, message: SpeakerManagement|192.168.4.31_46544|Groups|&lt;?xml version=&quot;1.0&quot; ?&gt;&lt;groups version=&quot;1.0&quot;&gt;&lt;/groups&gt;
2022.02.13 17:55:01.878 5: DLNAController: message parameters: SpeakerManagement, 192.168.4.31_46544, Groups, &lt;?xml version=&quot;1.0&quot; ?&gt;&lt;groups version=&quot;1.0&quot;&gt;&lt;/groups&gt;
2022.02.13 17:55:01.879 5: DLNAController: OG_SZ_MR process property Groups, xml-event <?xml version="1.0" ?><groups version="1.0"></groups>
2022.02.13 17:55:01.879 4: DLNAController: OG_SZ_MR parsing did enter load_xml call: <?xml version="1.0" ?><groups version="1.0"></groups>
2022.02.13 17:55:01.880 4: DLNAController OG_SZ_MR: state update from SYS_UPNP, address 192.168.4.31_46544
2022.02.13 17:55:01.895 5: UPNPController: SYS_UPNP: event of service SpeakerManagement, message 96791177-a26a-441b-887e-cb89dff636f2
2022.02.13 17:55:01.895 5: UPNPController: SYS_UPNP: event of service RenderingControl, message 96791177-a26a-441b-887e-cb89dff636f2
2022.02.13 17:55:01.895 5: UPNPController: SYS_UPNP: event of service AVTransport, message 96791177-a26a-441b-887e-cb89dff636f2
2022.02.13 17:55:01.895 3: UPNPController: SYS_UPNP: uniqueDeviceName 192.168.4.31_46544 event SessionID not yet implemented
2022.02.13 17:55:01.895 4: UPNPController: SYS_UPNP: uniqueDeviceName 192.168.4.31_46544 event details: $VAR1 = '96791177-a26a-441b-887e-cb89dff636f2';

2022.02.13 17:55:01.940 5: UPNPController: Received event: by 192.168.4.31_46544-zs-SessionManagement UPnP::ControlPoint::Service=HASH(0x302f540) $VAR1 = 'SessionID';
$VAR2 = '';

2022.02.13 17:55:01.940 5: UPNPController: SYS_UPNP: empty event SessionID found
2022.02.13 17:55:01.943 5: SYS_UPNP: dispatch SessionManagement|192.168.4.31_46544|SessionID|
2022.02.13 17:55:01.943 4: DLNAController: message from SYS_UPNP, message: SessionManagement|192.168.4.31_46544|SessionID|
2022.02.13 17:55:01.944 5: DLNAController: message parameters: SessionManagement, 192.168.4.31_46544, SessionID,
2022.02.13 17:55:01.944 5: DLNAController: OG_SZ_MR process property SessionID, xml-event
2022.02.13 17:55:01.944 4: DLNAController OG_SZ_MR: state update from SYS_UPNP, address 192.168.4.31_46544



Edit2:
Hiermit geht nun auch multiRoomVolume
455a456,465
> sub DLNAController_getHashByFriendlyName {
>   my ($hash, $friendlyName) = @_;
>
>   foreach my $fhem_dev (sort keys %main::defs) {
>     my $devHash = $main::defs{$fhem_dev};
>     return $devHash if($devHash->{TYPE} eq 'DLNAController' && ReadingsVal($devHash->{NAME}, "friendlyName", "") eq $friendlyName);
>   }
>
>   return undef;
> }

Sieht schon nicht schlecht aus
Gruß
Michael
Großes Mischmasch aus HM, Philips, WLAN und Eigenprojekte.
ABER alles mit FHEM.

KölnSolar

Hallo Michael,

ich hab jetzt noch einmal "Trockentests" gemacht.

Demnach ist "multiroom" wie folgt charakterisiert
readings: multiRoomUnits - devices einer session(ihr friendlyName)
UPNP service: SessionManagement actions: GetSession, CreateSession, AddUnitToSession, RemoveUnitFromSession, DestroySession

zusätzl FHEM-Funktionen setMultiRoomVolume (reading multiRoomVolume) über service RenderingControl


- multiRoomVolume wird derzeit falsch gesetzt
- sinnvoll wäre dann auch eine setMultiRoomMute Funktion

und "Mono, Stereo" wie folgt
UPNP service: SpeakerManagement actions: GetMultiChannelSpeaker, SetMultiChannelSpeaker
readings: stereoLeft, stereoRight - friendlyName des devices; stereoPairName - friendly name; stereoId; stereoSupport 0/1
               stereoPairName, stereoId, stereoSupport werden per internaltimer ausgelesen


- der internal timer wird derzeit nicht gestartet, also gibt es diese 3 readings auch nicht
- ich spekuliere, dass mute hier "irgendwie" per direkter Kommunikation funktioniert ?  :-\

Zu groups hab ich jetzt noch nichts geprüft. Ist mir noch unklar.

ZitatIch habe noch caskeid auf 1 gesetzt
Das verstehe ich, um die Funktionalität zu erreichen. Aber ich halte es für falsch. caskeid ist ja ungleich multiroom(und multiroom ohne Bt gibt's bestimmt auch).
Im Modul müsste also alles mögliche von caskeid in multiroom geändert werden. Verstehst Du, was ich meine ?

Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

MichaelT

Hallo Markus,

Das verstehe ich, um die Funktionalität zu erreichen. Aber ich halte es für falsch. caskeid ist ja ungleich multiroom(und multiroom ohne Bt gibt's bestimmt auch).
Im Modul müsste also alles mögliche von caskeid in multiroom geändert werden. Verstehst Du, was ich meine ?


Ja, bin ich bei dir. caskeid nur auf true, damit die restlichen set/get da sind.


- multiRoomVolume wird derzeit falsch gesetzt
- sinnvoll wäre dann auch eine setMultiRoomMute Funktion


Ja, passt auch.

- der internal timer wird derzeit nicht gestartet, also gibt es diese 3 readings auch nicht
- ich spekuliere, dass mute hier "irgendwie" per direkter Kommunikation funktioniert ?


- Timer hatte ich auch schon bemerkt, wusste aber nicht, wo man ihn am besten startet.
- mute hatte mit dem alten Mudul funktioniert (nur ein Hinweis)

Was auch noch unklar ist:
- Reading sessionId wird nicht gesetzt (blick nicht ganz durch, warum nicht). Das sorgt glaube ich dafür, dass z.B. ein set stream ... den multiplay beendet
weil bei AVT_play eine neue sessionId generiert wird.
- addUnit sollte normalerweise alle multiroom devices zur Auswahl anbieten, macht es aber nicht.

Gruß Michael


Großes Mischmasch aus HM, Philips, WLAN und Eigenprojekte.
ABER alles mit FHEM.

KölnSolar

Hallo Michael,
Zitatcaskeid nur auf true, damit die restlichen set/get da sind
Dann hast Du mich doch nicht ganz verstanden. Nicht caskeid(die Bluetooth-group) ist der Indikator, sondern das Vorhandensein des service SessionManagment(oder SpeakerManagement; ich gehe davon aus, dass es beide services für multiroom entweder gibt oder eben nicht)
Ich würde dann einfach nur die Variablennamen etc. von caskeid in multiroom ändern, damit dass Modul "leserlicher" wird. caskeid würd ich dann nur noch für den Kontext benutzen, wie wir uns oben bereits geeinigt hatten.

- multiRoomVolume wird derzeit falsch gesetzt
- sinnvoll wäre dann auch eine setMultiRoomMute Funktion
würde ich gleichzeitig einbauen.

- Timer hatte ich auch schon bemerkt, wusste aber nicht, wo man ihn am besten startet.
- mute hatte mit dem alten Mudul funktioniert (nur ein Hinweis)
ebenso.

auch
ZitatReading sessionId wird nicht gesetzt (blick nicht ganz durch, warum nicht). Das sorgt glaube ich dafür, dass z.B. ein set stream ... den multiplay beendet
weil bei AVT_play eine neue sessionId generiert wird.
- addUnit sollte normalerweise alle multiroom devices zur Auswahl anbieten, macht es aber nicht.

Ich komm mit Deinen diffs nie so richtig klar, weil ich meist auch schon weiterentwickelt habe. Das obige ist mir insofern klar, dass Du aus ein paar Zeilen eine Funktion gemacht hast und durch den Funktionsaufruf ersetzt hast. Wo aber der neue zusätzliche Funktionsaufruf hin muss, ist mir unklar. Kannst Du mir das einfach als komplette sub einstellen. Und helper->caskeid ändere ich so natürlich nicht.  ;)

Am We gibt's dann die neue Version für Dich und dann sollten wir schon recht gut vorangekommen sein und nachvollziehbareres Coding haben.

Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

MichaelT

Hi,

updateMultiRoomUnits war quasi in playEverywhere drin, musste aber zusätzlich in addUnit auch rein.

sub DLNAController_playEverywhere {
  my ($hash) = @_;
  my $multiRoomUnits = "";
  my @caskeidClients = DLNAController_caskeidClients($hash);
  foreach my $client (@caskeidClients) {
    if($client->{UDN} ne $hash->{UDN}) {
      DLNAController_addUnitToPlay($hash, substr($client->{UDN},5));
----->      DLNAController_updateMultiRoomUnits($hash,$client);
    }
  }
  return undef;
}

sub DLNAController_stopPlayEverywhere {
  my ($hash) = @_;
  DLNAController_destroyCurrentSession($hash);
  readingsSingleUpdate($hash, "multiRoomUnits", "", 1);
  return undef;
}

sub DLNAController_addUnit {
  my ($hash, $unitName) = @_;

  my @caskeidClients = DLNAController_caskeidClients($hash);
  foreach my $client (@caskeidClients) {
    if(ReadingsVal($client->{NAME}, "friendlyName", "") eq $unitName) {
      my @multiRoomUnits = split(",", ReadingsVal($hash->{NAME}, "multiRoomUnits", ""));
      foreach my $unit (@multiRoomUnits) {
        #skip if unit is already part of the session
        return undef if($unit eq $unitName);
      }
      #add unit to session
      DLNAController_addUnitToPlay($hash, substr($client->{UDN},5));
---->      DLNAController_updateMultiRoomUnits($hash,$client);
      return undef;
    }
  }
  return "DLNAController: No unit $unitName found.";
}

sub DLNAController_updateMultiRoomUnits {

  my ($hash, $client) = @_;

  my $multiRoomUnits = ReadingsVal($hash->{NAME}, "multiRoomUnits", "");

  $multiRoomUnits .= "," if($multiRoomUnits ne "");
  $multiRoomUnits .= ReadingsVal($client->{NAME}, "friendlyName", "");
  readingsSingleUpdate($hash, "multiRoomUnits", $multiRoomUnits, 1);

  return undef;
}



ZitatDann hast Du mich doch nicht ganz verstanden
Glaube ich schon, habe mich bloß doof ausgedrückt. ;-)

Gruß Michael




Großes Mischmasch aus HM, Philips, WLAN und Eigenprojekte.
ABER alles mit FHEM.

KölnSolar

#13
ich kämpfe noch mit den events  ::)
nur zur Doku aus dem anderen Thread(bewusst ohne RenderingControl/AVTransport)2022.02.05 09:53:28.606 5: SYS_UPNP: dispatch SpeakerManagement|IP_Port|online|groups
2022.02.05 09:53:28.606 4: DLNAController: message from SYS_UPNP, message: SpeakerManagement|IP_Port|online|groups
2022.02.05 09:53:28.606 5: DLNAController: message parameters: SpeakerManagement, IP_Port, online, groups

2022.02.05 09:53:30.185 5: UPNPController: SYS_UPNP, IP_Port, SpeakerManagement, subscribe,
2022.02.05 09:53:30.185 5: UPNPController: SpeakerManagement: urn:pure-com:serviceId:SpeakerManagement found. OK.
2022.02.05 09:53:30.185 4: UPNPController: subscribe: reading  IP_Port-zs-SpeakerManagement, uniquedevice IP_Port, service SpeakerManagement
2022.02.05 09:53:30.186 5: UPNPController: SpeakerManagement: urn:pure-com:serviceId:SpeakerManagement found. OK.
2022.02.05 09:53:30.382 4: UPNPController: subscribe: reading  IP_Port-zs-SpeakerManagement, uniquedevice IP_Port, service SpeakerManagement timeout: 300

2022.02.05 09:53:30.400 5: UPNPController: SYS_UPNP, IP_Port, SessionManagement, subscribe,
2022.02.05 09:53:30.400 5: UPNPController: SessionManagement: urn:pure-com:serviceId:SessionManagement found. OK.
2022.02.05 09:53:30.400 4: UPNPController: subscribe: reading  IP_Port-zs-SessionManagement, uniquedevice IP_Port, service SessionManagement
2022.02.05 09:53:30.401 5: UPNPController: SessionManagement: urn:pure-com:serviceId:SessionManagement found. OK.
2022.02.05 09:53:30.506 4: UPNPController: subscribe: reading  IP_Port-zs-SessionManagement, uniquedevice IP_Port, service SessionManagement timeout: 300

2022.02.05 09:53:30.652 5: SYS_UPNP: dispatch SpeakerManagement|IP_Port|Groups|<?xml version="1.0" ?><groups version="1.0"></groups>
2022.02.05 09:53:30.652 4: DLNAController: message from SYS_UPNP, message: SpeakerManagement|IP_Port|Groups|<?xml version="1.0" ?><groups version="1.0"></groups>
2022.02.05 09:53:30.652 5: DLNAController: message parameters: SpeakerManagement, IP_Port, Groups, <?xml version="1.0" ?><groups version="1.0"></groups>

2022.02.05 09:53:30.655 5: UPNPController: SYS_UPNP: empty event SessionID found
2022.02.05 09:53:30.655 5: SYS_UPNP: dispatch SessionManagement|IP_Port|SessionID|
2022.02.05 09:53:30.655 4: DLNAController: message from SYS_UPNP, message: SessionManagement|IP_Port|SessionID|
2022.02.05 09:53:30.656 5: DLNAController: message parameters: SessionManagement, IP_Port, SessionID,

2022.02.05 09:53:30.696 5: UPNPController: Received event: by IP_Port-zs-SessionManagement UPnP::ControlPoint::Service=HASH(0x2a7e630) $VAR1 = 'SessionID';
$VAR2 = '';

2022.02.05 09:53:30.713 5: UPNPController: SYS_UPNP: empty event SessionID found
2022.02.05 09:53:30.714 5: SYS_UPNP: dispatch SessionManagement|IP_Port|SessionID|
2022.02.05 09:53:30.714 4: DLNAController: message from SYS_UPNP, message: SessionManagement|IP_Port|SessionID|
2022.02.05 09:53:30.714 5: DLNAController: message parameters: SessionManagement, IP_Port, SessionID,


Mich wundert
ZitatSieht schon nicht schlecht aus
Der UPNPController dispatched bei meinen "Trockentests" doch gar keine SessionId(bzw. dispatched nur, wenn SessionId leer ist).  ???

Hast Du einen Log-Auszug, dass ich damit falsch liege ?

Grüße Markus

Edit: Jetzt bin ich gespannt, was die neuen Versionen bei Dir so machen.  :)
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

MichaelT

Hallo Markus,

ZitatHast Du einen Log-Auszug, dass ich damit falsch liege ?

Meinst Du sowas?
2022.02.19 11:06:58.725 5: UPNPController: Received event: by 192.168.4.32_48846-zs-SessionManagement UPnP::ControlPoint::Service=HASH(0x404b248) $VAR1 = 'SessionID';
$VAR2 = '6ea8f38b-bc3d-4920-b5fb-517d956c777d';

2022.02.19 11:06:58.726 5: UPNPController: SYS_UPNP: event of service SpeakerManagement, message 6ea8f38b-bc3d-4920-b5fb-517d956c777d
2022.02.19 11:06:58.726 5: UPNPController: SYS_UPNP: event of service AVTransport, message 6ea8f38b-bc3d-4920-b5fb-517d956c777d
2022.02.19 11:06:58.727 5: UPNPController: SYS_UPNP: event of service RenderingControl, message 6ea8f38b-bc3d-4920-b5fb-517d956c777d
2022.02.19 11:06:58.727 3: UPNPController: SYS_UPNP: uniqueDeviceName 192.168.4.32_48846 event SessionID not yet implemented
2022.02.19 11:06:58.728 4: UPNPController: SYS_UPNP: uniqueDeviceName 192.168.4.32_48846 event details: $VAR1 = '6ea8f38b-bc3d-4920-b5fb-517d956c777d';

2022.02.19 11:06:58.840 5: UPNPController: Received event: by 192.168.4.32_48846-zs-SpeakerManagement UPnP::ControlPoint::Service=HASH(0x400d1d8) $VAR1 = 'SessionID';
$VAR2 = '6ea8f38b-bc3d-4920-b5fb-517d956c777d';

2022.02.19 11:06:58.840 5: UPNPController: SYS_UPNP: event of service SpeakerManagement, message 6ea8f38b-bc3d-4920-b5fb-517d956c777d
2022.02.19 11:06:58.840 5: UPNPController: SYS_UPNP: event of service AVTransport, message 6ea8f38b-bc3d-4920-b5fb-517d956c777d
2022.02.19 11:06:58.841 5: UPNPController: SYS_UPNP: event of service RenderingControl, message 6ea8f38b-bc3d-4920-b5fb-517d956c777d
2022.02.19 11:06:58.841 3: UPNPController: SYS_UPNP: uniqueDeviceName 192.168.4.32_48846 event SessionID not yet implemented
2022.02.19 11:06:58.841 4: UPNPController: SYS_UPNP: uniqueDeviceName 192.168.4.32_48846 event details: $VAR1 = '6ea8f38b-bc3d-4920-b5fb-517d956c777d';

2022.02.19 11:06:59.101 5: UPNPController: Received event: by 192.168.4.32_48846-zs-AVTransport UPnP::ControlPoint::Service=HASH(0x404a8d8) $VAR1 = 'LastChange';
$VAR2 = '&lt;Event xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/AVT/&quot;&gt;&lt;InstanceID val=&quot;0&quot;&gt;&lt;TransportState val=&quot;TRANSITIONING&quot;/&gt;&lt;/InstanceID&gt;&lt;/Event&gt;';
Großes Mischmasch aus HM, Philips, WLAN und Eigenprojekte.
ABER alles mit FHEM.