mirror of
https://github.com/esphome/esphome.git
synced 2026-10-11 13:54:12 +00:00
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: J. Nick Koston <nick@koston.org>
150 lines
5.2 KiB
Python
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
|