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
f9a81869ef
commit
721228c1d2
@@ -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
|
||||
@@ -22,11 +22,95 @@ teleinfo:
|
||||
update_interval: 60s
|
||||
|
||||
sensor:
|
||||
# Historical mode tags - auto-configured via apply_tag_config
|
||||
- platform: teleinfo
|
||||
name: hchc
|
||||
tag_name: HCHC
|
||||
teleinfo_id: test_teleinfo
|
||||
unit_of_measurement: Wh
|
||||
- platform: teleinfo
|
||||
name: base
|
||||
tag_name: BASE
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: iinst1
|
||||
tag_name: IINST1
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: papp
|
||||
tag_name: PAPP
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: bbrhcjb
|
||||
tag_name: BBRHCJB
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: ejphn
|
||||
tag_name: EJPHN
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: pmax
|
||||
tag_name: PMAX
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: imax1
|
||||
tag_name: IMAX1
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: isousc
|
||||
tag_name: ISOUSC
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: adps
|
||||
tag_name: ADPS
|
||||
teleinfo_id: test_teleinfo
|
||||
# Standard mode tags - auto-configured via apply_tag_config
|
||||
- platform: teleinfo
|
||||
name: east
|
||||
tag_name: EAST
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: erqt
|
||||
tag_name: ERQT
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: irms1
|
||||
tag_name: IRMS1
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: urms1
|
||||
tag_name: URMS1
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: sinsts
|
||||
tag_name: SINSTS
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: smaxsn
|
||||
tag_name: SMAXSN
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: ccasn
|
||||
tag_name: CCASN
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: pref
|
||||
tag_name: PREF
|
||||
teleinfo_id: test_teleinfo
|
||||
- platform: teleinfo
|
||||
name: pcoup
|
||||
tag_name: PCOUP
|
||||
teleinfo_id: test_teleinfo
|
||||
# Explicit override - user-specified unit should not be overwritten
|
||||
- platform: teleinfo
|
||||
name: hchp_override
|
||||
tag_name: HCHP
|
||||
teleinfo_id: test_teleinfo
|
||||
unit_of_measurement: kWh
|
||||
# Unknown tag - no auto-config match, should still compile
|
||||
- platform: teleinfo
|
||||
name: custom_tag
|
||||
tag_name: MYTAG
|
||||
teleinfo_id: test_teleinfo
|
||||
|
||||
text_sensor:
|
||||
- platform: teleinfo
|
||||
|
||||
Reference in New Issue
Block a user