Add zwave_js.refresh_value service (#46944)

* add poll_value service

* switch vol.All to vol.Schema

* more relevant log message

* switch service name to refresh_value, add parameter to refresh all watched values, fix tests

* rename parameter and create task for polling command so we don't wait for a response

* raise ValueError for unknown entity

* better error message

* fix test
This commit is contained in:
Raman Gupta 2021-02-23 18:58:04 -05:00 committed by GitHub
parent 228096847b
commit 1a99562e91
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 168 additions and 7 deletions

View file

@ -8,8 +8,10 @@ from zwave_js_server.model.value import Value as ZwaveValue, get_value_id
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity import Entity
from .const import DOMAIN
from .discovery import ZwaveDiscoveryInfo
from .helpers import get_device_id
@ -39,6 +41,35 @@ class ZWaveBaseEntity(Entity):
To be overridden by platforms needing this event.
"""
async def async_poll_value(self, refresh_all_values: bool) -> None:
"""Poll a value."""
assert self.hass
if not refresh_all_values:
self.hass.async_create_task(
self.info.node.async_poll_value(self.info.primary_value)
)
LOGGER.info(
(
"Refreshing primary value %s for %s, "
"state update may be delayed for devices on battery"
),
self.info.primary_value,
self.entity_id,
)
return
for value_id in self.watched_value_ids:
self.hass.async_create_task(self.info.node.async_poll_value(value_id))
LOGGER.info(
(
"Refreshing values %s for %s, state update may be delayed for "
"devices on battery"
),
", ".join(self.watched_value_ids),
self.entity_id,
)
async def async_added_to_hass(self) -> None:
"""Call when entity is added."""
assert self.hass # typing
@ -46,6 +77,13 @@ class ZWaveBaseEntity(Entity):
self.async_on_remove(
self.info.node.on(EVENT_VALUE_UPDATED, self._value_changed)
)
self.async_on_remove(
async_dispatcher_connect(
self.hass,
f"{DOMAIN}_{self.unique_id}_poll_value",
self.async_poll_value,
)
)
@property
def device_info(self) -> dict: