From b0c8b31673d8a4f6950b13956090b7b9d23c2999 Mon Sep 17 00:00:00 2001 From: Marcos Junior Date: Wed, 4 Jan 2023 09:43:36 -0600 Subject: [PATCH] Reduce ffmpeg logs, reduce amount of time to seek for a snapshot --- .vscode/settings.json | 14 +------------- meterparser/CHANGELOG.md | 4 ++++ meterparser/config.yaml | 2 +- meterparser/src/__main__.py | 2 -- meterparser/src/app/camera.py | 19 +++++++++++-------- meterparser/src/app/mqtt.py | 7 ++++++- 6 files changed, 23 insertions(+), 25 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 841abbf..4ffe21a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,18 +7,6 @@ ], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, - "files.exclude": { - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/CVS": true, - "**/.DS_Store": true, - "**/Thumbs.db": true, - "**/.classpath": true, - "**/.project": true, - "**/.settings": true, - "**/.factorypath": true, - "**/__pycache__": true - }, + "files.exclude": {}, "explorerExclude.backup": null, } \ No newline at end of file diff --git a/meterparser/CHANGELOG.md b/meterparser/CHANGELOG.md index 2213bb0..a1f8975 100644 --- a/meterparser/CHANGELOG.md +++ b/meterparser/CHANGELOG.md @@ -1,3 +1,7 @@ +### [1.0.2.4] + +- Reduce ffmpeg logs, reduce amount of time to seek for a snapshot + ### [1.0.2.3] - Fix incorrect ffmpeg path. diff --git a/meterparser/config.yaml b/meterparser/config.yaml index 12c7846..04eaded 100644 --- a/meterparser/config.yaml +++ b/meterparser/config.yaml @@ -1,5 +1,5 @@ name: Meter Parser -version: 1.0.2.3 +version: 1.0.2.4 slug: meter-parser description: Read meter needles and numbers from a camera snapshot. url: https://github.com/junalmeida/homeassistant-addons/tree/main/meterparser diff --git a/meterparser/src/__main__.py b/meterparser/src/__main__.py index 843660d..beccd8f 100644 --- a/meterparser/src/__main__.py +++ b/meterparser/src/__main__.py @@ -1,5 +1,3 @@ -import time -from app.camera import Camera from app.mqtt import Mqtt from app.service import Service import sys diff --git a/meterparser/src/app/camera.py b/meterparser/src/app/camera.py index ee72685..3352f40 100644 --- a/meterparser/src/app/camera.py +++ b/meterparser/src/app/camera.py @@ -19,11 +19,12 @@ from skimage.metrics import structural_similarity as compare_ssim import subprocess import tempfile -ffmpeg = "/usr/bin/ffmpeg" +ffmpeg = "ffmpeg.exe" if os.name == "nt" else "/usr/bin/ffmpeg" class Camera (threading.Thread): def __init__(self, camera: dict, entity_id: str, mqtt: Mqtt, debug_path: str): threading.Thread.__init__(self) + self.isRunning = False self.error_limit = 30 # 3 m3? 3 kWh? 3 what? TODO: Check if this is a good fail safe parameter. self.reading_limit = int(camera["reading_limit"]) if "reading_limit" in camera else 3 @@ -35,7 +36,6 @@ def __init__(self, camera: dict, entity_id: str, mqtt: Mqtt, debug_path: str): camera["device_class"]) if "device_class" in camera else "energy" self._unit_of_measurement = str( camera["unit_of_measurement"]) if "unit_of_measurement" in camera else "kWh" - self._disposed = False self._current_reading = float( data[entity_id]) if entity_id in data else 0.0 self._dials = camera["dials"] if "dials" in camera else [] @@ -71,6 +71,7 @@ def run(self): "sensor", self.entity_id, self.set_callback) self._logger.info("Listening to messages at topic %s" % (topic_listen)) while not self._wait.is_set(): + self.isRunning = True try: self._mqtt.mqtt_device_trigger_discovery(self.entity_id, "on_before_get_image") self._mqtt.mqtt_device_trigger_discovery(self.entity_id, "on_after_get_image") @@ -196,7 +197,7 @@ def run(self): "Waiting %s secs for next reading." % self._interval) self._wait.wait(self._interval) self._logger.warn("Camera %s is now disposed." % self.name) - self._disposed = True + self.isRunning = False def get_image(self): url = urlparse(self._snapshot_url) @@ -224,21 +225,23 @@ def get_image(self): tmp_file_name = os.path.join(tmp_dir, "img.jpg") ffmpeg_cmd = [ ffmpeg, + "-hide_banner", + "-loglevel", "error", "-y", "-i", self._snapshot_url, - "-ss", "1", + "-ss", "00:00:00.5", "-frames:v", "1", tmp_file_name ] self._mqtt.on_before_get_image(self.entity_id) - time.sleep(0.2) + time.sleep(0.3) try: result = subprocess.run(ffmpeg_cmd, timeout=15) # fail after 15 secs finally: self._mqtt.on_after_get_image(self.entity_id) - - if result.returncode == 0: - self._logger.debug("FFmpeg Script Ran Successfully") + + if result is not None and result.returncode == 0: + self._logger.debug("FFmpeg ran successfully") with io.open(tmp_file_name) as tmp_file: arr = np.fromfile(tmp_file_name) img = cv2.imdecode(arr, cv2.IMREAD_UNCHANGED) # 'Load it as it is' diff --git a/meterparser/src/app/mqtt.py b/meterparser/src/app/mqtt.py index 5a21765..1d9d307 100644 --- a/meterparser/src/app/mqtt.py +++ b/meterparser/src/app/mqtt.py @@ -26,7 +26,7 @@ def __init__(self): self._mqtt_client.on_publish = self._mqtt_publish self._mqtt_client.on_connect_fail = self._mqtt_connection_failed - self.cameras: list = list() + self.cameras: list[threading.Thread] = list() self.device_id = slugify((os.environ["HOSTNAME"] if "HOSTNAME" in os.environ else os.environ["COMPUTERNAME"]).lower()) self.device = { "identifiers": self.device_id, @@ -79,8 +79,13 @@ def _mqtt_connected(self, client, userdata, flags, rc): def mqtt_stop(self): for camera in self.cameras: camera.stop() + for camera in self.cameras: + if (camera.isRunning): + time.sleep(2) + self.cameras.clear() self._mqtt_client.disconnect() self._mqtt_client.loop_stop(force=True) + self.stop() def _mqtt_disconnected(self, client, userdata, rc): if not self._mqtt_client.is_connected():