我正在家庭助理中创建我的第一个集成。
我首先创建了几个单独调用设备 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