diff --git a/README.md b/README.md index 00cd551..c22c9c3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,12 @@ 此项目为 [Home Assistant](https://www.home-assistant.io/) 的[巴法云](https://cloud.bemfa.com/)插件。 +## 修复 +修复高版本HA的mqtt版本不兼容导致的bemfa插件失效问题 25/09/10 +修复参考(https://bbs.hassbian.com/thread-29794-1-1.html)帖子和评论 + +修复core 2025.11.0 CAMERA_DOMAIN不兼容的问题 + + + ## 功能 将 Home Assistant 实体同步至巴法云,并使用小爱同学/天猫精灵/小度音箱控制。 diff --git a/custom_components/bemfa/const.py b/custom_components/bemfa/const.py index a833fff..776f8b3 100644 --- a/custom_components/bemfa/const.py +++ b/custom_components/bemfa/const.py @@ -2,7 +2,7 @@ from typing import Final -from homeassistant.backports.enum import StrEnum +from enum import StrEnum DOMAIN: Final = "bemfa" diff --git a/custom_components/bemfa/manifest.json b/custom_components/bemfa/manifest.json index c2aca07..2343a46 100644 --- a/custom_components/bemfa/manifest.json +++ b/custom_components/bemfa/manifest.json @@ -10,8 +10,8 @@ "homekit": {}, "iot_class": "cloud_push", "issue_tracker": "https://github.com/larry-wong/bemfa/issues", - "requirements": ["paho-mqtt==1.6.1"], + "requirements": ["paho-mqtt==2.1.0"], "ssdp": [], - "version": "1.4.0", + "version": "1.4.2", "zeroconf": [] -} \ No newline at end of file +} diff --git a/custom_components/bemfa/mqtt.py b/custom_components/bemfa/mqtt.py index e75f650..c113340 100644 --- a/custom_components/bemfa/mqtt.py +++ b/custom_components/bemfa/mqtt.py @@ -38,7 +38,8 @@ def __init__( self._hass = hass # Init MQTT connection - self._mqttc = mqtt.Client(uid, mqtt.MQTTv311) + #self._mqttc = mqtt.Client(uid, mqtt.MQTTv311) + self._mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1, client_id=uid, protocol=mqtt.MQTTv311) self._topic_to_sync: dict[str, Sync] = {} diff --git a/custom_components/bemfa/sync_light.py b/custom_components/bemfa/sync_light.py index 9573792..798aee1 100644 --- a/custom_components/bemfa/sync_light.py +++ b/custom_components/bemfa/sync_light.py @@ -6,9 +6,9 @@ from homeassistant.components.light import ( ATTR_BRIGHTNESS, ATTR_BRIGHTNESS_PCT, - ATTR_COLOR_TEMP, - ATTR_MAX_MIREDS, - ATTR_MIN_MIREDS, + ATTR_COLOR_TEMP_KELVIN, + ATTR_MIN_COLOR_TEMP_KELVIN, + ATTR_MAX_COLOR_TEMP_KELVIN, ATTR_RGB_COLOR, ATTR_SUPPORTED_COLOR_MODES, DOMAIN, @@ -45,8 +45,8 @@ def _msg_generators( lambda state, attributes: round(attributes[ATTR_BRIGHTNESS] / 2.55) if has_key(attributes, ATTR_BRIGHTNESS) else "", - lambda state, attributes: 1000000 // attributes[ATTR_COLOR_TEMP] - if has_key(attributes, ATTR_COLOR_TEMP) + lambda state, attributes: 1000000 // attributes[ATTR_COLOR_TEMP_KELVIN] + if has_key(attributes, ATTR_COLOR_TEMP_KELVIN) else attributes[ATTR_RGB_COLOR][0] * 256 * 256 + attributes[ATTR_RGB_COLOR][1] * 256 + attributes[ATTR_RGB_COLOR][2] @@ -76,8 +76,8 @@ def _msg_resolvers( { ATTR_BRIGHTNESS_PCT: msg[1], ATTR_COLOR_TEMP: min( - max(1000000 // msg[2], attributes[ATTR_MIN_MIREDS]), - attributes[ATTR_MAX_MIREDS], + max(1000000 // msg[2], attributes[ATTR_MAX_COLOR_TEMP_KELVIN]), + attributes[ATTR_MIN_COLOR_TEMP_KELVIN], ), } if len(msg) > 2 diff --git a/custom_components/bemfa/sync_sensor.py b/custom_components/bemfa/sync_sensor.py index 1ddb28e..dc221a1 100644 --- a/custom_components/bemfa/sync_sensor.py +++ b/custom_components/bemfa/sync_sensor.py @@ -14,7 +14,6 @@ SelectSelectorConfig, SelectSelectorMode, ) -from homeassistant.helpers.template import area_entities from .utils import has_key from .const import ( OPTIONS_CO2, diff --git a/custom_components/bemfa/sync_switch.py b/custom_components/bemfa/sync_switch.py index de8fc8f..a37dc14 100644 --- a/custom_components/bemfa/sync_switch.py +++ b/custom_components/bemfa/sync_switch.py @@ -4,7 +4,8 @@ from collections.abc import Mapping, Callable from typing import Any from homeassistant.components.automation import DOMAIN as AUTOMATION_DOMAIN -from homeassistant.components.camera import DOMAIN as CAMERA_DOMAIN, STATE_IDLE +from homeassistant.components.camera import DOMAIN as CAMERA_DOMAIN +from homeassistant.components.camera.const import CameraState from homeassistant.components.group import DOMAIN as GROUP_DOMAIN from homeassistant.components.humidifier import DOMAIN as HUMIDIFIER_DOMAIN from homeassistant.components.input_boolean import DOMAIN as INPUT_BOOLEAN_DOMAIN @@ -20,8 +21,8 @@ SERVICE_RETURN_TO_BASE, SERVICE_START, SERVICE_STOP, - STATE_CLEANING, VacuumEntityFeature, + VacuumActivity, ) from homeassistant.const import ( ATTR_SUPPORTED_FEATURES, @@ -29,7 +30,6 @@ SERVICE_TURN_ON, SERVICE_UNLOCK, SERVICE_LOCK, - STATE_LOCKED, STATE_ON, STATE_PLAYING, ) @@ -148,7 +148,7 @@ def _supported_domain() -> str: def _msg_generator( self, ) -> Callable[[str, ReadOnlyDict[Mapping[str, Any]]], str | int]: - return lambda state, attributes: MSG_OFF if state == STATE_LOCKED else MSG_ON + return lambda state, attributes: MSG_OFF if state == 'locked' else MSG_ON def _service_names(self) -> tuple[str, str]: return (SERVICE_UNLOCK, SERVICE_LOCK) @@ -193,7 +193,7 @@ def _msg_generator( ) -> Callable[[str, ReadOnlyDict[Mapping[str, Any]]], str | int]: return ( lambda state, attributes: MSG_ON - if state in [STATE_ON, STATE_CLEANING] + if state in [STATE_ON, VacuumActivity.CLEANING] else MSG_OFF )