mirror of
https://github.com/esphome/esphome.git
synced 2026-09-28 15:30:21 +00:00
Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: J. Nick Koston <nick@koston.org> Co-authored-by: J. Nick Koston <nick@home-assistant.io>
85 lines
2.7 KiB
Python
85 lines
2.7 KiB
Python
"""Tag-based sensor defaults, driven through the real CONFIG_SCHEMA."""
|
|
|
|
import pytest
|
|
|
|
from esphome.components import sensor
|
|
from esphome.components.mk2pvrouter.sensor import CONFIG_SCHEMA, tag_kind
|
|
from esphome.const import (
|
|
CONF_ACCURACY_DECIMALS,
|
|
CONF_DEVICE_CLASS,
|
|
CONF_STATE_CLASS,
|
|
CONF_UNIT_OF_MEASUREMENT,
|
|
DEVICE_CLASS_EMPTY,
|
|
STATE_CLASS_MEASUREMENT,
|
|
)
|
|
from esphome.types import ConfigType
|
|
|
|
|
|
def _sensor(tag: str, **extra: object) -> ConfigType:
|
|
return CONFIG_SCHEMA(
|
|
{"tag": tag, "mk2pvrouter_id": "hub", "name": f"{tag} sensor", **extra}
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("tag", "unit", "device_class", "state_class", "decimals"),
|
|
[
|
|
("P", "W", "power", "measurement", 0),
|
|
("P1", "W", "power", "measurement", 0),
|
|
("D", "W", "power", "measurement", 0),
|
|
("D1", "%", "", "measurement", 0),
|
|
("V", "V", "voltage", "measurement", 2),
|
|
("v1", "V", "voltage", "measurement", 2),
|
|
("E", "Wh", "energy", "total_increasing", 0),
|
|
("T1", "°C", "temperature", "measurement", 2),
|
|
("R", "W", "power", "measurement", 0),
|
|
("R1", "", "", "", 0),
|
|
("R10", "", "", "", 0),
|
|
],
|
|
)
|
|
def test_tag_defaults(
|
|
tag: str, unit: str, device_class: str, state_class: str, decimals: int
|
|
) -> None:
|
|
config = _sensor(tag)
|
|
assert config[CONF_UNIT_OF_MEASUREMENT] == unit
|
|
assert config[CONF_DEVICE_CLASS] == device_class
|
|
assert config[CONF_STATE_CLASS] == sensor.validate_state_class(state_class)
|
|
assert config[CONF_ACCURACY_DECIMALS] == decimals
|
|
|
|
|
|
@pytest.mark.parametrize("tag", ["S_MC", "STATUS", "X9", "Z", "T", "E1"])
|
|
def test_unknown_tag_gets_only_the_schema_defaults(tag: str) -> None:
|
|
config = _sensor(tag)
|
|
assert CONF_UNIT_OF_MEASUREMENT not in config
|
|
assert CONF_DEVICE_CLASS not in config
|
|
assert config[CONF_STATE_CLASS] == sensor.validate_state_class(
|
|
STATE_CLASS_MEASUREMENT
|
|
)
|
|
assert config[CONF_ACCURACY_DECIMALS] == 0
|
|
|
|
|
|
def test_explicit_values_win_over_tag_defaults() -> None:
|
|
config = _sensor("P", device_class=DEVICE_CLASS_EMPTY, accuracy_decimals=3)
|
|
assert config[CONF_DEVICE_CLASS] == DEVICE_CLASS_EMPTY
|
|
assert config[CONF_ACCURACY_DECIMALS] == 3
|
|
assert config[CONF_UNIT_OF_MEASUREMENT] == "W"
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("tag", "scale_centi"),
|
|
[
|
|
("V", True),
|
|
("V1", True),
|
|
("v2", True),
|
|
("T1", True),
|
|
("P", False),
|
|
("D1", False),
|
|
("E", False),
|
|
("T", False),
|
|
("X9", False),
|
|
],
|
|
)
|
|
def test_centi_scale_follows_the_tag(tag: str, scale_centi: bool) -> None:
|
|
kind = tag_kind(tag)
|
|
assert (kind is not None and kind.scale_centi) is scale_centi
|