diff --git a/agent/agent.py b/agent/agent.py index c7ff90f..02ae643 100644 --- a/agent/agent.py +++ b/agent/agent.py @@ -58,11 +58,12 @@ def run(self): "%s agent starting with version: %s", self.__agent_type, self._version ) self._agent.run() - for module in self._modules: - module.run() self._internet_connection.start() self._web_server.run() + for module in self._modules: + module.run() + def _select_agent(self): """Select the agent based on the agent type.""" if self.__agent_type == "doorbell": @@ -107,7 +108,6 @@ def stop(self): self._mqtt.stop() self._web_server.stop() self._internet_connection.join() - GPIO.cleanup() LOGGER.info("%s %s agent stopped.", self.__agent_type, self.__agent_location) def _check_internet_connection(self): diff --git a/agent/video_agent.py b/agent/video_agent.py index 9e804db..83c5b65 100644 --- a/agent/video_agent.py +++ b/agent/video_agent.py @@ -34,10 +34,12 @@ class StreamingHandler(server.BaseHTTPRequestHandler): def do_GET(self): """Handle GET requests.""" if self.path == '/': + LOGGER.info('Request for /. Redirecting to /stream.mjpg') self.send_response(301) self.send_header('Location', '/stream.mjpg') self.end_headers() elif self.path == '/stream.mjpg': + LOGGER.info('Request for /stream.mjpg') self.send_response(200) self.send_header('Age', 0) self.send_header('Cache-Control', 'no-cache, private') diff --git a/agent/web_server.py b/agent/web_server.py index ef1fb90..4490cae 100644 --- a/agent/web_server.py +++ b/agent/web_server.py @@ -3,6 +3,7 @@ # pylint: disable=import-error import os import dotenv +import threading import waitress from flask import Flask, render_template, request, redirect, url_for from flask_assets import Environment, Bundle @@ -50,10 +51,10 @@ def _setup_routes(self) -> None: @self.app.route("/") def dashboard(): - LOGGER.info("Dashboard requested by %s", request.remote_addr) - # pylint: disable=line-too-long - stream_url = f"http://{os.popen('hostname -I').read().split()[0]}:{os.environ.get('VIDEO_STREAM_PORT')}/stream.mjpg" - return render_template("dashboard.html", stream_url=stream_url) + LOGGER.info("Dashboard requested by %s", request.remote_addr) + # pylint: disable=line-too-long + stream_url = f"http://{os.popen('hostname -I').read().split()[0]}:{os.environ.get('VIDEO_STREAM_PORT')}/stream.mjpg" + return render_template("dashboard.html", stream_url=stream_url) @self.app.route("/settings", methods=["GET", "POST"]) def settings(): @@ -88,17 +89,27 @@ def run(self) -> None: self._on_doorbell_message, ) LOGGER.info("Webserver subscribed to MQTT topic: %s", self._location_topic) - self._web_server = waitress.serve(self.app, host="0.0.0.0", port=self._port) - LOGGER.info("Webserver started on port %i.", self._port) + self._web_server = threading.Thread(target=self._start_web_server, daemon=True) + self._web_server.start() def stop(self) -> None: """Stop the webserver.""" - self._web_server.close() + self._web_server.join() self._mqtt.unsubscribe(self._location_topic) LOGGER.info("Webserver unsubscribed from MQTT topic: %s", self._location_topic) self._mqtt.message_callback_remove(self._location_topic) LOGGER.info("Webserver stopped.") + def _start_web_server(self) -> None: + """Start the webserver.""" + LOGGER.info("Starting the webserver") + try: + waitress.serve(self.app, port=self._port) + LOGGER.info("Webserver started on port %i.", self._port) + except Exception as error: + LOGGER.error("Error starting the webserver: %s", error) + + # pylint: disable=unused-argument def _on_doorbell_message(self, client, userdata, msg): @@ -199,12 +210,12 @@ def tail(file_path, lines=25): return [line.strip() for line in lines] if __name__ == "__main__": - import mqtt_agent - - web_server = WebServer( - mqtt_agent.MqttAgent( - f"{os.environ.get('AGENT_LOCATION')}_{os.environ.get('AGENT_TYPE')}", - [], - ) - ) - web_server.run() \ No newline at end of file + import mqtt_agent + + web_server = WebServer( + mqtt_agent.MqttAgent( + f"{os.environ.get('AGENT_LOCATION')}_{os.environ.get('AGENT_TYPE')}", + [], + ) + ) + web_server.run() \ No newline at end of file