From 6f3a2305249ca5562c4d1e612f706e5f8777c99a Mon Sep 17 00:00:00 2001 From: Xiretza Date: Tue, 10 Dec 2024 12:47:20 +0000 Subject: [PATCH] spaceapi: fix sensor values (#132099) --- homeassistant/components/spaceapi/__init__.py | 13 ++++++- tests/components/spaceapi/test_init.py | 36 +++++++++++++++---- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/spaceapi/__init__.py b/homeassistant/components/spaceapi/__init__.py index 93d448bd17f..90281fe311c 100644 --- a/homeassistant/components/spaceapi/__init__.py +++ b/homeassistant/components/spaceapi/__init__.py @@ -1,6 +1,7 @@ """Support for the SpaceAPI.""" from contextlib import suppress +import math import voluptuous as vol @@ -254,7 +255,17 @@ class APISpaceApiView(HomeAssistantView): """Get data from a sensor.""" if not (sensor_state := hass.states.get(sensor)): return None - sensor_data = {ATTR_NAME: sensor_state.name, ATTR_VALUE: sensor_state.state} + + # SpaceAPI sensor values must be numbers + try: + state = float(sensor_state.state) + except ValueError: + state = math.nan + sensor_data = { + ATTR_NAME: sensor_state.name, + ATTR_VALUE: state, + } + if ATTR_SENSOR_LOCATION in sensor_state.attributes: sensor_data[ATTR_LOCATION] = sensor_state.attributes[ATTR_SENSOR_LOCATION] else: diff --git a/tests/components/spaceapi/test_init.py b/tests/components/spaceapi/test_init.py index 0de96d05605..8c0e897947a 100644 --- a/tests/components/spaceapi/test_init.py +++ b/tests/components/spaceapi/test_init.py @@ -6,7 +6,12 @@ from unittest.mock import patch from aiohttp.test_utils import TestClient import pytest -from homeassistant.components.spaceapi import DOMAIN, SPACEAPI_VERSION, URL_API_SPACEAPI +from homeassistant.components.spaceapi import ( + ATTR_SENSOR_LOCATION, + DOMAIN, + SPACEAPI_VERSION, + URL_API_SPACEAPI, +) from homeassistant.const import ATTR_UNIT_OF_MEASUREMENT, PERCENTAGE, UnitOfTemperature from homeassistant.core import HomeAssistant from homeassistant.setup import async_setup_component @@ -27,7 +32,7 @@ CONFIG = { "icon_closed": "https://home-assistant.io/close.png", }, "sensors": { - "temperature": ["test.temp1", "test.temp2"], + "temperature": ["test.temp1", "test.temp2", "test.temp3"], "humidity": ["test.hum1"], }, "spacefed": {"spacenet": True, "spacesaml": False, "spacephone": True}, @@ -67,17 +72,23 @@ SENSOR_OUTPUT = { "location": "Home", "name": "temp1", "unit": UnitOfTemperature.CELSIUS, - "value": "25", + "value": 25.0, + }, + { + "location": "outside", + "name": "temp2", + "unit": UnitOfTemperature.CELSIUS, + "value": 23.0, }, { "location": "Home", - "name": "temp2", + "name": "temp3", "unit": UnitOfTemperature.CELSIUS, - "value": "23", + "value": None, }, ], "humidity": [ - {"location": "Home", "name": "hum1", "unit": PERCENTAGE, "value": "88"} + {"location": "Home", "name": "hum1", "unit": PERCENTAGE, "value": 88.0} ], } @@ -96,6 +107,19 @@ def mock_client(hass: HomeAssistant, hass_client: ClientSessionGenerator) -> Tes hass.states.async_set( "test.temp2", 23, + attributes={ + ATTR_UNIT_OF_MEASUREMENT: UnitOfTemperature.CELSIUS, + ATTR_SENSOR_LOCATION: "outside", + }, + ) + hass.states.async_set( + "test.temp3", + "foo", + attributes={ATTR_UNIT_OF_MEASUREMENT: UnitOfTemperature.CELSIUS}, + ) + hass.states.async_set( + "test.temp3", + "foo", attributes={ATTR_UNIT_OF_MEASUREMENT: UnitOfTemperature.CELSIUS}, ) hass.states.async_set(