Add additional test coverage for zwave_js meter sensors (#55465)

pull/55549/head
Raman Gupta 2021-09-01 17:22:17 -04:00 committed by GitHub
parent 7dbd0e5274
commit 02eba22068
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 90 additions and 1 deletions

View File

@ -201,7 +201,7 @@ class NumericSensorDataTemplate(BaseDiscoverySchemaDataTemplate):
):
return ENTITY_DESC_KEY_TOTAL_INCREASING
# We do this because even though these are power scales, they don't meet
# the unit requirements for the energy power class.
# the unit requirements for the power device class.
if scale_type == ElectricScale.KILOVOLT_AMPERE_REACTIVE:
return ENTITY_DESC_KEY_MEASUREMENT

View File

@ -1,17 +1,24 @@
"""Test the Z-Wave JS sensor platform."""
import copy
from zwave_js_server.const.command_class.meter import MeterType
from zwave_js_server.event import Event
from zwave_js_server.model.node import Node
from homeassistant.components.sensor import (
ATTR_STATE_CLASS,
STATE_CLASS_MEASUREMENT,
STATE_CLASS_TOTAL_INCREASING,
)
from homeassistant.components.zwave_js.const import (
ATTR_METER_TYPE,
ATTR_METER_TYPE_NAME,
ATTR_VALUE,
DOMAIN,
SERVICE_RESET_METER,
)
from homeassistant.const import (
ATTR_DEVICE_CLASS,
ATTR_ENTITY_ID,
DEVICE_CLASS_CURRENT,
DEVICE_CLASS_ENERGY,
@ -268,3 +275,85 @@ async def test_reset_meter(
assert args["args"] == [{"type": 1, "targetValue": 2}]
client.async_send_command_no_wait.reset_mock()
async def test_meter_attributes(
hass,
client,
aeon_smart_switch_6,
integration,
):
"""Test meter entity attributes."""
state = hass.states.get(METER_ENERGY_SENSOR)
assert state
assert state.attributes[ATTR_METER_TYPE] == MeterType.ELECTRIC.value
assert state.attributes[ATTR_METER_TYPE_NAME] == MeterType.ELECTRIC.name
assert state.attributes[ATTR_DEVICE_CLASS] == DEVICE_CLASS_ENERGY
assert state.attributes[ATTR_STATE_CLASS] == STATE_CLASS_TOTAL_INCREASING
async def test_special_meters(hass, aeon_smart_switch_6_state, client, integration):
"""Test meters that have special handling."""
node_data = copy.deepcopy(
aeon_smart_switch_6_state
) # Copy to allow modification in tests.
# Add an ElectricScale.KILOVOLT_AMPERE_HOUR value to the state so we can test that
# it is handled differently (no device class)
node_data["values"].append(
{
"endpoint": 10,
"commandClass": 50,
"commandClassName": "Meter",
"property": "value",
"propertyKey": 65537,
"propertyName": "value",
"propertyKeyName": "Electric_kVah_Consumed",
"ccVersion": 3,
"metadata": {
"type": "number",
"readable": True,
"writeable": False,
"label": "Electric Consumed [kVah]",
"unit": "kVah",
"ccSpecific": {"meterType": 1, "rateType": 1, "scale": 1},
},
"value": 659.813,
},
)
# Add an ElectricScale.KILOVOLT_AMPERE_REACTIVE value to the state so we can test that
# it is handled differently (no device class)
node_data["values"].append(
{
"endpoint": 11,
"commandClass": 50,
"commandClassName": "Meter",
"property": "value",
"propertyKey": 65537,
"propertyName": "value",
"propertyKeyName": "Electric_kVa_reactive_Consumed",
"ccVersion": 3,
"metadata": {
"type": "number",
"readable": True,
"writeable": False,
"label": "Electric Consumed [kVa reactive]",
"unit": "kVa reactive",
"ccSpecific": {"meterType": 1, "rateType": 1, "scale": 7},
},
"value": 659.813,
},
)
node = Node(client, node_data)
event = {"node": node}
client.driver.controller.emit("node added", event)
await hass.async_block_till_done()
state = hass.states.get("sensor.smart_switch_6_electric_consumed_kvah_10")
assert state
assert ATTR_DEVICE_CLASS not in state.attributes
assert state.attributes[ATTR_STATE_CLASS] == STATE_CLASS_TOTAL_INCREASING
state = hass.states.get("sensor.smart_switch_6_electric_consumed_kva_reactive_11")
assert state
assert ATTR_DEVICE_CLASS not in state.attributes
assert state.attributes[ATTR_STATE_CLASS] == STATE_CLASS_MEASUREMENT