Ja. Ein Controlpoint sendet keine Notify-messages und empfängt sie nur. Entweder auf eigenen request oder periodisch(in der Regel wohl 30min.) durch ein device(keep-alive) ausgelöst.
Im nächsten Schritt habe ich set searchterm ssdp:all versucht : die ersten Zeilen im Log über gefundene Geräte, aber keine neuen Readings.
Das wundert mich. Logging und Anlage von readings findet gleichzeitig statt. Ich hab zwischenzeitlich noch einmal die searchterms über Wireshark getestet, weil auch bei mir irgendwie unklar war, auf welchen searchterm die devices reagieren. In der letzten Version hab ich bei der Initialisierung upnp:rootdevice. Da konnte ich aber jetzt mit Wireshark gar keine Reaktion feststellen. Wohl aber mit ssdp:all Warte auch mal die 30min. ab, um vielleicht devices zu bekommne, die nicht auf einen search-request reagieren.
Bei ShellyMonitor verwende ich die IO::Socket::Multicast-Bibliothek. Den Socket öffne ich mit
$conn = IO::Socket::Multicast->new(LocalPort=>5683, ReuseAddr=>1) or $err = "Cannot open Multicast socket: $^E";
damit eben "auch andere" ihn belauschen können. Ist das eine Lösung für Dein Problem, oder habe ich da etwas nicht verstanden?
Ich hab dann mal den Quellcode studiert. Für 1900 wird tatsächlich reuse benutzt. Hilft nur leider wenig, denn meines Erachtens kann die FHEM-selectloop ja nur einen filedescriptor bedienen. Wäre auch nicht so schlimm. Ich hab es jetzt so definiert, dass nur der Controlpoint lauscht und per ReadFn bedient wird. Nun hab ich aber das Problem, dass ich
hier bereits ähnlich und unbeantwortet angefragt hatte: Lesen ohne "Leeren" der message queue, um zu entscheiden, wer die Nachricht verarbeiten soll und dort dann auch noch die message zur Verfügung steht.
Das 2-stufige Modell hat über die X_Parse-Funktion u. a. den Vorteil, dass die nachgelagerten Module automatisch Devices anlegen können, sobald sie die für sie passenden SSDP-notify-Meldungen eines für sie noch unbekannten DeviceManagers erhalten. Dies über eine permanente Überwachung von Fhem-notifys durch die nachgelagerten Module machen zu wollen, führt dazu dass die SSDP-notifys permanent Fhem-notifys auslösen müssten. Dies gilt auch für die SSDP-bye-Meldungen.
Bei dem bisher "sichtbaren" Bedarf halte ich das in der Entwicklung zu aufwändig. Und eigentlich muss doch sowieso alles manuell angelegt werden. Die "nachgelagerten" Module kennen doch gar kein SSDP.

Umgekeht könnt ich mir eher noch vorstellen, dass bei der Definition eines devices eines "nachgelagerten" Moduls ein passendes UPNPdevice erzeugt wird.
Ich lass jetzt mal den Controlpoint und DeviceManager in 2 unterschiedlichen FHEM-System laufen, um den SHM zu simulieren. Sobald es stabil läuft attache ich die Versionen und beschreibe es ein wenig.
Grüße Markus
Edit: Ich attache mal meine xml-Beschreibung zum SEMP-device. Basis ist die Specification von SMA u. Literale habe ich mal angepasst. Uns fehlen der deviceType(müsste man mal wissen, was ein Gateway da nutzt bzw. der SHM "will") und eine uuid(der Einfachheit halber sollte die durch den user ermittelt und ins Template eingetragen werden. Ich hab mal
http://www.uuid.online dazu ausprobiert).
So sehen dann im Controlpoint die readings aus
setstate UPNP_Controller 2021-01-25 11:05:05 192.168.x.y:4004-UDN uuid:UUID
setstate UPNP_Controller 2021-01-25 11:05:05 192.168.x.y:4004-friendlyName this is just a test device
setstate UPNP_Controller 2021-01-25 11:05:05 192.168.x.y:4004-location http://192.168.x.y:4004/opt/fhem/SEMPdevice.xml
setstate UPNP_Controller 2021-01-25 11:05:05 192.168.x.y:4004-manufacturer FHEM
setstate UPNP_Controller 2021-01-25 11:05:05 192.168.x.y:4004-modelName FHEM UPNP SEMP device
setstate UPNP_Controller 2021-01-25 11:05:05 192.168.x.y:4004-presence online
Und so der Aufruf der "location" über einen Browser. Man sieht, dass das Modul die URLBase generiert und hinzugefügt hat.
<?xml version="1.0"?>
-<root xmlns="urn:schemas-upnp-org:device-1-0">
-<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
-<device>
<deviceType>urn:domain-name:device:deviceType:ver</deviceType>
<friendlyName>this is just a test device</friendlyName>
<manufacturer>FHEM</manufacturer>
<modelName>FHEM UPNP SEMP device</modelName>
<UDN>uuid:UUID</UDN>
<serviceList> </serviceList>
<deviceList> </deviceList>
-<semp:X_SEMPSERVICE xmlns:semp="urn:schemas-simple-energy-management-protocol:service-1-0">
<semp:server>http://IP[:port]</semp:server>
<semp:basePath>/SEMP</semp:basePath>
<semp:transport>HTTP/Pull</semp:transport>
<semp:exchangeFormat>XML</semp:exchangeFormat>
<semp:wsVersion>x.y.z</semp:wsVersion>
</semp:X_SEMPSERVICE>
</device>
<URLBase>http://192.168.x.y:4004</URLBase>
</root>