Skip to content

Commit

Permalink
Add tariff sensor and peak sensors (#136919)
Browse files Browse the repository at this point in the history
  • Loading branch information
gjong authored Jan 31, 2025
1 parent e512ad7 commit 010cad0
Show file tree
Hide file tree
Showing 7 changed files with 231 additions and 12 deletions.
34 changes: 33 additions & 1 deletion homeassistant/components/youless/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class YouLessSensorEntityDescription(SensorEntityDescription):
"""Describes a YouLess sensor entity."""

device_group: str
value_func: Callable[[YoulessAPI], float | None]
value_func: Callable[[YoulessAPI], float | None | str]


SENSOR_TYPES: tuple[YouLessSensorEntityDescription, ...] = (
Expand Down Expand Up @@ -212,6 +212,38 @@ class YouLessSensorEntityDescription(SensorEntityDescription):
lambda device: device.phase3.current.value if device.phase1 else None
),
),
YouLessSensorEntityDescription(
key="tariff",
device_group="power",
translation_key="active_tariff",
device_class=SensorDeviceClass.ENUM,
options=["1", "2"],
value_func=(
lambda device: str(device.current_tariff) if device.current_tariff else None
),
),
YouLessSensorEntityDescription(
key="average_peak",
device_group="power",
translation_key="average_peak",
device_class=SensorDeviceClass.POWER,
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfPower.WATT,
value_func=(
lambda device: device.average_power.value if device.average_power else None
),
),
YouLessSensorEntityDescription(
key="month_peak",
device_group="power",
translation_key="month_peak",
device_class=SensorDeviceClass.POWER,
state_class=SensorStateClass.MEASUREMENT,
native_unit_of_measurement=UnitOfPower.WATT,
value_func=(
lambda device: device.peak_power.value if device.peak_power else None
),
),
YouLessSensorEntityDescription(
key="delivery_low",
device_group="delivery",
Expand Down
9 changes: 9 additions & 0 deletions homeassistant/components/youless/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@
"active_current_phase_a": {
"name": "Current phase {phase}"
},
"active_tariff": {
"name": "Tariff"
},
"total_energy_import_tariff_kwh": {
"name": "Energy import tariff {tariff}"
},
Expand All @@ -66,6 +69,12 @@
},
"active_s0_w": {
"name": "Current usage"
},
"average_peak": {
"name": "Average peak"
},
"month_peak": {
"name": "Month peak"
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions tests/components/youless/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ async def init_component(hass: HomeAssistant) -> MockConfigEntry:
json=load_json_array_fixture("enologic.json", youless.DOMAIN),
headers={"Content-Type": "application/json"},
)
mock.get(
"http://1.1.1.1/f",
json=load_json_object_fixture("phase.json", youless.DOMAIN),
headers={"Content-Type": "application/json"},
)

entry = MockConfigEntry(
domain=youless.DOMAIN,
Expand Down
2 changes: 1 addition & 1 deletion tests/components/youless/fixtures/device.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"model": "LS120",
"fw": "1.4.2-EL",
"fw": "1.5.1-EL",
"mac": "de2:2d2:3d23"
}
15 changes: 15 additions & 0 deletions tests/components/youless/fixtures/phase.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"tr": 1,
"i1": 0.123,
"v1": 240,
"l1": 462,
"v2": 240,
"l2": 230,
"i2": 0.123,
"v3": 240,
"l3": 230,
"i3": 0.123,
"pp": 1200,
"pts": 2501301621,
"pa": 400
}
176 changes: 167 additions & 9 deletions tests/components/youless/snapshots/test_sensor.ambr
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,57 @@
'state': '1624.264',
})
# ---
# name: test_sensors[sensor.power_meter_average_peak-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.power_meter_average_peak',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.POWER: 'power'>,
'original_icon': None,
'original_name': 'Average peak',
'platform': 'youless',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'average_peak',
'unique_id': 'youless_localhost_average_peak',
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
})
# ---
# name: test_sensors[sensor.power_meter_average_peak-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power',
'friendly_name': 'Power meter Average peak',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
}),
'context': <ANY>,
'entity_id': 'sensor.power_meter_average_peak',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '400',
})
# ---
# name: test_sensors[sensor.power_meter_current_phase_1-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
Expand Down Expand Up @@ -200,7 +251,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
'state': '0.123',
})
# ---
# name: test_sensors[sensor.power_meter_current_phase_2-entry]
Expand Down Expand Up @@ -251,7 +302,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
'state': '0.123',
})
# ---
# name: test_sensors[sensor.power_meter_current_phase_3-entry]
Expand Down Expand Up @@ -302,7 +353,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
'state': '0.123',
})
# ---
# name: test_sensors[sensor.power_meter_current_power_usage-entry]
Expand Down Expand Up @@ -458,6 +509,57 @@
'state': '4490.631',
})
# ---
# name: test_sensors[sensor.power_meter_month_peak-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.power_meter_month_peak',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.POWER: 'power'>,
'original_icon': None,
'original_name': 'Month peak',
'platform': 'youless',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'month_peak',
'unique_id': 'youless_localhost_month_peak',
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
})
# ---
# name: test_sensors[sensor.power_meter_month_peak-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power',
'friendly_name': 'Power meter Month peak',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfPower.WATT: 'W'>,
}),
'context': <ANY>,
'entity_id': 'sensor.power_meter_month_peak',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1200',
})
# ---
# name: test_sensors[sensor.power_meter_power_phase_1-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
Expand Down Expand Up @@ -506,7 +608,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
'state': '462',
})
# ---
# name: test_sensors[sensor.power_meter_power_phase_2-entry]
Expand Down Expand Up @@ -557,7 +659,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
'state': '230',
})
# ---
# name: test_sensors[sensor.power_meter_power_phase_3-entry]
Expand Down Expand Up @@ -608,7 +710,63 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
'state': '230',
})
# ---
# name: test_sensors[sensor.power_meter_tariff-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'1',
'2',
]),
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.power_meter_tariff',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': None,
'original_name': 'Tariff',
'platform': 'youless',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'active_tariff',
'unique_id': 'youless_localhost_tariff',
'unit_of_measurement': None,
})
# ---
# name: test_sensors[sensor.power_meter_tariff-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'Power meter Tariff',
'options': list([
'1',
'2',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.power_meter_tariff',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1',
})
# ---
# name: test_sensors[sensor.power_meter_total_energy_import-entry]
Expand Down Expand Up @@ -710,7 +868,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
'state': '240',
})
# ---
# name: test_sensors[sensor.power_meter_voltage_phase_2-entry]
Expand Down Expand Up @@ -761,7 +919,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
'state': '240',
})
# ---
# name: test_sensors[sensor.power_meter_voltage_phase_3-entry]
Expand Down Expand Up @@ -812,7 +970,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
'state': '240',
})
# ---
# name: test_sensors[sensor.s0_meter_current_usage-entry]
Expand Down
2 changes: 1 addition & 1 deletion tests/components/youless/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ async def test_async_setup_entry(hass: HomeAssistant) -> None:

assert await setup.async_setup_component(hass, youless.DOMAIN, {})
assert entry.state is ConfigEntryState.LOADED
assert len(hass.states.async_entity_ids()) == 19
assert len(hass.states.async_entity_ids()) == 22

0 comments on commit 010cad0

Please sign in to comment.