From 90defddc70ccf4b5f61f220fb4752229922348b3 Mon Sep 17 00:00:00 2001 From: GravySeal Date: Wed, 24 Apr 2024 11:45:31 +0200 Subject: [PATCH] Encode in json before sending first websocket message as well as extra logging. --- bacnetinterface_dev/CHANGELOG.md | 4 +-- bacnetinterface_dev/config.yaml | 4 ++- .../rootfs/etc/nginx/templates/ingress.gtpl | 6 ++++- .../etc/s6-overlay/s6-rc.d/init-nginx/run | 1 + .../rootfs/usr/bin/BACnetIOHandler.py | 6 ----- bacnetinterface_dev/rootfs/usr/bin/webAPI.py | 27 ++++++++++++------- bacnetinterface_dev/translations/en.yaml | 3 +++ bacnetinterface_dev/translations/nl.yaml | 3 +++ 8 files changed, 34 insertions(+), 20 deletions(-) diff --git a/bacnetinterface_dev/CHANGELOG.md b/bacnetinterface_dev/CHANGELOG.md index fc52398f..ed15f6b3 100644 --- a/bacnetinterface_dev/CHANGELOG.md +++ b/bacnetinterface_dev/CHANGELOG.md @@ -1,7 +1,7 @@  -# 1.4.1b6 -17/04/2024 +# 1.4.1b7 +24/04/2024 If there are any issues, please report on GitHub! diff --git a/bacnetinterface_dev/config.yaml b/bacnetinterface_dev/config.yaml index d996eed3..bb3f1214 100644 --- a/bacnetinterface_dev/config.yaml +++ b/bacnetinterface_dev/config.yaml @@ -1,6 +1,6 @@ # https://developers.home-assistant.io/docs/add-ons/configuration#add-on-config name: Bepacom BACnet/IP Interface Development Version -version: "1.4.1b6" +version: "1.4.1b7" slug: bacnetinterface_dev description: Bepacom BACnet/IP interface for the Bepacom EcoPanel. Allows BACnet/IP devices to be available to Home Assistant through an API url: "https://github.com/Bepacom-Raalte/bepacom-HA-Addons/tree/main/bacnetinterface" @@ -41,6 +41,7 @@ options: slow_poll_list: - all entity_list: [] + api_accessible: false loglevel: WARNING segmentation: segmentedBoth schema: @@ -62,6 +63,7 @@ schema: - str? entity_list: - str? + api_accessible: bool? foreignBBMD: str? foreignTTL: str? vendorID: int? diff --git a/bacnetinterface_dev/rootfs/etc/nginx/templates/ingress.gtpl b/bacnetinterface_dev/rootfs/etc/nginx/templates/ingress.gtpl index 7ce5a3f7..057bfd52 100644 --- a/bacnetinterface_dev/rootfs/etc/nginx/templates/ingress.gtpl +++ b/bacnetinterface_dev/rootfs/etc/nginx/templates/ingress.gtpl @@ -13,7 +13,11 @@ server { allow {{ . }}; {{ end }} - # deny all; + {{if .accessible}} + allow all; + {{else}} + deny all; + {{end}} # forward request to backend location / { diff --git a/bacnetinterface_dev/rootfs/etc/s6-overlay/s6-rc.d/init-nginx/run b/bacnetinterface_dev/rootfs/etc/s6-overlay/s6-rc.d/init-nginx/run index ec0a87df..6db19f15 100755 --- a/bacnetinterface_dev/rootfs/etc/s6-overlay/s6-rc.d/init-nginx/run +++ b/bacnetinterface_dev/rootfs/etc/s6-overlay/s6-rc.d/init-nginx/run @@ -22,6 +22,7 @@ done bashio::log.info "Allowed addresses for NGINX: ${ip_array[@]}" bashio::var.json \ + accessible "$(bashio::config 'api_accessible')" \ port "$(bashio::addon.port 80)" \ ip_array "^$(printf '%s\n' "${ip_array[@]}" | jq -R . | jq -s .)" \ | tempio \ diff --git a/bacnetinterface_dev/rootfs/usr/bin/BACnetIOHandler.py b/bacnetinterface_dev/rootfs/usr/bin/BACnetIOHandler.py index 953993b4..e509c57c 100644 --- a/bacnetinterface_dev/rootfs/usr/bin/BACnetIOHandler.py +++ b/bacnetinterface_dev/rootfs/usr/bin/BACnetIOHandler.py @@ -1153,8 +1153,6 @@ async def end_subscription_tasks(self): async def do_ConfirmedCOVNotificationRequest( self, apdu: ConfirmedCOVNotificationRequest ) -> None: - if _debug: - ChangeOfValueServices._debug("do_ConfirmedCOVNotificationRequest %r", apdu) address = apdu.pduSource subscriber_process_identifier = apdu.subscriberProcessIdentifier @@ -1169,8 +1167,6 @@ async def do_ConfirmedCOVNotificationRequest( if (not scm) or ( apdu.monitoredObjectIdentifier != scm.monitored_object_identifier ): - if _debug: - ChangeOfValueServices._debug(" - scm not found") raise ServicesError(errorCode="unknownSubscription") # queue the property values @@ -1179,8 +1175,6 @@ async def do_ConfirmedCOVNotificationRequest( # success resp = SimpleAckPDU(context=apdu) - if _debug: - ChangeOfValueServices._debug(" - resp: %r", resp) # return the result await self.response(resp) diff --git a/bacnetinterface_dev/rootfs/usr/bin/webAPI.py b/bacnetinterface_dev/rootfs/usr/bin/webAPI.py index 6265d8a0..13f331df 100644 --- a/bacnetinterface_dev/rootfs/usr/bin/webAPI.py +++ b/bacnetinterface_dev/rootfs/usr/bin/webAPI.py @@ -158,6 +158,8 @@ async def webapp(request: Request): for file in EDE_files: dict_to_send = deep_update(dict_to_send, file) + dict_to_send = jsonable_encoder(dict_to_send) + return templates.TemplateResponse( "index.html", {"request": request, "bacnet_devices": dict_to_send} ) @@ -510,6 +512,8 @@ async def unsubscribe_objectid(deviceid: str, objectid: str): async def websocket_endpoint(websocket: WebSocket): """This function will be called whenever a new client connects to the server.""" await websocket.accept() + + LOGGER.debug(f"Accepted websocket: {websocket.url}") # Start a task to write data to the websocket write_task = asyncio.create_task(websocket_writer(websocket)) @@ -519,6 +523,7 @@ async def websocket_endpoint(websocket: WebSocket): while True: try: data = await websocket.receive() + LOGGER.debug(f"Data received: {data}") if data["type"] == "websocket.disconnect": raise WebSocketDisconnect @@ -565,20 +570,20 @@ async def websocket_endpoint(websocket: WebSocket): else: LOGGER.warning(f"message: {message} is not processed") - except (RuntimeError, asyncio.CancelledError) as error: + except (RuntimeError, asyncio.CancelledError) as err: write_task.cancel() activeSockets.remove(websocket) - LOGGER.error("Disconnected with RuntimeError or CancelledError...") + LOGGER.error(f"Disconnected with Exception... {err}") return - except WebSocketDisconnect: + except WebSocketDisconnect as err: write_task.cancel() activeSockets.remove(websocket) - LOGGER.info("Disconnected websocket") + LOGGER.info(f"Disconnected websocket: {err}") return - except Exception as e: + except Exception as err: write_task.cancel() activeSockets.remove(websocket) - LOGGER.error("Disconnected with Exception" + str(e) + "...") + LOGGER.error(f"Disconnected with Exception {err}") async def websocket_writer(websocket: WebSocket): @@ -588,7 +593,9 @@ async def websocket_writer(websocket: WebSocket): if not is_valid_json(bacnet_device_dict): LOGGER.warning(f"Websocket dict isn't converted to JSON'!") else: - await websocket.send_json(bacnet_device_dict) + data_to_send = jsonable_encoder(bacnet_device_dict) + await websocket.send_json(data_to_send) + LOGGER.debug("Passed send_json test") while True: if events.val_updated_event.is_set(): dict_to_send = bacnet_device_dict @@ -609,11 +616,11 @@ async def websocket_writer(websocket: WebSocket): else: await asyncio.sleep(1) - except asyncio.CancelledError as error: - LOGGER.debug(f"Websocket writer cancelled: {error}") + except asyncio.CancelledError as err: + LOGGER.debug(f"Websocket writer cancelled: {err}") except WebSocketDisconnect as err: - LOGGER.info("Websocket disconnected") + LOGGER.info(f"Websocket disconnected: {err}") except Exception as err: LOGGER.error(f"Error during writing: {err}") diff --git a/bacnetinterface_dev/translations/en.yaml b/bacnetinterface_dev/translations/en.yaml index 877c45c8..ceceebcb 100644 --- a/bacnetinterface_dev/translations/en.yaml +++ b/bacnetinterface_dev/translations/en.yaml @@ -38,6 +38,9 @@ configuration: devices_setup: name: Device Setup description: Set up any devices you want to be treated differently. See docs for usage. + api_accessible: + name: Allow API access + description: Allow API access from outside of Home Assistant. network: 47808/udp: BACnet port. 80/tcp: Port which the integration should connect to. If you leave this empty, the integration should connect to port 8099. \ No newline at end of file diff --git a/bacnetinterface_dev/translations/nl.yaml b/bacnetinterface_dev/translations/nl.yaml index 67163c47..5072f6e4 100644 --- a/bacnetinterface_dev/translations/nl.yaml +++ b/bacnetinterface_dev/translations/nl.yaml @@ -38,6 +38,9 @@ configuration: devices_setup: name: Apparaat configuratie description: Configureer apparaten die appart behandeld moeten worden. Zie documentatie over hoe deze optie gebruikt moet worden. + api_accessible: + name: Toegang tot API toestaan + description: Sta toe dat de API toegankelijk is buiten Home Assistant. network: 47808/udp: BACnet poort. 80/tcp: Poort waarmee de integration moet verbinden. Wanneer je deze poort leeg laat, moet de integration met poort 8099 verbinden. \ No newline at end of file