mirror of
https://github.com/esphome/esphome.git
synced 2026-10-13 09:42:50 +00:00
[teleinfo] Add predefined properties for main tags of TIC standard and historical (#9167)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
co-authored by
Claude Opus 4.6
J. Nick Koston
parent
3ae52e21cf
commit
c9e49b8e8f
@@ -0,0 +1,149 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user