Skip to content

Commit

Permalink
Reduce ffmpeg logs, reduce amount of time to seek for a snapshot
Browse files Browse the repository at this point in the history
  • Loading branch information
junalmeida committed Jan 4, 2023
1 parent 3dfd9f9 commit b0c8b31
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 25 deletions.
14 changes: 1 addition & 13 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
4 changes: 4 additions & 0 deletions meterparser/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
2 changes: 1 addition & 1 deletion meterparser/config.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 0 additions & 2 deletions meterparser/src/__main__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import time
from app.camera import Camera
from app.mqtt import Mqtt
from app.service import Service
import sys
Expand Down
19 changes: 11 additions & 8 deletions meterparser/src/app/camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 []
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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'
Expand Down
7 changes: 6 additions & 1 deletion meterparser/src/app/mqtt.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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():
Expand Down

0 comments on commit b0c8b31

Please sign in to comment.