From db70260fcf675f98a56cf13e4365262c72669fea Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Sat, 6 Dec 2025 12:32:34 +0000 Subject: [PATCH 1/7] Bump pylamarzocco to 2.2.3 --- homeassistant/components/lamarzocco/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/lamarzocco/manifest.json b/homeassistant/components/lamarzocco/manifest.json index dbc663ed46253..abe454df3ad8c 100644 --- a/homeassistant/components/lamarzocco/manifest.json +++ b/homeassistant/components/lamarzocco/manifest.json @@ -37,5 +37,5 @@ "iot_class": "cloud_push", "loggers": ["pylamarzocco"], "quality_scale": "platinum", - "requirements": ["pylamarzocco==2.2.2"] + "requirements": ["pylamarzocco==2.2.3"] } diff --git a/requirements_all.txt b/requirements_all.txt index 69ef5e82416d6..8e8b5820f4a4e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2154,7 +2154,7 @@ pykwb==0.0.8 pylacrosse==0.4 # homeassistant.components.lamarzocco -pylamarzocco==2.2.2 +pylamarzocco==2.2.3 # homeassistant.components.lastfm pylast==5.1.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 4b7f55c36fe31..9a495d6574721 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1813,7 +1813,7 @@ pykrakenapi==0.1.8 pykulersky==0.5.8 # homeassistant.components.lamarzocco -pylamarzocco==2.2.2 +pylamarzocco==2.2.3 # homeassistant.components.lastfm pylast==5.1.0 From c54699a9284fb0410eb18535438a9e4bf980a68c Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Sat, 6 Dec 2025 18:24:30 +0000 Subject: [PATCH 2/7] Add brew by weight controls to lamarzocco --- .../components/lamarzocco/icons.json | 14 ++++ homeassistant/components/lamarzocco/number.py | 74 ++++++++++++++++- homeassistant/components/lamarzocco/select.py | 36 ++++++++- .../components/lamarzocco/strings.json | 14 ++++ .../lamarzocco/fixtures/config_mini.json | 2 +- .../lamarzocco/snapshots/test_number.ambr | 80 +++++++++++++++++++ .../lamarzocco/snapshots/test_select.ambr | 57 +++++++++++++ tests/components/lamarzocco/test_number.py | 43 ++++++++++ tests/components/lamarzocco/test_select.py | 38 +++++++++ 9 files changed, 354 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/lamarzocco/icons.json b/homeassistant/components/lamarzocco/icons.json index f8270909baeb7..6f97d08168ba8 100644 --- a/homeassistant/components/lamarzocco/icons.json +++ b/homeassistant/components/lamarzocco/icons.json @@ -28,6 +28,12 @@ } }, "number": { + "bbw_dose_1": { + "default": "mdi:weight-gram" + }, + "bbw_dose_2": { + "default": "mdi:weight-gram" + }, "coffee_temp": { "default": "mdi:thermometer-water" }, @@ -51,6 +57,14 @@ } }, "select": { + "bbw_dose_mode": { + "default": "mdi:all-inclusive-box", + "state": { + "continuous": "mdi:all-inclusive-box", + "dose1": "mdi:numeric-1-box", + "dose2": "mdi:numeric-2-box" + } + }, "prebrew_infusion_select": { "default": "mdi:water-pump-off", "state": { diff --git a/homeassistant/components/lamarzocco/number.py b/homeassistant/components/lamarzocco/number.py index 675595bac4d28..e58e3ac9c127f 100644 --- a/homeassistant/components/lamarzocco/number.py +++ b/homeassistant/components/lamarzocco/number.py @@ -5,9 +5,14 @@ from typing import Any, cast from pylamarzocco import LaMarzoccoMachine -from pylamarzocco.const import ModelName, PreExtractionMode, WidgetType +from pylamarzocco.const import DoseMode, ModelName, PreExtractionMode, WidgetType from pylamarzocco.exceptions import RequestNotSuccessful -from pylamarzocco.models import CoffeeBoiler, PreBrewing, SteamBoilerTemperature +from pylamarzocco.models import ( + BrewByWeightDoses, + CoffeeBoiler, + PreBrewing, + SteamBoilerTemperature, +) from homeassistant.components.number import ( NumberDeviceClass, @@ -18,6 +23,7 @@ PRECISION_TENTHS, PRECISION_WHOLE, EntityCategory, + UnitOfMass, UnitOfTemperature, UnitOfTime, ) @@ -219,6 +225,70 @@ class LaMarzoccoNumberEntityDescription( ) ), ), + LaMarzoccoNumberEntityDescription( + key="bbw_dose_1", + translation_key="bbw_dose_1", + device_class=NumberDeviceClass.WEIGHT, + native_unit_of_measurement=UnitOfMass.GRAMS, + native_step=PRECISION_TENTHS, + native_min_value=5, + native_max_value=100, + entity_category=EntityCategory.CONFIG, + set_value_fn=( + lambda machine, value: machine.set_brew_by_weight_dose( + dose=DoseMode.DOSE_1, + value=value, + ) + ), + native_value_fn=( + lambda machine: cast( + BrewByWeightDoses, + machine.dashboard.config[WidgetType.CM_BREW_BY_WEIGHT_DOSES], + ).doses.dose_1.dose + ), + available_fn=lambda coordinator: ( + cast( + BrewByWeightDoses, + coordinator.device.dashboard.config[WidgetType.CM_BREW_BY_WEIGHT_DOSES], + ).scale_connected + ), + supported_fn=( + lambda coordinator: coordinator.device.dashboard.model_name + in (ModelName.LINEA_MINI, ModelName.LINEA_MINI_R) + ), + ), + LaMarzoccoNumberEntityDescription( + key="bbw_dose_2", + translation_key="bbw_dose_2", + device_class=NumberDeviceClass.WEIGHT, + native_unit_of_measurement=UnitOfMass.GRAMS, + native_step=PRECISION_TENTHS, + native_min_value=5, + native_max_value=100, + entity_category=EntityCategory.CONFIG, + set_value_fn=( + lambda machine, value: machine.set_brew_by_weight_dose( + dose=DoseMode.DOSE_2, + value=value, + ) + ), + native_value_fn=( + lambda machine: cast( + BrewByWeightDoses, + machine.dashboard.config[WidgetType.CM_BREW_BY_WEIGHT_DOSES], + ).doses.dose_2.dose + ), + available_fn=lambda coordinator: ( + cast( + BrewByWeightDoses, + coordinator.device.dashboard.config[WidgetType.CM_BREW_BY_WEIGHT_DOSES], + ).scale_connected + ), + supported_fn=( + lambda coordinator: coordinator.device.dashboard.model_name + in (ModelName.LINEA_MINI, ModelName.LINEA_MINI_R) + ), + ), ) diff --git a/homeassistant/components/lamarzocco/select.py b/homeassistant/components/lamarzocco/select.py index 053c3b75bef12..73cc4474b84cf 100644 --- a/homeassistant/components/lamarzocco/select.py +++ b/homeassistant/components/lamarzocco/select.py @@ -5,6 +5,7 @@ from typing import Any, cast from pylamarzocco.const import ( + DoseMode, ModelName, PreExtractionMode, SmartStandByType, @@ -13,7 +14,7 @@ ) from pylamarzocco.devices import LaMarzoccoMachine from pylamarzocco.exceptions import RequestNotSuccessful -from pylamarzocco.models import PreBrewing, SteamBoilerLevel +from pylamarzocco.models import BrewByWeightDoses, PreBrewing, SteamBoilerLevel from homeassistant.components.select import SelectEntity, SelectEntityDescription from homeassistant.const import EntityCategory @@ -50,6 +51,14 @@ STANDBY_MODE_LM_TO_HA = {value: key for key, value in STANDBY_MODE_HA_TO_LM.items()} +DOSE_MODE_HA_TO_LM = { + "continuous": DoseMode.CONTINUOUS, + "dose1": DoseMode.DOSE_1, + "dose2": DoseMode.DOSE_2, +} + +DOSE_MODE_LM_TO_HA = {value: key for key, value in DOSE_MODE_HA_TO_LM.items()} + @dataclass(frozen=True, kw_only=True) class LaMarzoccoSelectEntityDescription( @@ -117,6 +126,31 @@ class LaMarzoccoSelectEntityDescription( machine.schedule.smart_wake_up_sleep.smart_stand_by_after ], ), + LaMarzoccoSelectEntityDescription( + key="bbw_dose_mode", + translation_key="bbw_dose_mode", + entity_category=EntityCategory.CONFIG, + options=["dose1", "dose2"], + select_option_fn=lambda machine, option: machine.set_brew_by_weight_dose_mode( + mode=DOSE_MODE_HA_TO_LM[option] + ), + current_option_fn=lambda machine: DOSE_MODE_LM_TO_HA[ + cast( + BrewByWeightDoses, + machine.dashboard.config[WidgetType.CM_BREW_BY_WEIGHT_DOSES], + ).mode + ], + available_fn=lambda coordinator: ( + cast( + BrewByWeightDoses, + coordinator.device.dashboard.config[WidgetType.CM_BREW_BY_WEIGHT_DOSES], + ).scale_connected + ), + supported_fn=( + lambda coordinator: coordinator.device.dashboard.model_name + in (ModelName.LINEA_MINI, ModelName.LINEA_MINI_R) + ), + ), ) diff --git a/homeassistant/components/lamarzocco/strings.json b/homeassistant/components/lamarzocco/strings.json index 9b7194fe5f458..765b12d65d3bd 100644 --- a/homeassistant/components/lamarzocco/strings.json +++ b/homeassistant/components/lamarzocco/strings.json @@ -87,6 +87,12 @@ } }, "number": { + "bbw_dose_1": { + "name": "Brew by weight Dose 1" + }, + "bbw_dose_2": { + "name": "Brew by weight Dose 2" + }, "coffee_temp": { "name": "Coffee target temperature" }, @@ -107,6 +113,14 @@ } }, "select": { + "bbw_dose_mode": { + "name": "Brew by weight dose mode", + "state": { + "continuous": "Continuous", + "dose1": "Dose 1", + "dose2": "Dose 2" + } + }, "prebrew_infusion_select": { "name": "Prebrew/-infusion mode", "state": { diff --git a/tests/components/lamarzocco/fixtures/config_mini.json b/tests/components/lamarzocco/fixtures/config_mini.json index a5a285800e988..cf7b1ebb201cd 100644 --- a/tests/components/lamarzocco/fixtures/config_mini.json +++ b/tests/components/lamarzocco/fixtures/config_mini.json @@ -163,7 +163,7 @@ "code": "CMBrewByWeightDoses", "index": 1, "output": { - "scaleConnected": false, + "scaleConnected": true, "availableModes": ["Continuous"], "mode": "Continuous", "doses": { diff --git a/tests/components/lamarzocco/snapshots/test_number.ambr b/tests/components/lamarzocco/snapshots/test_number.ambr index 72de5e8428554..c457afd8d55b1 100644 --- a/tests/components/lamarzocco/snapshots/test_number.ambr +++ b/tests/components/lamarzocco/snapshots/test_number.ambr @@ -1,4 +1,84 @@ # serializer version: 1 +# name: test_brew_by_weight_dose[Linea Mini][dose_1] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'max': 100, + 'min': 5, + 'mode': , + 'step': 0.1, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': , + 'entity_id': 'number.lm012345_brew_by_weight_dose_1', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Brew by weight Dose 1', + 'platform': 'lamarzocco', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'bbw_dose_1', + 'unique_id': 'LM012345_bbw_dose_1', + 'unit_of_measurement': , + }) +# --- +# name: test_brew_by_weight_dose[Linea Mini][dose_2] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'max': 100, + 'min': 5, + 'mode': , + 'step': 0.1, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': , + 'entity_id': 'number.lm012345_brew_by_weight_dose_2', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Brew by weight Dose 2', + 'platform': 'lamarzocco', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'bbw_dose_2', + 'unique_id': 'LM012345_bbw_dose_2', + 'unit_of_measurement': , + }) +# --- # name: test_general_numbers[coffee_target_temperature-94-set_coffee_target_temperature-kwargs0] StateSnapshot({ 'attributes': ReadOnlyDict({ diff --git a/tests/components/lamarzocco/snapshots/test_select.ambr b/tests/components/lamarzocco/snapshots/test_select.ambr index 701ce6b1cd240..ce634eedd19c1 100644 --- a/tests/components/lamarzocco/snapshots/test_select.ambr +++ b/tests/components/lamarzocco/snapshots/test_select.ambr @@ -1,4 +1,61 @@ # serializer version: 1 +# name: test_bbw_dose_mode[Linea Mini] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'LM012345 Brew by weight dose mode', + 'options': list([ + 'dose1', + 'dose2', + ]), + }), + 'context': , + 'entity_id': 'select.lm012345_brew_by_weight_dose_mode', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_bbw_dose_mode[Linea Mini].1 + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'dose1', + 'dose2', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'select', + 'entity_category': , + 'entity_id': 'select.lm012345_brew_by_weight_dose_mode', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Brew by weight dose mode', + 'platform': 'lamarzocco', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'bbw_dose_mode', + 'unique_id': 'LM012345_bbw_dose_mode', + 'unit_of_measurement': None, + }) +# --- # name: test_pre_brew_infusion_select[GS3 AV] StateSnapshot({ 'attributes': ReadOnlyDict({ diff --git a/tests/components/lamarzocco/test_number.py b/tests/components/lamarzocco/test_number.py index 111a306abd12d..368af011ab30d 100644 --- a/tests/components/lamarzocco/test_number.py +++ b/tests/components/lamarzocco/test_number.py @@ -13,6 +13,7 @@ import pytest from syrupy.assertion import SnapshotAssertion +from homeassistant.components.lamarzocco.select import DOSE_MODE_HA_TO_LM from homeassistant.components.number import ( ATTR_VALUE, DOMAIN as NUMBER_DOMAIN, @@ -291,3 +292,45 @@ async def test_steam_temperature( mock_lamarzocco.set_steam_target_temperature.assert_called_once_with( temperature=128.3, ) + + +@pytest.mark.parametrize("device_fixture", [ModelName.LINEA_MINI]) +async def test_brew_by_weight_dose( + hass: HomeAssistant, + mock_lamarzocco: MagicMock, + mock_config_entry: MockConfigEntry, + entity_registry: er.EntityRegistry, + snapshot: SnapshotAssertion, +) -> None: + """Test brew by weight dose.""" + + await async_init_integration(hass, mock_config_entry) + serial_number = mock_lamarzocco.serial_number + for dose in (1, 2): + entity_id = f"number.{serial_number}_brew_by_weight_dose_{dose}" + + state = hass.states.get(entity_id) + + assert state + assert state == snapshot(name=f"dose_{dose}") + + entry = entity_registry.async_get(state.entity_id) + assert entry + assert entry.device_id + assert entry == snapshot(name=f"dose_{dose}") + + # service call + await hass.services.async_call( + NUMBER_DOMAIN, + SERVICE_SET_VALUE, + { + ATTR_ENTITY_ID: entity_id, + ATTR_VALUE: 42, + }, + blocking=True, + ) + + mock_lamarzocco.set_brew_by_weight_dose.assert_called_with( + dose=DOSE_MODE_HA_TO_LM[f"dose{dose}"], + value=42, + ) diff --git a/tests/components/lamarzocco/test_select.py b/tests/components/lamarzocco/test_select.py index 845eda69d5b89..97df0219294df 100644 --- a/tests/components/lamarzocco/test_select.py +++ b/tests/components/lamarzocco/test_select.py @@ -3,6 +3,7 @@ from unittest.mock import MagicMock from pylamarzocco.const import ( + DoseMode, ModelName, PreExtractionMode, SmartStandByType, @@ -193,3 +194,40 @@ async def test_select_errors( blocking=True, ) assert exc_info.value.translation_key == "select_option_error" + + +@pytest.mark.usefixtures("init_integration") +@pytest.mark.parametrize("device_fixture", [ModelName.LINEA_MINI]) +async def test_bbw_dose_mode( + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + mock_lamarzocco: MagicMock, + snapshot: SnapshotAssertion, +) -> None: + """Test the La Marzocco Brew By Weight Mode Select (only for Mini R Models).""" + + serial_number = mock_lamarzocco.serial_number + + state = hass.states.get(f"select.{serial_number}_brew_by_weight_dose_mode") + + assert state + assert state == snapshot + + entry = entity_registry.async_get(state.entity_id) + assert entry + assert entry == snapshot + + # on/off service calls + await hass.services.async_call( + SELECT_DOMAIN, + SERVICE_SELECT_OPTION, + { + ATTR_ENTITY_ID: f"select.{serial_number}_brew_by_weight_dose_mode", + ATTR_OPTION: "dose2", + }, + blocking=True, + ) + + mock_lamarzocco.set_brew_by_weight_dose_mode.assert_called_once_with( + mode=DoseMode.DOSE_2 + ) From 37628f16b5df28e59d4375eb8e1dba977f78d8d3 Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Sat, 6 Dec 2025 18:25:10 +0000 Subject: [PATCH 3/7] Add continous option --- homeassistant/components/lamarzocco/select.py | 2 +- tests/components/lamarzocco/snapshots/test_select.ambr | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/lamarzocco/select.py b/homeassistant/components/lamarzocco/select.py index 73cc4474b84cf..d7662b6f50d38 100644 --- a/homeassistant/components/lamarzocco/select.py +++ b/homeassistant/components/lamarzocco/select.py @@ -130,7 +130,7 @@ class LaMarzoccoSelectEntityDescription( key="bbw_dose_mode", translation_key="bbw_dose_mode", entity_category=EntityCategory.CONFIG, - options=["dose1", "dose2"], + options=["continuous", "dose1", "dose2"], select_option_fn=lambda machine, option: machine.set_brew_by_weight_dose_mode( mode=DOSE_MODE_HA_TO_LM[option] ), diff --git a/tests/components/lamarzocco/snapshots/test_select.ambr b/tests/components/lamarzocco/snapshots/test_select.ambr index ce634eedd19c1..f8516b4b89a7d 100644 --- a/tests/components/lamarzocco/snapshots/test_select.ambr +++ b/tests/components/lamarzocco/snapshots/test_select.ambr @@ -4,6 +4,7 @@ 'attributes': ReadOnlyDict({ 'friendly_name': 'LM012345 Brew by weight dose mode', 'options': list([ + 'continuous', 'dose1', 'dose2', ]), @@ -13,7 +14,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': 'unknown', + 'state': 'continuous', }) # --- # name: test_bbw_dose_mode[Linea Mini].1 @@ -23,6 +24,7 @@ 'area_id': None, 'capabilities': dict({ 'options': list([ + 'continuous', 'dose1', 'dose2', ]), From 6bcc7aad69eae0f989e287e70e2729d598f999a4 Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Sun, 7 Dec 2025 12:10:14 +0000 Subject: [PATCH 4/7] fix snapshot naming --- .../lamarzocco/snapshots/test_number.ambr | 42 ++++++++++++++++++- tests/components/lamarzocco/test_number.py | 4 +- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/tests/components/lamarzocco/snapshots/test_number.ambr b/tests/components/lamarzocco/snapshots/test_number.ambr index c457afd8d55b1..085fab8f463f0 100644 --- a/tests/components/lamarzocco/snapshots/test_number.ambr +++ b/tests/components/lamarzocco/snapshots/test_number.ambr @@ -1,5 +1,5 @@ # serializer version: 1 -# name: test_brew_by_weight_dose[Linea Mini][dose_1] +# name: test_brew_by_weight_dose[Linea Mini][entry-dose-1] EntityRegistryEntrySnapshot({ 'aliases': set({ }), @@ -39,7 +39,7 @@ 'unit_of_measurement': , }) # --- -# name: test_brew_by_weight_dose[Linea Mini][dose_2] +# name: test_brew_by_weight_dose[Linea Mini][entry-dose-2] EntityRegistryEntrySnapshot({ 'aliases': set({ }), @@ -79,6 +79,44 @@ 'unit_of_measurement': , }) # --- +# name: test_brew_by_weight_dose[Linea Mini][state-dose-1] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'weight', + 'friendly_name': 'LM012345 Brew by weight Dose 1', + 'max': 100, + 'min': 5, + 'mode': , + 'step': 0.1, + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'number.lm012345_brew_by_weight_dose_1', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '34.5', + }) +# --- +# name: test_brew_by_weight_dose[Linea Mini][state-dose-2] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'weight', + 'friendly_name': 'LM012345 Brew by weight Dose 2', + 'max': 100, + 'min': 5, + 'mode': , + 'step': 0.1, + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'number.lm012345_brew_by_weight_dose_2', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '17.5', + }) +# --- # name: test_general_numbers[coffee_target_temperature-94-set_coffee_target_temperature-kwargs0] StateSnapshot({ 'attributes': ReadOnlyDict({ diff --git a/tests/components/lamarzocco/test_number.py b/tests/components/lamarzocco/test_number.py index 368af011ab30d..8ef20d913ee4e 100644 --- a/tests/components/lamarzocco/test_number.py +++ b/tests/components/lamarzocco/test_number.py @@ -312,12 +312,12 @@ async def test_brew_by_weight_dose( state = hass.states.get(entity_id) assert state - assert state == snapshot(name=f"dose_{dose}") + assert state == snapshot(name=f"state-dose-{dose}") entry = entity_registry.async_get(state.entity_id) assert entry assert entry.device_id - assert entry == snapshot(name=f"dose_{dose}") + assert entry == snapshot(name=f"entry-dose-{dose}") # service call await hass.services.async_call( From 63c1c28251bdecf67a91662f9d583a689b4fa9b6 Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Sun, 7 Dec 2025 12:20:31 +0000 Subject: [PATCH 5/7] update strings --- homeassistant/components/lamarzocco/number.py | 2 ++ homeassistant/components/lamarzocco/strings.json | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/lamarzocco/number.py b/homeassistant/components/lamarzocco/number.py index e58e3ac9c127f..6f07c6d4d0489 100644 --- a/homeassistant/components/lamarzocco/number.py +++ b/homeassistant/components/lamarzocco/number.py @@ -228,6 +228,7 @@ class LaMarzoccoNumberEntityDescription( LaMarzoccoNumberEntityDescription( key="bbw_dose_1", translation_key="bbw_dose_1", + translation_placeholders={"dose": "Dose 1"}, device_class=NumberDeviceClass.WEIGHT, native_unit_of_measurement=UnitOfMass.GRAMS, native_step=PRECISION_TENTHS, @@ -260,6 +261,7 @@ class LaMarzoccoNumberEntityDescription( LaMarzoccoNumberEntityDescription( key="bbw_dose_2", translation_key="bbw_dose_2", + translation_placeholders={"dose": "Dose 2"}, device_class=NumberDeviceClass.WEIGHT, native_unit_of_measurement=UnitOfMass.GRAMS, native_step=PRECISION_TENTHS, diff --git a/homeassistant/components/lamarzocco/strings.json b/homeassistant/components/lamarzocco/strings.json index 765b12d65d3bd..1f2317707c44f 100644 --- a/homeassistant/components/lamarzocco/strings.json +++ b/homeassistant/components/lamarzocco/strings.json @@ -88,10 +88,10 @@ }, "number": { "bbw_dose_1": { - "name": "Brew by weight Dose 1" + "name": "Brew by weight {dose}" }, "bbw_dose_2": { - "name": "Brew by weight Dose 2" + "name": "[%key:component::lamarzocco::entity::number::bbw_dose_1::name%]" }, "coffee_temp": { "name": "Coffee target temperature" From df38eecb7d7021346405221d9c1c329d0a3514f1 Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Sun, 7 Dec 2025 12:26:27 +0000 Subject: [PATCH 6/7] single translation key --- homeassistant/components/lamarzocco/icons.json | 5 +---- homeassistant/components/lamarzocco/number.py | 4 ++-- homeassistant/components/lamarzocco/strings.json | 5 +---- tests/components/lamarzocco/snapshots/test_number.ambr | 4 ++-- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/lamarzocco/icons.json b/homeassistant/components/lamarzocco/icons.json index 6f97d08168ba8..ac59d954c371c 100644 --- a/homeassistant/components/lamarzocco/icons.json +++ b/homeassistant/components/lamarzocco/icons.json @@ -28,10 +28,7 @@ } }, "number": { - "bbw_dose_1": { - "default": "mdi:weight-gram" - }, - "bbw_dose_2": { + "bbw_dose": { "default": "mdi:weight-gram" }, "coffee_temp": { diff --git a/homeassistant/components/lamarzocco/number.py b/homeassistant/components/lamarzocco/number.py index 6f07c6d4d0489..92431d33f90aa 100644 --- a/homeassistant/components/lamarzocco/number.py +++ b/homeassistant/components/lamarzocco/number.py @@ -227,7 +227,7 @@ class LaMarzoccoNumberEntityDescription( ), LaMarzoccoNumberEntityDescription( key="bbw_dose_1", - translation_key="bbw_dose_1", + translation_key="bbw_dose", translation_placeholders={"dose": "Dose 1"}, device_class=NumberDeviceClass.WEIGHT, native_unit_of_measurement=UnitOfMass.GRAMS, @@ -260,7 +260,7 @@ class LaMarzoccoNumberEntityDescription( ), LaMarzoccoNumberEntityDescription( key="bbw_dose_2", - translation_key="bbw_dose_2", + translation_key="bbw_dose", translation_placeholders={"dose": "Dose 2"}, device_class=NumberDeviceClass.WEIGHT, native_unit_of_measurement=UnitOfMass.GRAMS, diff --git a/homeassistant/components/lamarzocco/strings.json b/homeassistant/components/lamarzocco/strings.json index 1f2317707c44f..01eec9fba7fce 100644 --- a/homeassistant/components/lamarzocco/strings.json +++ b/homeassistant/components/lamarzocco/strings.json @@ -87,12 +87,9 @@ } }, "number": { - "bbw_dose_1": { + "bbw_dose": { "name": "Brew by weight {dose}" }, - "bbw_dose_2": { - "name": "[%key:component::lamarzocco::entity::number::bbw_dose_1::name%]" - }, "coffee_temp": { "name": "Coffee target temperature" }, diff --git a/tests/components/lamarzocco/snapshots/test_number.ambr b/tests/components/lamarzocco/snapshots/test_number.ambr index 085fab8f463f0..32a9cc613a8bf 100644 --- a/tests/components/lamarzocco/snapshots/test_number.ambr +++ b/tests/components/lamarzocco/snapshots/test_number.ambr @@ -34,7 +34,7 @@ 'previous_unique_id': None, 'suggested_object_id': None, 'supported_features': 0, - 'translation_key': 'bbw_dose_1', + 'translation_key': 'bbw_dose', 'unique_id': 'LM012345_bbw_dose_1', 'unit_of_measurement': , }) @@ -74,7 +74,7 @@ 'previous_unique_id': None, 'suggested_object_id': None, 'supported_features': 0, - 'translation_key': 'bbw_dose_2', + 'translation_key': 'bbw_dose', 'unique_id': 'LM012345_bbw_dose_2', 'unit_of_measurement': , }) From 350a1e3b010533b3793dc043e6a253d3281e3dd7 Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Sat, 13 Dec 2025 08:08:33 +0000 Subject: [PATCH 7/7] move const --- tests/components/lamarzocco/test_number.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/components/lamarzocco/test_number.py b/tests/components/lamarzocco/test_number.py index 8ef20d913ee4e..f73ca211f2a8b 100644 --- a/tests/components/lamarzocco/test_number.py +++ b/tests/components/lamarzocco/test_number.py @@ -4,6 +4,7 @@ from unittest.mock import MagicMock from pylamarzocco.const import ( + DoseMode, ModelName, PreExtractionMode, SmartStandByType, @@ -13,7 +14,6 @@ import pytest from syrupy.assertion import SnapshotAssertion -from homeassistant.components.lamarzocco.select import DOSE_MODE_HA_TO_LM from homeassistant.components.number import ( ATTR_VALUE, DOMAIN as NUMBER_DOMAIN, @@ -28,6 +28,11 @@ from tests.common import MockConfigEntry +DOSE_MODE_HA_TO_LM = { + "dose1": DoseMode.DOSE_1, + "dose2": DoseMode.DOSE_2, +} + @pytest.mark.parametrize( ("entity_name", "value", "func_name", "kwargs"),