微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不在 CoordinatorEntity 上调用 async_update 方法

如何解决不在 CoordinatorEntity 上调用 async_update 方法

我正在家庭助理中创建我的第一个集成。

我首先创建了几个单独调用设备 API 的实体。这有效,但正在向 API 发送垃圾邮件。所以我切换到异步函数并且确实有很多超时。现在我将代码更改为使用协调器,以便集成需要调用 API 一次以填充实体状态。协调器中的数据更新正在工作,但实体方法 async_update() 不会被调用,因此我的实体处于未知状态。

我的代码有什么问题,所以我的实体可以更新状态?


async def getFieldValue(coordinator,field):
        for data in coordinator.data:
            if data['Name'] == field:
                _LOGGER.info(data['Value'])
                return data['Value']
    
    async def async_setup_platform(hass,config,async_add_entities,discovery_info=None):
        host = config[CONF_HOST]
        
        async def async_update_data():
            _LOGGER.info("update data")
            async with aiohttp.ClientSession() as session:
                async with session.get(DATA_URL.replace("[host]",host)) as response:
    
                    if response.status == 200:
                        return await response.json()
                    else:
                        raise UpdateFailed(f"Error communicating with API: {response.status}")
    
        coordinator = DataUpdateCoordinator(
            hass,_LOGGER,# Name of the data. For logging purposes.
            name="sensor",update_method=async_update_data,# Polling interval. Will only be polled if there are subscribers.
            update_interval=timedelta(seconds=30),)
    
        await coordinator.async_config_entry_first_refresh()
    
        async_add_entities([
            SensorValue(coordinator,"Air quality",AIR_QUALITY_FIELD,"","quality"),SensorValue(coordinator,"CO2 value",CO2_FIELD,"carbon_dioxide","ppm","numeric"),])
    
    class SensorValue(CoordinatorEntity):
    
        def __init__(self,coordinator,name,field,deviceClass,unitOfMeasurement,dataType):
            super().__init__(coordinator)
    
            self._state = None
            self.sensorName = name
            self.field = field
            self.deviceClass = deviceClass
            self.unitOfMeasurement = unitOfMeasurement
            self.datatYPE = dataType
    
        @property
        def name(self):
            return self.sensorName
    
        @property
        def device_class(self):
            return self.deviceClass
    
        @property
        def unit_of_measurement(self):
            return self.unitOfMeasurement
    
        @property
        def state(self):
            return self._state
    
        async def async_update(self):
            _LOGGER.info("update sensor state")
            if dataType == "numeric":
                self._state = round(float(await getFieldValue(self.coordinator,field)))
            elif dataType == "string":
                self._state = await getFieldValue(self.coordinator,field)
            elif dataType == "boolean":
                self._state = bool(int(await getFieldValue(self.coordinator,field)))
            elif dataType == "quality":
                value = round(float(await getFieldValue(self.coordinator,field)))
                if value < 950:
                    self._state = QUALITY_GOOD
                elif value < 1500:
                    self._state = QUALITY_POOR
                else:
                    self._state = QUALITY_BAD

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。