Files
esphome/tests/component_tests/teleinfo/test_sensor.py
T

150 lines
5.2 KiB
Python

"""Tests for teleinfo sensor tag presets."""
import pytest
from esphome.components.teleinfo import CONF_TAG_NAME
from esphome.components.teleinfo.sensor import apply_tag_config
from esphome.const import (
CONF_DEVICE_CLASS,
CONF_ICON,
CONF_STATE_CLASS,
CONF_UNIT_OF_MEASUREMENT,
DEVICE_CLASS_APPARENT_POWER,
DEVICE_CLASS_CURRENT,
DEVICE_CLASS_ENERGY,
DEVICE_CLASS_POWER,
DEVICE_CLASS_REACTIVE_ENERGY,
DEVICE_CLASS_VOLTAGE,
ICON_FLASH,
STATE_CLASS_MEASUREMENT,
STATE_CLASS_TOTAL_INCREASING,
UNIT_AMPERE,
UNIT_KILOVOLT_AMPS,
UNIT_KILOWATT_HOURS,
UNIT_MILLIAMP,
UNIT_VOLT,
UNIT_VOLT_AMPS,
UNIT_VOLT_AMPS_REACTIVE_HOURS,
UNIT_WATT,
UNIT_WATT_HOURS,
)
@pytest.mark.parametrize(
("tag", "unit", "device_class", "state_class"),
[
("EAST", UNIT_WATT_HOURS, DEVICE_CLASS_ENERGY, STATE_CLASS_TOTAL_INCREASING),
(
"ERQ1",
UNIT_VOLT_AMPS_REACTIVE_HOURS,
DEVICE_CLASS_REACTIVE_ENERGY,
STATE_CLASS_TOTAL_INCREASING,
),
("IRMS1", UNIT_AMPERE, DEVICE_CLASS_CURRENT, STATE_CLASS_MEASUREMENT),
("URMS1", UNIT_VOLT, DEVICE_CLASS_VOLTAGE, STATE_CLASS_MEASUREMENT),
(
"SINSTS",
UNIT_VOLT_AMPS,
DEVICE_CLASS_APPARENT_POWER,
STATE_CLASS_MEASUREMENT,
),
(
"PREF",
UNIT_KILOVOLT_AMPS,
DEVICE_CLASS_APPARENT_POWER,
STATE_CLASS_MEASUREMENT,
),
("CCASN", UNIT_WATT, DEVICE_CLASS_POWER, STATE_CLASS_MEASUREMENT),
("HCHC", UNIT_WATT_HOURS, DEVICE_CLASS_ENERGY, STATE_CLASS_TOTAL_INCREASING),
("BBRHCJB", UNIT_WATT_HOURS, DEVICE_CLASS_ENERGY, STATE_CLASS_TOTAL_INCREASING),
("IINST1", UNIT_AMPERE, DEVICE_CLASS_CURRENT, STATE_CLASS_MEASUREMENT),
("ADIR2", UNIT_AMPERE, DEVICE_CLASS_CURRENT, STATE_CLASS_MEASUREMENT),
("PAPP", UNIT_VOLT_AMPS, DEVICE_CLASS_APPARENT_POWER, STATE_CLASS_MEASUREMENT),
("PMAX", UNIT_WATT, DEVICE_CLASS_POWER, STATE_CLASS_MEASUREMENT),
],
)
def test_known_tag_preset(
tag: str, unit: str, device_class: str, state_class: str
) -> None:
config = apply_tag_config({CONF_TAG_NAME: tag})
assert config[CONF_UNIT_OF_MEASUREMENT] == unit
assert config[CONF_DEVICE_CLASS] == device_class
assert config[CONF_STATE_CLASS] == state_class
assert CONF_ICON not in config
def test_unknown_tag_keeps_legacy_defaults() -> None:
config = apply_tag_config({CONF_TAG_NAME: "MYTAG"})
assert config[CONF_UNIT_OF_MEASUREMENT] == UNIT_WATT_HOURS
assert config[CONF_DEVICE_CLASS] == DEVICE_CLASS_ENERGY
assert config[CONF_STATE_CLASS] == STATE_CLASS_TOTAL_INCREASING
assert config[CONF_ICON] == ICON_FLASH
def test_unknown_tag_user_unit_keeps_legacy_device_class() -> None:
config = apply_tag_config(
{CONF_TAG_NAME: "MYTAG", CONF_UNIT_OF_MEASUREMENT: UNIT_KILOWATT_HOURS}
)
assert config[CONF_UNIT_OF_MEASUREMENT] == UNIT_KILOWATT_HOURS
assert config[CONF_DEVICE_CLASS] == DEVICE_CLASS_ENERGY
assert config[CONF_STATE_CLASS] == STATE_CLASS_TOTAL_INCREASING
assert config[CONF_ICON] == ICON_FLASH
def test_unknown_tag_starting_with_u_is_not_voltage() -> None:
config = apply_tag_config({CONF_TAG_NAME: "UNKNOWN"})
assert config[CONF_DEVICE_CLASS] == DEVICE_CLASS_ENERGY
def test_numeric_tag_name_does_not_crash() -> None:
config = apply_tag_config({CONF_TAG_NAME: 1234})
assert config[CONF_TAG_NAME] == 1234
assert config[CONF_DEVICE_CLASS] == DEVICE_CLASS_ENERGY
@pytest.mark.parametrize(
("tag", "unit", "device_class"),
[
("HCHP", UNIT_KILOWATT_HOURS, DEVICE_CLASS_ENERGY),
("EAST", UNIT_KILOWATT_HOURS, DEVICE_CLASS_ENERGY),
("PREF", UNIT_VOLT_AMPS, DEVICE_CLASS_APPARENT_POWER),
("IINST1", UNIT_MILLIAMP, DEVICE_CLASS_CURRENT),
],
)
def test_user_compatible_unit_keeps_preset_device_class(
tag: str, unit: str, device_class: str
) -> None:
config = apply_tag_config({CONF_TAG_NAME: tag, CONF_UNIT_OF_MEASUREMENT: unit})
assert config[CONF_UNIT_OF_MEASUREMENT] == unit
assert config[CONF_DEVICE_CLASS] == device_class
def test_user_incompatible_unit_skips_preset_device_class() -> None:
config = apply_tag_config({CONF_TAG_NAME: "PAPP", CONF_UNIT_OF_MEASUREMENT: "W"})
assert config[CONF_UNIT_OF_MEASUREMENT] == "W"
assert CONF_DEVICE_CLASS not in config
assert config[CONF_STATE_CLASS] == STATE_CLASS_MEASUREMENT
def test_user_incompatible_device_class_skips_preset_unit() -> None:
config = apply_tag_config(
{CONF_TAG_NAME: "PAPP", CONF_DEVICE_CLASS: DEVICE_CLASS_POWER}
)
assert config[CONF_DEVICE_CLASS] == DEVICE_CLASS_POWER
assert CONF_UNIT_OF_MEASUREMENT not in config
def test_user_same_device_class_keeps_preset_unit() -> None:
config = apply_tag_config(
{CONF_TAG_NAME: "PAPP", CONF_DEVICE_CLASS: DEVICE_CLASS_APPARENT_POWER}
)
assert config[CONF_UNIT_OF_MEASUREMENT] == UNIT_VOLT_AMPS
def test_user_state_class_is_kept() -> None:
config = apply_tag_config(
{CONF_TAG_NAME: "HCHP", CONF_STATE_CLASS: STATE_CLASS_MEASUREMENT}
)
assert config[CONF_STATE_CLASS] == STATE_CLASS_MEASUREMENT
assert config[CONF_UNIT_OF_MEASUREMENT] == UNIT_WATT_HOURS