mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 19:27:45 +00:00
google_assistant: support for humidity sensors (#28695)
This commit is contained in:
parent
72ccc83651
commit
1f72de108c
@ -135,6 +135,7 @@ DEVICE_CLASS_TO_GOOGLE_TYPES = {
|
|||||||
(media_player.DOMAIN, media_player.DEVICE_CLASS_TV): TYPE_TV,
|
(media_player.DOMAIN, media_player.DEVICE_CLASS_TV): TYPE_TV,
|
||||||
(media_player.DOMAIN, media_player.DEVICE_CLASS_SPEAKER): TYPE_SPEAKER,
|
(media_player.DOMAIN, media_player.DEVICE_CLASS_SPEAKER): TYPE_SPEAKER,
|
||||||
(sensor.DOMAIN, sensor.DEVICE_CLASS_TEMPERATURE): TYPE_SENSOR,
|
(sensor.DOMAIN, sensor.DEVICE_CLASS_TEMPERATURE): TYPE_SENSOR,
|
||||||
|
(sensor.DOMAIN, sensor.DEVICE_CLASS_HUMIDITY): TYPE_SENSOR,
|
||||||
}
|
}
|
||||||
|
|
||||||
CHALLENGE_ACK_NEEDED = "ackNeeded"
|
CHALLENGE_ACK_NEEDED = "ackNeeded"
|
||||||
|
@ -80,6 +80,7 @@ TRAIT_MODES = PREFIX_TRAITS + "Modes"
|
|||||||
TRAIT_OPENCLOSE = PREFIX_TRAITS + "OpenClose"
|
TRAIT_OPENCLOSE = PREFIX_TRAITS + "OpenClose"
|
||||||
TRAIT_VOLUME = PREFIX_TRAITS + "Volume"
|
TRAIT_VOLUME = PREFIX_TRAITS + "Volume"
|
||||||
TRAIT_ARMDISARM = PREFIX_TRAITS + "ArmDisarm"
|
TRAIT_ARMDISARM = PREFIX_TRAITS + "ArmDisarm"
|
||||||
|
TRAIT_HUMIDITY_SETTING = PREFIX_TRAITS + "HumiditySetting"
|
||||||
|
|
||||||
PREFIX_COMMANDS = "action.devices.commands."
|
PREFIX_COMMANDS = "action.devices.commands."
|
||||||
COMMAND_ONOFF = PREFIX_COMMANDS + "OnOff"
|
COMMAND_ONOFF = PREFIX_COMMANDS + "OnOff"
|
||||||
@ -849,6 +850,56 @@ class TemperatureSettingTrait(_Trait):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@register_trait
|
||||||
|
class HumiditySettingTrait(_Trait):
|
||||||
|
"""Trait to offer humidity setting functionality.
|
||||||
|
|
||||||
|
https://developers.google.com/actions/smarthome/traits/humiditysetting
|
||||||
|
"""
|
||||||
|
|
||||||
|
name = TRAIT_HUMIDITY_SETTING
|
||||||
|
commands = []
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def supported(domain, features, device_class):
|
||||||
|
"""Test if state is supported."""
|
||||||
|
return domain == sensor.DOMAIN and device_class == sensor.DEVICE_CLASS_HUMIDITY
|
||||||
|
|
||||||
|
def sync_attributes(self):
|
||||||
|
"""Return humidity attributes for a sync request."""
|
||||||
|
response = {}
|
||||||
|
attrs = self.state.attributes
|
||||||
|
domain = self.state.domain
|
||||||
|
if domain == sensor.DOMAIN:
|
||||||
|
device_class = attrs.get(ATTR_DEVICE_CLASS)
|
||||||
|
if device_class == sensor.DEVICE_CLASS_HUMIDITY:
|
||||||
|
response["queryOnlyHumiditySetting"] = True
|
||||||
|
|
||||||
|
return response
|
||||||
|
|
||||||
|
def query_attributes(self):
|
||||||
|
"""Return humidity query attributes."""
|
||||||
|
response = {}
|
||||||
|
attrs = self.state.attributes
|
||||||
|
domain = self.state.domain
|
||||||
|
if domain == sensor.DOMAIN:
|
||||||
|
device_class = attrs.get(ATTR_DEVICE_CLASS)
|
||||||
|
if device_class == sensor.DEVICE_CLASS_HUMIDITY:
|
||||||
|
current_humidity = self.state.state
|
||||||
|
if current_humidity is not None:
|
||||||
|
response["humidityAmbientPercent"] = round(float(current_humidity))
|
||||||
|
|
||||||
|
return response
|
||||||
|
|
||||||
|
async def execute(self, command, data, params, challenge):
|
||||||
|
"""Execute a humidity command."""
|
||||||
|
domain = self.state.domain
|
||||||
|
if domain == sensor.DOMAIN:
|
||||||
|
raise SmartHomeError(
|
||||||
|
ERR_NOT_SUPPORTED, "Execute is not supported by sensor"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@register_trait
|
@register_trait
|
||||||
class LockUnlockTrait(_Trait):
|
class LockUnlockTrait(_Trait):
|
||||||
"""Trait to lock or unlock a lock.
|
"""Trait to lock or unlock a lock.
|
||||||
|
@ -1629,3 +1629,29 @@ async def test_temperature_setting_sensor(hass):
|
|||||||
|
|
||||||
assert trt.query_attributes() == {"thermostatTemperatureAmbient": 21.1}
|
assert trt.query_attributes() == {"thermostatTemperatureAmbient": 21.1}
|
||||||
hass.config.units.temperature_unit = TEMP_CELSIUS
|
hass.config.units.temperature_unit = TEMP_CELSIUS
|
||||||
|
|
||||||
|
|
||||||
|
async def test_humidity_setting_sensor(hass):
|
||||||
|
"""Test HumiditySetting trait support for humidity sensor."""
|
||||||
|
assert (
|
||||||
|
helpers.get_google_type(sensor.DOMAIN, sensor.DEVICE_CLASS_HUMIDITY) is not None
|
||||||
|
)
|
||||||
|
assert not trait.HumiditySettingTrait.supported(
|
||||||
|
sensor.DOMAIN, 0, sensor.DEVICE_CLASS_TEMPERATURE
|
||||||
|
)
|
||||||
|
assert trait.HumiditySettingTrait.supported(
|
||||||
|
sensor.DOMAIN, 0, sensor.DEVICE_CLASS_HUMIDITY
|
||||||
|
)
|
||||||
|
|
||||||
|
trt = trait.HumiditySettingTrait(
|
||||||
|
hass,
|
||||||
|
State("sensor.test", "70", {ATTR_DEVICE_CLASS: sensor.DEVICE_CLASS_HUMIDITY}),
|
||||||
|
BASIC_CONFIG,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert trt.sync_attributes() == {"queryOnlyHumiditySetting": True}
|
||||||
|
assert trt.query_attributes() == {"humidityAmbientPercent": 70}
|
||||||
|
|
||||||
|
with pytest.raises(helpers.SmartHomeError) as err:
|
||||||
|
await trt.execute(trait.COMMAND_ONOFF, BASIC_DATA, {"on": False}, {})
|
||||||
|
assert err.value.code == const.ERR_NOT_SUPPORTED
|
||||||
|
Loading…
x
Reference in New Issue
Block a user