Skip to content

Commit d99a3dd

Browse files
author
chenwenhao
committed
fix watcher image display bug
1 parent 8967d5c commit d99a3dd

File tree

7 files changed

+42
-21
lines changed

7 files changed

+42
-21
lines changed

custom_components/sensecraft/core/sscma_local.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,22 @@ def setMqtt(self):
7171
self.sscmaClient
7272
)
7373
if mqtt.connect():
74+
print('setMqtt connect success')
7475
self.device.on_connect = self.on_device_connect
7576
self.device.loop_start()
77+
print('loop_start')
7678
self.mqttClient = mqtt
7779
self.mqttClient.subscribe(self.rx_topic)
7880
self.mqttClient.message_received = self.on_message
81+
print('on_message')
7982
# 等待连接结果
8083
if self.connectEvent.wait(timeout=30):
84+
print('connectEvent wait success')
8185
self.device.on_monitor = self.on_monitor
8286
self.connected = True
8387
return True
8488
else:
89+
print('connectEvent wait timeout')
8590
self.connected = False
8691
return False
8792
except Exception as e:

custom_components/sensecraft/core/watcher_local.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import logging
2+
import os
3+
from base64 import b64decode
4+
from datetime import datetime
25
from aiohttp import web
36
from homeassistant.core import HomeAssistant
47
from ..const import (
@@ -34,6 +37,11 @@ async def _start_runner(self, runner):
3437
await runner.setup()
3538
site = web.TCPSite(runner, '0.0.0.0', 8887)
3639
await site.start()
40+
41+
def save_image_to_file(self, image_base64, filename):
42+
image_data = b64decode(image_base64)
43+
with open(filename, 'wb') as file:
44+
file.write(image_data)
3745

3846
async def handle_request(self, request):
3947
"""Handle incoming HTTP POST request."""
@@ -47,7 +55,6 @@ async def handle_request(self, request):
4755

4856
text = events.get('text')
4957
image = events.get('img')
50-
5158
if text is not None:
5259
_event_type = ("{domain}_watcher_alarm_{eui}").format(
5360
domain=DOMAIN,
@@ -60,7 +67,14 @@ async def handle_request(self, request):
6067
domain=DOMAIN,
6168
eui=eui
6269
)
63-
self.hass.bus.fire(_event_type, {"image": image})
70+
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S_%f')
71+
filename = self.hass.config.path(f'images/watcher_{timestamp}.png')
72+
73+
# 确保目录存在
74+
os.makedirs(os.path.dirname(filename), exist_ok=True)
75+
76+
self.save_image_to_file(image, filename)
77+
self.hass.bus.fire(_event_type, {"image_path": filename})
6478

6579
temperature = 'unavailable'
6680
humidity = 'unavailable'

custom_components/sensecraft/image.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import logging
2-
from base64 import b64decode
2+
import os
33
from homeassistant import config_entries
44
from homeassistant.util import dt as dt_util
55
from homeassistant.core import HomeAssistant
@@ -53,7 +53,7 @@ def __init__(
5353
self._attr_name = "Alarm Image"
5454
self._attr_image_last_updated = None
5555
self._event = None
56-
self._image_base64 = None
56+
self._image_data = None
5757

5858
async def async_added_to_hass(self) -> None:
5959
"""Run when this Entity has been added to HA."""
@@ -67,9 +67,15 @@ async def async_will_remove_from_hass(self) -> None:
6767
self._event = None
6868

6969
def handle_event(self, event):
70-
self._image_base64 = event.data.get('image')
70+
image_path = event.data.get('image_path')
7171
self._attr_image_last_updated = dt_util.utcnow()
72-
self.async_write_ha_state()
72+
if image_path and os.path.exists(image_path):
73+
with open(image_path, 'rb') as file:
74+
self._image_data = file.read()
75+
image_size = len(self._image_data)
76+
else:
77+
self._image_data = None
78+
self.hass.async_add_job(self.async_write_ha_state)
7379

7480
@property
7581
def device_info(self) -> DeviceInfo:
@@ -86,6 +92,4 @@ def device_info(self) -> DeviceInfo:
8692

8793
def image(self) -> bytes | None:
8894
"""Return bytes of image."""
89-
if self._image_base64:
90-
return b64decode(self._image_base64)
91-
return None
95+
return self._image_data

custom_components/sensecraft/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"paho-mqtt==1.6.1",
1515
"python-sscma==0.0.3"
1616
],
17-
"version": "1.1.3",
17+
"version": "1.1.4",
1818
"zeroconf": [
1919
"_sensecraft._tcp.local.",
2020
"_sscma._tcp.local."

custom_components/sensecraft/number.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ async def async_set_native_value(self, value: float) -> None:
109109
local: SScmaLocal = data[SSCMA_LOCAL]
110110
if local is not None:
111111
local.device.tscore = value
112-
self.async_write_ha_state()
112+
self.hass.async_add_job(self.async_write_ha_state)
113113

114114

115115
class IOU(ConfigNumber):
@@ -135,4 +135,4 @@ async def async_set_native_value(self, value: float) -> None:
135135
local: SScmaLocal = data[SSCMA_LOCAL]
136136
if local is not None:
137137
local.device.tiou = value
138-
self.async_write_ha_state()
138+
self.hass.async_add_job(self.async_write_ha_state)

custom_components/sensecraft/select.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
"""Select platform for Advantage Air integration."""
2-
31
from homeassistant.components.select import SelectEntity
42
from homeassistant.config_entries import ConfigEntry
53
from homeassistant.core import HomeAssistant
@@ -47,7 +45,7 @@ def received_stream_list(self, streams):
4745
data = self.hass.data[DOMAIN][self._entry_id]
4846
local: SenseCraftLocal = data[SENSECRAFT_LOCAL]
4947
local.updateStream(streams[0])
50-
self.async_write_ha_state()
48+
self.hass.async_add_job(self.async_write_ha_state)
5149

5250

5351
@property
@@ -80,7 +78,7 @@ async def async_select_option(self, option: str) -> None:
8078
data = self.hass.data[DOMAIN][self._entry_id]
8179
local: SenseCraftLocal = data[SENSECRAFT_LOCAL]
8280
local.updateStream(option)
83-
self.async_write_ha_state()
81+
self.hass.async_add_job(self.async_write_ha_state)
8482

8583
def should_poll():
8684
return True

custom_components/sensecraft/sensor.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ async def async_will_remove_from_hass(self) -> None:
203203

204204
def handle_event(self, event):
205205
self._state = event.data.get('value')
206-
self.async_write_ha_state()
206+
self.hass.async_add_job(self.async_write_ha_state)
207207

208208
@property
209209
def device_info(self) -> DeviceInfo:
@@ -262,7 +262,7 @@ async def async_will_remove_from_hass(self) -> None:
262262

263263
def handle_event(self, event):
264264
self._state = event.data.get('value')
265-
self.async_write_ha_state()
265+
self.hass.async_add_job(self.async_write_ha_state)
266266

267267
@property
268268
def device_info(self) -> DeviceInfo:
@@ -316,7 +316,7 @@ async def async_will_remove_from_hass(self) -> None:
316316

317317
def handle_event(self, event):
318318
self._state = event.data.get('value')
319-
self.async_write_ha_state()
319+
self.hass.async_add_job(self.async_write_ha_state)
320320

321321
@property
322322
def device_info(self) -> DeviceInfo:
@@ -367,7 +367,7 @@ async def async_will_remove_from_hass(self) -> None:
367367

368368
def handle_event(self, event):
369369
self._state = event.data.get('value')
370-
self.async_write_ha_state()
370+
self.hass.async_add_job(self.async_write_ha_state)
371371

372372
@property
373373
def device_info(self) -> DeviceInfo:
@@ -416,7 +416,7 @@ async def async_will_remove_from_hass(self) -> None:
416416

417417
def handle_event(self, event):
418418
self._state = event.data.get('text')
419-
self.async_write_ha_state()
419+
self.hass.async_add_job(self.async_write_ha_state)
420420

421421
@property
422422
def device_info(self) -> DeviceInfo:

0 commit comments

Comments
 (0)