From b6518a659ff8d3049a51254444a43a6e807a3b2b Mon Sep 17 00:00:00 2001 From: Patrick762 Date: Fri, 16 Jun 2023 17:02:58 +0200 Subject: [PATCH 1/4] added properies to zeroconf info --- streamdeckapi/server.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/streamdeckapi/server.py b/streamdeckapi/server.py index d77aedd..768b8e2 100644 --- a/streamdeckapi/server.py +++ b/streamdeckapi/server.py @@ -560,6 +560,8 @@ def start_zeroconf(): f"Stream Deck API Server.{SD_ZEROCONF}", addresses=[socket.inet_aton("127.0.0.1")], port=80, + properties={'path': '/sd/info'}, + server="pythonserver.local.", ) zeroconf = Zeroconf() From fb720e6a0c9411783f5435327e681444c6d3f125 Mon Sep 17 00:00:00 2001 From: Patrick762 Date: Fri, 16 Jun 2023 17:08:21 +0200 Subject: [PATCH 2/4] updated zeroconf port --- streamdeckapi/server.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/streamdeckapi/server.py b/streamdeckapi/server.py index 768b8e2..53d8f64 100644 --- a/streamdeckapi/server.py +++ b/streamdeckapi/server.py @@ -19,8 +19,7 @@ from StreamDeck.Devices.StreamDeck import StreamDeck from StreamDeck.ImageHelpers import PILHelper import cairosvg from PIL import Image -from zeroconf import IPVersion, ServiceInfo, Zeroconf -from zeroconf.asyncio import AsyncServiceInfo, AsyncZeroconf +from zeroconf import ServiceInfo, Zeroconf from streamdeckapi.const import ( DATETIME_FORMAT, @@ -559,7 +558,7 @@ def start_zeroconf(): SD_ZEROCONF, f"Stream Deck API Server.{SD_ZEROCONF}", addresses=[socket.inet_aton("127.0.0.1")], - port=80, + port=PLUGIN_PORT, properties={'path': '/sd/info'}, server="pythonserver.local.", ) From 5236fbf0d9c71b6cc551d7ae3f7d02b51f433b9d Mon Sep 17 00:00:00 2001 From: Patrick762 Date: Fri, 16 Jun 2023 17:15:28 +0200 Subject: [PATCH 3/4] updated zeroconf address --- streamdeckapi/server.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/streamdeckapi/server.py b/streamdeckapi/server.py index 53d8f64..ce02129 100644 --- a/streamdeckapi/server.py +++ b/streamdeckapi/server.py @@ -551,13 +551,30 @@ class Timer: self._task.cancel() +def get_local_ip(): + """Get local ip address.""" + connection = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + connection.connect(("192.255.255.255", 1)) + address = connection.getsockname()[0] + except socket.error: + address = "127.0.0.1" + finally: + connection.close() + return address + + def start_zeroconf(): """Start Zeroconf server.""" + host = get_local_ip() + + print("Using host", host, "for Zeroconf") + info = ServiceInfo( SD_ZEROCONF, f"Stream Deck API Server.{SD_ZEROCONF}", - addresses=[socket.inet_aton("127.0.0.1")], + addresses=[socket.inet_aton(host)], port=PLUGIN_PORT, properties={'path': '/sd/info'}, server="pythonserver.local.", From 8b2389a8908b28fb288ecbfa2d5c2ae80343d0ee Mon Sep 17 00:00:00 2001 From: Patrick762 Date: Fri, 16 Jun 2023 17:56:15 +0200 Subject: [PATCH 4/4] added warning icon if no client connected --- streamdeckapi/server.py | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/streamdeckapi/server.py b/streamdeckapi/server.py index ce02129..9cd6052 100644 --- a/streamdeckapi/server.py +++ b/streamdeckapi/server.py @@ -48,6 +48,25 @@ DEFAULT_ICON = re.sub( ) +# Copy of MDI Icon "alert" +NO_CONN_ICON = re.sub( + "\r\n|\n|\r", + "", + """ + + + + + + + + + + + """, +) + + application: SDApplication = SDApplication( { "font": "Segoe UI", @@ -382,6 +401,21 @@ def create_runner(): return web.AppRunner(app) +async def check_websocket(): + """Check if a websocket client is connected.""" + if len(websocket_connections) == 0: + print("No connection") + for deck in streamdecks: + if not deck.is_visual(): + continue + + if not deck.is_open(): + deck.open() + + for key in range(deck.key_count()): + set_icon(deck, key, NO_CONN_ICON) + + async def start_server_async(host: str = "0.0.0.0", port: int = PLUGIN_PORT): """Start API server.""" runner = create_runner() @@ -391,7 +425,7 @@ async def start_server_async(host: str = "0.0.0.0", port: int = PLUGIN_PORT): print("Started Stream Deck API server on port", PLUGIN_PORT) Timer(10, broadcast_status) - # TODO add check if websocket is used, otherwise display warning on streamdeck + Timer(3, check_websocket) def get_position(deck: StreamDeck, key: int) -> SDButtonPosition: @@ -573,10 +607,10 @@ def start_zeroconf(): info = ServiceInfo( SD_ZEROCONF, - f"Stream Deck API Server.{SD_ZEROCONF}", + f"Stream Deck API Server at {host}.{SD_ZEROCONF}", addresses=[socket.inet_aton(host)], port=PLUGIN_PORT, - properties={'path': '/sd/info'}, + properties={"path": "/sd/info"}, server="pythonserver.local.", )