diff --git a/homeassistant/components/prusalink/sensor.py b/homeassistant/components/prusalink/sensor.py index bcfadb29166..4f93fd3407e 100644 --- a/homeassistant/components/prusalink/sensor.py +++ b/homeassistant/components/prusalink/sensor.py @@ -15,7 +15,7 @@ from homeassistant.components.sensor import ( SensorStateClass, ) from homeassistant.config_entries import ConfigEntry -from homeassistant.const import PERCENTAGE, UnitOfTemperature +from homeassistant.const import PERCENTAGE, UnitOfLength, UnitOfTemperature from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import StateType @@ -81,6 +81,45 @@ SENSORS: dict[str, tuple[PrusaLinkSensorEntityDescription, ...]] = { value_fn=lambda data: cast(float, data["telemetry"]["temp-nozzle"]), entity_registry_enabled_default=False, ), + PrusaLinkSensorEntityDescription[PrinterInfo]( + key="printer.telemetry.temp-bed.target", + translation_key="heatbed_target_temperature", + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + value_fn=lambda data: cast(float, data["temperature"]["bed"]["target"]), + entity_registry_enabled_default=False, + ), + PrusaLinkSensorEntityDescription[PrinterInfo]( + key="printer.telemetry.temp-nozzle.target", + translation_key="nozzle_target_temperature", + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + value_fn=lambda data: cast(float, data["temperature"]["tool0"]["target"]), + entity_registry_enabled_default=False, + ), + PrusaLinkSensorEntityDescription[PrinterInfo]( + key="printer.telemetry.z-height", + translation_key="z_height", + native_unit_of_measurement=UnitOfLength.MILLIMETERS, + device_class=SensorDeviceClass.DISTANCE, + state_class=SensorStateClass.MEASUREMENT, + value_fn=lambda data: cast(float, data["telemetry"]["z-height"]), + entity_registry_enabled_default=False, + ), + PrusaLinkSensorEntityDescription[PrinterInfo]( + key="printer.telemetry.print-speed", + translation_key="print_speed", + native_unit_of_measurement=PERCENTAGE, + value_fn=lambda data: cast(float, data["telemetry"]["print-speed"]), + ), + PrusaLinkSensorEntityDescription[PrinterInfo]( + key="printer.telemetry.material", + translation_key="material", + icon="mdi:palette-swatch-variant", + value_fn=lambda data: cast(str, data["telemetry"]["material"]), + ), ), "job": ( PrusaLinkSensorEntityDescription[JobInfo]( diff --git a/homeassistant/components/prusalink/strings.json b/homeassistant/components/prusalink/strings.json index 34611e4fffb..53f5f0153fe 100644 --- a/homeassistant/components/prusalink/strings.json +++ b/homeassistant/components/prusalink/strings.json @@ -29,20 +29,35 @@ "heatbed_temperature": { "name": "Heatbed temperature" }, + "heatbed_target_temperature": { + "name": "Heatbed target temperature" + }, "nozzle_temperature": { "name": "Nozzle temperature" }, + "nozzle_target_temperature": { + "name": "Nozzle target temperature" + }, "progress": { "name": "Progress" }, "filename": { "name": "Filename" }, + "material": { + "name": "Material" + }, "print_start": { "name": "Print start" }, "print_finish": { "name": "Print finish" + }, + "print_speed": { + "name": "Print speed" + }, + "z_height": { + "name": "Z-Height" } }, "button": { diff --git a/tests/components/prusalink/conftest.py b/tests/components/prusalink/conftest.py index 391579359b6..8beb67b0ed4 100644 --- a/tests/components/prusalink/conftest.py +++ b/tests/components/prusalink/conftest.py @@ -42,8 +42,8 @@ def mock_printer_api(hass): "material": "PLA", }, "temperature": { - "tool0": {"actual": 47.8, "target": 0.0, "display": 0.0, "offset": 0}, - "bed": {"actual": 41.9, "target": 0.0, "offset": 0}, + "tool0": {"actual": 47.8, "target": 210.1, "display": 0.0, "offset": 0}, + "bed": {"actual": 41.9, "target": 60.5, "offset": 0}, }, "state": { "text": "Operational", diff --git a/tests/components/prusalink/test_sensor.py b/tests/components/prusalink/test_sensor.py index 4f64c3139e1..6a0944bdf36 100644 --- a/tests/components/prusalink/test_sensor.py +++ b/tests/components/prusalink/test_sensor.py @@ -14,7 +14,9 @@ from homeassistant.components.sensor import ( from homeassistant.const import ( ATTR_DEVICE_CLASS, ATTR_UNIT_OF_MEASUREMENT, + PERCENTAGE, Platform, + UnitOfLength, UnitOfTemperature, ) from homeassistant.core import HomeAssistant @@ -63,6 +65,36 @@ async def test_sensors_no_job(hass: HomeAssistant, mock_config_entry, mock_api) assert state.attributes[ATTR_DEVICE_CLASS] == SensorDeviceClass.TEMPERATURE assert state.attributes[ATTR_STATE_CLASS] == SensorStateClass.MEASUREMENT + state = hass.states.get("sensor.mock_title_heatbed_target_temperature") + assert state is not None + assert state.state == "60.5" + assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == UnitOfTemperature.CELSIUS + assert state.attributes[ATTR_DEVICE_CLASS] == SensorDeviceClass.TEMPERATURE + assert state.attributes[ATTR_STATE_CLASS] == SensorStateClass.MEASUREMENT + + state = hass.states.get("sensor.mock_title_nozzle_target_temperature") + assert state is not None + assert state.state == "210.1" + assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == UnitOfTemperature.CELSIUS + assert state.attributes[ATTR_DEVICE_CLASS] == SensorDeviceClass.TEMPERATURE + assert state.attributes[ATTR_STATE_CLASS] == SensorStateClass.MEASUREMENT + + state = hass.states.get("sensor.mock_title_z_height") + assert state is not None + assert state.state == "1.8" + assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == UnitOfLength.MILLIMETERS + assert state.attributes[ATTR_DEVICE_CLASS] == SensorDeviceClass.DISTANCE + assert state.attributes[ATTR_STATE_CLASS] == SensorStateClass.MEASUREMENT + + state = hass.states.get("sensor.mock_title_print_speed") + assert state is not None + assert state.state == "100" + assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == PERCENTAGE + + state = hass.states.get("sensor.mock_title_material") + assert state is not None + assert state.state == "PLA" + state = hass.states.get("sensor.mock_title_progress") assert state is not None assert state.state == "unavailable"