async def async_start_event_handler(
        hass: HomeAssistantType,
        server_host: str,
        server_port: int,
        requester,
        callback_url_override: Optional[str] = None):
    """Register notify view."""
    hass_data = hass.data[DLNA_DMR_DATA]
    if 'event_handler' in hass_data:
        return hass_data['event_handler']

    # start event handler
    from async_upnp_client.aiohttp import AiohttpNotifyServer
    server = AiohttpNotifyServer(requester,
                                 listen_port=server_port,
                                 listen_host=server_host,
                                 loop=hass.loop,
                                 callback_url=callback_url_override)
    await server.start_server()
    _LOGGER.info('UPNP/DLNA event handler listening, url: %s',
                 server.callback_url)
    hass_data['notify_server'] = server
    hass_data['event_handler'] = server.event_handler

    # register for graceful shutdown
    async def async_stop_server(event):
        """Stop server."""
        _LOGGER.debug('Stopping UPNP/DLNA event handler')
        await server.stop_server()

    hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, async_stop_server)

    return hass_data['event_handler']
Beispiel #2
0
async def async_start_event_handler(
    hass: HomeAssistantType,
    server_host: str,
    server_port: int,
    requester,
    callback_url_override: str | None = None,
):
    """Register notify view."""
    hass_data = hass.data[DLNA_DMR_DATA]
    if "event_handler" in hass_data:
        return hass_data["event_handler"]

    # start event handler
    server = AiohttpNotifyServer(
        requester,
        listen_port=server_port,
        listen_host=server_host,
        callback_url=callback_url_override,
    )
    await server.start_server()
    _LOGGER.info("UPNP/DLNA event handler listening, url: %s",
                 server.callback_url)
    hass_data["notify_server"] = server
    hass_data["event_handler"] = server.event_handler

    # register for graceful shutdown
    async def async_stop_server(event):
        """Stop server."""
        _LOGGER.debug("Stopping UPNP/DLNA event handler")
        await server.stop_server()

    hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, async_stop_server)

    return hass_data["event_handler"]
Beispiel #3
0
async def subscribe(description_url: str, service_names: Any) -> None:
    """Subscribe to service(s) and output updates."""
    global event_handler  # pylint: disable=global-statement

    device = await create_device(description_url)

    # start notify server/event handler
    host, port = bind_host_port()
    server = AiohttpNotifyServer(device.requester, port, listen_host=host)
    await server.start_server()
    _LOGGER.debug('Listening on: %s', server.callback_url)

    # gather all wanted services
    if '*' in service_names:
        service_names = device.services.keys()

    services = []
    for service_name in service_names:
        service = service_from_device(device, service_name)
        if not service:
            print('Unknown service: %s' % (service_name, ))
            sys.exit(1)
        service.on_event = on_event
        services.append(service)

    # subscribe to services
    event_handler = server.event_handler
    for service in services:
        await event_handler.async_subscribe(service)

    # keep the webservice running
    while True:
        await asyncio.sleep(120)
        await event_handler.async_resubscribe_all()
Beispiel #4
0
async def async_start_event_handler(hass, server_host, server_port, requester):
    """Register notify view."""
    hass_data = hass.data[DLNA_DMR_DATA]
    if 'event_handler' in hass_data:
        return hass_data['event_handler']

    # start event handler
    from async_upnp_client.aiohttp import AiohttpNotifyServer
    server = AiohttpNotifyServer(requester, server_port, server_host,
                                 hass.loop)
    await server.start_server()
    _LOGGER.info('UPNP/DLNA event handler listening on: %s',
                 server.callback_url)
    hass_data['notify_server'] = server
    hass_data['event_handler'] = server.event_handler

    # register for graceful shutdown
    async def async_stop_server(event):
        """Stop server."""
        _LOGGER.debug('Stopping UPNP/DLNA event handler')
        await server.stop_server()

    hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, async_stop_server)

    return hass_data['event_handler']
Beispiel #5
0
async def async_start_event_handler(
    opp: OpenPeerPower,
    server_host: str,
    server_port: int,
    requester,
    callback_url_override: str | None = None,
):
    """Register notify view."""
    opp_data = opp.data[DLNA_DMR_DATA]
    if "event_handler" in opp_data:
        return opp_data["event_handler"]

    # start event handler
    server = AiohttpNotifyServer(
        requester,
        listen_port=server_port,
        listen_host=server_host,
        callback_url=callback_url_override,
    )
    await server.start_server()
    _LOGGER.info("UPNP/DLNA event handler listening, url: %s",
                 server.callback_url)
    opp_data["notify_server"] = server
    opp_data["event_handler"] = server.event_handler

    # register for graceful shutdown
    async def async_stop_server(event):
        """Stop server."""
        _LOGGER.debug("Stopping UPNP/DLNA event handler")
        await server.stop_server()

    opp.bus.async_listen_once(EVENT_OPENPEERPOWER_STOP, async_stop_server)

    return opp_data["event_handler"]
Beispiel #6
0
async def subscribe(device: UpnpDevice, subscribe_args):
    """Subscribe to service(s) and output updates."""
    global event_handler  # pylint: disable=global-statement

    # start notify server/event handler
    host, port = bind_host_port()
    server = AiohttpNotifyServer(device.requester, port, listen_host=host)
    await server.start_server()
    _LOGGER.debug('Listening on: %s', server.callback_url)

    # gather all wanted services
    services = []
    for service_name in subscribe_args:
        if service_name == '*':
            services += device.services.values()
            continue

        service = service_from_device(device, service_name)
        service.on_event = on_event
        services.append(service)

    # subscribe to services
    event_handler = server.event_handler
    for service in services:
        await event_handler.async_subscribe(service)

    # keep the webservice running
    while True:
        await asyncio.sleep(120)
        await event_handler.async_resubscribe_all()
Beispiel #7
0
    async def setup_subscriptions(self):
        self.server = AiohttpNotifyServer(self.device.requester, 41234)
        await self.server.start_server()
        print('Listening on: %s', self.server.callback_url)

        await self.subscribe(self.product_service)
        await self.subscribe(self.volume_service)
        await self.subscribe(self.transport_service)
        await self.subscribe(self.info_service)

        while True:
            await asyncio.sleep(120)
            await self.server.event_handler.async_resubscribe_all()
Beispiel #8
0
 async def async_start_event_handler(
     self, server_host: str, server_port: int, requester
 ):
     """Register notify view."""
     if dlna_dmr.event_handler:
         return dlna_dmr.event_handler
     # start event handler
     self.server = AiohttpNotifyServer(
         requester,
         listen_port=server_port,
         listen_host=server_host,
     )
     await self.server.start_server()
     self.logger.info(
         "UPNP/DLNA event handler listening, url: %s", self.server.callback_url
     )
     dlna_dmr.event_handler = self.server.event_handler
     return dlna_dmr.event_handler
Beispiel #9
0
    async def async_get_event_notifier(
            self, listen_addr: EventListenAddr,
            hass: HomeAssistant) -> UpnpEventHandler:
        """Return existing event notifier for the listen_addr, or create one.

        Only one event notify server is kept for each listen_addr. Must call
        async_release_event_notifier when done to cleanup resources.
        """
        LOGGER.debug("Getting event handler for %s", listen_addr)

        async with self.lock:
            # Stop all servers when HA shuts down, to release resources on devices
            if not self.stop_listener_remove:
                self.stop_listener_remove = hass.bus.async_listen_once(
                    EVENT_HOMEASSISTANT_STOP,
                    self.async_cleanup_event_notifiers)

            # Always increment the reference counter, for existing or new event handlers
            self.event_notifier_refs[listen_addr] += 1

            # Return an existing event handler if we can
            if listen_addr in self.event_notifiers:
                return self.event_notifiers[listen_addr].event_handler

            # Start event handler
            source = (listen_addr.host or "0.0.0.0", listen_addr.port)
            server = AiohttpNotifyServer(
                requester=self.requester,
                source=source,
                callback_url=listen_addr.callback_url,
                loop=hass.loop,
            )
            await server.async_start_server()
            LOGGER.debug("Started event handler at %s", server.callback_url)

            self.event_notifiers[listen_addr] = server

        return server.event_handler