Skip to content

Commit

Permalink
Fixed threading
Browse files Browse the repository at this point in the history
  • Loading branch information
exddc committed Jun 24, 2024
1 parent ee994b2 commit b995a43
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 19 deletions.
6 changes: 3 additions & 3 deletions agent/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -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":
Expand Down Expand Up @@ -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):
Expand Down
2 changes: 2 additions & 0 deletions agent/video_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down
43 changes: 27 additions & 16 deletions agent/web_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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():
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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()
import mqtt_agent

web_server = WebServer(
mqtt_agent.MqttAgent(
f"{os.environ.get('AGENT_LOCATION')}_{os.environ.get('AGENT_TYPE')}",
[],
)
)
web_server.run()

0 comments on commit b995a43

Please sign in to comment.