From 0c2485bc03cb42a2d08f7b3a4e3abf848510caa0 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 19 Dec 2023 03:28:13 +0100 Subject: [PATCH] Freeze integration entity descriptions (#105984) Co-authored-by: J. Nick Koston --- homeassistant/components/abode/sensor.py | 4 +-- .../components/accuweather/sensor.py | 4 +-- homeassistant/components/adguard/sensor.py | 2 +- homeassistant/components/adguard/switch.py | 2 +- homeassistant/components/airly/sensor.py | 2 +- homeassistant/components/airnow/sensor.py | 4 +-- homeassistant/components/airq/sensor.py | 4 +-- .../components/airvisual_pro/sensor.py | 4 +-- .../components/airzone/binary_sensor.py | 2 +- homeassistant/components/airzone/select.py | 4 +-- .../components/airzone_cloud/binary_sensor.py | 2 +- .../components/aladdin_connect/sensor.py | 4 +-- .../ambient_station/binary_sensor.py | 4 +-- .../components/amcrest/binary_sensor.py | 2 +- .../components/android_ip_webcam/sensor.py | 4 +-- .../components/android_ip_webcam/switch.py | 4 +-- homeassistant/components/anova/sensor.py | 4 +-- homeassistant/components/aosmith/sensor.py | 2 +- homeassistant/components/aqualogic/sensor.py | 2 +- homeassistant/components/aranet/sensor.py | 2 +- .../aseko_pool_live/binary_sensor.py | 4 +-- homeassistant/components/asuswrt/sensor.py | 2 +- .../components/august/binary_sensor.py | 6 ++-- homeassistant/components/august/sensor.py | 4 +-- .../components/aussie_broadband/sensor.py | 2 +- homeassistant/components/awair/sensor.py | 4 +-- .../components/azure_devops/__init__.py | 2 +- .../components/azure_devops/sensor.py | 4 +-- homeassistant/components/baf/binary_sensor.py | 4 +-- homeassistant/components/baf/number.py | 4 +-- homeassistant/components/baf/sensor.py | 4 +-- homeassistant/components/baf/switch.py | 4 +-- .../components/balboa/binary_sensor.py | 4 +-- .../bmw_connected_drive/binary_sensor.py | 4 +-- .../components/bmw_connected_drive/button.py | 4 +-- .../components/bmw_connected_drive/number.py | 4 +-- .../components/bmw_connected_drive/select.py | 4 +-- .../components/bmw_connected_drive/sensor.py | 2 +- .../components/bmw_connected_drive/switch.py | 4 +-- homeassistant/components/bond/button.py | 4 +-- homeassistant/components/bosch_shc/switch.py | 4 +-- homeassistant/components/braviatv/button.py | 4 +-- homeassistant/components/brother/sensor.py | 4 +-- homeassistant/components/co2signal/sensor.py | 2 +- .../components/comfoconnect/sensor.py | 4 +-- homeassistant/components/daikin/sensor.py | 4 +-- .../components/deconz/binary_sensor.py | 2 +- homeassistant/components/deconz/button.py | 2 +- homeassistant/components/deconz/number.py | 2 +- homeassistant/components/deconz/sensor.py | 2 +- homeassistant/components/deluge/sensor.py | 2 +- .../devolo_home_network/binary_sensor.py | 4 +-- .../components/devolo_home_network/button.py | 4 +-- .../components/devolo_home_network/image.py | 4 +-- .../components/devolo_home_network/sensor.py | 4 +-- .../components/devolo_home_network/switch.py | 4 +-- .../components/devolo_home_network/update.py | 4 +-- homeassistant/components/discovergy/sensor.py | 2 +- homeassistant/components/doorbird/button.py | 4 +-- .../dormakaba_dkey/binary_sensor.py | 4 +-- homeassistant/components/dovado/sensor.py | 4 +-- .../dremel_3d_printer/binary_sensor.py | 4 +-- .../components/dremel_3d_printer/button.py | 4 +-- .../components/dremel_3d_printer/sensor.py | 4 +-- homeassistant/components/dsmr/sensor.py | 2 +- .../components/dsmr_reader/definitions.py | 2 +- homeassistant/components/easyenergy/sensor.py | 4 +-- homeassistant/components/ecobee/number.py | 4 +-- homeassistant/components/ecobee/sensor.py | 4 +-- homeassistant/components/ecoforest/number.py | 4 +-- homeassistant/components/ecoforest/sensor.py | 4 +-- homeassistant/components/ecoforest/switch.py | 4 +-- .../components/electric_kiwi/sensor.py | 4 +-- homeassistant/components/elgato/button.py | 2 +- homeassistant/components/elgato/sensor.py | 2 +- homeassistant/components/elgato/switch.py | 2 +- homeassistant/components/energyzero/sensor.py | 4 +-- homeassistant/components/enocean/sensor.py | 4 +-- .../components/enphase_envoy/binary_sensor.py | 8 +++--- .../components/enphase_envoy/number.py | 8 +++--- .../components/enphase_envoy/select.py | 8 +++--- .../components/enphase_envoy/sensor.py | 28 +++++++++---------- .../components/enphase_envoy/switch.py | 12 ++++---- .../components/environment_canada/sensor.py | 4 +-- .../components/ezviz/alarm_control_panel.py | 4 +-- homeassistant/components/ezviz/button.py | 4 +-- homeassistant/components/ezviz/number.py | 4 +-- homeassistant/components/ezviz/select.py | 4 +-- homeassistant/components/ezviz/switch.py | 4 +-- .../components/faa_delays/binary_sensor.py | 2 +- homeassistant/components/fitbit/sensor.py | 2 +- .../components/fivem/binary_sensor.py | 2 +- homeassistant/components/fivem/entity.py | 2 +- homeassistant/components/fivem/sensor.py | 2 +- .../components/fjaraskupan/binary_sensor.py | 2 +- .../components/flume/binary_sensor.py | 4 +-- .../components/forecast_solar/sensor.py | 2 +- homeassistant/components/freebox/button.py | 4 +-- .../components/fritz/binary_sensor.py | 2 +- homeassistant/components/fritz/button.py | 4 +-- homeassistant/components/fritz/common.py | 4 +-- homeassistant/components/fritz/sensor.py | 2 +- homeassistant/components/fritz/update.py | 2 +- .../components/fritzbox/binary_sensor.py | 4 +-- homeassistant/components/fritzbox/model.py | 2 +- homeassistant/components/fritzbox/sensor.py | 4 +-- homeassistant/components/fronius/sensor.py | 2 +- .../components/fully_kiosk/button.py | 4 +-- .../components/fully_kiosk/sensor.py | 2 +- .../components/fully_kiosk/switch.py | 4 +-- .../gardena_bluetooth/binary_sensor.py | 2 +- .../components/gardena_bluetooth/button.py | 2 +- .../components/gardena_bluetooth/number.py | 2 +- .../components/gardena_bluetooth/sensor.py | 2 +- homeassistant/components/geocaching/sensor.py | 4 +-- homeassistant/components/gios/sensor.py | 4 +-- homeassistant/components/github/sensor.py | 6 ++-- homeassistant/components/glances/sensor.py | 4 +-- homeassistant/components/goodwe/button.py | 4 +-- homeassistant/components/goodwe/number.py | 4 +-- homeassistant/components/goodwe/sensor.py | 2 +- .../components/google_wifi/sensor.py | 4 +-- homeassistant/components/gree/switch.py | 4 +-- .../sensor_types/sensor_entity_description.py | 4 +-- homeassistant/components/guardian/__init__.py | 4 +-- .../components/guardian/binary_sensor.py | 2 +- homeassistant/components/guardian/button.py | 4 +-- homeassistant/components/guardian/sensor.py | 2 +- homeassistant/components/guardian/switch.py | 4 +-- .../components/hassio/binary_sensor.py | 2 +- .../components/homekit_controller/button.py | 2 +- .../components/homekit_controller/select.py | 4 +-- .../components/homekit_controller/sensor.py | 2 +- .../components/homekit_controller/switch.py | 2 +- homeassistant/components/homewizard/sensor.py | 2 +- homeassistant/components/homewizard/switch.py | 2 +- homeassistant/components/honeywell/sensor.py | 4 +-- homeassistant/components/huawei_lte/select.py | 4 +-- homeassistant/components/huawei_lte/sensor.py | 2 +- homeassistant/components/huisbaasje/sensor.py | 2 +- .../hunterdouglas_powerview/button.py | 4 +-- .../hunterdouglas_powerview/select.py | 4 +-- .../hunterdouglas_powerview/sensor.py | 4 +-- homeassistant/components/iammeter/sensor.py | 2 +- homeassistant/components/ibeacon/sensor.py | 4 +-- .../components/idasen_desk/button.py | 4 +-- .../components/idasen_desk/sensor.py | 4 +-- homeassistant/components/incomfort/sensor.py | 2 +- .../components/intellifire/binary_sensor.py | 4 +-- homeassistant/components/intellifire/fan.py | 4 +-- homeassistant/components/intellifire/light.py | 4 +-- .../components/intellifire/sensor.py | 4 +-- .../components/intellifire/switch.py | 4 +-- homeassistant/components/iotawatt/sensor.py | 2 +- homeassistant/components/ipma/sensor.py | 4 +-- homeassistant/components/ipp/sensor.py | 4 +-- homeassistant/components/isy994/switch.py | 2 +- homeassistant/components/jellyfin/sensor.py | 4 +-- .../jewish_calendar/binary_sensor.py | 4 +-- homeassistant/components/juicenet/number.py | 4 +-- homeassistant/components/justnimbus/sensor.py | 4 +-- homeassistant/components/kaiterra/sensor.py | 4 +-- .../components/kaleidescape/sensor.py | 4 +-- homeassistant/components/knx/sensor.py | 2 +- .../components/kostal_plenticore/number.py | 4 +-- .../components/kostal_plenticore/select.py | 4 +-- .../components/kostal_plenticore/sensor.py | 4 +-- .../components/kostal_plenticore/switch.py | 4 +-- homeassistant/components/kraken/sensor.py | 4 +-- .../components/lacrosse_view/sensor.py | 4 +-- homeassistant/components/lametric/button.py | 2 +- homeassistant/components/lametric/number.py | 2 +- homeassistant/components/lametric/select.py | 2 +- homeassistant/components/lametric/sensor.py | 2 +- homeassistant/components/lametric/switch.py | 2 +- .../components/landisgyr_heat_meter/sensor.py | 4 +-- .../components/launch_library/sensor.py | 4 +-- homeassistant/components/lidarr/sensor.py | 4 +-- .../components/litterrobot/binary_sensor.py | 4 +-- .../components/litterrobot/button.py | 4 +-- .../components/litterrobot/select.py | 4 +-- .../components/litterrobot/sensor.py | 2 +- .../components/litterrobot/switch.py | 4 +-- homeassistant/components/litterrobot/time.py | 4 +-- homeassistant/components/lyric/sensor.py | 4 +-- .../components/matter/binary_sensor.py | 2 +- homeassistant/components/matter/entity.py | 2 +- homeassistant/components/matter/sensor.py | 2 +- homeassistant/components/meater/sensor.py | 4 +-- homeassistant/components/melcloud/sensor.py | 4 +-- homeassistant/components/melnor/number.py | 4 +-- homeassistant/components/melnor/sensor.py | 8 +++--- homeassistant/components/melnor/switch.py | 4 +-- homeassistant/components/melnor/time.py | 4 +-- .../components/meteo_france/sensor.py | 4 +-- .../minecraft_server/binary_sensor.py | 2 +- .../components/minecraft_server/sensor.py | 4 +-- .../components/mysensors/binary_sensor.py | 2 +- homeassistant/components/mystrom/sensor.py | 2 +- homeassistant/components/nam/sensor.py | 4 +-- homeassistant/components/netatmo/sensor.py | 4 +-- homeassistant/components/netgear/button.py | 4 +-- homeassistant/components/netgear/sensor.py | 2 +- homeassistant/components/netgear/switch.py | 4 +-- homeassistant/components/nextcloud/sensor.py | 2 +- .../components/nextdns/binary_sensor.py | 4 +-- homeassistant/components/nextdns/sensor.py | 4 +-- homeassistant/components/nextdns/switch.py | 4 +-- .../components/notion/binary_sensor.py | 4 +-- homeassistant/components/notion/model.py | 2 +- homeassistant/components/notion/sensor.py | 2 +- homeassistant/components/nws/sensor.py | 2 +- .../components/onewire/binary_sensor.py | 2 +- .../components/onewire/onewire_entities.py | 2 +- homeassistant/components/onewire/sensor.py | 2 +- homeassistant/components/onewire/switch.py | 2 +- homeassistant/components/onvif/switch.py | 4 +-- homeassistant/components/openuv/sensor.py | 4 +-- homeassistant/components/opower/sensor.py | 4 +-- .../components/overkiz/alarm_control_panel.py | 4 +-- .../components/overkiz/binary_sensor.py | 4 +-- homeassistant/components/overkiz/button.py | 2 +- homeassistant/components/overkiz/number.py | 4 +-- homeassistant/components/overkiz/select.py | 4 +-- homeassistant/components/overkiz/sensor.py | 2 +- homeassistant/components/overkiz/switch.py | 4 +-- homeassistant/components/ovo_energy/sensor.py | 2 +- homeassistant/components/peco/sensor.py | 4 +-- .../components/pegel_online/sensor.py | 4 +-- homeassistant/components/permobil/sensor.py | 4 +-- .../components/philips_js/binary_sensor.py | 2 +- .../components/pi_hole/binary_sensor.py | 4 +-- homeassistant/components/pi_hole/update.py | 2 +- homeassistant/components/picnic/sensor.py | 4 +-- .../components/plugwise/binary_sensor.py | 2 +- homeassistant/components/plugwise/number.py | 2 +- homeassistant/components/plugwise/select.py | 2 +- homeassistant/components/plugwise/sensor.py | 2 +- homeassistant/components/plugwise/switch.py | 2 +- homeassistant/components/point/sensor.py | 4 +-- homeassistant/components/powerwall/sensor.py | 4 +-- .../components/private_ble_device/sensor.py | 4 +-- homeassistant/components/prusalink/button.py | 4 +-- homeassistant/components/prusalink/sensor.py | 4 +-- .../components/pure_energie/sensor.py | 4 +-- homeassistant/components/purpleair/sensor.py | 4 +-- homeassistant/components/pvoutput/sensor.py | 2 +- .../components/qbittorrent/sensor.py | 4 +-- .../components/qnap_qsw/binary_sensor.py | 2 +- homeassistant/components/qnap_qsw/button.py | 4 +-- homeassistant/components/qnap_qsw/entity.py | 3 +- homeassistant/components/qnap_qsw/sensor.py | 2 +- homeassistant/components/radarr/sensor.py | 4 +-- .../components/rainmachine/binary_sensor.py | 2 +- .../components/rainmachine/button.py | 4 +-- homeassistant/components/rainmachine/model.py | 8 +++--- .../components/rainmachine/select.py | 6 ++-- .../components/rainmachine/sensor.py | 4 +-- .../components/rainmachine/switch.py | 6 ++-- homeassistant/components/rdw/binary_sensor.py | 2 +- homeassistant/components/rdw/sensor.py | 2 +- .../components/renault/binary_sensor.py | 4 +-- homeassistant/components/renault/button.py | 4 +-- homeassistant/components/renault/entity.py | 4 +-- homeassistant/components/renault/select.py | 4 +-- homeassistant/components/renault/sensor.py | 4 +-- .../components/renson/binary_sensor.py | 4 +-- homeassistant/components/renson/button.py | 4 +-- homeassistant/components/renson/sensor.py | 4 +-- .../components/reolink/binary_sensor.py | 2 +- homeassistant/components/reolink/button.py | 4 +-- homeassistant/components/reolink/camera.py | 2 +- homeassistant/components/reolink/entity.py | 4 +-- homeassistant/components/reolink/light.py | 2 +- homeassistant/components/reolink/number.py | 2 +- homeassistant/components/reolink/select.py | 2 +- homeassistant/components/reolink/sensor.py | 4 +-- homeassistant/components/reolink/siren.py | 2 +- homeassistant/components/reolink/switch.py | 4 +-- homeassistant/components/repetier/__init__.py | 4 +-- homeassistant/components/rfxtrx/sensor.py | 2 +- .../components/ring/binary_sensor.py | 4 +-- homeassistant/components/ring/sensor.py | 4 +-- .../rituals_perfume_genie/binary_sensor.py | 2 +- .../rituals_perfume_genie/number.py | 2 +- .../rituals_perfume_genie/select.py | 2 +- .../rituals_perfume_genie/sensor.py | 2 +- .../rituals_perfume_genie/switch.py | 4 +-- .../components/roborock/binary_sensor.py | 4 +-- homeassistant/components/roborock/button.py | 4 +-- homeassistant/components/roborock/number.py | 4 +-- homeassistant/components/roborock/select.py | 4 +-- homeassistant/components/roborock/sensor.py | 4 +-- homeassistant/components/roborock/switch.py | 4 +-- homeassistant/components/roborock/time.py | 4 +-- .../components/roku/binary_sensor.py | 4 +-- homeassistant/components/roku/select.py | 4 +-- homeassistant/components/roku/sensor.py | 4 +-- homeassistant/components/roomba/sensor.py | 4 +-- homeassistant/components/sabnzbd/sensor.py | 4 +-- .../components/schlage/binary_sensor.py | 4 +-- homeassistant/components/schlage/switch.py | 4 +-- .../components/screenlogic/binary_sensor.py | 4 +-- .../components/screenlogic/climate.py | 2 +- .../components/screenlogic/entity.py | 8 +++--- homeassistant/components/screenlogic/light.py | 2 +- .../components/screenlogic/number.py | 4 +-- .../components/screenlogic/sensor.py | 6 ++-- .../components/screenlogic/switch.py | 2 +- .../components/sensibo/binary_sensor.py | 8 +++--- homeassistant/components/sensibo/button.py | 4 +-- homeassistant/components/sensibo/number.py | 4 +-- homeassistant/components/sensibo/select.py | 4 +-- homeassistant/components/sensibo/sensor.py | 8 +++--- homeassistant/components/sensibo/switch.py | 4 +-- homeassistant/components/sensibo/update.py | 4 +-- .../components/sfr_box/binary_sensor.py | 4 +-- homeassistant/components/sfr_box/button.py | 4 +-- homeassistant/components/sfr_box/sensor.py | 4 +-- .../components/shelly/binary_sensor.py | 6 ++-- homeassistant/components/shelly/button.py | 4 +-- homeassistant/components/shelly/entity.py | 8 +++--- homeassistant/components/shelly/event.py | 4 +-- homeassistant/components/shelly/number.py | 2 +- homeassistant/components/shelly/sensor.py | 6 ++-- homeassistant/components/shelly/switch.py | 2 +- homeassistant/components/shelly/update.py | 8 +++--- .../components/sia/alarm_control_panel.py | 2 +- homeassistant/components/sia/binary_sensor.py | 2 +- .../components/sia/sia_entity_base.py | 4 +-- homeassistant/components/simplisafe/button.py | 4 +-- homeassistant/components/skybell/sensor.py | 4 +-- homeassistant/components/sleepiq/button.py | 4 +-- homeassistant/components/sleepiq/number.py | 4 +-- homeassistant/components/smappee/sensor.py | 8 +++--- homeassistant/components/solaredge/sensor.py | 4 +-- .../components/solaredge_local/sensor.py | 2 +- homeassistant/components/solarlog/sensor.py | 2 +- homeassistant/components/sonarr/sensor.py | 4 +-- .../components/speedtestdotnet/sensor.py | 2 +- homeassistant/components/starline/switch.py | 4 +-- .../components/starlink/binary_sensor.py | 4 +-- homeassistant/components/starlink/button.py | 4 +-- .../components/starlink/device_tracker.py | 4 +-- homeassistant/components/starlink/sensor.py | 4 +-- homeassistant/components/starlink/switch.py | 4 +-- homeassistant/components/steamist/sensor.py | 4 +-- homeassistant/components/sun/sensor.py | 4 +-- .../sensor_types/sensor_entity_description.py | 4 +-- .../components/switcher_kis/button.py | 4 +-- .../components/synology_dsm/binary_sensor.py | 2 +- .../components/synology_dsm/button.py | 4 +-- .../components/synology_dsm/camera.py | 2 +- .../components/synology_dsm/entity.py | 4 +-- .../components/synology_dsm/sensor.py | 2 +- .../components/synology_dsm/switch.py | 2 +- .../components/synology_dsm/update.py | 2 +- .../components/system_bridge/binary_sensor.py | 2 +- .../components/system_bridge/sensor.py | 2 +- .../components/systemmonitor/sensor.py | 2 +- .../components/tado/binary_sensor.py | 4 +-- homeassistant/components/tado/sensor.py | 4 +-- .../components/tailscale/binary_sensor.py | 2 +- homeassistant/components/tailscale/sensor.py | 2 +- homeassistant/components/tailwind/button.py | 2 +- homeassistant/components/tailwind/number.py | 2 +- homeassistant/components/tautulli/sensor.py | 8 +++--- .../tesla_wall_connector/__init__.py | 2 +- .../tesla_wall_connector/binary_sensor.py | 2 +- .../components/tesla_wall_connector/sensor.py | 2 +- .../components/tessie/binary_sensor.py | 2 +- homeassistant/components/tessie/sensor.py | 2 +- homeassistant/components/tolo/number.py | 4 +-- homeassistant/components/tolo/sensor.py | 4 +-- homeassistant/components/tomorrowio/sensor.py | 2 +- .../components/toon/binary_sensor.py | 4 +-- homeassistant/components/toon/models.py | 2 +- homeassistant/components/toon/sensor.py | 4 +-- homeassistant/components/toon/switch.py | 4 +-- homeassistant/components/tplink/sensor.py | 2 +- homeassistant/components/tractive/sensor.py | 4 +-- homeassistant/components/tractive/switch.py | 4 +-- homeassistant/components/tradfri/sensor.py | 4 +-- .../trafikverket_camera/binary_sensor.py | 4 +-- .../components/trafikverket_camera/sensor.py | 4 +-- .../components/trafikverket_ferry/sensor.py | 4 +-- .../components/trafikverket_train/sensor.py | 4 +-- .../trafikverket_weatherstation/sensor.py | 4 +-- .../components/transmission/sensor.py | 2 +- .../components/transmission/switch.py | 4 +-- .../components/tuya/binary_sensor.py | 2 +- homeassistant/components/tuya/climate.py | 4 +-- homeassistant/components/tuya/cover.py | 2 +- homeassistant/components/tuya/humidifier.py | 2 +- homeassistant/components/tuya/light.py | 2 +- homeassistant/components/tuya/sensor.py | 2 +- .../components/twentemilieu/sensor.py | 2 +- homeassistant/components/unifi/button.py | 4 +-- .../components/unifi/device_tracker.py | 4 +-- homeassistant/components/unifi/entity.py | 4 +-- homeassistant/components/unifi/image.py | 4 +-- homeassistant/components/unifi/sensor.py | 4 +-- homeassistant/components/unifi/switch.py | 4 +-- homeassistant/components/unifi/update.py | 4 +-- .../components/unifiprotect/binary_sensor.py | 4 +-- .../components/unifiprotect/button.py | 2 +- .../components/unifiprotect/models.py | 6 ++-- .../components/unifiprotect/number.py | 4 +-- .../components/unifiprotect/select.py | 2 +- .../components/unifiprotect/sensor.py | 4 +-- .../components/unifiprotect/switch.py | 2 +- homeassistant/components/unifiprotect/text.py | 2 +- .../components/upnp/binary_sensor.py | 2 +- homeassistant/components/upnp/entity.py | 2 +- homeassistant/components/upnp/sensor.py | 2 +- homeassistant/components/v2c/binary_sensor.py | 4 +-- homeassistant/components/v2c/number.py | 4 +-- homeassistant/components/v2c/sensor.py | 4 +-- homeassistant/components/v2c/switch.py | 4 +-- .../components/vallox/binary_sensor.py | 4 +-- homeassistant/components/vallox/number.py | 4 +-- homeassistant/components/vallox/sensor.py | 2 +- homeassistant/components/vallox/switch.py | 4 +-- homeassistant/components/venstar/sensor.py | 4 +-- homeassistant/components/vesync/sensor.py | 4 +-- homeassistant/components/vicare/__init__.py | 4 +-- .../components/vicare/binary_sensor.py | 2 +- homeassistant/components/vicare/button.py | 2 +- homeassistant/components/vicare/number.py | 2 +- homeassistant/components/vicare/sensor.py | 2 +- homeassistant/components/vilfo/sensor.py | 4 +-- .../components/vodafone_station/button.py | 4 +-- .../components/vodafone_station/sensor.py | 4 +-- homeassistant/components/wallbox/number.py | 4 +-- homeassistant/components/wallbox/sensor.py | 2 +- homeassistant/components/waqi/sensor.py | 4 +-- .../components/weatherflow/sensor.py | 4 +-- homeassistant/components/wemo/sensor.py | 2 +- homeassistant/components/whirlpool/sensor.py | 4 +-- homeassistant/components/whois/sensor.py | 2 +- homeassistant/components/withings/sensor.py | 10 +++---- homeassistant/components/wiz/number.py | 2 +- homeassistant/components/wled/number.py | 2 +- homeassistant/components/wled/sensor.py | 2 +- .../components/xiaomi_miio/binary_sensor.py | 2 +- .../components/xiaomi_miio/button.py | 2 +- .../components/xiaomi_miio/number.py | 4 +-- .../components/xiaomi_miio/select.py | 2 +- .../components/xiaomi_miio/sensor.py | 2 +- .../components/xiaomi_miio/switch.py | 4 +-- homeassistant/components/yalexs_ble/sensor.py | 4 +-- .../components/yolink/binary_sensor.py | 2 +- homeassistant/components/yolink/sensor.py | 4 +-- homeassistant/components/yolink/siren.py | 2 +- homeassistant/components/yolink/switch.py | 2 +- homeassistant/components/youtube/sensor.py | 4 +-- homeassistant/components/zamg/sensor.py | 4 +-- homeassistant/components/zeversolar/sensor.py | 4 +-- .../components/zwave_js/binary_sensor.py | 6 ++-- .../components/zwave_js/humidifier.py | 4 +-- homeassistant/components/zwave_me/sensor.py | 2 +- homeassistant/util/frozen_dataclass_compat.py | 1 + 462 files changed, 806 insertions(+), 804 deletions(-) diff --git a/homeassistant/components/abode/sensor.py b/homeassistant/components/abode/sensor.py index bceed215428..1b1dbe8b30a 100644 --- a/homeassistant/components/abode/sensor.py +++ b/homeassistant/components/abode/sensor.py @@ -27,7 +27,7 @@ ABODE_TEMPERATURE_UNIT_HA_UNIT = { } -@dataclass +@dataclass(frozen=True) class AbodeSensorDescriptionMixin: """Mixin for Abode sensor.""" @@ -35,7 +35,7 @@ class AbodeSensorDescriptionMixin: native_unit_of_measurement_fn: Callable[[AbodeSense], str] -@dataclass +@dataclass(frozen=True) class AbodeSensorDescription(SensorEntityDescription, AbodeSensorDescriptionMixin): """Class describing Abode sensor entities.""" diff --git a/homeassistant/components/accuweather/sensor.py b/homeassistant/components/accuweather/sensor.py index c983f0bc291..2219c5de4b6 100644 --- a/homeassistant/components/accuweather/sensor.py +++ b/homeassistant/components/accuweather/sensor.py @@ -45,14 +45,14 @@ from .const import ( PARALLEL_UPDATES = 1 -@dataclass +@dataclass(frozen=True) class AccuWeatherSensorDescriptionMixin: """Mixin for AccuWeather sensor.""" value_fn: Callable[[dict[str, Any]], str | int | float | None] -@dataclass +@dataclass(frozen=True) class AccuWeatherSensorDescription( SensorEntityDescription, AccuWeatherSensorDescriptionMixin ): diff --git a/homeassistant/components/adguard/sensor.py b/homeassistant/components/adguard/sensor.py index 523e1b73e16..c8ec5023533 100644 --- a/homeassistant/components/adguard/sensor.py +++ b/homeassistant/components/adguard/sensor.py @@ -22,7 +22,7 @@ SCAN_INTERVAL = timedelta(seconds=300) PARALLEL_UPDATES = 4 -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class AdGuardHomeEntityDescription(SensorEntityDescription): """Describes AdGuard Home sensor entity.""" diff --git a/homeassistant/components/adguard/switch.py b/homeassistant/components/adguard/switch.py index 944a3c7b269..4b6fe06cdab 100644 --- a/homeassistant/components/adguard/switch.py +++ b/homeassistant/components/adguard/switch.py @@ -21,7 +21,7 @@ SCAN_INTERVAL = timedelta(seconds=10) PARALLEL_UPDATES = 1 -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class AdGuardHomeSwitchEntityDescription(SwitchEntityDescription): """Describes AdGuard Home switch entity.""" diff --git a/homeassistant/components/airly/sensor.py b/homeassistant/components/airly/sensor.py index 864c36f171a..6105b277088 100644 --- a/homeassistant/components/airly/sensor.py +++ b/homeassistant/components/airly/sensor.py @@ -56,7 +56,7 @@ from .const import ( PARALLEL_UPDATES = 1 -@dataclass +@dataclass(frozen=True) class AirlySensorEntityDescription(SensorEntityDescription): """Class describing Airly sensor entities.""" diff --git a/homeassistant/components/airnow/sensor.py b/homeassistant/components/airnow/sensor.py index c6ab27a8497..9c154dc0712 100644 --- a/homeassistant/components/airnow/sensor.py +++ b/homeassistant/components/airnow/sensor.py @@ -51,7 +51,7 @@ ATTR_LEVEL = "level" ATTR_STATION = "reporting_station" -@dataclass +@dataclass(frozen=True) class AirNowEntityDescriptionMixin: """Mixin for required keys.""" @@ -59,7 +59,7 @@ class AirNowEntityDescriptionMixin: extra_state_attributes_fn: Callable[[Any], dict[str, str]] | None -@dataclass +@dataclass(frozen=True) class AirNowEntityDescription(SensorEntityDescription, AirNowEntityDescriptionMixin): """Describes Airnow sensor entity.""" diff --git a/homeassistant/components/airq/sensor.py b/homeassistant/components/airq/sensor.py index 9974307b4cd..f1fdfb289dd 100644 --- a/homeassistant/components/airq/sensor.py +++ b/homeassistant/components/airq/sensor.py @@ -37,14 +37,14 @@ from .const import ( _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class AirQEntityDescriptionMixin: """Class for keys required by AirQ entity.""" value: Callable[[dict], float | int | None] -@dataclass +@dataclass(frozen=True) class AirQEntityDescription(SensorEntityDescription, AirQEntityDescriptionMixin): """Describes AirQ sensor entity.""" diff --git a/homeassistant/components/airvisual_pro/sensor.py b/homeassistant/components/airvisual_pro/sensor.py index 188647b7338..6a8e32bc32c 100644 --- a/homeassistant/components/airvisual_pro/sensor.py +++ b/homeassistant/components/airvisual_pro/sensor.py @@ -26,7 +26,7 @@ from . import AirVisualProData, AirVisualProEntity from .const import DOMAIN -@dataclass +@dataclass(frozen=True) class AirVisualProMeasurementKeyMixin: """Define an entity description mixin to include a measurement key.""" @@ -35,7 +35,7 @@ class AirVisualProMeasurementKeyMixin: ] -@dataclass +@dataclass(frozen=True) class AirVisualProMeasurementDescription( SensorEntityDescription, AirVisualProMeasurementKeyMixin ): diff --git a/homeassistant/components/airzone/binary_sensor.py b/homeassistant/components/airzone/binary_sensor.py index cee0bb19691..488c2c96132 100644 --- a/homeassistant/components/airzone/binary_sensor.py +++ b/homeassistant/components/airzone/binary_sensor.py @@ -29,7 +29,7 @@ from .coordinator import AirzoneUpdateCoordinator from .entity import AirzoneEntity, AirzoneSystemEntity, AirzoneZoneEntity -@dataclass +@dataclass(frozen=True) class AirzoneBinarySensorEntityDescription(BinarySensorEntityDescription): """A class that describes airzone binary sensor entities.""" diff --git a/homeassistant/components/airzone/select.py b/homeassistant/components/airzone/select.py index 78b4dee3b72..6f69d4454ee 100644 --- a/homeassistant/components/airzone/select.py +++ b/homeassistant/components/airzone/select.py @@ -26,7 +26,7 @@ from .coordinator import AirzoneUpdateCoordinator from .entity import AirzoneEntity, AirzoneZoneEntity -@dataclass +@dataclass(frozen=True) class AirzoneSelectDescriptionMixin: """Define an entity description mixin for select entities.""" @@ -34,7 +34,7 @@ class AirzoneSelectDescriptionMixin: options_dict: dict[str, int] -@dataclass +@dataclass(frozen=True) class AirzoneSelectDescription(SelectEntityDescription, AirzoneSelectDescriptionMixin): """Class to describe an Airzone select entity.""" diff --git a/homeassistant/components/airzone_cloud/binary_sensor.py b/homeassistant/components/airzone_cloud/binary_sensor.py index 2a182b7b487..9f99e49f650 100644 --- a/homeassistant/components/airzone_cloud/binary_sensor.py +++ b/homeassistant/components/airzone_cloud/binary_sensor.py @@ -34,7 +34,7 @@ from .entity import ( ) -@dataclass +@dataclass(frozen=True) class AirzoneBinarySensorEntityDescription(BinarySensorEntityDescription): """A class that describes Airzone Cloud binary sensor entities.""" diff --git a/homeassistant/components/aladdin_connect/sensor.py b/homeassistant/components/aladdin_connect/sensor.py index e3a1f2d443c..0a264edc8c2 100644 --- a/homeassistant/components/aladdin_connect/sensor.py +++ b/homeassistant/components/aladdin_connect/sensor.py @@ -23,14 +23,14 @@ from .const import DOMAIN from .model import DoorDevice -@dataclass +@dataclass(frozen=True) class AccSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable -@dataclass +@dataclass(frozen=True) class AccSensorEntityDescription( SensorEntityDescription, AccSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/ambient_station/binary_sensor.py b/homeassistant/components/ambient_station/binary_sensor.py index 49ff43bcc7e..8bdfe0fd642 100644 --- a/homeassistant/components/ambient_station/binary_sensor.py +++ b/homeassistant/components/ambient_station/binary_sensor.py @@ -63,14 +63,14 @@ TYPE_RELAY8 = "relay8" TYPE_RELAY9 = "relay9" -@dataclass +@dataclass(frozen=True) class AmbientBinarySensorDescriptionMixin: """Define an entity description mixin for binary sensors.""" on_state: Literal[0, 1] -@dataclass +@dataclass(frozen=True) class AmbientBinarySensorDescription( BinarySensorEntityDescription, AmbientBinarySensorDescriptionMixin ): diff --git a/homeassistant/components/amcrest/binary_sensor.py b/homeassistant/components/amcrest/binary_sensor.py index e71a5cda538..a0b6b4f6527 100644 --- a/homeassistant/components/amcrest/binary_sensor.py +++ b/homeassistant/components/amcrest/binary_sensor.py @@ -35,7 +35,7 @@ if TYPE_CHECKING: from . import AmcrestDevice -@dataclass +@dataclass(frozen=True) class AmcrestSensorEntityDescription(BinarySensorEntityDescription): """Describe Amcrest sensor entity.""" diff --git a/homeassistant/components/android_ip_webcam/sensor.py b/homeassistant/components/android_ip_webcam/sensor.py index 7a08d774f6a..d7a821d956a 100644 --- a/homeassistant/components/android_ip_webcam/sensor.py +++ b/homeassistant/components/android_ip_webcam/sensor.py @@ -23,14 +23,14 @@ from .coordinator import AndroidIPCamDataUpdateCoordinator from .entity import AndroidIPCamBaseEntity -@dataclass +@dataclass(frozen=True) class AndroidIPWebcamSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[PyDroidIPCam], StateType] -@dataclass +@dataclass(frozen=True) class AndroidIPWebcamSensorEntityDescription( SensorEntityDescription, AndroidIPWebcamSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/android_ip_webcam/switch.py b/homeassistant/components/android_ip_webcam/switch.py index 1eca19fe395..bae84739079 100644 --- a/homeassistant/components/android_ip_webcam/switch.py +++ b/homeassistant/components/android_ip_webcam/switch.py @@ -18,7 +18,7 @@ from .coordinator import AndroidIPCamDataUpdateCoordinator from .entity import AndroidIPCamBaseEntity -@dataclass +@dataclass(frozen=True) class AndroidIPWebcamSwitchEntityDescriptionMixin: """Mixin for required keys.""" @@ -26,7 +26,7 @@ class AndroidIPWebcamSwitchEntityDescriptionMixin: off_func: Callable[[PyDroidIPCam], Coroutine[Any, Any, bool]] -@dataclass +@dataclass(frozen=True) class AndroidIPWebcamSwitchEntityDescription( SwitchEntityDescription, AndroidIPWebcamSwitchEntityDescriptionMixin ): diff --git a/homeassistant/components/anova/sensor.py b/homeassistant/components/anova/sensor.py index 6336aa61e1c..b7657e26249 100644 --- a/homeassistant/components/anova/sensor.py +++ b/homeassistant/components/anova/sensor.py @@ -23,14 +23,14 @@ from .entity import AnovaDescriptionEntity from .models import AnovaData -@dataclass +@dataclass(frozen=True) class AnovaSensorEntityDescriptionMixin: """Describes the mixin variables for anova sensors.""" value_fn: Callable[[APCUpdateSensor], float | int | str] -@dataclass +@dataclass(frozen=True) class AnovaSensorEntityDescription( SensorEntityDescription, AnovaSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/aosmith/sensor.py b/homeassistant/components/aosmith/sensor.py index c9bd9f1321e..78c6f32232a 100644 --- a/homeassistant/components/aosmith/sensor.py +++ b/homeassistant/components/aosmith/sensor.py @@ -19,7 +19,7 @@ from .coordinator import AOSmithCoordinator from .entity import AOSmithEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class AOSmithSensorEntityDescription(SensorEntityDescription): """Define sensor entity description class.""" diff --git a/homeassistant/components/aqualogic/sensor.py b/homeassistant/components/aqualogic/sensor.py index 955293a938e..90f87bfde23 100644 --- a/homeassistant/components/aqualogic/sensor.py +++ b/homeassistant/components/aqualogic/sensor.py @@ -26,7 +26,7 @@ from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from . import DOMAIN, UPDATE_TOPIC, AquaLogicProcessor -@dataclass +@dataclass(frozen=True) class AquaLogicSensorEntityDescription(SensorEntityDescription): """Describes AquaLogic sensor entity.""" diff --git a/homeassistant/components/aranet/sensor.py b/homeassistant/components/aranet/sensor.py index ad11b4bdbdc..23d3b64fdca 100644 --- a/homeassistant/components/aranet/sensor.py +++ b/homeassistant/components/aranet/sensor.py @@ -39,7 +39,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from .const import DOMAIN -@dataclass +@dataclass(frozen=True) class AranetSensorEntityDescription(SensorEntityDescription): """Class to describe an Aranet sensor entity.""" diff --git a/homeassistant/components/aseko_pool_live/binary_sensor.py b/homeassistant/components/aseko_pool_live/binary_sensor.py index 3e0e57fffac..cc91b6b97a6 100644 --- a/homeassistant/components/aseko_pool_live/binary_sensor.py +++ b/homeassistant/components/aseko_pool_live/binary_sensor.py @@ -20,14 +20,14 @@ from .coordinator import AsekoDataUpdateCoordinator from .entity import AsekoEntity -@dataclass +@dataclass(frozen=True) class AsekoBinarySensorDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[Unit], bool] -@dataclass +@dataclass(frozen=True) class AsekoBinarySensorEntityDescription( BinarySensorEntityDescription, AsekoBinarySensorDescriptionMixin ): diff --git a/homeassistant/components/asuswrt/sensor.py b/homeassistant/components/asuswrt/sensor.py index 4f9ec0af411..72d99c60816 100644 --- a/homeassistant/components/asuswrt/sensor.py +++ b/homeassistant/components/asuswrt/sensor.py @@ -38,7 +38,7 @@ from .const import ( from .router import AsusWrtRouter -@dataclass +@dataclass(frozen=True) class AsusWrtSensorEntityDescription(SensorEntityDescription): """A class that describes AsusWrt sensor entities.""" diff --git a/homeassistant/components/august/binary_sensor.py b/homeassistant/components/august/binary_sensor.py index b19a9833a47..144666844e7 100644 --- a/homeassistant/components/august/binary_sensor.py +++ b/homeassistant/components/august/binary_sensor.py @@ -105,12 +105,12 @@ def _native_datetime() -> datetime: return datetime.now() -@dataclass +@dataclass(frozen=True) class AugustBinarySensorEntityDescription(BinarySensorEntityDescription): """Describes August binary_sensor entity.""" -@dataclass +@dataclass(frozen=True) class AugustDoorbellRequiredKeysMixin: """Mixin for required keys.""" @@ -118,7 +118,7 @@ class AugustDoorbellRequiredKeysMixin: is_time_based: bool -@dataclass +@dataclass(frozen=True) class AugustDoorbellBinarySensorEntityDescription( BinarySensorEntityDescription, AugustDoorbellRequiredKeysMixin ): diff --git a/homeassistant/components/august/sensor.py b/homeassistant/components/august/sensor.py index 7f6e0c51995..1896a91c54f 100644 --- a/homeassistant/components/august/sensor.py +++ b/homeassistant/components/august/sensor.py @@ -63,14 +63,14 @@ def _retrieve_linked_keypad_battery_state(detail: KeypadDetail) -> int | None: _T = TypeVar("_T", LockDetail, KeypadDetail) -@dataclass +@dataclass(frozen=True) class AugustRequiredKeysMixin(Generic[_T]): """Mixin for required keys.""" value_fn: Callable[[_T], int | None] -@dataclass +@dataclass(frozen=True) class AugustSensorEntityDescription( SensorEntityDescription, AugustRequiredKeysMixin[_T] ): diff --git a/homeassistant/components/aussie_broadband/sensor.py b/homeassistant/components/aussie_broadband/sensor.py index aff232f2934..efc8ae99ef9 100644 --- a/homeassistant/components/aussie_broadband/sensor.py +++ b/homeassistant/components/aussie_broadband/sensor.py @@ -23,7 +23,7 @@ from homeassistant.helpers.update_coordinator import CoordinatorEntity from .const import DOMAIN, SERVICE_ID -@dataclass +@dataclass(frozen=True) class SensorValueEntityDescription(SensorEntityDescription): """Class describing Aussie Broadband sensor entities.""" diff --git a/homeassistant/components/awair/sensor.py b/homeassistant/components/awair/sensor.py index 2a09a8d4e70..698850d6a49 100644 --- a/homeassistant/components/awair/sensor.py +++ b/homeassistant/components/awair/sensor.py @@ -50,14 +50,14 @@ from .coordinator import AwairDataUpdateCoordinator, AwairResult DUST_ALIASES = [API_PM25, API_PM10] -@dataclass +@dataclass(frozen=True) class AwairRequiredKeysMixin: """Mixin for required keys.""" unique_id_tag: str -@dataclass +@dataclass(frozen=True) class AwairSensorEntityDescription(SensorEntityDescription, AwairRequiredKeysMixin): """Describes Awair sensor entity.""" diff --git a/homeassistant/components/azure_devops/__init__.py b/homeassistant/components/azure_devops/__init__.py index dc3d0e5b04b..edd06d69d2e 100644 --- a/homeassistant/components/azure_devops/__init__.py +++ b/homeassistant/components/azure_devops/__init__.py @@ -32,7 +32,7 @@ PLATFORMS = [Platform.SENSOR] BUILDS_QUERY: Final = "?queryOrder=queueTimeDescending&maxBuildsPerDefinition=1" -@dataclass +@dataclass(frozen=True) class AzureDevOpsEntityDescription(EntityDescription): """Class describing Azure DevOps entities.""" diff --git a/homeassistant/components/azure_devops/sensor.py b/homeassistant/components/azure_devops/sensor.py index ac884f73d68..6daf9b434df 100644 --- a/homeassistant/components/azure_devops/sensor.py +++ b/homeassistant/components/azure_devops/sensor.py @@ -17,14 +17,14 @@ from . import AzureDevOpsDeviceEntity, AzureDevOpsEntityDescription from .const import CONF_ORG, DOMAIN -@dataclass +@dataclass(frozen=True) class AzureDevOpsSensorEntityDescriptionMixin: """Mixin class for required Azure DevOps sensor description keys.""" build_key: int -@dataclass +@dataclass(frozen=True) class AzureDevOpsSensorEntityDescription( AzureDevOpsEntityDescription, SensorEntityDescription, diff --git a/homeassistant/components/baf/binary_sensor.py b/homeassistant/components/baf/binary_sensor.py index a68e80c3ac2..50e8cd78629 100644 --- a/homeassistant/components/baf/binary_sensor.py +++ b/homeassistant/components/baf/binary_sensor.py @@ -21,14 +21,14 @@ from .entity import BAFEntity from .models import BAFData -@dataclass +@dataclass(frozen=True) class BAFBinarySensorDescriptionMixin: """Required values for BAF binary sensors.""" value_fn: Callable[[Device], bool | None] -@dataclass +@dataclass(frozen=True) class BAFBinarySensorDescription( BinarySensorEntityDescription, BAFBinarySensorDescriptionMixin, diff --git a/homeassistant/components/baf/number.py b/homeassistant/components/baf/number.py index 7fd1c9ed290..9dd4180c7e1 100644 --- a/homeassistant/components/baf/number.py +++ b/homeassistant/components/baf/number.py @@ -22,14 +22,14 @@ from .entity import BAFEntity from .models import BAFData -@dataclass +@dataclass(frozen=True) class BAFNumberDescriptionMixin: """Required values for BAF sensors.""" value_fn: Callable[[Device], int | None] -@dataclass +@dataclass(frozen=True) class BAFNumberDescription(NumberEntityDescription, BAFNumberDescriptionMixin): """Class describing BAF sensor entities.""" diff --git a/homeassistant/components/baf/sensor.py b/homeassistant/components/baf/sensor.py index d8111804142..5c8d8f2979b 100644 --- a/homeassistant/components/baf/sensor.py +++ b/homeassistant/components/baf/sensor.py @@ -28,14 +28,14 @@ from .entity import BAFEntity from .models import BAFData -@dataclass +@dataclass(frozen=True) class BAFSensorDescriptionMixin: """Required values for BAF sensors.""" value_fn: Callable[[Device], int | float | str | None] -@dataclass +@dataclass(frozen=True) class BAFSensorDescription( SensorEntityDescription, BAFSensorDescriptionMixin, diff --git a/homeassistant/components/baf/switch.py b/homeassistant/components/baf/switch.py index ed4e635ece3..ccb8aee36e5 100644 --- a/homeassistant/components/baf/switch.py +++ b/homeassistant/components/baf/switch.py @@ -18,14 +18,14 @@ from .entity import BAFEntity from .models import BAFData -@dataclass +@dataclass(frozen=True) class BAFSwitchDescriptionMixin: """Required values for BAF sensors.""" value_fn: Callable[[Device], bool | None] -@dataclass +@dataclass(frozen=True) class BAFSwitchDescription( SwitchEntityDescription, BAFSwitchDescriptionMixin, diff --git a/homeassistant/components/balboa/binary_sensor.py b/homeassistant/components/balboa/binary_sensor.py index 7462d051643..ec7a9fe484a 100644 --- a/homeassistant/components/balboa/binary_sensor.py +++ b/homeassistant/components/balboa/binary_sensor.py @@ -33,7 +33,7 @@ async def async_setup_entry( async_add_entities(entities) -@dataclass +@dataclass(frozen=True) class BalboaBinarySensorEntityDescriptionMixin: """Mixin for required keys.""" @@ -41,7 +41,7 @@ class BalboaBinarySensorEntityDescriptionMixin: on_off_icons: tuple[str, str] -@dataclass +@dataclass(frozen=True) class BalboaBinarySensorEntityDescription( BinarySensorEntityDescription, BalboaBinarySensorEntityDescriptionMixin ): diff --git a/homeassistant/components/bmw_connected_drive/binary_sensor.py b/homeassistant/components/bmw_connected_drive/binary_sensor.py index 0e3750de085..29c4d61e9f7 100644 --- a/homeassistant/components/bmw_connected_drive/binary_sensor.py +++ b/homeassistant/components/bmw_connected_drive/binary_sensor.py @@ -109,14 +109,14 @@ def _format_cbs_report( return result -@dataclass +@dataclass(frozen=True) class BMWRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[MyBMWVehicle], bool] -@dataclass +@dataclass(frozen=True) class BMWBinarySensorEntityDescription( BinarySensorEntityDescription, BMWRequiredKeysMixin ): diff --git a/homeassistant/components/bmw_connected_drive/button.py b/homeassistant/components/bmw_connected_drive/button.py index c3f066610a9..f2a123fe4a8 100644 --- a/homeassistant/components/bmw_connected_drive/button.py +++ b/homeassistant/components/bmw_connected_drive/button.py @@ -25,14 +25,14 @@ if TYPE_CHECKING: _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class BMWRequiredKeysMixin: """Mixin for required keys.""" remote_function: Callable[[MyBMWVehicle], Coroutine[Any, Any, RemoteServiceStatus]] -@dataclass +@dataclass(frozen=True) class BMWButtonEntityDescription(ButtonEntityDescription, BMWRequiredKeysMixin): """Class describing BMW button entities.""" diff --git a/homeassistant/components/bmw_connected_drive/number.py b/homeassistant/components/bmw_connected_drive/number.py index f37f7627140..0ed732e1dcb 100644 --- a/homeassistant/components/bmw_connected_drive/number.py +++ b/homeassistant/components/bmw_connected_drive/number.py @@ -26,7 +26,7 @@ from .coordinator import BMWDataUpdateCoordinator _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class BMWRequiredKeysMixin: """Mixin for required keys.""" @@ -34,7 +34,7 @@ class BMWRequiredKeysMixin: remote_service: Callable[[MyBMWVehicle, float | int], Coroutine[Any, Any, Any]] -@dataclass +@dataclass(frozen=True) class BMWNumberEntityDescription(NumberEntityDescription, BMWRequiredKeysMixin): """Describes BMW number entity.""" diff --git a/homeassistant/components/bmw_connected_drive/select.py b/homeassistant/components/bmw_connected_drive/select.py index 1d8b736f4dd..8823c6552cc 100644 --- a/homeassistant/components/bmw_connected_drive/select.py +++ b/homeassistant/components/bmw_connected_drive/select.py @@ -22,7 +22,7 @@ from .coordinator import BMWDataUpdateCoordinator _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class BMWRequiredKeysMixin: """Mixin for required keys.""" @@ -30,7 +30,7 @@ class BMWRequiredKeysMixin: remote_service: Callable[[MyBMWVehicle, str], Coroutine[Any, Any, Any]] -@dataclass +@dataclass(frozen=True) class BMWSelectEntityDescription(SelectEntityDescription, BMWRequiredKeysMixin): """Describes BMW sensor entity.""" diff --git a/homeassistant/components/bmw_connected_drive/sensor.py b/homeassistant/components/bmw_connected_drive/sensor.py index 62854badb20..d486c41ae56 100644 --- a/homeassistant/components/bmw_connected_drive/sensor.py +++ b/homeassistant/components/bmw_connected_drive/sensor.py @@ -28,7 +28,7 @@ from .coordinator import BMWDataUpdateCoordinator _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class BMWSensorEntityDescription(SensorEntityDescription): """Describes BMW sensor entity.""" diff --git a/homeassistant/components/bmw_connected_drive/switch.py b/homeassistant/components/bmw_connected_drive/switch.py index 298338dc9fa..e4ce0ba81ff 100644 --- a/homeassistant/components/bmw_connected_drive/switch.py +++ b/homeassistant/components/bmw_connected_drive/switch.py @@ -22,7 +22,7 @@ from .coordinator import BMWDataUpdateCoordinator _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class BMWRequiredKeysMixin: """Mixin for required keys.""" @@ -31,7 +31,7 @@ class BMWRequiredKeysMixin: remote_service_off: Callable[[MyBMWVehicle], Coroutine[Any, Any, Any]] -@dataclass +@dataclass(frozen=True) class BMWSwitchEntityDescription(SwitchEntityDescription, BMWRequiredKeysMixin): """Describes BMW switch entity.""" diff --git a/homeassistant/components/bond/button.py b/homeassistant/components/bond/button.py index 1109cf0d311..273ef837f6e 100644 --- a/homeassistant/components/bond/button.py +++ b/homeassistant/components/bond/button.py @@ -21,7 +21,7 @@ from .utils import BondDevice, BondHub STEP_SIZE = 10 -@dataclass +@dataclass(frozen=True) class BondButtonEntityDescriptionMixin: """Mixin to describe a Bond Button entity.""" @@ -29,7 +29,7 @@ class BondButtonEntityDescriptionMixin: argument: int | None -@dataclass +@dataclass(frozen=True) class BondButtonEntityDescription( ButtonEntityDescription, BondButtonEntityDescriptionMixin ): diff --git a/homeassistant/components/bosch_shc/switch.py b/homeassistant/components/bosch_shc/switch.py index 25af0628780..03d3ba2f6a9 100644 --- a/homeassistant/components/bosch_shc/switch.py +++ b/homeassistant/components/bosch_shc/switch.py @@ -29,7 +29,7 @@ from .const import DATA_SESSION, DOMAIN from .entity import SHCEntity -@dataclass +@dataclass(frozen=True) class SHCSwitchRequiredKeysMixin: """Mixin for SHC switch required keys.""" @@ -38,7 +38,7 @@ class SHCSwitchRequiredKeysMixin: should_poll: bool -@dataclass +@dataclass(frozen=True) class SHCSwitchEntityDescription( SwitchEntityDescription, SHCSwitchRequiredKeysMixin, diff --git a/homeassistant/components/braviatv/button.py b/homeassistant/components/braviatv/button.py index 1f6c9961c51..eb3d2d8797f 100644 --- a/homeassistant/components/braviatv/button.py +++ b/homeassistant/components/braviatv/button.py @@ -19,14 +19,14 @@ from .coordinator import BraviaTVCoordinator from .entity import BraviaTVEntity -@dataclass +@dataclass(frozen=True) class BraviaTVButtonDescriptionMixin: """Mixin to describe a Bravia TV Button entity.""" press_action: Callable[[BraviaTVCoordinator], Coroutine] -@dataclass +@dataclass(frozen=True) class BraviaTVButtonDescription( ButtonEntityDescription, BraviaTVButtonDescriptionMixin ): diff --git a/homeassistant/components/brother/sensor.py b/homeassistant/components/brother/sensor.py index e9554d84207..27e4b7fd715 100644 --- a/homeassistant/components/brother/sensor.py +++ b/homeassistant/components/brother/sensor.py @@ -35,14 +35,14 @@ UNIT_PAGES = "p" _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class BrotherSensorRequiredKeysMixin: """Class for Brother entity required keys.""" value: Callable[[BrotherSensors], StateType | datetime] -@dataclass +@dataclass(frozen=True) class BrotherSensorEntityDescription( SensorEntityDescription, BrotherSensorRequiredKeysMixin ): diff --git a/homeassistant/components/co2signal/sensor.py b/homeassistant/components/co2signal/sensor.py index 00051d8bec9..9f955e35ed8 100644 --- a/homeassistant/components/co2signal/sensor.py +++ b/homeassistant/components/co2signal/sensor.py @@ -22,7 +22,7 @@ from .const import ATTRIBUTION, DOMAIN from .coordinator import CO2SignalCoordinator -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class CO2SensorEntityDescription(SensorEntityDescription): """Provide a description of a CO2 sensor.""" diff --git a/homeassistant/components/comfoconnect/sensor.py b/homeassistant/components/comfoconnect/sensor.py index 21e6eda255d..421643f5ced 100644 --- a/homeassistant/components/comfoconnect/sensor.py +++ b/homeassistant/components/comfoconnect/sensor.py @@ -79,14 +79,14 @@ ATTR_SUPPLY_TEMPERATURE = "supply_temperature" _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class ComfoconnectRequiredKeysMixin: """Mixin for required keys.""" sensor_id: int -@dataclass +@dataclass(frozen=True) class ComfoconnectSensorEntityDescription( SensorEntityDescription, ComfoconnectRequiredKeysMixin ): diff --git a/homeassistant/components/daikin/sensor.py b/homeassistant/components/daikin/sensor.py index 1646e292ee9..9e7a181ba32 100644 --- a/homeassistant/components/daikin/sensor.py +++ b/homeassistant/components/daikin/sensor.py @@ -39,14 +39,14 @@ from .const import ( ) -@dataclass +@dataclass(frozen=True) class DaikinRequiredKeysMixin: """Mixin for required keys.""" value_func: Callable[[Appliance], float | None] -@dataclass +@dataclass(frozen=True) class DaikinSensorEntityDescription(SensorEntityDescription, DaikinRequiredKeysMixin): """Describes Daikin sensor entity.""" diff --git a/homeassistant/components/deconz/binary_sensor.py b/homeassistant/components/deconz/binary_sensor.py index 84141eac964..c0a4e2585a3 100644 --- a/homeassistant/components/deconz/binary_sensor.py +++ b/homeassistant/components/deconz/binary_sensor.py @@ -65,7 +65,7 @@ T = TypeVar( ) -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class DeconzBinarySensorDescription(Generic[T], BinarySensorEntityDescription): """Class describing deCONZ binary sensor entities.""" diff --git a/homeassistant/components/deconz/button.py b/homeassistant/components/deconz/button.py index 81d839ea0f2..52105c10203 100644 --- a/homeassistant/components/deconz/button.py +++ b/homeassistant/components/deconz/button.py @@ -23,7 +23,7 @@ from .deconz_device import DeconzDevice, DeconzSceneMixin from .gateway import DeconzGateway, get_gateway_from_config_entry -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class DeconzButtonDescription(ButtonEntityDescription): """Class describing deCONZ button entities.""" diff --git a/homeassistant/components/deconz/number.py b/homeassistant/components/deconz/number.py index 7cc0da936cb..e98f5d726ac 100644 --- a/homeassistant/components/deconz/number.py +++ b/homeassistant/components/deconz/number.py @@ -31,7 +31,7 @@ from .util import serial_from_unique_id T = TypeVar("T", Presence, PydeconzSensorBase) -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class DeconzNumberDescription(Generic[T], NumberEntityDescription): """Class describing deCONZ number entities.""" diff --git a/homeassistant/components/deconz/sensor.py b/homeassistant/components/deconz/sensor.py index ecb9ac9b297..8366c811318 100644 --- a/homeassistant/components/deconz/sensor.py +++ b/homeassistant/components/deconz/sensor.py @@ -93,7 +93,7 @@ T = TypeVar( ) -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class DeconzSensorDescription(Generic[T], SensorEntityDescription): """Class describing deCONZ binary sensor entities.""" diff --git a/homeassistant/components/deluge/sensor.py b/homeassistant/components/deluge/sensor.py index 9242e3e2d5e..eeb947663bf 100644 --- a/homeassistant/components/deluge/sensor.py +++ b/homeassistant/components/deluge/sensor.py @@ -38,7 +38,7 @@ def get_state(data: dict[str, float], key: str) -> str | float: return round(kb_spd, 2 if kb_spd < 0.1 else 1) -@dataclass +@dataclass(frozen=True) class DelugeSensorEntityDescription(SensorEntityDescription): """Class to describe a Deluge sensor.""" diff --git a/homeassistant/components/devolo_home_network/binary_sensor.py b/homeassistant/components/devolo_home_network/binary_sensor.py index ebe7e60af7b..35b79b57f1d 100644 --- a/homeassistant/components/devolo_home_network/binary_sensor.py +++ b/homeassistant/components/devolo_home_network/binary_sensor.py @@ -32,14 +32,14 @@ def _is_connected_to_router(entity: DevoloBinarySensorEntity) -> bool: ) -@dataclass +@dataclass(frozen=True) class DevoloBinarySensorRequiredKeysMixin: """Mixin for required keys.""" value_func: Callable[[DevoloBinarySensorEntity], bool] -@dataclass +@dataclass(frozen=True) class DevoloBinarySensorEntityDescription( BinarySensorEntityDescription, DevoloBinarySensorRequiredKeysMixin ): diff --git a/homeassistant/components/devolo_home_network/button.py b/homeassistant/components/devolo_home_network/button.py index 463356268a6..9b3dd75ef98 100644 --- a/homeassistant/components/devolo_home_network/button.py +++ b/homeassistant/components/devolo_home_network/button.py @@ -22,14 +22,14 @@ from .const import DOMAIN, IDENTIFY, PAIRING, RESTART, START_WPS from .entity import DevoloEntity -@dataclass +@dataclass(frozen=True) class DevoloButtonRequiredKeysMixin: """Mixin for required keys.""" press_func: Callable[[Device], Awaitable[bool]] -@dataclass +@dataclass(frozen=True) class DevoloButtonEntityDescription( ButtonEntityDescription, DevoloButtonRequiredKeysMixin ): diff --git a/homeassistant/components/devolo_home_network/image.py b/homeassistant/components/devolo_home_network/image.py index 3670c42bc6b..72cf4f57c1d 100644 --- a/homeassistant/components/devolo_home_network/image.py +++ b/homeassistant/components/devolo_home_network/image.py @@ -21,14 +21,14 @@ from .const import DOMAIN, IMAGE_GUEST_WIFI, SWITCH_GUEST_WIFI from .entity import DevoloCoordinatorEntity -@dataclass +@dataclass(frozen=True) class DevoloImageRequiredKeysMixin: """Mixin for required keys.""" image_func: Callable[[WifiGuestAccessGet], bytes] -@dataclass +@dataclass(frozen=True) class DevoloImageEntityDescription( ImageEntityDescription, DevoloImageRequiredKeysMixin ): diff --git a/homeassistant/components/devolo_home_network/sensor.py b/homeassistant/components/devolo_home_network/sensor.py index 5d2b768d547..66395e3a465 100644 --- a/homeassistant/components/devolo_home_network/sensor.py +++ b/homeassistant/components/devolo_home_network/sensor.py @@ -49,14 +49,14 @@ class DataRateDirection(StrEnum): TX = "tx_rate" -@dataclass +@dataclass(frozen=True) class DevoloSensorRequiredKeysMixin(Generic[_CoordinatorDataT]): """Mixin for required keys.""" value_func: Callable[[_CoordinatorDataT], float] -@dataclass +@dataclass(frozen=True) class DevoloSensorEntityDescription( SensorEntityDescription, DevoloSensorRequiredKeysMixin[_CoordinatorDataT] ): diff --git a/homeassistant/components/devolo_home_network/switch.py b/homeassistant/components/devolo_home_network/switch.py index e7bcee3f2ec..99c23f77d35 100644 --- a/homeassistant/components/devolo_home_network/switch.py +++ b/homeassistant/components/devolo_home_network/switch.py @@ -23,7 +23,7 @@ from .entity import DevoloCoordinatorEntity _DataT = TypeVar("_DataT", bound=WifiGuestAccessGet | bool) -@dataclass +@dataclass(frozen=True) class DevoloSwitchRequiredKeysMixin(Generic[_DataT]): """Mixin for required keys.""" @@ -32,7 +32,7 @@ class DevoloSwitchRequiredKeysMixin(Generic[_DataT]): turn_off_func: Callable[[Device], Awaitable[bool]] -@dataclass +@dataclass(frozen=True) class DevoloSwitchEntityDescription( SwitchEntityDescription, DevoloSwitchRequiredKeysMixin[_DataT] ): diff --git a/homeassistant/components/devolo_home_network/update.py b/homeassistant/components/devolo_home_network/update.py index 1c95c4262b2..03f86381307 100644 --- a/homeassistant/components/devolo_home_network/update.py +++ b/homeassistant/components/devolo_home_network/update.py @@ -26,7 +26,7 @@ from .const import DOMAIN, REGULAR_FIRMWARE from .entity import DevoloCoordinatorEntity -@dataclass +@dataclass(frozen=True) class DevoloUpdateRequiredKeysMixin: """Mixin for required keys.""" @@ -34,7 +34,7 @@ class DevoloUpdateRequiredKeysMixin: update_func: Callable[[Device], Awaitable[bool]] -@dataclass +@dataclass(frozen=True) class DevoloUpdateEntityDescription( UpdateEntityDescription, DevoloUpdateRequiredKeysMixin ): diff --git a/homeassistant/components/discovergy/sensor.py b/homeassistant/components/discovergy/sensor.py index 9648492c2e4..df16551fff2 100644 --- a/homeassistant/components/discovergy/sensor.py +++ b/homeassistant/components/discovergy/sensor.py @@ -35,7 +35,7 @@ def _get_and_scale(reading: Reading, key: str, scale: int) -> datetime | float | return None -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class DiscovergySensorEntityDescription(SensorEntityDescription): """Class to describe a Discovergy sensor entity.""" diff --git a/homeassistant/components/doorbird/button.py b/homeassistant/components/doorbird/button.py index 1c69429d3c7..1e1b4c55e18 100644 --- a/homeassistant/components/doorbird/button.py +++ b/homeassistant/components/doorbird/button.py @@ -17,14 +17,14 @@ from .models import DoorBirdData IR_RELAY = "__ir_light__" -@dataclass +@dataclass(frozen=True) class DoorbirdButtonEntityDescriptionMixin: """Mixin to describe a Doorbird Button entity.""" press_action: Callable[[DoorBird, str], None] -@dataclass +@dataclass(frozen=True) class DoorbirdButtonEntityDescription( ButtonEntityDescription, DoorbirdButtonEntityDescriptionMixin ): diff --git a/homeassistant/components/dormakaba_dkey/binary_sensor.py b/homeassistant/components/dormakaba_dkey/binary_sensor.py index 6cfbdd50b34..2ec2b0a1c91 100644 --- a/homeassistant/components/dormakaba_dkey/binary_sensor.py +++ b/homeassistant/components/dormakaba_dkey/binary_sensor.py @@ -22,14 +22,14 @@ from .entity import DormakabaDkeyEntity from .models import DormakabaDkeyData -@dataclass +@dataclass(frozen=True) class DormakabaDkeyBinarySensorDescriptionMixin: """Class for keys required by Dormakaba dKey binary sensor entity.""" is_on: Callable[[Notifications], bool] -@dataclass +@dataclass(frozen=True) class DormakabaDkeyBinarySensorDescription( BinarySensorEntityDescription, DormakabaDkeyBinarySensorDescriptionMixin ): diff --git a/homeassistant/components/dovado/sensor.py b/homeassistant/components/dovado/sensor.py index f84261de44b..4de20bf86e8 100644 --- a/homeassistant/components/dovado/sensor.py +++ b/homeassistant/components/dovado/sensor.py @@ -30,14 +30,14 @@ SENSOR_NETWORK = "network" SENSOR_SMS_UNREAD = "sms" -@dataclass +@dataclass(frozen=True) class DovadoRequiredKeysMixin: """Mixin for required keys.""" identifier: str -@dataclass +@dataclass(frozen=True) class DovadoSensorEntityDescription(SensorEntityDescription, DovadoRequiredKeysMixin): """Describes Dovado sensor entity.""" diff --git a/homeassistant/components/dremel_3d_printer/binary_sensor.py b/homeassistant/components/dremel_3d_printer/binary_sensor.py index 3a92bfe5510..22c2a1a9557 100644 --- a/homeassistant/components/dremel_3d_printer/binary_sensor.py +++ b/homeassistant/components/dremel_3d_printer/binary_sensor.py @@ -19,14 +19,14 @@ from .const import DOMAIN from .entity import Dremel3DPrinterEntity -@dataclass +@dataclass(frozen=True) class Dremel3DPrinterBinarySensorEntityMixin: """Mixin for Dremel 3D Printer binary sensor.""" value_fn: Callable[[Dremel3DPrinter], bool] -@dataclass +@dataclass(frozen=True) class Dremel3DPrinterBinarySensorEntityDescription( BinarySensorEntityDescription, Dremel3DPrinterBinarySensorEntityMixin ): diff --git a/homeassistant/components/dremel_3d_printer/button.py b/homeassistant/components/dremel_3d_printer/button.py index 2d328b30cea..b2ea103f78b 100644 --- a/homeassistant/components/dremel_3d_printer/button.py +++ b/homeassistant/components/dremel_3d_printer/button.py @@ -16,14 +16,14 @@ from .const import DOMAIN from .entity import Dremel3DPrinterEntity -@dataclass +@dataclass(frozen=True) class Dremel3DPrinterButtonEntityMixin: """Mixin for required keys.""" press_fn: Callable[[Dremel3DPrinter], None] -@dataclass +@dataclass(frozen=True) class Dremel3DPrinterButtonEntityDescription( ButtonEntityDescription, Dremel3DPrinterButtonEntityMixin ): diff --git a/homeassistant/components/dremel_3d_printer/sensor.py b/homeassistant/components/dremel_3d_printer/sensor.py index 660e7a90487..b24b01d2308 100644 --- a/homeassistant/components/dremel_3d_printer/sensor.py +++ b/homeassistant/components/dremel_3d_printer/sensor.py @@ -31,14 +31,14 @@ from .const import ATTR_EXTRUDER, ATTR_PLATFORM, DOMAIN from .entity import Dremel3DPrinterEntity -@dataclass +@dataclass(frozen=True) class Dremel3DPrinterSensorEntityMixin: """Mixin for Dremel 3D Printer sensor.""" value_fn: Callable[[Dremel3DPrinter, str], StateType | datetime] -@dataclass +@dataclass(frozen=True) class Dremel3DPrinterSensorEntityDescription( SensorEntityDescription, Dremel3DPrinterSensorEntityMixin ): diff --git a/homeassistant/components/dsmr/sensor.py b/homeassistant/components/dsmr/sensor.py index 9c511ef9191..3e26ee1ea62 100644 --- a/homeassistant/components/dsmr/sensor.py +++ b/homeassistant/components/dsmr/sensor.py @@ -67,7 +67,7 @@ EVENT_FIRST_TELEGRAM = "dsmr_first_telegram_{}" UNIT_CONVERSION = {"m3": UnitOfVolume.CUBIC_METERS} -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class DSMRSensorEntityDescription(SensorEntityDescription): """Represents an DSMR Sensor.""" diff --git a/homeassistant/components/dsmr_reader/definitions.py b/homeassistant/components/dsmr_reader/definitions.py index f12b2ad72bc..2b5b995eabd 100644 --- a/homeassistant/components/dsmr_reader/definitions.py +++ b/homeassistant/components/dsmr_reader/definitions.py @@ -38,7 +38,7 @@ def tariff_transform(value): return "high" -@dataclass +@dataclass(frozen=True) class DSMRReaderSensorEntityDescription(SensorEntityDescription): """Sensor entity description for DSMR Reader.""" diff --git a/homeassistant/components/easyenergy/sensor.py b/homeassistant/components/easyenergy/sensor.py index 28bcbbafcb8..7298c49660f 100644 --- a/homeassistant/components/easyenergy/sensor.py +++ b/homeassistant/components/easyenergy/sensor.py @@ -29,7 +29,7 @@ from .const import DOMAIN, SERVICE_TYPE_DEVICE_NAMES from .coordinator import EasyEnergyData, EasyEnergyDataUpdateCoordinator -@dataclass +@dataclass(frozen=True) class EasyEnergySensorEntityDescriptionMixin: """Mixin for required keys.""" @@ -37,7 +37,7 @@ class EasyEnergySensorEntityDescriptionMixin: service_type: str -@dataclass +@dataclass(frozen=True) class EasyEnergySensorEntityDescription( SensorEntityDescription, EasyEnergySensorEntityDescriptionMixin ): diff --git a/homeassistant/components/ecobee/number.py b/homeassistant/components/ecobee/number.py index 67c975010ab..345ca7b705f 100644 --- a/homeassistant/components/ecobee/number.py +++ b/homeassistant/components/ecobee/number.py @@ -18,7 +18,7 @@ from .entity import EcobeeBaseEntity _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class EcobeeNumberEntityDescriptionBase: """Required values when describing Ecobee number entities.""" @@ -26,7 +26,7 @@ class EcobeeNumberEntityDescriptionBase: set_fn: Callable[[EcobeeData, int, int], Awaitable] -@dataclass +@dataclass(frozen=True) class EcobeeNumberEntityDescription( NumberEntityDescription, EcobeeNumberEntityDescriptionBase ): diff --git a/homeassistant/components/ecobee/sensor.py b/homeassistant/components/ecobee/sensor.py index 4d07ec9447e..7f0e7b808a8 100644 --- a/homeassistant/components/ecobee/sensor.py +++ b/homeassistant/components/ecobee/sensor.py @@ -25,14 +25,14 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from .const import DOMAIN, ECOBEE_MODEL_TO_NAME, MANUFACTURER -@dataclass +@dataclass(frozen=True) class EcobeeSensorEntityDescriptionMixin: """Represent the required ecobee entity description attributes.""" runtime_key: str | None -@dataclass +@dataclass(frozen=True) class EcobeeSensorEntityDescription( SensorEntityDescription, EcobeeSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/ecoforest/number.py b/homeassistant/components/ecoforest/number.py index 90ea0bd4dff..79d62b6a2d2 100644 --- a/homeassistant/components/ecoforest/number.py +++ b/homeassistant/components/ecoforest/number.py @@ -16,14 +16,14 @@ from .coordinator import EcoforestCoordinator from .entity import EcoforestEntity -@dataclass +@dataclass(frozen=True) class EcoforestRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[Device], float | None] -@dataclass +@dataclass(frozen=True) class EcoforestNumberEntityDescription( NumberEntityDescription, EcoforestRequiredKeysMixin ): diff --git a/homeassistant/components/ecoforest/sensor.py b/homeassistant/components/ecoforest/sensor.py index e595ddb65f7..6f903bee2ba 100644 --- a/homeassistant/components/ecoforest/sensor.py +++ b/homeassistant/components/ecoforest/sensor.py @@ -33,14 +33,14 @@ STATUS_TYPE = [s.value for s in State] ALARM_TYPE = [a.value for a in Alarm] + ["none"] -@dataclass +@dataclass(frozen=True) class EcoforestRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[Device], StateType] -@dataclass +@dataclass(frozen=True) class EcoforestSensorEntityDescription( SensorEntityDescription, EcoforestRequiredKeysMixin ): diff --git a/homeassistant/components/ecoforest/switch.py b/homeassistant/components/ecoforest/switch.py index 32341ff5d61..1e70068cde8 100644 --- a/homeassistant/components/ecoforest/switch.py +++ b/homeassistant/components/ecoforest/switch.py @@ -17,7 +17,7 @@ from .coordinator import EcoforestCoordinator from .entity import EcoforestEntity -@dataclass +@dataclass(frozen=True) class EcoforestSwitchRequiredKeysMixin: """Mixin for required keys.""" @@ -25,7 +25,7 @@ class EcoforestSwitchRequiredKeysMixin: switch_fn: Callable[[EcoforestApi, bool], Awaitable[Device]] -@dataclass +@dataclass(frozen=True) class EcoforestSwitchEntityDescription( SwitchEntityDescription, EcoforestSwitchRequiredKeysMixin ): diff --git a/homeassistant/components/electric_kiwi/sensor.py b/homeassistant/components/electric_kiwi/sensor.py index 8017bbf006e..51d02781554 100644 --- a/homeassistant/components/electric_kiwi/sensor.py +++ b/homeassistant/components/electric_kiwi/sensor.py @@ -28,14 +28,14 @@ ATTR_EK_HOP_START = "hop_sensor_start" ATTR_EK_HOP_END = "hop_sensor_end" -@dataclass +@dataclass(frozen=True) class ElectricKiwiHOPRequiredKeysMixin: """Mixin for required HOP keys.""" value_func: Callable[[Hop], datetime] -@dataclass +@dataclass(frozen=True) class ElectricKiwiHOPSensorEntityDescription( SensorEntityDescription, ElectricKiwiHOPRequiredKeysMixin, diff --git a/homeassistant/components/elgato/button.py b/homeassistant/components/elgato/button.py index 7a69db24012..9747496c126 100644 --- a/homeassistant/components/elgato/button.py +++ b/homeassistant/components/elgato/button.py @@ -23,7 +23,7 @@ from .coordinator import ElgatoDataUpdateCoordinator from .entity import ElgatoEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ElgatoButtonEntityDescription(ButtonEntityDescription): """Class describing Elgato button entities.""" diff --git a/homeassistant/components/elgato/sensor.py b/homeassistant/components/elgato/sensor.py index 27dedee25c9..b683b80f5fa 100644 --- a/homeassistant/components/elgato/sensor.py +++ b/homeassistant/components/elgato/sensor.py @@ -26,7 +26,7 @@ from .coordinator import ElgatoData, ElgatoDataUpdateCoordinator from .entity import ElgatoEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ElgatoSensorEntityDescription(SensorEntityDescription): """Class describing Elgato sensor entities.""" diff --git a/homeassistant/components/elgato/switch.py b/homeassistant/components/elgato/switch.py index e9ab506c3a4..d1f370547a4 100644 --- a/homeassistant/components/elgato/switch.py +++ b/homeassistant/components/elgato/switch.py @@ -19,7 +19,7 @@ from .coordinator import ElgatoData, ElgatoDataUpdateCoordinator from .entity import ElgatoEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ElgatoSwitchEntityDescription(SwitchEntityDescription): """Class describing Elgato switch entities.""" diff --git a/homeassistant/components/energyzero/sensor.py b/homeassistant/components/energyzero/sensor.py index 2468e5e68bf..59c44c1aad8 100644 --- a/homeassistant/components/energyzero/sensor.py +++ b/homeassistant/components/energyzero/sensor.py @@ -29,7 +29,7 @@ from .const import DOMAIN, SERVICE_TYPE_DEVICE_NAMES from .coordinator import EnergyZeroData, EnergyZeroDataUpdateCoordinator -@dataclass +@dataclass(frozen=True) class EnergyZeroSensorEntityDescriptionMixin: """Mixin for required keys.""" @@ -37,7 +37,7 @@ class EnergyZeroSensorEntityDescriptionMixin: service_type: str -@dataclass +@dataclass(frozen=True) class EnergyZeroSensorEntityDescription( SensorEntityDescription, EnergyZeroSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/enocean/sensor.py b/homeassistant/components/enocean/sensor.py index f63fd7239d0..83c801d598e 100644 --- a/homeassistant/components/enocean/sensor.py +++ b/homeassistant/components/enocean/sensor.py @@ -44,14 +44,14 @@ SENSOR_TYPE_TEMPERATURE = "temperature" SENSOR_TYPE_WINDOWHANDLE = "windowhandle" -@dataclass +@dataclass(frozen=True) class EnOceanSensorEntityDescriptionMixin: """Mixin for required keys.""" unique_id: Callable[[list[int]], str | None] -@dataclass +@dataclass(frozen=True) class EnOceanSensorEntityDescription( SensorEntityDescription, EnOceanSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/enphase_envoy/binary_sensor.py b/homeassistant/components/enphase_envoy/binary_sensor.py index 7060943deb8..5eb2e621e47 100644 --- a/homeassistant/components/enphase_envoy/binary_sensor.py +++ b/homeassistant/components/enphase_envoy/binary_sensor.py @@ -22,14 +22,14 @@ from .coordinator import EnphaseUpdateCoordinator from .entity import EnvoyBaseEntity -@dataclass +@dataclass(frozen=True) class EnvoyEnchargeRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[EnvoyEncharge], bool] -@dataclass +@dataclass(frozen=True) class EnvoyEnchargeBinarySensorEntityDescription( BinarySensorEntityDescription, EnvoyEnchargeRequiredKeysMixin ): @@ -53,14 +53,14 @@ ENCHARGE_SENSORS = ( ) -@dataclass +@dataclass(frozen=True) class EnvoyEnpowerRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[EnvoyEnpower], bool] -@dataclass +@dataclass(frozen=True) class EnvoyEnpowerBinarySensorEntityDescription( BinarySensorEntityDescription, EnvoyEnpowerRequiredKeysMixin ): diff --git a/homeassistant/components/enphase_envoy/number.py b/homeassistant/components/enphase_envoy/number.py index 918e4002e7a..bf54c91f45b 100644 --- a/homeassistant/components/enphase_envoy/number.py +++ b/homeassistant/components/enphase_envoy/number.py @@ -25,21 +25,21 @@ from .coordinator import EnphaseUpdateCoordinator from .entity import EnvoyBaseEntity -@dataclass +@dataclass(frozen=True) class EnvoyRelayRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[EnvoyDryContactSettings], float] -@dataclass +@dataclass(frozen=True) class EnvoyRelayNumberEntityDescription( NumberEntityDescription, EnvoyRelayRequiredKeysMixin ): """Describes an Envoy Dry Contact Relay number entity.""" -@dataclass +@dataclass(frozen=True) class EnvoyStorageSettingsRequiredKeysMixin: """Mixin for required keys.""" @@ -47,7 +47,7 @@ class EnvoyStorageSettingsRequiredKeysMixin: update_fn: Callable[[Envoy, float], Awaitable[dict[str, Any]]] -@dataclass +@dataclass(frozen=True) class EnvoyStorageSettingsNumberEntityDescription( NumberEntityDescription, EnvoyStorageSettingsRequiredKeysMixin ): diff --git a/homeassistant/components/enphase_envoy/select.py b/homeassistant/components/enphase_envoy/select.py index 331d2a999ad..5d2edf91d9a 100644 --- a/homeassistant/components/enphase_envoy/select.py +++ b/homeassistant/components/enphase_envoy/select.py @@ -21,7 +21,7 @@ from .coordinator import EnphaseUpdateCoordinator from .entity import EnvoyBaseEntity -@dataclass +@dataclass(frozen=True) class EnvoyRelayRequiredKeysMixin: """Mixin for required keys.""" @@ -31,14 +31,14 @@ class EnvoyRelayRequiredKeysMixin: ] -@dataclass +@dataclass(frozen=True) class EnvoyRelaySelectEntityDescription( SelectEntityDescription, EnvoyRelayRequiredKeysMixin ): """Describes an Envoy Dry Contact Relay select entity.""" -@dataclass +@dataclass(frozen=True) class EnvoyStorageSettingsRequiredKeysMixin: """Mixin for required keys.""" @@ -46,7 +46,7 @@ class EnvoyStorageSettingsRequiredKeysMixin: update_fn: Callable[[Envoy, str], Awaitable[dict[str, Any]]] -@dataclass +@dataclass(frozen=True) class EnvoyStorageSettingsSelectEntityDescription( SelectEntityDescription, EnvoyStorageSettingsRequiredKeysMixin ): diff --git a/homeassistant/components/enphase_envoy/sensor.py b/homeassistant/components/enphase_envoy/sensor.py index 33b9e3a64df..1dfd72dcaf3 100644 --- a/homeassistant/components/enphase_envoy/sensor.py +++ b/homeassistant/components/enphase_envoy/sensor.py @@ -47,14 +47,14 @@ INVERTERS_KEY = "inverters" LAST_REPORTED_KEY = "last_reported" -@dataclass +@dataclass(frozen=True) class EnvoyInverterRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[EnvoyInverter], datetime.datetime | float] -@dataclass +@dataclass(frozen=True) class EnvoyInverterSensorEntityDescription( SensorEntityDescription, EnvoyInverterRequiredKeysMixin ): @@ -80,14 +80,14 @@ INVERTER_SENSORS = ( ) -@dataclass +@dataclass(frozen=True) class EnvoyProductionRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[EnvoySystemProduction], int] -@dataclass +@dataclass(frozen=True) class EnvoyProductionSensorEntityDescription( SensorEntityDescription, EnvoyProductionRequiredKeysMixin ): @@ -137,14 +137,14 @@ PRODUCTION_SENSORS = ( ) -@dataclass +@dataclass(frozen=True) class EnvoyConsumptionRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[EnvoySystemConsumption], int] -@dataclass +@dataclass(frozen=True) class EnvoyConsumptionSensorEntityDescription( SensorEntityDescription, EnvoyConsumptionRequiredKeysMixin ): @@ -194,28 +194,28 @@ CONSUMPTION_SENSORS = ( ) -@dataclass +@dataclass(frozen=True) class EnvoyEnchargeRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[EnvoyEncharge], datetime.datetime | int | float] -@dataclass +@dataclass(frozen=True) class EnvoyEnchargeSensorEntityDescription( SensorEntityDescription, EnvoyEnchargeRequiredKeysMixin ): """Describes an Envoy Encharge sensor entity.""" -@dataclass +@dataclass(frozen=True) class EnvoyEnchargePowerRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[EnvoyEnchargePower], int | float] -@dataclass +@dataclass(frozen=True) class EnvoyEnchargePowerSensorEntityDescription( SensorEntityDescription, EnvoyEnchargePowerRequiredKeysMixin ): @@ -259,14 +259,14 @@ ENCHARGE_POWER_SENSORS = ( ) -@dataclass +@dataclass(frozen=True) class EnvoyEnpowerRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[EnvoyEnpower], datetime.datetime | int | float] -@dataclass +@dataclass(frozen=True) class EnvoyEnpowerSensorEntityDescription( SensorEntityDescription, EnvoyEnpowerRequiredKeysMixin ): @@ -289,14 +289,14 @@ ENPOWER_SENSORS = ( ) -@dataclass +@dataclass(frozen=True) class EnvoyEnchargeAggregateRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[EnvoyEnchargeAggregate], int] -@dataclass +@dataclass(frozen=True) class EnvoyEnchargeAggregateSensorEntityDescription( SensorEntityDescription, EnvoyEnchargeAggregateRequiredKeysMixin ): diff --git a/homeassistant/components/enphase_envoy/switch.py b/homeassistant/components/enphase_envoy/switch.py index 22746fd9479..76c73914db6 100644 --- a/homeassistant/components/enphase_envoy/switch.py +++ b/homeassistant/components/enphase_envoy/switch.py @@ -24,7 +24,7 @@ from .entity import EnvoyBaseEntity _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class EnvoyEnpowerRequiredKeysMixin: """Mixin for required keys.""" @@ -33,14 +33,14 @@ class EnvoyEnpowerRequiredKeysMixin: turn_off_fn: Callable[[Envoy], Coroutine[Any, Any, dict[str, Any]]] -@dataclass +@dataclass(frozen=True) class EnvoyEnpowerSwitchEntityDescription( SwitchEntityDescription, EnvoyEnpowerRequiredKeysMixin ): """Describes an Envoy Enpower switch entity.""" -@dataclass +@dataclass(frozen=True) class EnvoyDryContactRequiredKeysMixin: """Mixin for required keys.""" @@ -49,14 +49,14 @@ class EnvoyDryContactRequiredKeysMixin: turn_off_fn: Callable[[Envoy, str], Coroutine[Any, Any, dict[str, Any]]] -@dataclass +@dataclass(frozen=True) class EnvoyDryContactSwitchEntityDescription( SwitchEntityDescription, EnvoyDryContactRequiredKeysMixin ): """Describes an Envoy Enpower dry contact switch entity.""" -@dataclass +@dataclass(frozen=True) class EnvoyStorageSettingsRequiredKeysMixin: """Mixin for required keys.""" @@ -65,7 +65,7 @@ class EnvoyStorageSettingsRequiredKeysMixin: turn_off_fn: Callable[[Envoy], Awaitable[dict[str, Any]]] -@dataclass +@dataclass(frozen=True) class EnvoyStorageSettingsSwitchEntityDescription( SwitchEntityDescription, EnvoyStorageSettingsRequiredKeysMixin ): diff --git a/homeassistant/components/environment_canada/sensor.py b/homeassistant/components/environment_canada/sensor.py index 987a779d2e8..9ec4971f573 100644 --- a/homeassistant/components/environment_canada/sensor.py +++ b/homeassistant/components/environment_canada/sensor.py @@ -33,14 +33,14 @@ from .const import ATTR_STATION, DOMAIN ATTR_TIME = "alert time" -@dataclass +@dataclass(frozen=True) class ECSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[Any], Any] -@dataclass +@dataclass(frozen=True) class ECSensorEntityDescription( SensorEntityDescription, ECSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/ezviz/alarm_control_panel.py b/homeassistant/components/ezviz/alarm_control_panel.py index 4dd16b23480..1cdda152685 100644 --- a/homeassistant/components/ezviz/alarm_control_panel.py +++ b/homeassistant/components/ezviz/alarm_control_panel.py @@ -33,14 +33,14 @@ SCAN_INTERVAL = timedelta(seconds=60) PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class EzvizAlarmControlPanelEntityDescriptionMixin: """Mixin values for EZVIZ Alarm control panel entities.""" ezviz_alarm_states: list -@dataclass +@dataclass(frozen=True) class EzvizAlarmControlPanelEntityDescription( AlarmControlPanelEntityDescription, EzvizAlarmControlPanelEntityDescriptionMixin ): diff --git a/homeassistant/components/ezviz/button.py b/homeassistant/components/ezviz/button.py index 2199f82a476..abc44419075 100644 --- a/homeassistant/components/ezviz/button.py +++ b/homeassistant/components/ezviz/button.py @@ -22,7 +22,7 @@ from .entity import EzvizEntity PARALLEL_UPDATES = 1 -@dataclass +@dataclass(frozen=True) class EzvizButtonEntityDescriptionMixin: """Mixin values for EZVIZ button entities.""" @@ -30,7 +30,7 @@ class EzvizButtonEntityDescriptionMixin: supported_ext: str -@dataclass +@dataclass(frozen=True) class EzvizButtonEntityDescription( ButtonEntityDescription, EzvizButtonEntityDescriptionMixin ): diff --git a/homeassistant/components/ezviz/number.py b/homeassistant/components/ezviz/number.py index ea7a4812b32..c922173aa87 100644 --- a/homeassistant/components/ezviz/number.py +++ b/homeassistant/components/ezviz/number.py @@ -30,7 +30,7 @@ PARALLEL_UPDATES = 0 _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class EzvizNumberEntityDescriptionMixin: """Mixin values for EZVIZ Number entities.""" @@ -38,7 +38,7 @@ class EzvizNumberEntityDescriptionMixin: supported_ext_value: list -@dataclass +@dataclass(frozen=True) class EzvizNumberEntityDescription( NumberEntityDescription, EzvizNumberEntityDescriptionMixin ): diff --git a/homeassistant/components/ezviz/select.py b/homeassistant/components/ezviz/select.py index 369a429dbe6..8110cf61a5c 100644 --- a/homeassistant/components/ezviz/select.py +++ b/homeassistant/components/ezviz/select.py @@ -20,14 +20,14 @@ from .entity import EzvizEntity PARALLEL_UPDATES = 1 -@dataclass +@dataclass(frozen=True) class EzvizSelectEntityDescriptionMixin: """Mixin values for EZVIZ Select entities.""" supported_switch: int -@dataclass +@dataclass(frozen=True) class EzvizSelectEntityDescription( SelectEntityDescription, EzvizSelectEntityDescriptionMixin ): diff --git a/homeassistant/components/ezviz/switch.py b/homeassistant/components/ezviz/switch.py index 4089b0ae393..f6d19afae0c 100644 --- a/homeassistant/components/ezviz/switch.py +++ b/homeassistant/components/ezviz/switch.py @@ -22,14 +22,14 @@ from .coordinator import EzvizDataUpdateCoordinator from .entity import EzvizEntity -@dataclass +@dataclass(frozen=True) class EzvizSwitchEntityDescriptionMixin: """Mixin values for EZVIZ Switch entities.""" supported_ext: str | None -@dataclass +@dataclass(frozen=True) class EzvizSwitchEntityDescription( SwitchEntityDescription, EzvizSwitchEntityDescriptionMixin ): diff --git a/homeassistant/components/faa_delays/binary_sensor.py b/homeassistant/components/faa_delays/binary_sensor.py index c72fedaf59a..20bebcf08c8 100644 --- a/homeassistant/components/faa_delays/binary_sensor.py +++ b/homeassistant/components/faa_delays/binary_sensor.py @@ -21,7 +21,7 @@ from . import FAADataUpdateCoordinator from .const import DOMAIN -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class FaaDelaysBinarySensorEntityDescription(BinarySensorEntityDescription): """Mixin for required keys.""" diff --git a/homeassistant/components/fitbit/sensor.py b/homeassistant/components/fitbit/sensor.py index e2cfb3e3992..eb7d3b02b4d 100644 --- a/homeassistant/components/fitbit/sensor.py +++ b/homeassistant/components/fitbit/sensor.py @@ -146,7 +146,7 @@ def _int_value_or_none(field: str) -> Callable[[dict[str, Any]], int | None]: return convert -@dataclass +@dataclass(frozen=True) class FitbitSensorEntityDescription(SensorEntityDescription): """Describes Fitbit sensor entity.""" diff --git a/homeassistant/components/fivem/binary_sensor.py b/homeassistant/components/fivem/binary_sensor.py index 153732d2ce5..ee46067f443 100644 --- a/homeassistant/components/fivem/binary_sensor.py +++ b/homeassistant/components/fivem/binary_sensor.py @@ -14,7 +14,7 @@ from .const import DOMAIN, NAME_STATUS from .entity import FiveMEntity, FiveMEntityDescription -@dataclass +@dataclass(frozen=True) class FiveMBinarySensorEntityDescription( BinarySensorEntityDescription, FiveMEntityDescription ): diff --git a/homeassistant/components/fivem/entity.py b/homeassistant/components/fivem/entity.py index c11378ff049..69204b559ae 100644 --- a/homeassistant/components/fivem/entity.py +++ b/homeassistant/components/fivem/entity.py @@ -16,7 +16,7 @@ from .coordinator import FiveMDataUpdateCoordinator _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class FiveMEntityDescription(EntityDescription): """Describes FiveM entity.""" diff --git a/homeassistant/components/fivem/sensor.py b/homeassistant/components/fivem/sensor.py index 1c4e4b77c45..967a1392fe5 100644 --- a/homeassistant/components/fivem/sensor.py +++ b/homeassistant/components/fivem/sensor.py @@ -24,7 +24,7 @@ from .const import ( from .entity import FiveMEntity, FiveMEntityDescription -@dataclass +@dataclass(frozen=True) class FiveMSensorEntityDescription(SensorEntityDescription, FiveMEntityDescription): """Describes FiveM sensor entity.""" diff --git a/homeassistant/components/fjaraskupan/binary_sensor.py b/homeassistant/components/fjaraskupan/binary_sensor.py index 41cdc0dbffe..03302d490a6 100644 --- a/homeassistant/components/fjaraskupan/binary_sensor.py +++ b/homeassistant/components/fjaraskupan/binary_sensor.py @@ -22,7 +22,7 @@ from . import async_setup_entry_platform from .coordinator import FjaraskupanCoordinator -@dataclass +@dataclass(frozen=True) class EntityDescription(BinarySensorEntityDescription): """Entity description.""" diff --git a/homeassistant/components/flume/binary_sensor.py b/homeassistant/components/flume/binary_sensor.py index 2305cd9f23e..fd6fcc5f4b9 100644 --- a/homeassistant/components/flume/binary_sensor.py +++ b/homeassistant/components/flume/binary_sensor.py @@ -39,14 +39,14 @@ BINARY_SENSOR_DESCRIPTION_CONNECTED = BinarySensorEntityDescription( ) -@dataclass +@dataclass(frozen=True) class FlumeBinarySensorRequiredKeysMixin: """Mixin for required keys.""" event_rule: str -@dataclass +@dataclass(frozen=True) class FlumeBinarySensorEntityDescription( BinarySensorEntityDescription, FlumeBinarySensorRequiredKeysMixin ): diff --git a/homeassistant/components/forecast_solar/sensor.py b/homeassistant/components/forecast_solar/sensor.py index 7a2723ce591..68a3fe81867 100644 --- a/homeassistant/components/forecast_solar/sensor.py +++ b/homeassistant/components/forecast_solar/sensor.py @@ -27,7 +27,7 @@ from .const import DOMAIN from .coordinator import ForecastSolarDataUpdateCoordinator -@dataclass +@dataclass(frozen=True) class ForecastSolarSensorEntityDescription(SensorEntityDescription): """Describes a Forecast.Solar Sensor.""" diff --git a/homeassistant/components/freebox/button.py b/homeassistant/components/freebox/button.py index e3a206b43a8..d1268fb91d2 100644 --- a/homeassistant/components/freebox/button.py +++ b/homeassistant/components/freebox/button.py @@ -18,14 +18,14 @@ from .const import DOMAIN from .router import FreeboxRouter -@dataclass +@dataclass(frozen=True) class FreeboxButtonRequiredKeysMixin: """Mixin for required keys.""" async_press: Callable[[FreeboxRouter], Awaitable] -@dataclass +@dataclass(frozen=True) class FreeboxButtonEntityDescription( ButtonEntityDescription, FreeboxButtonRequiredKeysMixin ): diff --git a/homeassistant/components/fritz/binary_sensor.py b/homeassistant/components/fritz/binary_sensor.py index 6d371a82c95..00e9f406ed4 100644 --- a/homeassistant/components/fritz/binary_sensor.py +++ b/homeassistant/components/fritz/binary_sensor.py @@ -26,7 +26,7 @@ from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class FritzBinarySensorEntityDescription( BinarySensorEntityDescription, FritzEntityDescription ): diff --git a/homeassistant/components/fritz/button.py b/homeassistant/components/fritz/button.py index a4504996820..5b4a3f5a20c 100644 --- a/homeassistant/components/fritz/button.py +++ b/homeassistant/components/fritz/button.py @@ -23,14 +23,14 @@ from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class FritzButtonDescriptionMixin: """Mixin to describe a Button entity.""" press_action: Callable -@dataclass +@dataclass(frozen=True) class FritzButtonDescription(ButtonEntityDescription, FritzButtonDescriptionMixin): """Class to describe a Button entity.""" diff --git a/homeassistant/components/fritz/common.py b/homeassistant/components/fritz/common.py index 2abba137fbf..63f9f593ea8 100644 --- a/homeassistant/components/fritz/common.py +++ b/homeassistant/components/fritz/common.py @@ -1092,14 +1092,14 @@ class FritzBoxBaseEntity: ) -@dataclass +@dataclass(frozen=True) class FritzRequireKeysMixin: """Fritz entity description mix in.""" value_fn: Callable[[FritzStatus, Any], Any] | None -@dataclass +@dataclass(frozen=True) class FritzEntityDescription(EntityDescription, FritzRequireKeysMixin): """Fritz entity base description.""" diff --git a/homeassistant/components/fritz/sensor.py b/homeassistant/components/fritz/sensor.py index d6b78c1cfc0..53a299cd576 100644 --- a/homeassistant/components/fritz/sensor.py +++ b/homeassistant/components/fritz/sensor.py @@ -142,7 +142,7 @@ def _retrieve_link_attenuation_received_state( return status.attenuation[1] / 10 # type: ignore[no-any-return] -@dataclass +@dataclass(frozen=True) class FritzSensorEntityDescription(SensorEntityDescription, FritzEntityDescription): """Describes Fritz sensor entity.""" diff --git a/homeassistant/components/fritz/update.py b/homeassistant/components/fritz/update.py index 80cbe1f4c5c..fafd9c37ab8 100644 --- a/homeassistant/components/fritz/update.py +++ b/homeassistant/components/fritz/update.py @@ -21,7 +21,7 @@ from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class FritzUpdateEntityDescription(UpdateEntityDescription, FritzEntityDescription): """Describes Fritz update entity.""" diff --git a/homeassistant/components/fritzbox/binary_sensor.py b/homeassistant/components/fritzbox/binary_sensor.py index e36056d2fab..c6676bb1bbf 100644 --- a/homeassistant/components/fritzbox/binary_sensor.py +++ b/homeassistant/components/fritzbox/binary_sensor.py @@ -22,14 +22,14 @@ from .common import get_coordinator from .model import FritzEntityDescriptionMixinBase -@dataclass +@dataclass(frozen=True) class FritzEntityDescriptionMixinBinarySensor(FritzEntityDescriptionMixinBase): """BinarySensor description mixin for Fritz!Smarthome entities.""" is_on: Callable[[FritzhomeDevice], bool | None] -@dataclass +@dataclass(frozen=True) class FritzBinarySensorEntityDescription( BinarySensorEntityDescription, FritzEntityDescriptionMixinBinarySensor ): diff --git a/homeassistant/components/fritzbox/model.py b/homeassistant/components/fritzbox/model.py index 3c3275e0ff0..74c5bd42927 100644 --- a/homeassistant/components/fritzbox/model.py +++ b/homeassistant/components/fritzbox/model.py @@ -18,7 +18,7 @@ class ClimateExtraAttributes(TypedDict, total=False): window_open: bool -@dataclass +@dataclass(frozen=True) class FritzEntityDescriptionMixinBase: """Bases description mixin for Fritz!Smarthome entities.""" diff --git a/homeassistant/components/fritzbox/sensor.py b/homeassistant/components/fritzbox/sensor.py index 140ecaef331..fd55369d915 100644 --- a/homeassistant/components/fritzbox/sensor.py +++ b/homeassistant/components/fritzbox/sensor.py @@ -35,14 +35,14 @@ from .common import get_coordinator from .model import FritzEntityDescriptionMixinBase -@dataclass +@dataclass(frozen=True) class FritzEntityDescriptionMixinSensor(FritzEntityDescriptionMixinBase): """Sensor description mixin for Fritz!Smarthome entities.""" native_value: Callable[[FritzhomeDevice], StateType | datetime] -@dataclass +@dataclass(frozen=True) class FritzSensorEntityDescription( SensorEntityDescription, FritzEntityDescriptionMixinSensor ): diff --git a/homeassistant/components/fronius/sensor.py b/homeassistant/components/fronius/sensor.py index f058a25a044..93c13c8e579 100644 --- a/homeassistant/components/fronius/sensor.py +++ b/homeassistant/components/fronius/sensor.py @@ -104,7 +104,7 @@ async def async_setup_entry( ) -@dataclass +@dataclass(frozen=True) class FroniusSensorEntityDescription(SensorEntityDescription): """Describes Fronius sensor entity.""" diff --git a/homeassistant/components/fully_kiosk/button.py b/homeassistant/components/fully_kiosk/button.py index b16265ed467..0a6233937ae 100644 --- a/homeassistant/components/fully_kiosk/button.py +++ b/homeassistant/components/fully_kiosk/button.py @@ -22,14 +22,14 @@ from .coordinator import FullyKioskDataUpdateCoordinator from .entity import FullyKioskEntity -@dataclass +@dataclass(frozen=True) class FullyButtonEntityDescriptionMixin: """Mixin to describe a Fully Kiosk Browser button entity.""" press_action: Callable[[FullyKiosk], Any] -@dataclass +@dataclass(frozen=True) class FullyButtonEntityDescription( ButtonEntityDescription, FullyButtonEntityDescriptionMixin ): diff --git a/homeassistant/components/fully_kiosk/sensor.py b/homeassistant/components/fully_kiosk/sensor.py index dd775e7d55a..8e9029fda73 100644 --- a/homeassistant/components/fully_kiosk/sensor.py +++ b/homeassistant/components/fully_kiosk/sensor.py @@ -40,7 +40,7 @@ def truncate_url(value: StateType) -> tuple[StateType, dict[str, Any]]: return (url, extra_state_attributes) -@dataclass +@dataclass(frozen=True) class FullySensorEntityDescription(SensorEntityDescription): """Fully Kiosk Browser sensor description.""" diff --git a/homeassistant/components/fully_kiosk/switch.py b/homeassistant/components/fully_kiosk/switch.py index c1d5d4e5c75..d5480b784c4 100644 --- a/homeassistant/components/fully_kiosk/switch.py +++ b/homeassistant/components/fully_kiosk/switch.py @@ -18,7 +18,7 @@ from .coordinator import FullyKioskDataUpdateCoordinator from .entity import FullyKioskEntity -@dataclass +@dataclass(frozen=True) class FullySwitchEntityDescriptionMixin: """Fully Kiosk Browser switch entity description mixin.""" @@ -29,7 +29,7 @@ class FullySwitchEntityDescriptionMixin: mqtt_off_event: str | None -@dataclass +@dataclass(frozen=True) class FullySwitchEntityDescription( SwitchEntityDescription, FullySwitchEntityDescriptionMixin ): diff --git a/homeassistant/components/gardena_bluetooth/binary_sensor.py b/homeassistant/components/gardena_bluetooth/binary_sensor.py index b66cb8cd00d..bf905bc551d 100644 --- a/homeassistant/components/gardena_bluetooth/binary_sensor.py +++ b/homeassistant/components/gardena_bluetooth/binary_sensor.py @@ -20,7 +20,7 @@ from .const import DOMAIN from .coordinator import Coordinator, GardenaBluetoothDescriptorEntity -@dataclass +@dataclass(frozen=True) class GardenaBluetoothBinarySensorEntityDescription(BinarySensorEntityDescription): """Description of entity.""" diff --git a/homeassistant/components/gardena_bluetooth/button.py b/homeassistant/components/gardena_bluetooth/button.py index 1ed738a9690..cbdbda5f367 100644 --- a/homeassistant/components/gardena_bluetooth/button.py +++ b/homeassistant/components/gardena_bluetooth/button.py @@ -16,7 +16,7 @@ from .const import DOMAIN from .coordinator import Coordinator, GardenaBluetoothDescriptorEntity -@dataclass +@dataclass(frozen=True) class GardenaBluetoothButtonEntityDescription(ButtonEntityDescription): """Description of entity.""" diff --git a/homeassistant/components/gardena_bluetooth/number.py b/homeassistant/components/gardena_bluetooth/number.py index f0ba5dbd2fe..ef19a921041 100644 --- a/homeassistant/components/gardena_bluetooth/number.py +++ b/homeassistant/components/gardena_bluetooth/number.py @@ -29,7 +29,7 @@ from .coordinator import ( ) -@dataclass +@dataclass(frozen=True) class GardenaBluetoothNumberEntityDescription(NumberEntityDescription): """Description of entity.""" diff --git a/homeassistant/components/gardena_bluetooth/sensor.py b/homeassistant/components/gardena_bluetooth/sensor.py index 495a1fcb1eb..ca2b1acdd8c 100644 --- a/homeassistant/components/gardena_bluetooth/sensor.py +++ b/homeassistant/components/gardena_bluetooth/sensor.py @@ -27,7 +27,7 @@ from .coordinator import ( ) -@dataclass +@dataclass(frozen=True) class GardenaBluetoothSensorEntityDescription(SensorEntityDescription): """Description of entity.""" diff --git a/homeassistant/components/geocaching/sensor.py b/homeassistant/components/geocaching/sensor.py index 541d2e0b89d..dd324492d73 100644 --- a/homeassistant/components/geocaching/sensor.py +++ b/homeassistant/components/geocaching/sensor.py @@ -18,14 +18,14 @@ from .const import DOMAIN from .coordinator import GeocachingDataUpdateCoordinator -@dataclass +@dataclass(frozen=True) class GeocachingRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[GeocachingStatus], str | int | None] -@dataclass +@dataclass(frozen=True) class GeocachingSensorEntityDescription( SensorEntityDescription, GeocachingRequiredKeysMixin ): diff --git a/homeassistant/components/gios/sensor.py b/homeassistant/components/gios/sensor.py index f5bbdb06198..9ca34b2e77c 100644 --- a/homeassistant/components/gios/sensor.py +++ b/homeassistant/components/gios/sensor.py @@ -42,14 +42,14 @@ from .const import ( _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class GiosSensorRequiredKeysMixin: """Class for GIOS entity required keys.""" value: Callable[[GiosSensors], StateType] -@dataclass +@dataclass(frozen=True) class GiosSensorEntityDescription(SensorEntityDescription, GiosSensorRequiredKeysMixin): """Class describing GIOS sensor entities.""" diff --git a/homeassistant/components/github/sensor.py b/homeassistant/components/github/sensor.py index d497700f5db..cec0e6b763f 100644 --- a/homeassistant/components/github/sensor.py +++ b/homeassistant/components/github/sensor.py @@ -22,14 +22,14 @@ from .const import DOMAIN from .coordinator import GitHubDataUpdateCoordinator -@dataclass +@dataclass(frozen=True) class BaseEntityDescriptionMixin: """Mixin for required GitHub base description keys.""" value_fn: Callable[[dict[str, Any]], StateType] -@dataclass +@dataclass(frozen=True) class BaseEntityDescription(SensorEntityDescription): """Describes GitHub sensor entity default overrides.""" @@ -38,7 +38,7 @@ class BaseEntityDescription(SensorEntityDescription): avabl_fn: Callable[[dict[str, Any]], bool] = lambda data: True -@dataclass +@dataclass(frozen=True) class GitHubSensorEntityDescription(BaseEntityDescription, BaseEntityDescriptionMixin): """Describes GitHub issue sensor entity.""" diff --git a/homeassistant/components/glances/sensor.py b/homeassistant/components/glances/sensor.py index 78aa5ffbf0a..a3578bf6f66 100644 --- a/homeassistant/components/glances/sensor.py +++ b/homeassistant/components/glances/sensor.py @@ -30,7 +30,7 @@ from . import GlancesDataUpdateCoordinator from .const import CPU_ICON, DOMAIN -@dataclass +@dataclass(frozen=True) class GlancesSensorEntityDescriptionMixin: """Mixin for required keys.""" @@ -38,7 +38,7 @@ class GlancesSensorEntityDescriptionMixin: name_suffix: str -@dataclass +@dataclass(frozen=True) class GlancesSensorEntityDescription( SensorEntityDescription, GlancesSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/goodwe/button.py b/homeassistant/components/goodwe/button.py index 12cad42547d..0aebdb8c073 100644 --- a/homeassistant/components/goodwe/button.py +++ b/homeassistant/components/goodwe/button.py @@ -18,14 +18,14 @@ from .const import DOMAIN, KEY_DEVICE_INFO, KEY_INVERTER _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class GoodweButtonEntityDescriptionRequired: """Required attributes of GoodweButtonEntityDescription.""" action: Callable[[Inverter], Awaitable[None]] -@dataclass +@dataclass(frozen=True) class GoodweButtonEntityDescription( ButtonEntityDescription, GoodweButtonEntityDescriptionRequired ): diff --git a/homeassistant/components/goodwe/number.py b/homeassistant/components/goodwe/number.py index a3e4190f309..d92f6ab8fd0 100644 --- a/homeassistant/components/goodwe/number.py +++ b/homeassistant/components/goodwe/number.py @@ -23,7 +23,7 @@ from .const import DOMAIN, KEY_DEVICE_INFO, KEY_INVERTER _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class GoodweNumberEntityDescriptionBase: """Required values when describing Goodwe number entities.""" @@ -32,7 +32,7 @@ class GoodweNumberEntityDescriptionBase: filter: Callable[[Inverter], bool] -@dataclass +@dataclass(frozen=True) class GoodweNumberEntityDescription( NumberEntityDescription, GoodweNumberEntityDescriptionBase ): diff --git a/homeassistant/components/goodwe/sensor.py b/homeassistant/components/goodwe/sensor.py index 0065d70dda9..a43ff971a9a 100644 --- a/homeassistant/components/goodwe/sensor.py +++ b/homeassistant/components/goodwe/sensor.py @@ -75,7 +75,7 @@ _ICONS: dict[SensorKind, str] = { } -@dataclass +@dataclass(frozen=True) class GoodweSensorEntityDescription(SensorEntityDescription): """Class describing Goodwe sensor entities.""" diff --git a/homeassistant/components/google_wifi/sensor.py b/homeassistant/components/google_wifi/sensor.py index 6bf552b824b..f90cc028fdf 100644 --- a/homeassistant/components/google_wifi/sensor.py +++ b/homeassistant/components/google_wifi/sensor.py @@ -42,7 +42,7 @@ ENDPOINT = "/api/v1/status" MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=1) -@dataclass +@dataclass(frozen=True) class GoogleWifiRequiredKeysMixin: """Mixin for required keys.""" @@ -50,7 +50,7 @@ class GoogleWifiRequiredKeysMixin: sensor_key: str -@dataclass +@dataclass(frozen=True) class GoogleWifiSensorEntityDescription( SensorEntityDescription, GoogleWifiRequiredKeysMixin ): diff --git a/homeassistant/components/gree/switch.py b/homeassistant/components/gree/switch.py index 3c1893f7735..b9c8491e0f1 100644 --- a/homeassistant/components/gree/switch.py +++ b/homeassistant/components/gree/switch.py @@ -21,7 +21,7 @@ from .const import COORDINATORS, DISPATCH_DEVICE_DISCOVERED, DOMAIN from .entity import GreeEntity -@dataclass +@dataclass(frozen=True) class GreeRequiredKeysMixin: """Mixin for required keys.""" @@ -29,7 +29,7 @@ class GreeRequiredKeysMixin: set_value_fn: Callable[[Device, bool], None] -@dataclass +@dataclass(frozen=True) class GreeSwitchEntityDescription(SwitchEntityDescription, GreeRequiredKeysMixin): """Describes Gree switch entity.""" diff --git a/homeassistant/components/growatt_server/sensor_types/sensor_entity_description.py b/homeassistant/components/growatt_server/sensor_types/sensor_entity_description.py index cd286e228b4..cfeb98a382e 100644 --- a/homeassistant/components/growatt_server/sensor_types/sensor_entity_description.py +++ b/homeassistant/components/growatt_server/sensor_types/sensor_entity_description.py @@ -6,14 +6,14 @@ from dataclasses import dataclass from homeassistant.components.sensor import SensorEntityDescription -@dataclass +@dataclass(frozen=True) class GrowattRequiredKeysMixin: """Mixin for required keys.""" api_key: str -@dataclass +@dataclass(frozen=True) class GrowattSensorEntityDescription(SensorEntityDescription, GrowattRequiredKeysMixin): """Describes Growatt sensor entity.""" diff --git a/homeassistant/components/guardian/__init__.py b/homeassistant/components/guardian/__init__.py index bd2cb8c96de..1cb55204240 100644 --- a/homeassistant/components/guardian/__init__.py +++ b/homeassistant/components/guardian/__init__.py @@ -410,14 +410,14 @@ class PairedSensorEntity(GuardianEntity): self._attr_unique_id = f"{paired_sensor_uid}_{description.key}" -@dataclass +@dataclass(frozen=True) class ValveControllerEntityDescriptionMixin: """Define an entity description mixin for valve controller entities.""" api_category: str -@dataclass +@dataclass(frozen=True) class ValveControllerEntityDescription( EntityDescription, ValveControllerEntityDescriptionMixin ): diff --git a/homeassistant/components/guardian/binary_sensor.py b/homeassistant/components/guardian/binary_sensor.py index 7114d33f93a..179158ab512 100644 --- a/homeassistant/components/guardian/binary_sensor.py +++ b/homeassistant/components/guardian/binary_sensor.py @@ -39,7 +39,7 @@ SENSOR_KIND_LEAK_DETECTED = "leak_detected" SENSOR_KIND_MOVED = "moved" -@dataclass +@dataclass(frozen=True) class ValveControllerBinarySensorDescription( BinarySensorEntityDescription, ValveControllerEntityDescription ): diff --git a/homeassistant/components/guardian/button.py b/homeassistant/components/guardian/button.py index c6363c9bcec..7a931f35019 100644 --- a/homeassistant/components/guardian/button.py +++ b/homeassistant/components/guardian/button.py @@ -23,14 +23,14 @@ from . import GuardianData, ValveControllerEntity, ValveControllerEntityDescript from .const import API_SYSTEM_DIAGNOSTICS, DOMAIN -@dataclass +@dataclass(frozen=True) class GuardianButtonEntityDescriptionMixin: """Define an mixin for button entities.""" push_action: Callable[[Client], Awaitable] -@dataclass +@dataclass(frozen=True) class ValveControllerButtonDescription( ButtonEntityDescription, ValveControllerEntityDescription, diff --git a/homeassistant/components/guardian/sensor.py b/homeassistant/components/guardian/sensor.py index c5fc77cc8f9..68833234b15 100644 --- a/homeassistant/components/guardian/sensor.py +++ b/homeassistant/components/guardian/sensor.py @@ -39,7 +39,7 @@ SENSOR_KIND_TEMPERATURE = "temperature" SENSOR_KIND_UPTIME = "uptime" -@dataclass +@dataclass(frozen=True) class ValveControllerSensorDescription( SensorEntityDescription, ValveControllerEntityDescription ): diff --git a/homeassistant/components/guardian/switch.py b/homeassistant/components/guardian/switch.py index 4e2be5ae179..98179c1922f 100644 --- a/homeassistant/components/guardian/switch.py +++ b/homeassistant/components/guardian/switch.py @@ -29,7 +29,7 @@ SWITCH_KIND_ONBOARD_AP = "onboard_ap" SWITCH_KIND_VALVE = "valve" -@dataclass +@dataclass(frozen=True) class SwitchDescriptionMixin: """Define an entity description mixin for Guardian switches.""" @@ -37,7 +37,7 @@ class SwitchDescriptionMixin: on_action: Callable[[Client], Awaitable] -@dataclass +@dataclass(frozen=True) class ValveControllerSwitchDescription( SwitchEntityDescription, ValveControllerEntityDescription, SwitchDescriptionMixin ): diff --git a/homeassistant/components/hassio/binary_sensor.py b/homeassistant/components/hassio/binary_sensor.py index e2cd1bae270..f57cfa472c4 100644 --- a/homeassistant/components/hassio/binary_sensor.py +++ b/homeassistant/components/hassio/binary_sensor.py @@ -17,7 +17,7 @@ from .const import ATTR_STARTED, ATTR_STATE, DATA_KEY_ADDONS from .entity import HassioAddonEntity -@dataclass +@dataclass(frozen=True) class HassioBinarySensorEntityDescription(BinarySensorEntityDescription): """Hassio binary sensor entity description.""" diff --git a/homeassistant/components/homekit_controller/button.py b/homeassistant/components/homekit_controller/button.py index ff61c632be9..1c16b2c6483 100644 --- a/homeassistant/components/homekit_controller/button.py +++ b/homeassistant/components/homekit_controller/button.py @@ -28,7 +28,7 @@ from .entity import CharacteristicEntity _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class HomeKitButtonEntityDescription(ButtonEntityDescription): """Describes Homekit button.""" diff --git a/homeassistant/components/homekit_controller/select.py b/homeassistant/components/homekit_controller/select.py index 09bb57923c6..e6eae1c51ca 100644 --- a/homeassistant/components/homekit_controller/select.py +++ b/homeassistant/components/homekit_controller/select.py @@ -19,14 +19,14 @@ from .connection import HKDevice from .entity import CharacteristicEntity -@dataclass +@dataclass(frozen=True) class HomeKitSelectEntityDescriptionRequired: """Required fields for HomeKitSelectEntityDescription.""" choices: dict[str, IntEnum] -@dataclass +@dataclass(frozen=True) class HomeKitSelectEntityDescription( SelectEntityDescription, HomeKitSelectEntityDescriptionRequired ): diff --git a/homeassistant/components/homekit_controller/sensor.py b/homeassistant/components/homekit_controller/sensor.py index 2d30de24650..eb5b99e126d 100644 --- a/homeassistant/components/homekit_controller/sensor.py +++ b/homeassistant/components/homekit_controller/sensor.py @@ -46,7 +46,7 @@ from .entity import CharacteristicEntity, HomeKitEntity from .utils import folded_name -@dataclass +@dataclass(frozen=True) class HomeKitSensorEntityDescription(SensorEntityDescription): """Describes Homekit sensor.""" diff --git a/homeassistant/components/homekit_controller/switch.py b/homeassistant/components/homekit_controller/switch.py index 15a7aca4a5d..2ae19152b93 100644 --- a/homeassistant/components/homekit_controller/switch.py +++ b/homeassistant/components/homekit_controller/switch.py @@ -30,7 +30,7 @@ ATTR_IS_CONFIGURED = "is_configured" ATTR_REMAINING_DURATION = "remaining_duration" -@dataclass +@dataclass(frozen=True) class DeclarativeSwitchEntityDescription(SwitchEntityDescription): """Describes Homekit button.""" diff --git a/homeassistant/components/homewizard/sensor.py b/homeassistant/components/homewizard/sensor.py index d980e66e0e4..12655dbbc39 100644 --- a/homeassistant/components/homewizard/sensor.py +++ b/homeassistant/components/homewizard/sensor.py @@ -35,7 +35,7 @@ from .entity import HomeWizardEntity PARALLEL_UPDATES = 1 -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class HomeWizardSensorEntityDescription(SensorEntityDescription): """Class describing HomeWizard sensor entities.""" diff --git a/homeassistant/components/homewizard/switch.py b/homeassistant/components/homewizard/switch.py index 3f854aad320..fea4d7018bf 100644 --- a/homeassistant/components/homewizard/switch.py +++ b/homeassistant/components/homewizard/switch.py @@ -23,7 +23,7 @@ from .entity import HomeWizardEntity from .helpers import homewizard_exception_handler -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class HomeWizardSwitchEntityDescription(SwitchEntityDescription): """Class describing HomeWizard switch entities.""" diff --git a/homeassistant/components/honeywell/sensor.py b/homeassistant/components/honeywell/sensor.py index 9542648b996..0841b7df1cc 100644 --- a/homeassistant/components/honeywell/sensor.py +++ b/homeassistant/components/honeywell/sensor.py @@ -36,7 +36,7 @@ def _get_temperature_sensor_unit(device: Device) -> str: return UnitOfTemperature.FAHRENHEIT -@dataclass +@dataclass(frozen=True) class HoneywellSensorEntityDescriptionMixin: """Mixin for required keys.""" @@ -44,7 +44,7 @@ class HoneywellSensorEntityDescriptionMixin: unit_fn: Callable[[Device], Any] -@dataclass +@dataclass(frozen=True) class HoneywellSensorEntityDescription( SensorEntityDescription, HoneywellSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/huawei_lte/select.py b/homeassistant/components/huawei_lte/select.py index 2f4b7274fc0..83b5d5545cb 100644 --- a/homeassistant/components/huawei_lte/select.py +++ b/homeassistant/components/huawei_lte/select.py @@ -26,14 +26,14 @@ from .const import DOMAIN, KEY_NET_NET_MODE _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class HuaweiSelectEntityMixin: """Mixin for Huawei LTE select entities, to ensure required fields are set.""" setter_fn: Callable[[str], None] -@dataclass +@dataclass(frozen=True) class HuaweiSelectEntityDescription(SelectEntityDescription, HuaweiSelectEntityMixin): """Class describing Huawei LTE select entities.""" diff --git a/homeassistant/components/huawei_lte/sensor.py b/homeassistant/components/huawei_lte/sensor.py index ca3734bb305..d47305fa5f6 100644 --- a/homeassistant/components/huawei_lte/sensor.py +++ b/homeassistant/components/huawei_lte/sensor.py @@ -111,7 +111,7 @@ class HuaweiSensorGroup: exclude: re.Pattern[str] | None = None -@dataclass +@dataclass(frozen=True) class HuaweiSensorEntityDescription(SensorEntityDescription): """Class describing Huawei LTE sensor entities.""" diff --git a/homeassistant/components/huisbaasje/sensor.py b/homeassistant/components/huisbaasje/sensor.py index b82b2b34a4b..82cf51d3b26 100644 --- a/homeassistant/components/huisbaasje/sensor.py +++ b/homeassistant/components/huisbaasje/sensor.py @@ -48,7 +48,7 @@ from .const import ( _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class HuisbaasjeSensorEntityDescription(SensorEntityDescription): """Class describing Airly sensor entities.""" diff --git a/homeassistant/components/hunterdouglas_powerview/button.py b/homeassistant/components/hunterdouglas_powerview/button.py index 2e0bc1c413a..cb6bc72954f 100644 --- a/homeassistant/components/hunterdouglas_powerview/button.py +++ b/homeassistant/components/hunterdouglas_powerview/button.py @@ -23,14 +23,14 @@ from .entity import ShadeEntity from .model import PowerviewDeviceInfo, PowerviewEntryData -@dataclass +@dataclass(frozen=True) class PowerviewButtonDescriptionMixin: """Mixin to describe a Button entity.""" press_action: Callable[[BaseShade], Any] -@dataclass +@dataclass(frozen=True) class PowerviewButtonDescription( ButtonEntityDescription, PowerviewButtonDescriptionMixin ): diff --git a/homeassistant/components/hunterdouglas_powerview/select.py b/homeassistant/components/hunterdouglas_powerview/select.py index 151b3a58011..65fe61851df 100644 --- a/homeassistant/components/hunterdouglas_powerview/select.py +++ b/homeassistant/components/hunterdouglas_powerview/select.py @@ -27,7 +27,7 @@ from .entity import ShadeEntity from .model import PowerviewDeviceInfo, PowerviewEntryData -@dataclass +@dataclass(frozen=True) class PowerviewSelectDescriptionMixin: """Mixin to describe a select entity.""" @@ -35,7 +35,7 @@ class PowerviewSelectDescriptionMixin: select_fn: Callable[[BaseShade, str], Coroutine[Any, Any, bool]] -@dataclass +@dataclass(frozen=True) class PowerviewSelectDescription( SelectEntityDescription, PowerviewSelectDescriptionMixin ): diff --git a/homeassistant/components/hunterdouglas_powerview/sensor.py b/homeassistant/components/hunterdouglas_powerview/sensor.py index 330e5dddfa5..8e16d53ae09 100644 --- a/homeassistant/components/hunterdouglas_powerview/sensor.py +++ b/homeassistant/components/hunterdouglas_powerview/sensor.py @@ -33,7 +33,7 @@ from .entity import ShadeEntity from .model import PowerviewDeviceInfo, PowerviewEntryData -@dataclass +@dataclass(frozen=True) class PowerviewSensorDescriptionMixin: """Mixin to describe a Sensor entity.""" @@ -42,7 +42,7 @@ class PowerviewSensorDescriptionMixin: create_sensor_fn: Callable[[BaseShade], bool] -@dataclass +@dataclass(frozen=True) class PowerviewSensorDescription( SensorEntityDescription, PowerviewSensorDescriptionMixin ): diff --git a/homeassistant/components/iammeter/sensor.py b/homeassistant/components/iammeter/sensor.py index f36eca93f28..df3a873b6c1 100644 --- a/homeassistant/components/iammeter/sensor.py +++ b/homeassistant/components/iammeter/sensor.py @@ -185,7 +185,7 @@ class IammeterSensor(update_coordinator.CoordinatorEntity, SensorEntity): return raw_attr -@dataclass +@dataclass(frozen=True) class IammeterSensorEntityDescription(SensorEntityDescription): """Describes Iammeter sensor entity.""" diff --git a/homeassistant/components/ibeacon/sensor.py b/homeassistant/components/ibeacon/sensor.py index b3895ce23b4..3ce145fc3b9 100644 --- a/homeassistant/components/ibeacon/sensor.py +++ b/homeassistant/components/ibeacon/sensor.py @@ -23,14 +23,14 @@ from .coordinator import IBeaconCoordinator from .entity import IBeaconEntity -@dataclass +@dataclass(frozen=True) class IBeaconRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[iBeaconAdvertisement], str | int | None] -@dataclass +@dataclass(frozen=True) class IBeaconSensorEntityDescription(SensorEntityDescription, IBeaconRequiredKeysMixin): """Describes iBeacon sensor entity.""" diff --git a/homeassistant/components/idasen_desk/button.py b/homeassistant/components/idasen_desk/button.py index 6cae9a42895..d11738c6bcd 100644 --- a/homeassistant/components/idasen_desk/button.py +++ b/homeassistant/components/idasen_desk/button.py @@ -21,7 +21,7 @@ from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class IdasenDeskButtonDescriptionMixin: """Mixin to describe a IdasenDesk button entity.""" @@ -30,7 +30,7 @@ class IdasenDeskButtonDescriptionMixin: ] -@dataclass +@dataclass(frozen=True) class IdasenDeskButtonDescription( ButtonEntityDescription, IdasenDeskButtonDescriptionMixin ): diff --git a/homeassistant/components/idasen_desk/sensor.py b/homeassistant/components/idasen_desk/sensor.py index b67dec0f579..f4e04ea762b 100644 --- a/homeassistant/components/idasen_desk/sensor.py +++ b/homeassistant/components/idasen_desk/sensor.py @@ -22,14 +22,14 @@ from . import DeskData, IdasenDeskCoordinator from .const import DOMAIN -@dataclass +@dataclass(frozen=True) class IdasenDeskSensorDescriptionMixin: """Required values for IdasenDesk sensors.""" value_fn: Callable[[IdasenDeskCoordinator], float | None] -@dataclass +@dataclass(frozen=True) class IdasenDeskSensorDescription( SensorEntityDescription, IdasenDeskSensorDescriptionMixin, diff --git a/homeassistant/components/incomfort/sensor.py b/homeassistant/components/incomfort/sensor.py index 9e8cabbe253..535d8b61653 100644 --- a/homeassistant/components/incomfort/sensor.py +++ b/homeassistant/components/incomfort/sensor.py @@ -23,7 +23,7 @@ INCOMFORT_PRESSURE = "CV Pressure" INCOMFORT_TAP_TEMP = "Tap Temp" -@dataclass +@dataclass(frozen=True) class IncomfortSensorEntityDescription(SensorEntityDescription): """Describes Incomfort sensor entity.""" diff --git a/homeassistant/components/intellifire/binary_sensor.py b/homeassistant/components/intellifire/binary_sensor.py index b19c592a5cf..503b97f183d 100644 --- a/homeassistant/components/intellifire/binary_sensor.py +++ b/homeassistant/components/intellifire/binary_sensor.py @@ -21,14 +21,14 @@ from .const import DOMAIN from .entity import IntellifireEntity -@dataclass +@dataclass(frozen=True) class IntellifireBinarySensorRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[IntellifirePollData], bool] -@dataclass +@dataclass(frozen=True) class IntellifireBinarySensorEntityDescription( BinarySensorEntityDescription, IntellifireBinarySensorRequiredKeysMixin ): diff --git a/homeassistant/components/intellifire/fan.py b/homeassistant/components/intellifire/fan.py index 3911efeb5b9..7c376eeec4c 100644 --- a/homeassistant/components/intellifire/fan.py +++ b/homeassistant/components/intellifire/fan.py @@ -26,7 +26,7 @@ from .coordinator import IntellifireDataUpdateCoordinator from .entity import IntellifireEntity -@dataclass +@dataclass(frozen=True) class IntellifireFanRequiredKeysMixin: """Required keys for fan entity.""" @@ -35,7 +35,7 @@ class IntellifireFanRequiredKeysMixin: speed_range: tuple[int, int] -@dataclass +@dataclass(frozen=True) class IntellifireFanEntityDescription( FanEntityDescription, IntellifireFanRequiredKeysMixin ): diff --git a/homeassistant/components/intellifire/light.py b/homeassistant/components/intellifire/light.py index 05994919296..a807735ed79 100644 --- a/homeassistant/components/intellifire/light.py +++ b/homeassistant/components/intellifire/light.py @@ -22,7 +22,7 @@ from .coordinator import IntellifireDataUpdateCoordinator from .entity import IntellifireEntity -@dataclass +@dataclass(frozen=True) class IntellifireLightRequiredKeysMixin: """Required keys for fan entity.""" @@ -30,7 +30,7 @@ class IntellifireLightRequiredKeysMixin: value_fn: Callable[[IntellifirePollData], bool] -@dataclass +@dataclass(frozen=True) class IntellifireLightEntityDescription( LightEntityDescription, IntellifireLightRequiredKeysMixin ): diff --git a/homeassistant/components/intellifire/sensor.py b/homeassistant/components/intellifire/sensor.py index bc42b977f12..c974378fb71 100644 --- a/homeassistant/components/intellifire/sensor.py +++ b/homeassistant/components/intellifire/sensor.py @@ -24,14 +24,14 @@ from .coordinator import IntellifireDataUpdateCoordinator from .entity import IntellifireEntity -@dataclass +@dataclass(frozen=True) class IntellifireSensorRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[IntellifirePollData], int | str | datetime | None] -@dataclass +@dataclass(frozen=True) class IntellifireSensorEntityDescription( SensorEntityDescription, IntellifireSensorRequiredKeysMixin, diff --git a/homeassistant/components/intellifire/switch.py b/homeassistant/components/intellifire/switch.py index 1af4d8c0e91..03e3a2be0a2 100644 --- a/homeassistant/components/intellifire/switch.py +++ b/homeassistant/components/intellifire/switch.py @@ -18,7 +18,7 @@ from .coordinator import IntellifireDataUpdateCoordinator from .entity import IntellifireEntity -@dataclass() +@dataclass(frozen=True) class IntellifireSwitchRequiredKeysMixin: """Mixin for required keys.""" @@ -27,7 +27,7 @@ class IntellifireSwitchRequiredKeysMixin: value_fn: Callable[[IntellifirePollData], bool] -@dataclass +@dataclass(frozen=True) class IntellifireSwitchEntityDescription( SwitchEntityDescription, IntellifireSwitchRequiredKeysMixin ): diff --git a/homeassistant/components/iotawatt/sensor.py b/homeassistant/components/iotawatt/sensor.py index 7dd26c46201..4faac347c40 100644 --- a/homeassistant/components/iotawatt/sensor.py +++ b/homeassistant/components/iotawatt/sensor.py @@ -36,7 +36,7 @@ from .coordinator import IotawattUpdater _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class IotaWattSensorEntityDescription(SensorEntityDescription): """Class describing IotaWatt sensor entities.""" diff --git a/homeassistant/components/ipma/sensor.py b/homeassistant/components/ipma/sensor.py index cb0620ceca0..d779a7ae02a 100644 --- a/homeassistant/components/ipma/sensor.py +++ b/homeassistant/components/ipma/sensor.py @@ -23,14 +23,14 @@ from .entity import IPMADevice _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class IPMARequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[Location, IPMA_API], Coroutine[Location, IPMA_API, int | None]] -@dataclass +@dataclass(frozen=True) class IPMASensorEntityDescription(SensorEntityDescription, IPMARequiredKeysMixin): """Describes IPMA sensor entity.""" diff --git a/homeassistant/components/ipp/sensor.py b/homeassistant/components/ipp/sensor.py index a2cb5cd34dc..d1acbe9bd96 100644 --- a/homeassistant/components/ipp/sensor.py +++ b/homeassistant/components/ipp/sensor.py @@ -37,14 +37,14 @@ from .coordinator import IPPDataUpdateCoordinator from .entity import IPPEntity -@dataclass +@dataclass(frozen=True) class IPPSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[Printer], StateType | datetime] -@dataclass +@dataclass(frozen=True) class IPPSensorEntityDescription( SensorEntityDescription, IPPSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/isy994/switch.py b/homeassistant/components/isy994/switch.py index de64741ba3a..da208dcc79c 100644 --- a/homeassistant/components/isy994/switch.py +++ b/homeassistant/components/isy994/switch.py @@ -31,7 +31,7 @@ from .entity import ISYAuxControlEntity, ISYNodeEntity, ISYProgramEntity from .models import IsyData -@dataclass +@dataclass(frozen=True) class ISYSwitchEntityDescription(SwitchEntityDescription): """Describes IST switch.""" diff --git a/homeassistant/components/jellyfin/sensor.py b/homeassistant/components/jellyfin/sensor.py index cd0e9ab21a2..0f1afd30e9b 100644 --- a/homeassistant/components/jellyfin/sensor.py +++ b/homeassistant/components/jellyfin/sensor.py @@ -16,14 +16,14 @@ from .entity import JellyfinEntity from .models import JellyfinData -@dataclass +@dataclass(frozen=True) class JellyfinSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[JellyfinDataT], StateType] -@dataclass +@dataclass(frozen=True) class JellyfinSensorEntityDescription( SensorEntityDescription, JellyfinSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/jewish_calendar/binary_sensor.py b/homeassistant/components/jewish_calendar/binary_sensor.py index e127d78229f..638d54d6159 100644 --- a/homeassistant/components/jewish_calendar/binary_sensor.py +++ b/homeassistant/components/jewish_calendar/binary_sensor.py @@ -22,14 +22,14 @@ import homeassistant.util.dt as dt_util from . import DOMAIN -@dataclass +@dataclass(frozen=True) class JewishCalendarBinarySensorMixIns(BinarySensorEntityDescription): """Binary Sensor description mixin class for Jewish Calendar.""" is_on: Callable[..., bool] = lambda _: False -@dataclass +@dataclass(frozen=True) class JewishCalendarBinarySensorEntityDescription( JewishCalendarBinarySensorMixIns, BinarySensorEntityDescription ): diff --git a/homeassistant/components/juicenet/number.py b/homeassistant/components/juicenet/number.py index e78f6189baf..fd2535c5bf3 100644 --- a/homeassistant/components/juicenet/number.py +++ b/homeassistant/components/juicenet/number.py @@ -19,14 +19,14 @@ from .const import DOMAIN, JUICENET_API, JUICENET_COORDINATOR from .entity import JuiceNetDevice -@dataclass +@dataclass(frozen=True) class JuiceNetNumberEntityDescriptionMixin: """Mixin for required keys.""" setter_key: str -@dataclass +@dataclass(frozen=True) class JuiceNetNumberEntityDescription( NumberEntityDescription, JuiceNetNumberEntityDescriptionMixin ): diff --git a/homeassistant/components/justnimbus/sensor.py b/homeassistant/components/justnimbus/sensor.py index 156fa37e982..cb428fa5eea 100644 --- a/homeassistant/components/justnimbus/sensor.py +++ b/homeassistant/components/justnimbus/sensor.py @@ -29,14 +29,14 @@ from .const import DOMAIN, VOLUME_FLOW_RATE_LITERS_PER_MINUTE from .entity import JustNimbusEntity -@dataclass +@dataclass(frozen=True) class JustNimbusEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[JustNimbusCoordinator], Any] -@dataclass +@dataclass(frozen=True) class JustNimbusEntityDescription( SensorEntityDescription, JustNimbusEntityDescriptionMixin ): diff --git a/homeassistant/components/kaiterra/sensor.py b/homeassistant/components/kaiterra/sensor.py index ab487aa1a25..bb780aab619 100644 --- a/homeassistant/components/kaiterra/sensor.py +++ b/homeassistant/components/kaiterra/sensor.py @@ -17,14 +17,14 @@ from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from .const import DISPATCHER_KAITERRA, DOMAIN -@dataclass +@dataclass(frozen=True) class KaiterraSensorRequiredKeysMixin: """Mixin for required keys.""" suffix: str -@dataclass +@dataclass(frozen=True) class KaiterraSensorEntityDescription( SensorEntityDescription, KaiterraSensorRequiredKeysMixin ): diff --git a/homeassistant/components/kaleidescape/sensor.py b/homeassistant/components/kaleidescape/sensor.py index 183036f3973..ba9eaca1e95 100644 --- a/homeassistant/components/kaleidescape/sensor.py +++ b/homeassistant/components/kaleidescape/sensor.py @@ -22,14 +22,14 @@ if TYPE_CHECKING: from homeassistant.helpers.typing import StateType -@dataclass +@dataclass(frozen=True) class BaseEntityDescriptionMixin: """Mixin for required descriptor keys.""" value_fn: Callable[[KaleidescapeDevice], StateType] -@dataclass +@dataclass(frozen=True) class KaleidescapeSensorEntityDescription( SensorEntityDescription, BaseEntityDescriptionMixin ): diff --git a/homeassistant/components/knx/sensor.py b/homeassistant/components/knx/sensor.py index dbfe8e9bd5e..2f09f7e8ed6 100644 --- a/homeassistant/components/knx/sensor.py +++ b/homeassistant/components/knx/sensor.py @@ -40,7 +40,7 @@ from .schema import SensorSchema SCAN_INTERVAL = timedelta(seconds=10) -@dataclass +@dataclass(frozen=True) class KNXSystemEntityDescription(SensorEntityDescription): """Class describing KNX system sensor entities.""" diff --git a/homeassistant/components/kostal_plenticore/number.py b/homeassistant/components/kostal_plenticore/number.py index 834057d63b8..36e1fc95eb8 100644 --- a/homeassistant/components/kostal_plenticore/number.py +++ b/homeassistant/components/kostal_plenticore/number.py @@ -26,7 +26,7 @@ from .helper import PlenticoreDataFormatter, SettingDataUpdateCoordinator _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class PlenticoreNumberEntityDescriptionMixin: """Define an entity description mixin for number entities.""" @@ -36,7 +36,7 @@ class PlenticoreNumberEntityDescriptionMixin: fmt_to: str -@dataclass +@dataclass(frozen=True) class PlenticoreNumberEntityDescription( NumberEntityDescription, PlenticoreNumberEntityDescriptionMixin ): diff --git a/homeassistant/components/kostal_plenticore/select.py b/homeassistant/components/kostal_plenticore/select.py index 779cc24b0c4..321bc4e5d70 100644 --- a/homeassistant/components/kostal_plenticore/select.py +++ b/homeassistant/components/kostal_plenticore/select.py @@ -19,14 +19,14 @@ from .helper import Plenticore, SelectDataUpdateCoordinator _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class PlenticoreRequiredKeysMixin: """A class that describes required properties for plenticore select entities.""" module_id: str -@dataclass +@dataclass(frozen=True) class PlenticoreSelectEntityDescription( SelectEntityDescription, PlenticoreRequiredKeysMixin ): diff --git a/homeassistant/components/kostal_plenticore/sensor.py b/homeassistant/components/kostal_plenticore/sensor.py index ce18867511d..111d497b128 100644 --- a/homeassistant/components/kostal_plenticore/sensor.py +++ b/homeassistant/components/kostal_plenticore/sensor.py @@ -33,7 +33,7 @@ from .helper import PlenticoreDataFormatter, ProcessDataUpdateCoordinator _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class PlenticoreRequiredKeysMixin: """A class that describes required properties for plenticore sensor entities.""" @@ -41,7 +41,7 @@ class PlenticoreRequiredKeysMixin: formatter: str -@dataclass +@dataclass(frozen=True) class PlenticoreSensorEntityDescription( SensorEntityDescription, PlenticoreRequiredKeysMixin ): diff --git a/homeassistant/components/kostal_plenticore/switch.py b/homeassistant/components/kostal_plenticore/switch.py index 554f8db2b68..509a3610884 100644 --- a/homeassistant/components/kostal_plenticore/switch.py +++ b/homeassistant/components/kostal_plenticore/switch.py @@ -20,7 +20,7 @@ from .helper import SettingDataUpdateCoordinator _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class PlenticoreRequiredKeysMixin: """A class that describes required properties for plenticore switch entities.""" @@ -32,7 +32,7 @@ class PlenticoreRequiredKeysMixin: off_label: str -@dataclass +@dataclass(frozen=True) class PlenticoreSwitchEntityDescription( SwitchEntityDescription, PlenticoreRequiredKeysMixin ): diff --git a/homeassistant/components/kraken/sensor.py b/homeassistant/components/kraken/sensor.py index 21eb3f2e5a1..7e55da2b189 100644 --- a/homeassistant/components/kraken/sensor.py +++ b/homeassistant/components/kraken/sensor.py @@ -32,14 +32,14 @@ from .const import ( _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class KrakenRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[DataUpdateCoordinator[KrakenResponse], str], float | int] -@dataclass +@dataclass(frozen=True) class KrakenSensorEntityDescription(SensorEntityDescription, KrakenRequiredKeysMixin): """Describes Kraken sensor entity.""" diff --git a/homeassistant/components/lacrosse_view/sensor.py b/homeassistant/components/lacrosse_view/sensor.py index 76688af61ae..e347a1409f6 100644 --- a/homeassistant/components/lacrosse_view/sensor.py +++ b/homeassistant/components/lacrosse_view/sensor.py @@ -35,14 +35,14 @@ from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class LaCrosseSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[Sensor, str], float | int | str | None] -@dataclass +@dataclass(frozen=True) class LaCrosseSensorEntityDescription( SensorEntityDescription, LaCrosseSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/lametric/button.py b/homeassistant/components/lametric/button.py index 1de8c1d1717..dacbf8d2445 100644 --- a/homeassistant/components/lametric/button.py +++ b/homeassistant/components/lametric/button.py @@ -19,7 +19,7 @@ from .entity import LaMetricEntity from .helpers import lametric_exception_handler -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class LaMetricButtonEntityDescription(ButtonEntityDescription): """Class describing LaMetric button entities.""" diff --git a/homeassistant/components/lametric/number.py b/homeassistant/components/lametric/number.py index d8c70494264..9acdc6f1411 100644 --- a/homeassistant/components/lametric/number.py +++ b/homeassistant/components/lametric/number.py @@ -19,7 +19,7 @@ from .entity import LaMetricEntity from .helpers import lametric_exception_handler -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class LaMetricNumberEntityDescription(NumberEntityDescription): """Class describing LaMetric number entities.""" diff --git a/homeassistant/components/lametric/select.py b/homeassistant/components/lametric/select.py index f15147235ac..c7a3f55125b 100644 --- a/homeassistant/components/lametric/select.py +++ b/homeassistant/components/lametric/select.py @@ -19,7 +19,7 @@ from .entity import LaMetricEntity from .helpers import lametric_exception_handler -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class LaMetricSelectEntityDescription(SelectEntityDescription): """Class describing LaMetric select entities.""" diff --git a/homeassistant/components/lametric/sensor.py b/homeassistant/components/lametric/sensor.py index 88d461e9d4f..5ef3608d33b 100644 --- a/homeassistant/components/lametric/sensor.py +++ b/homeassistant/components/lametric/sensor.py @@ -21,7 +21,7 @@ from .coordinator import LaMetricDataUpdateCoordinator from .entity import LaMetricEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class LaMetricSensorEntityDescription(SensorEntityDescription): """Class describing LaMetric sensor entities.""" diff --git a/homeassistant/components/lametric/switch.py b/homeassistant/components/lametric/switch.py index ace492fe0cb..7fda3a22b8f 100644 --- a/homeassistant/components/lametric/switch.py +++ b/homeassistant/components/lametric/switch.py @@ -19,7 +19,7 @@ from .entity import LaMetricEntity from .helpers import lametric_exception_handler -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class LaMetricSwitchEntityDescription(SwitchEntityDescription): """Class describing LaMetric switch entities.""" diff --git a/homeassistant/components/landisgyr_heat_meter/sensor.py b/homeassistant/components/landisgyr_heat_meter/sensor.py index d7485e88fb0..075aeb67b50 100644 --- a/homeassistant/components/landisgyr_heat_meter/sensor.py +++ b/homeassistant/components/landisgyr_heat_meter/sensor.py @@ -39,14 +39,14 @@ from . import DOMAIN _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class HeatMeterSensorEntityDescriptionMixin: """Mixin for additional Heat Meter sensor description attributes .""" value_fn: Callable[[HeatMeterResponse], StateType | datetime] -@dataclass +@dataclass(frozen=True) class HeatMeterSensorEntityDescription( SensorEntityDescription, HeatMeterSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/launch_library/sensor.py b/homeassistant/components/launch_library/sensor.py index 5dab7da56ed..2c1934f0c16 100644 --- a/homeassistant/components/launch_library/sensor.py +++ b/homeassistant/components/launch_library/sensor.py @@ -31,7 +31,7 @@ from .const import DOMAIN DEFAULT_NEXT_LAUNCH_NAME = "Next launch" -@dataclass +@dataclass(frozen=True) class LaunchLibrarySensorEntityDescriptionMixin: """Mixin for required keys.""" @@ -39,7 +39,7 @@ class LaunchLibrarySensorEntityDescriptionMixin: attributes_fn: Callable[[Launch | Event], dict[str, Any] | None] -@dataclass +@dataclass(frozen=True) class LaunchLibrarySensorEntityDescription( SensorEntityDescription, LaunchLibrarySensorEntityDescriptionMixin ): diff --git a/homeassistant/components/lidarr/sensor.py b/homeassistant/components/lidarr/sensor.py index 552bc35768f..027779f93fe 100644 --- a/homeassistant/components/lidarr/sensor.py +++ b/homeassistant/components/lidarr/sensor.py @@ -48,14 +48,14 @@ def get_modified_description( return desc, name -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class LidarrSensorEntityDescriptionMixIn(Generic[T]): """Mixin for required keys.""" value_fn: Callable[[T, str], str | int] -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class LidarrSensorEntityDescription( SensorEntityDescription, LidarrSensorEntityDescriptionMixIn[T], Generic[T] ): diff --git a/homeassistant/components/litterrobot/binary_sensor.py b/homeassistant/components/litterrobot/binary_sensor.py index 0872c5c831d..6a588c36d6c 100644 --- a/homeassistant/components/litterrobot/binary_sensor.py +++ b/homeassistant/components/litterrobot/binary_sensor.py @@ -22,14 +22,14 @@ from .entity import LitterRobotEntity, _RobotT from .hub import LitterRobotHub -@dataclass +@dataclass(frozen=True) class RequiredKeysMixin(Generic[_RobotT]): """A class that describes robot binary sensor entity required keys.""" is_on_fn: Callable[[_RobotT], bool] -@dataclass +@dataclass(frozen=True) class RobotBinarySensorEntityDescription( BinarySensorEntityDescription, RequiredKeysMixin[_RobotT] ): diff --git a/homeassistant/components/litterrobot/button.py b/homeassistant/components/litterrobot/button.py index 06c4fe75888..de93ead5190 100644 --- a/homeassistant/components/litterrobot/button.py +++ b/homeassistant/components/litterrobot/button.py @@ -46,14 +46,14 @@ async def async_setup_entry( async_add_entities(entities) -@dataclass +@dataclass(frozen=True) class RequiredKeysMixin(Generic[_RobotT]): """A class that describes robot button entity required keys.""" press_fn: Callable[[_RobotT], Coroutine[Any, Any, bool]] -@dataclass +@dataclass(frozen=True) class RobotButtonEntityDescription(ButtonEntityDescription, RequiredKeysMixin[_RobotT]): """A class that describes robot button entities.""" diff --git a/homeassistant/components/litterrobot/select.py b/homeassistant/components/litterrobot/select.py index 7f2ea62f956..726cfaebaeb 100644 --- a/homeassistant/components/litterrobot/select.py +++ b/homeassistant/components/litterrobot/select.py @@ -28,7 +28,7 @@ BRIGHTNESS_LEVEL_ICON_MAP: dict[BrightnessLevel | None, str] = { } -@dataclass +@dataclass(frozen=True) class RequiredKeysMixin(Generic[_RobotT, _CastTypeT]): """A class that describes robot select entity required keys.""" @@ -37,7 +37,7 @@ class RequiredKeysMixin(Generic[_RobotT, _CastTypeT]): select_fn: Callable[[_RobotT, str], Coroutine[Any, Any, bool]] -@dataclass +@dataclass(frozen=True) class RobotSelectEntityDescription( SelectEntityDescription, RequiredKeysMixin[_RobotT, _CastTypeT] ): diff --git a/homeassistant/components/litterrobot/sensor.py b/homeassistant/components/litterrobot/sensor.py index 935bbaca595..a25921e440c 100644 --- a/homeassistant/components/litterrobot/sensor.py +++ b/homeassistant/components/litterrobot/sensor.py @@ -35,7 +35,7 @@ def icon_for_gauge_level(gauge_level: int | None = None, offset: int = 0) -> str return "mdi:gauge-low" -@dataclass +@dataclass(frozen=True) class RobotSensorEntityDescription(SensorEntityDescription, Generic[_RobotT]): """A class that describes robot sensor entities.""" diff --git a/homeassistant/components/litterrobot/switch.py b/homeassistant/components/litterrobot/switch.py index 6b4e5b56b48..84e6fa2be67 100644 --- a/homeassistant/components/litterrobot/switch.py +++ b/homeassistant/components/litterrobot/switch.py @@ -18,7 +18,7 @@ from .entity import LitterRobotEntity, _RobotT from .hub import LitterRobotHub -@dataclass +@dataclass(frozen=True) class RequiredKeysMixin(Generic[_RobotT]): """A class that describes robot switch entity required keys.""" @@ -26,7 +26,7 @@ class RequiredKeysMixin(Generic[_RobotT]): set_fn: Callable[[_RobotT, bool], Coroutine[Any, Any, bool]] -@dataclass +@dataclass(frozen=True) class RobotSwitchEntityDescription(SwitchEntityDescription, RequiredKeysMixin[_RobotT]): """A class that describes robot switch entities.""" diff --git a/homeassistant/components/litterrobot/time.py b/homeassistant/components/litterrobot/time.py index f352b7cee70..bb840e17a8f 100644 --- a/homeassistant/components/litterrobot/time.py +++ b/homeassistant/components/litterrobot/time.py @@ -20,7 +20,7 @@ from .entity import LitterRobotEntity, _RobotT from .hub import LitterRobotHub -@dataclass +@dataclass(frozen=True) class RequiredKeysMixin(Generic[_RobotT]): """A class that describes robot time entity required keys.""" @@ -28,7 +28,7 @@ class RequiredKeysMixin(Generic[_RobotT]): set_fn: Callable[[_RobotT, time], Coroutine[Any, Any, bool]] -@dataclass +@dataclass(frozen=True) class RobotTimeEntityDescription(TimeEntityDescription, RequiredKeysMixin[_RobotT]): """A class that describes robot time entities.""" diff --git a/homeassistant/components/lyric/sensor.py b/homeassistant/components/lyric/sensor.py index f0a4cdfbb99..1b9af351e71 100644 --- a/homeassistant/components/lyric/sensor.py +++ b/homeassistant/components/lyric/sensor.py @@ -41,7 +41,7 @@ LYRIC_SETPOINT_STATUS_NAMES = { } -@dataclass +@dataclass(frozen=True) class LyricSensorEntityDescriptionMixin: """Mixin for required keys.""" @@ -49,7 +49,7 @@ class LyricSensorEntityDescriptionMixin: suitable_fn: Callable[[LyricDevice], bool] -@dataclass +@dataclass(frozen=True) class LyricSensorEntityDescription( SensorEntityDescription, LyricSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/matter/binary_sensor.py b/homeassistant/components/matter/binary_sensor.py index aabfc12eefb..ea87fabf3f5 100644 --- a/homeassistant/components/matter/binary_sensor.py +++ b/homeassistant/components/matter/binary_sensor.py @@ -32,7 +32,7 @@ async def async_setup_entry( matter.register_platform_handler(Platform.BINARY_SENSOR, async_add_entities) -@dataclass +@dataclass(frozen=True) class MatterBinarySensorEntityDescription( BinarySensorEntityDescription, MatterEntityDescription ): diff --git a/homeassistant/components/matter/entity.py b/homeassistant/components/matter/entity.py index de6e6ff83c2..e308699acad 100644 --- a/homeassistant/components/matter/entity.py +++ b/homeassistant/components/matter/entity.py @@ -37,7 +37,7 @@ LOGGER = logging.getLogger(__name__) EXTRA_POLL_DELAY = 3.0 -@dataclass +@dataclass(frozen=True) class MatterEntityDescription(EntityDescription): """Describe the Matter entity.""" diff --git a/homeassistant/components/matter/sensor.py b/homeassistant/components/matter/sensor.py index 6262eb253aa..e7b18f308f7 100644 --- a/homeassistant/components/matter/sensor.py +++ b/homeassistant/components/matter/sensor.py @@ -45,7 +45,7 @@ async def async_setup_entry( matter.register_platform_handler(Platform.SENSOR, async_add_entities) -@dataclass +@dataclass(frozen=True) class MatterSensorEntityDescription(SensorEntityDescription, MatterEntityDescription): """Describe Matter sensor entities.""" diff --git a/homeassistant/components/meater/sensor.py b/homeassistant/components/meater/sensor.py index 98bb44947c8..a7e03ae7c22 100644 --- a/homeassistant/components/meater/sensor.py +++ b/homeassistant/components/meater/sensor.py @@ -27,7 +27,7 @@ from homeassistant.util import dt as dt_util from .const import DOMAIN -@dataclass +@dataclass(frozen=True) class MeaterSensorEntityDescriptionMixin: """Mixin for MeaterSensorEntityDescription.""" @@ -35,7 +35,7 @@ class MeaterSensorEntityDescriptionMixin: value: Callable[[MeaterProbe], datetime | float | str | None] -@dataclass +@dataclass(frozen=True) class MeaterSensorEntityDescription( SensorEntityDescription, MeaterSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/melcloud/sensor.py b/homeassistant/components/melcloud/sensor.py index 1cb8930049d..cf53fe42b77 100644 --- a/homeassistant/components/melcloud/sensor.py +++ b/homeassistant/components/melcloud/sensor.py @@ -23,7 +23,7 @@ from . import MelCloudDevice from .const import DOMAIN -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class MelcloudRequiredKeysMixin: """Mixin for required keys.""" @@ -31,7 +31,7 @@ class MelcloudRequiredKeysMixin: enabled: Callable[[Any], bool] -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class MelcloudSensorEntityDescription( SensorEntityDescription, MelcloudRequiredKeysMixin ): diff --git a/homeassistant/components/melnor/number.py b/homeassistant/components/melnor/number.py index e0f9c7d3bf6..caf2d499851 100644 --- a/homeassistant/components/melnor/number.py +++ b/homeassistant/components/melnor/number.py @@ -26,7 +26,7 @@ from .models import ( ) -@dataclass +@dataclass(frozen=True) class MelnorZoneNumberEntityDescriptionMixin: """Mixin for required keys.""" @@ -34,7 +34,7 @@ class MelnorZoneNumberEntityDescriptionMixin: state_fn: Callable[[Valve], Any] -@dataclass +@dataclass(frozen=True) class MelnorZoneNumberEntityDescription( NumberEntityDescription, MelnorZoneNumberEntityDescriptionMixin ): diff --git a/homeassistant/components/melnor/sensor.py b/homeassistant/components/melnor/sensor.py index edb906cc80f..255c3c9747d 100644 --- a/homeassistant/components/melnor/sensor.py +++ b/homeassistant/components/melnor/sensor.py @@ -54,28 +54,28 @@ def next_cycle(valve: Valve) -> datetime | None: return None -@dataclass +@dataclass(frozen=True) class MelnorSensorEntityDescriptionMixin: """Mixin for required keys.""" state_fn: Callable[[Device], Any] -@dataclass +@dataclass(frozen=True) class MelnorZoneSensorEntityDescriptionMixin: """Mixin for required keys.""" state_fn: Callable[[Valve], Any] -@dataclass +@dataclass(frozen=True) class MelnorZoneSensorEntityDescription( SensorEntityDescription, MelnorZoneSensorEntityDescriptionMixin ): """Describes Melnor sensor entity.""" -@dataclass +@dataclass(frozen=True) class MelnorSensorEntityDescription( SensorEntityDescription, MelnorSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/melnor/switch.py b/homeassistant/components/melnor/switch.py index 03bd28faa9d..e3c0e0afa15 100644 --- a/homeassistant/components/melnor/switch.py +++ b/homeassistant/components/melnor/switch.py @@ -25,7 +25,7 @@ from .models import ( ) -@dataclass +@dataclass(frozen=True) class MelnorSwitchEntityDescriptionMixin: """Mixin for required keys.""" @@ -33,7 +33,7 @@ class MelnorSwitchEntityDescriptionMixin: state_fn: Callable[[Valve], Any] -@dataclass +@dataclass(frozen=True) class MelnorSwitchEntityDescription( SwitchEntityDescription, MelnorSwitchEntityDescriptionMixin ): diff --git a/homeassistant/components/melnor/time.py b/homeassistant/components/melnor/time.py index 943a7996aeb..36afe2d976d 100644 --- a/homeassistant/components/melnor/time.py +++ b/homeassistant/components/melnor/time.py @@ -23,7 +23,7 @@ from .models import ( ) -@dataclass +@dataclass(frozen=True) class MelnorZoneTimeEntityDescriptionMixin: """Mixin for required keys.""" @@ -31,7 +31,7 @@ class MelnorZoneTimeEntityDescriptionMixin: state_fn: Callable[[Valve], Any] -@dataclass +@dataclass(frozen=True) class MelnorZoneTimeEntityDescription( TimeEntityDescription, MelnorZoneTimeEntityDescriptionMixin ): diff --git a/homeassistant/components/meteo_france/sensor.py b/homeassistant/components/meteo_france/sensor.py index dd8fd4af83b..451d617e65b 100644 --- a/homeassistant/components/meteo_france/sensor.py +++ b/homeassistant/components/meteo_france/sensor.py @@ -51,14 +51,14 @@ from .const import ( _DataT = TypeVar("_DataT", bound=Rain | Forecast | CurrentPhenomenons) -@dataclass +@dataclass(frozen=True) class MeteoFranceRequiredKeysMixin: """Mixin for required keys.""" data_path: str -@dataclass +@dataclass(frozen=True) class MeteoFranceSensorEntityDescription( SensorEntityDescription, MeteoFranceRequiredKeysMixin ): diff --git a/homeassistant/components/minecraft_server/binary_sensor.py b/homeassistant/components/minecraft_server/binary_sensor.py index 520d7342b35..6c0a2a248f3 100644 --- a/homeassistant/components/minecraft_server/binary_sensor.py +++ b/homeassistant/components/minecraft_server/binary_sensor.py @@ -19,7 +19,7 @@ ICON_STATUS = "mdi:lan" KEY_STATUS = "status" -@dataclass +@dataclass(frozen=True) class MinecraftServerBinarySensorEntityDescription(BinarySensorEntityDescription): """Class describing Minecraft Server binary sensor entities.""" diff --git a/homeassistant/components/minecraft_server/sensor.py b/homeassistant/components/minecraft_server/sensor.py index 661ce00dac5..671bbdb7a05 100644 --- a/homeassistant/components/minecraft_server/sensor.py +++ b/homeassistant/components/minecraft_server/sensor.py @@ -41,7 +41,7 @@ UNIT_PLAYERS_MAX = "players" UNIT_PLAYERS_ONLINE = "players" -@dataclass +@dataclass(frozen=True) class MinecraftServerEntityDescriptionMixin: """Mixin values for Minecraft Server entities.""" @@ -50,7 +50,7 @@ class MinecraftServerEntityDescriptionMixin: supported_server_types: set[MinecraftServerType] -@dataclass +@dataclass(frozen=True) class MinecraftServerSensorEntityDescription( SensorEntityDescription, MinecraftServerEntityDescriptionMixin ): diff --git a/homeassistant/components/mysensors/binary_sensor.py b/homeassistant/components/mysensors/binary_sensor.py index 2b4edd99221..b70a7fc8d55 100644 --- a/homeassistant/components/mysensors/binary_sensor.py +++ b/homeassistant/components/mysensors/binary_sensor.py @@ -21,7 +21,7 @@ from .const import MYSENSORS_DISCOVERY, DiscoveryInfo from .helpers import on_unload -@dataclass +@dataclass(frozen=True) class MySensorsBinarySensorDescription(BinarySensorEntityDescription): """Describe a MySensors binary sensor entity.""" diff --git a/homeassistant/components/mystrom/sensor.py b/homeassistant/components/mystrom/sensor.py index 606a6275acf..4551c9ebbec 100644 --- a/homeassistant/components/mystrom/sensor.py +++ b/homeassistant/components/mystrom/sensor.py @@ -21,7 +21,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from .const import DOMAIN, MANUFACTURER -@dataclass +@dataclass(frozen=True) class MyStromSwitchSensorEntityDescription(SensorEntityDescription): """Class describing mystrom switch sensor entities.""" diff --git a/homeassistant/components/nam/sensor.py b/homeassistant/components/nam/sensor.py index 3c0b8bc9ba4..5b3c6517f64 100644 --- a/homeassistant/components/nam/sensor.py +++ b/homeassistant/components/nam/sensor.py @@ -74,14 +74,14 @@ PARALLEL_UPDATES = 1 _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class NAMSensorRequiredKeysMixin: """Class for NAM entity required keys.""" value: Callable[[NAMSensors], StateType | datetime] -@dataclass +@dataclass(frozen=True) class NAMSensorEntityDescription(SensorEntityDescription, NAMSensorRequiredKeysMixin): """NAM sensor entity description.""" diff --git a/homeassistant/components/netatmo/sensor.py b/homeassistant/components/netatmo/sensor.py index 2f99b866cf2..692a1a806ea 100644 --- a/homeassistant/components/netatmo/sensor.py +++ b/homeassistant/components/netatmo/sensor.py @@ -70,14 +70,14 @@ SUPPORTED_PUBLIC_SENSOR_TYPES: tuple[str, ...] = ( ) -@dataclass +@dataclass(frozen=True) class NetatmoRequiredKeysMixin: """Mixin for required keys.""" netatmo_name: str -@dataclass +@dataclass(frozen=True) class NetatmoSensorEntityDescription(SensorEntityDescription, NetatmoRequiredKeysMixin): """Describes Netatmo sensor entity.""" diff --git a/homeassistant/components/netgear/button.py b/homeassistant/components/netgear/button.py index f3283f8d7b5..6ec988edbe1 100644 --- a/homeassistant/components/netgear/button.py +++ b/homeassistant/components/netgear/button.py @@ -19,14 +19,14 @@ from .entity import NetgearRouterCoordinatorEntity from .router import NetgearRouter -@dataclass +@dataclass(frozen=True) class NetgearButtonEntityDescriptionRequired: """Required attributes of NetgearButtonEntityDescription.""" action: Callable[[NetgearRouter], Callable[[], Coroutine[Any, Any, None]]] -@dataclass +@dataclass(frozen=True) class NetgearButtonEntityDescription( ButtonEntityDescription, NetgearButtonEntityDescriptionRequired ): diff --git a/homeassistant/components/netgear/sensor.py b/homeassistant/components/netgear/sensor.py index 6e7771d44cb..897fe9da30c 100644 --- a/homeassistant/components/netgear/sensor.py +++ b/homeassistant/components/netgear/sensor.py @@ -77,7 +77,7 @@ SENSOR_TYPES = { } -@dataclass +@dataclass(frozen=True) class NetgearSensorEntityDescription(SensorEntityDescription): """Class describing Netgear sensor entities.""" diff --git a/homeassistant/components/netgear/switch.py b/homeassistant/components/netgear/switch.py index a4548da16a4..4be13a0f32c 100644 --- a/homeassistant/components/netgear/switch.py +++ b/homeassistant/components/netgear/switch.py @@ -32,7 +32,7 @@ SWITCH_TYPES = [ ] -@dataclass +@dataclass(frozen=True) class NetgearSwitchEntityDescriptionRequired: """Required attributes of NetgearSwitchEntityDescription.""" @@ -40,7 +40,7 @@ class NetgearSwitchEntityDescriptionRequired: action: Callable[[NetgearRouter], bool] -@dataclass +@dataclass(frozen=True) class NetgearSwitchEntityDescription( SwitchEntityDescription, NetgearSwitchEntityDescriptionRequired ): diff --git a/homeassistant/components/nextcloud/sensor.py b/homeassistant/components/nextcloud/sensor.py index 6800c403ee8..851cb9f3cd3 100644 --- a/homeassistant/components/nextcloud/sensor.py +++ b/homeassistant/components/nextcloud/sensor.py @@ -30,7 +30,7 @@ from .entity import NextcloudEntity UNIT_OF_LOAD: Final[str] = "load" -@dataclass +@dataclass(frozen=True) class NextcloudSensorEntityDescription(SensorEntityDescription): """Describes Nextcloud sensor entity.""" diff --git a/homeassistant/components/nextdns/binary_sensor.py b/homeassistant/components/nextdns/binary_sensor.py index e2e37ccab2d..dad29893161 100644 --- a/homeassistant/components/nextdns/binary_sensor.py +++ b/homeassistant/components/nextdns/binary_sensor.py @@ -24,14 +24,14 @@ from .const import ATTR_CONNECTION, DOMAIN PARALLEL_UPDATES = 1 -@dataclass +@dataclass(frozen=True) class NextDnsBinarySensorRequiredKeysMixin(Generic[CoordinatorDataT]): """Mixin for required keys.""" state: Callable[[CoordinatorDataT, str], bool] -@dataclass +@dataclass(frozen=True) class NextDnsBinarySensorEntityDescription( BinarySensorEntityDescription, NextDnsBinarySensorRequiredKeysMixin[CoordinatorDataT], diff --git a/homeassistant/components/nextdns/sensor.py b/homeassistant/components/nextdns/sensor.py index ccbbb5e534e..c501142697e 100644 --- a/homeassistant/components/nextdns/sensor.py +++ b/homeassistant/components/nextdns/sensor.py @@ -38,7 +38,7 @@ from .const import ( PARALLEL_UPDATES = 1 -@dataclass +@dataclass(frozen=True) class NextDnsSensorRequiredKeysMixin(Generic[CoordinatorDataT]): """Class for NextDNS entity required keys.""" @@ -46,7 +46,7 @@ class NextDnsSensorRequiredKeysMixin(Generic[CoordinatorDataT]): value: Callable[[CoordinatorDataT], StateType] -@dataclass +@dataclass(frozen=True) class NextDnsSensorEntityDescription( SensorEntityDescription, NextDnsSensorRequiredKeysMixin[CoordinatorDataT], diff --git a/homeassistant/components/nextdns/switch.py b/homeassistant/components/nextdns/switch.py index 0a310bc29e7..177b4970a93 100644 --- a/homeassistant/components/nextdns/switch.py +++ b/homeassistant/components/nextdns/switch.py @@ -24,14 +24,14 @@ from .const import ATTR_SETTINGS, DOMAIN PARALLEL_UPDATES = 1 -@dataclass +@dataclass(frozen=True) class NextDnsSwitchRequiredKeysMixin(Generic[CoordinatorDataT]): """Class for NextDNS entity required keys.""" state: Callable[[CoordinatorDataT], bool] -@dataclass +@dataclass(frozen=True) class NextDnsSwitchEntityDescription( SwitchEntityDescription, NextDnsSwitchRequiredKeysMixin[CoordinatorDataT] ): diff --git a/homeassistant/components/notion/binary_sensor.py b/homeassistant/components/notion/binary_sensor.py index ff58d566a34..a1c519f228f 100644 --- a/homeassistant/components/notion/binary_sensor.py +++ b/homeassistant/components/notion/binary_sensor.py @@ -33,14 +33,14 @@ from .const import ( from .model import NotionEntityDescriptionMixin -@dataclass +@dataclass(frozen=True) class NotionBinarySensorDescriptionMixin: """Define an entity description mixin for binary and regular sensors.""" on_state: Literal["alarm", "leak", "low", "not_missing", "open"] -@dataclass +@dataclass(frozen=True) class NotionBinarySensorDescription( BinarySensorEntityDescription, NotionBinarySensorDescriptionMixin, diff --git a/homeassistant/components/notion/model.py b/homeassistant/components/notion/model.py index 0999df3abdb..cdfd6e63dad 100644 --- a/homeassistant/components/notion/model.py +++ b/homeassistant/components/notion/model.py @@ -4,7 +4,7 @@ from dataclasses import dataclass from aionotion.sensor.models import ListenerKind -@dataclass +@dataclass(frozen=True) class NotionEntityDescriptionMixin: """Define an description mixin Notion entities.""" diff --git a/homeassistant/components/notion/sensor.py b/homeassistant/components/notion/sensor.py index 4777cc94fbf..8c4242aec2a 100644 --- a/homeassistant/components/notion/sensor.py +++ b/homeassistant/components/notion/sensor.py @@ -19,7 +19,7 @@ from .const import DOMAIN, SENSOR_MOLD, SENSOR_TEMPERATURE from .model import NotionEntityDescriptionMixin -@dataclass +@dataclass(frozen=True) class NotionSensorDescription(SensorEntityDescription, NotionEntityDescriptionMixin): """Describe a Notion sensor.""" diff --git a/homeassistant/components/nws/sensor.py b/homeassistant/components/nws/sensor.py index ecf9d39ae55..35fb6c0ec1f 100644 --- a/homeassistant/components/nws/sensor.py +++ b/homeassistant/components/nws/sensor.py @@ -39,7 +39,7 @@ from .const import ATTRIBUTION, CONF_STATION, DOMAIN, OBSERVATION_VALID_TIME PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class NWSSensorEntityDescription(SensorEntityDescription): """Class describing NWSSensor entities.""" diff --git a/homeassistant/components/onewire/binary_sensor.py b/homeassistant/components/onewire/binary_sensor.py index b405140bc32..2840cde704b 100644 --- a/homeassistant/components/onewire/binary_sensor.py +++ b/homeassistant/components/onewire/binary_sensor.py @@ -25,7 +25,7 @@ from .onewire_entities import OneWireEntity, OneWireEntityDescription from .onewirehub import OneWireHub -@dataclass +@dataclass(frozen=True) class OneWireBinarySensorEntityDescription( OneWireEntityDescription, BinarySensorEntityDescription ): diff --git a/homeassistant/components/onewire/onewire_entities.py b/homeassistant/components/onewire/onewire_entities.py index a6eddece5c6..cad55234181 100644 --- a/homeassistant/components/onewire/onewire_entities.py +++ b/homeassistant/components/onewire/onewire_entities.py @@ -14,7 +14,7 @@ from homeassistant.helpers.typing import StateType from .const import READ_MODE_BOOL, READ_MODE_INT -@dataclass +@dataclass(frozen=True) class OneWireEntityDescription(EntityDescription): """Class describing OneWire entities.""" diff --git a/homeassistant/components/onewire/sensor.py b/homeassistant/components/onewire/sensor.py index 61cf3459c84..cc8b14b5d6e 100644 --- a/homeassistant/components/onewire/sensor.py +++ b/homeassistant/components/onewire/sensor.py @@ -42,7 +42,7 @@ from .onewire_entities import OneWireEntity, OneWireEntityDescription from .onewirehub import OneWireHub -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class OneWireSensorEntityDescription(OneWireEntityDescription, SensorEntityDescription): """Class describing OneWire sensor entities.""" diff --git a/homeassistant/components/onewire/switch.py b/homeassistant/components/onewire/switch.py index 986be11d169..db9e8f5b0f8 100644 --- a/homeassistant/components/onewire/switch.py +++ b/homeassistant/components/onewire/switch.py @@ -22,7 +22,7 @@ from .onewire_entities import OneWireEntity, OneWireEntityDescription from .onewirehub import OneWireHub -@dataclass +@dataclass(frozen=True) class OneWireSwitchEntityDescription(OneWireEntityDescription, SwitchEntityDescription): """Class describing OneWire switch entities.""" diff --git a/homeassistant/components/onvif/switch.py b/homeassistant/components/onvif/switch.py index 4f7de67386b..673f77f558c 100644 --- a/homeassistant/components/onvif/switch.py +++ b/homeassistant/components/onvif/switch.py @@ -16,7 +16,7 @@ from .device import ONVIFDevice from .models import Profile -@dataclass +@dataclass(frozen=True) class ONVIFSwitchEntityDescriptionMixin: """Mixin for required keys.""" @@ -31,7 +31,7 @@ class ONVIFSwitchEntityDescriptionMixin: supported_fn: Callable[[ONVIFDevice], bool] -@dataclass +@dataclass(frozen=True) class ONVIFSwitchEntityDescription( SwitchEntityDescription, ONVIFSwitchEntityDescriptionMixin ): diff --git a/homeassistant/components/openuv/sensor.py b/homeassistant/components/openuv/sensor.py index 8434b6d5591..431fa41a288 100644 --- a/homeassistant/components/openuv/sensor.py +++ b/homeassistant/components/openuv/sensor.py @@ -71,14 +71,14 @@ def get_uv_label(uv_index: int) -> str: return label.value -@dataclass +@dataclass(frozen=True) class OpenUvSensorEntityDescriptionMixin: """Define a mixin for OpenUV sensor descriptions.""" value_fn: Callable[[dict[str, Any]], int | str] -@dataclass +@dataclass(frozen=True) class OpenUvSensorEntityDescription( SensorEntityDescription, OpenUvSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/opower/sensor.py b/homeassistant/components/opower/sensor.py index 175bef01449..9940132dac2 100644 --- a/homeassistant/components/opower/sensor.py +++ b/homeassistant/components/opower/sensor.py @@ -24,14 +24,14 @@ from .const import DOMAIN from .coordinator import OpowerCoordinator -@dataclass +@dataclass(frozen=True) class OpowerEntityDescriptionMixin: """Mixin values for required keys.""" value_fn: Callable[[Forecast], str | float] -@dataclass +@dataclass(frozen=True) class OpowerEntityDescription(SensorEntityDescription, OpowerEntityDescriptionMixin): """Class describing Opower sensors entities.""" diff --git a/homeassistant/components/overkiz/alarm_control_panel.py b/homeassistant/components/overkiz/alarm_control_panel.py index b08ede7df10..fcd94ae5bcd 100644 --- a/homeassistant/components/overkiz/alarm_control_panel.py +++ b/homeassistant/components/overkiz/alarm_control_panel.py @@ -35,7 +35,7 @@ from .coordinator import OverkizDataUpdateCoordinator from .entity import OverkizDescriptiveEntity -@dataclass +@dataclass(frozen=True) class OverkizAlarmDescriptionMixin: """Define an entity description mixin for switch entities.""" @@ -43,7 +43,7 @@ class OverkizAlarmDescriptionMixin: fn_state: Callable[[Callable[[str], OverkizStateType]], str] -@dataclass +@dataclass(frozen=True) class OverkizAlarmDescription( AlarmControlPanelEntityDescription, OverkizAlarmDescriptionMixin ): diff --git a/homeassistant/components/overkiz/binary_sensor.py b/homeassistant/components/overkiz/binary_sensor.py index 0d00179ee81..975ef4ff834 100644 --- a/homeassistant/components/overkiz/binary_sensor.py +++ b/homeassistant/components/overkiz/binary_sensor.py @@ -22,14 +22,14 @@ from .const import DOMAIN, IGNORED_OVERKIZ_DEVICES from .entity import OverkizDescriptiveEntity -@dataclass +@dataclass(frozen=True) class OverkizBinarySensorDescriptionMixin: """Define an entity description mixin for binary sensor entities.""" value_fn: Callable[[OverkizStateType], bool] -@dataclass +@dataclass(frozen=True) class OverkizBinarySensorDescription( BinarySensorEntityDescription, OverkizBinarySensorDescriptionMixin ): diff --git a/homeassistant/components/overkiz/button.py b/homeassistant/components/overkiz/button.py index 8388e2c3b2d..f8f33db7eed 100644 --- a/homeassistant/components/overkiz/button.py +++ b/homeassistant/components/overkiz/button.py @@ -17,7 +17,7 @@ from .const import DOMAIN, IGNORED_OVERKIZ_DEVICES from .entity import OverkizDescriptiveEntity -@dataclass +@dataclass(frozen=True) class OverkizButtonDescription(ButtonEntityDescription): """Class to describe an Overkiz button.""" diff --git a/homeassistant/components/overkiz/number.py b/homeassistant/components/overkiz/number.py index c90c4446339..c15a7bd3acc 100644 --- a/homeassistant/components/overkiz/number.py +++ b/homeassistant/components/overkiz/number.py @@ -26,14 +26,14 @@ BOOST_MODE_DURATION_DELAY = 1 OPERATING_MODE_DELAY = 3 -@dataclass +@dataclass(frozen=True) class OverkizNumberDescriptionMixin: """Define an entity description mixin for number entities.""" command: str -@dataclass +@dataclass(frozen=True) class OverkizNumberDescription(NumberEntityDescription, OverkizNumberDescriptionMixin): """Class to describe an Overkiz number.""" diff --git a/homeassistant/components/overkiz/select.py b/homeassistant/components/overkiz/select.py index 5f72ca23a80..c225d475f63 100644 --- a/homeassistant/components/overkiz/select.py +++ b/homeassistant/components/overkiz/select.py @@ -17,14 +17,14 @@ from .const import DOMAIN, IGNORED_OVERKIZ_DEVICES from .entity import OverkizDescriptiveEntity -@dataclass +@dataclass(frozen=True) class OverkizSelectDescriptionMixin: """Define an entity description mixin for select entities.""" select_option: Callable[[str, Callable[..., Awaitable[None]]], Awaitable[None]] -@dataclass +@dataclass(frozen=True) class OverkizSelectDescription(SelectEntityDescription, OverkizSelectDescriptionMixin): """Class to describe an Overkiz select entity.""" diff --git a/homeassistant/components/overkiz/sensor.py b/homeassistant/components/overkiz/sensor.py index a267b54b398..011daf2ab51 100644 --- a/homeassistant/components/overkiz/sensor.py +++ b/homeassistant/components/overkiz/sensor.py @@ -44,7 +44,7 @@ from .coordinator import OverkizDataUpdateCoordinator from .entity import OverkizDescriptiveEntity, OverkizEntity -@dataclass +@dataclass(frozen=True) class OverkizSensorDescription(SensorEntityDescription): """Class to describe an Overkiz sensor.""" diff --git a/homeassistant/components/overkiz/switch.py b/homeassistant/components/overkiz/switch.py index b7416711e77..0396e385a3c 100644 --- a/homeassistant/components/overkiz/switch.py +++ b/homeassistant/components/overkiz/switch.py @@ -24,7 +24,7 @@ from .const import DOMAIN from .entity import OverkizDescriptiveEntity -@dataclass +@dataclass(frozen=True) class OverkizSwitchDescriptionMixin: """Define an entity description mixin for switch entities.""" @@ -32,7 +32,7 @@ class OverkizSwitchDescriptionMixin: turn_off: str -@dataclass +@dataclass(frozen=True) class OverkizSwitchDescription(SwitchEntityDescription, OverkizSwitchDescriptionMixin): """Class to describe an Overkiz switch.""" diff --git a/homeassistant/components/ovo_energy/sensor.py b/homeassistant/components/ovo_energy/sensor.py index 89a05f99a81..761515c9c84 100644 --- a/homeassistant/components/ovo_energy/sensor.py +++ b/homeassistant/components/ovo_energy/sensor.py @@ -33,7 +33,7 @@ KEY_LAST_ELECTRICITY_COST: Final = "last_electricity_cost" KEY_LAST_GAS_COST: Final = "last_gas_cost" -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class OVOEnergySensorEntityDescription(SensorEntityDescription): """Class describing System Bridge sensor entities.""" diff --git a/homeassistant/components/peco/sensor.py b/homeassistant/components/peco/sensor.py index 935f2b659f9..f9ad35fd251 100644 --- a/homeassistant/components/peco/sensor.py +++ b/homeassistant/components/peco/sensor.py @@ -24,7 +24,7 @@ from . import PECOCoordinatorData from .const import ATTR_CONTENT, CONF_COUNTY, DOMAIN -@dataclass +@dataclass(frozen=True) class PECOSensorEntityDescriptionMixin: """Mixin for required keys.""" @@ -32,7 +32,7 @@ class PECOSensorEntityDescriptionMixin: attribute_fn: Callable[[PECOCoordinatorData], dict[str, str]] -@dataclass +@dataclass(frozen=True) class PECOSensorEntityDescription( SensorEntityDescription, PECOSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/pegel_online/sensor.py b/homeassistant/components/pegel_online/sensor.py index cf229f16d12..5f7f431ddf7 100644 --- a/homeassistant/components/pegel_online/sensor.py +++ b/homeassistant/components/pegel_online/sensor.py @@ -21,14 +21,14 @@ from .coordinator import PegelOnlineDataUpdateCoordinator from .entity import PegelOnlineEntity -@dataclass +@dataclass(frozen=True) class PegelOnlineRequiredKeysMixin: """Mixin for required keys.""" measurement_key: str -@dataclass +@dataclass(frozen=True) class PegelOnlineSensorEntityDescription( SensorEntityDescription, PegelOnlineRequiredKeysMixin ): diff --git a/homeassistant/components/permobil/sensor.py b/homeassistant/components/permobil/sensor.py index e942aa265b8..a48741b0886 100644 --- a/homeassistant/components/permobil/sensor.py +++ b/homeassistant/components/permobil/sensor.py @@ -38,7 +38,7 @@ from .coordinator import MyPermobilCoordinator _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class PermobilRequiredKeysMixin: """Mixin for required keys.""" @@ -46,7 +46,7 @@ class PermobilRequiredKeysMixin: available_fn: Callable[[Any], bool] -@dataclass +@dataclass(frozen=True) class PermobilSensorEntityDescription( SensorEntityDescription, PermobilRequiredKeysMixin ): diff --git a/homeassistant/components/philips_js/binary_sensor.py b/homeassistant/components/philips_js/binary_sensor.py index ec93f0ab87e..74fe41bf722 100644 --- a/homeassistant/components/philips_js/binary_sensor.py +++ b/homeassistant/components/philips_js/binary_sensor.py @@ -18,7 +18,7 @@ from .const import DOMAIN from .entity import PhilipsJsEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class PhilipsTVBinarySensorEntityDescription(BinarySensorEntityDescription): """A entity description for Philips TV binary sensor.""" diff --git a/homeassistant/components/pi_hole/binary_sensor.py b/homeassistant/components/pi_hole/binary_sensor.py index 5d1419db8b2..2f3a5a4801c 100644 --- a/homeassistant/components/pi_hole/binary_sensor.py +++ b/homeassistant/components/pi_hole/binary_sensor.py @@ -21,14 +21,14 @@ from . import PiHoleEntity from .const import DATA_KEY_API, DATA_KEY_COORDINATOR, DOMAIN as PIHOLE_DOMAIN -@dataclass +@dataclass(frozen=True) class RequiredPiHoleBinaryDescription: """Represent the required attributes of the PiHole binary description.""" state_value: Callable[[Hole], bool] -@dataclass +@dataclass(frozen=True) class PiHoleBinarySensorEntityDescription( BinarySensorEntityDescription, RequiredPiHoleBinaryDescription ): diff --git a/homeassistant/components/pi_hole/update.py b/homeassistant/components/pi_hole/update.py index b9d8bf828d4..b559a1cf806 100644 --- a/homeassistant/components/pi_hole/update.py +++ b/homeassistant/components/pi_hole/update.py @@ -17,7 +17,7 @@ from . import PiHoleEntity from .const import DATA_KEY_API, DATA_KEY_COORDINATOR, DOMAIN -@dataclass +@dataclass(frozen=True) class PiHoleUpdateEntityDescription(UpdateEntityDescription): """Describes PiHole update entity.""" diff --git a/homeassistant/components/picnic/sensor.py b/homeassistant/components/picnic/sensor.py index 507ab82e8e2..56d2d22cf29 100644 --- a/homeassistant/components/picnic/sensor.py +++ b/homeassistant/components/picnic/sensor.py @@ -44,7 +44,7 @@ from .const import ( from .coordinator import PicnicUpdateCoordinator -@dataclass +@dataclass(frozen=True) class PicnicRequiredKeysMixin: """Mixin for required keys.""" @@ -54,7 +54,7 @@ class PicnicRequiredKeysMixin: value_fn: Callable[[Any], StateType | datetime] -@dataclass +@dataclass(frozen=True) class PicnicSensorEntityDescription(SensorEntityDescription, PicnicRequiredKeysMixin): """Describes Picnic sensor entity.""" diff --git a/homeassistant/components/plugwise/binary_sensor.py b/homeassistant/components/plugwise/binary_sensor.py index 5da82ab4105..0c67e20d7ab 100644 --- a/homeassistant/components/plugwise/binary_sensor.py +++ b/homeassistant/components/plugwise/binary_sensor.py @@ -23,7 +23,7 @@ from .entity import PlugwiseEntity SEVERITIES = ["other", "info", "warning", "error"] -@dataclass +@dataclass(frozen=True) class PlugwiseBinarySensorEntityDescription(BinarySensorEntityDescription): """Describes a Plugwise binary sensor entity.""" diff --git a/homeassistant/components/plugwise/number.py b/homeassistant/components/plugwise/number.py index c21ecbd94c7..c71b52cf5c8 100644 --- a/homeassistant/components/plugwise/number.py +++ b/homeassistant/components/plugwise/number.py @@ -22,7 +22,7 @@ from .coordinator import PlugwiseDataUpdateCoordinator from .entity import PlugwiseEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class PlugwiseNumberEntityDescription(NumberEntityDescription): """Class describing Plugwise Number entities.""" diff --git a/homeassistant/components/plugwise/select.py b/homeassistant/components/plugwise/select.py index eef873703c1..4be21fe9026 100644 --- a/homeassistant/components/plugwise/select.py +++ b/homeassistant/components/plugwise/select.py @@ -17,7 +17,7 @@ from .coordinator import PlugwiseDataUpdateCoordinator from .entity import PlugwiseEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class PlugwiseSelectEntityDescription(SelectEntityDescription): """Class describing Plugwise Select entities.""" diff --git a/homeassistant/components/plugwise/sensor.py b/homeassistant/components/plugwise/sensor.py index 0cc878178fe..95dfc2ba6a3 100644 --- a/homeassistant/components/plugwise/sensor.py +++ b/homeassistant/components/plugwise/sensor.py @@ -32,7 +32,7 @@ from .coordinator import PlugwiseDataUpdateCoordinator from .entity import PlugwiseEntity -@dataclass +@dataclass(frozen=True) class PlugwiseSensorEntityDescription(SensorEntityDescription): """Describes Plugwise sensor entity.""" diff --git a/homeassistant/components/plugwise/switch.py b/homeassistant/components/plugwise/switch.py index 8639826e37a..dfd11127332 100644 --- a/homeassistant/components/plugwise/switch.py +++ b/homeassistant/components/plugwise/switch.py @@ -22,7 +22,7 @@ from .entity import PlugwiseEntity from .util import plugwise_command -@dataclass +@dataclass(frozen=True) class PlugwiseSwitchEntityDescription(SwitchEntityDescription): """Describes Plugwise switch entity.""" diff --git a/homeassistant/components/point/sensor.py b/homeassistant/components/point/sensor.py index 462d8270f0a..471fa72c6c5 100644 --- a/homeassistant/components/point/sensor.py +++ b/homeassistant/components/point/sensor.py @@ -23,14 +23,14 @@ from .const import DOMAIN as POINT_DOMAIN, POINT_DISCOVERY_NEW _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class MinutPointRequiredKeysMixin: """Mixin for required keys.""" precision: int -@dataclass +@dataclass(frozen=True) class MinutPointSensorEntityDescription( SensorEntityDescription, MinutPointRequiredKeysMixin ): diff --git a/homeassistant/components/powerwall/sensor.py b/homeassistant/components/powerwall/sensor.py index 3f02c925f9d..bfa75392efb 100644 --- a/homeassistant/components/powerwall/sensor.py +++ b/homeassistant/components/powerwall/sensor.py @@ -32,14 +32,14 @@ _METER_DIRECTION_EXPORT = "export" _METER_DIRECTION_IMPORT = "import" -@dataclass +@dataclass(frozen=True) class PowerwallRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[Meter], float] -@dataclass +@dataclass(frozen=True) class PowerwallSensorEntityDescription( SensorEntityDescription, PowerwallRequiredKeysMixin ): diff --git a/homeassistant/components/private_ble_device/sensor.py b/homeassistant/components/private_ble_device/sensor.py index d15ed1163b7..fb094de3d58 100644 --- a/homeassistant/components/private_ble_device/sensor.py +++ b/homeassistant/components/private_ble_device/sensor.py @@ -26,7 +26,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from .entity import BasePrivateDeviceEntity -@dataclass +@dataclass(frozen=True) class PrivateDeviceSensorEntityDescriptionRequired: """Required domain specific fields for sensor entity.""" @@ -35,7 +35,7 @@ class PrivateDeviceSensorEntityDescriptionRequired: ] -@dataclass +@dataclass(frozen=True) class PrivateDeviceSensorEntityDescription( SensorEntityDescription, PrivateDeviceSensorEntityDescriptionRequired ): diff --git a/homeassistant/components/prusalink/button.py b/homeassistant/components/prusalink/button.py index 7e95b209bad..a44de101387 100644 --- a/homeassistant/components/prusalink/button.py +++ b/homeassistant/components/prusalink/button.py @@ -18,14 +18,14 @@ from . import DOMAIN, PrusaLinkEntity, PrusaLinkUpdateCoordinator T = TypeVar("T", PrinterInfo, JobInfo) -@dataclass +@dataclass(frozen=True) class PrusaLinkButtonEntityDescriptionMixin(Generic[T]): """Mixin for required keys.""" press_fn: Callable[[PrusaLink], Coroutine[Any, Any, None]] -@dataclass +@dataclass(frozen=True) class PrusaLinkButtonEntityDescription( ButtonEntityDescription, PrusaLinkButtonEntityDescriptionMixin[T], Generic[T] ): diff --git a/homeassistant/components/prusalink/sensor.py b/homeassistant/components/prusalink/sensor.py index 1ee4274e5bb..c6feda0defd 100644 --- a/homeassistant/components/prusalink/sensor.py +++ b/homeassistant/components/prusalink/sensor.py @@ -27,14 +27,14 @@ from . import DOMAIN, PrusaLinkEntity, PrusaLinkUpdateCoordinator T = TypeVar("T", PrinterInfo, JobInfo) -@dataclass +@dataclass(frozen=True) class PrusaLinkSensorEntityDescriptionMixin(Generic[T]): """Mixin for required keys.""" value_fn: Callable[[T], datetime | StateType] -@dataclass +@dataclass(frozen=True) class PrusaLinkSensorEntityDescription( SensorEntityDescription, PrusaLinkSensorEntityDescriptionMixin[T], Generic[T] ): diff --git a/homeassistant/components/pure_energie/sensor.py b/homeassistant/components/pure_energie/sensor.py index 4ab77fa7893..09470609c9e 100644 --- a/homeassistant/components/pure_energie/sensor.py +++ b/homeassistant/components/pure_energie/sensor.py @@ -22,14 +22,14 @@ from . import PureEnergieData, PureEnergieDataUpdateCoordinator from .const import DOMAIN -@dataclass +@dataclass(frozen=True) class PureEnergieSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[PureEnergieData], int | float] -@dataclass +@dataclass(frozen=True) class PureEnergieSensorEntityDescription( SensorEntityDescription, PureEnergieSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/purpleair/sensor.py b/homeassistant/components/purpleair/sensor.py index fffceffa343..1e78586dece 100644 --- a/homeassistant/components/purpleair/sensor.py +++ b/homeassistant/components/purpleair/sensor.py @@ -33,14 +33,14 @@ from .coordinator import PurpleAirDataUpdateCoordinator CONCENTRATION_PARTICLES_PER_100_MILLILITERS = f"particles/100{UnitOfVolume.MILLILITERS}" -@dataclass +@dataclass(frozen=True) class PurpleAirSensorEntityDescriptionMixin: """Define a description mixin for PurpleAir sensor entities.""" value_fn: Callable[[SensorModel], float | str | None] -@dataclass +@dataclass(frozen=True) class PurpleAirSensorEntityDescription( SensorEntityDescription, PurpleAirSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/pvoutput/sensor.py b/homeassistant/components/pvoutput/sensor.py index d9ef71bee69..c003e3cfad8 100644 --- a/homeassistant/components/pvoutput/sensor.py +++ b/homeassistant/components/pvoutput/sensor.py @@ -28,7 +28,7 @@ from .const import CONF_SYSTEM_ID, DOMAIN from .coordinator import PVOutputDataUpdateCoordinator -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class PVOutputSensorEntityDescription(SensorEntityDescription): """Describes a PVOutput sensor entity.""" diff --git a/homeassistant/components/qbittorrent/sensor.py b/homeassistant/components/qbittorrent/sensor.py index e2feee1e60c..0e6bc071125 100644 --- a/homeassistant/components/qbittorrent/sensor.py +++ b/homeassistant/components/qbittorrent/sensor.py @@ -29,14 +29,14 @@ SENSOR_TYPE_DOWNLOAD_SPEED = "download_speed" SENSOR_TYPE_UPLOAD_SPEED = "upload_speed" -@dataclass +@dataclass(frozen=True) class QBittorrentMixin: """Mixin for required keys.""" value_fn: Callable[[dict[str, Any]], StateType] -@dataclass +@dataclass(frozen=True) class QBittorrentSensorEntityDescription(SensorEntityDescription, QBittorrentMixin): """Describes QBittorrent sensor entity.""" diff --git a/homeassistant/components/qnap_qsw/binary_sensor.py b/homeassistant/components/qnap_qsw/binary_sensor.py index 5c3fbe13aff..f655beee3d4 100644 --- a/homeassistant/components/qnap_qsw/binary_sensor.py +++ b/homeassistant/components/qnap_qsw/binary_sensor.py @@ -30,7 +30,7 @@ from .coordinator import QswDataCoordinator from .entity import QswEntityDescription, QswEntityType, QswSensorEntity -@dataclass +@dataclass(frozen=True) class QswBinarySensorEntityDescription( BinarySensorEntityDescription, QswEntityDescription ): diff --git a/homeassistant/components/qnap_qsw/button.py b/homeassistant/components/qnap_qsw/button.py index acd8d3bd1ef..c2c4f9f6043 100644 --- a/homeassistant/components/qnap_qsw/button.py +++ b/homeassistant/components/qnap_qsw/button.py @@ -22,14 +22,14 @@ from .coordinator import QswDataCoordinator from .entity import QswDataEntity -@dataclass +@dataclass(frozen=True) class QswButtonDescriptionMixin: """Mixin to describe a Button entity.""" press_action: Callable[[QnapQswApi], Awaitable[bool]] -@dataclass +@dataclass(frozen=True) class QswButtonDescription(ButtonEntityDescription, QswButtonDescriptionMixin): """Class to describe a Button entity.""" diff --git a/homeassistant/components/qnap_qsw/entity.py b/homeassistant/components/qnap_qsw/entity.py index 4bbfba423e9..de92afe69a2 100644 --- a/homeassistant/components/qnap_qsw/entity.py +++ b/homeassistant/components/qnap_qsw/entity.py @@ -83,13 +83,14 @@ class QswDataEntity(CoordinatorEntity[QswDataCoordinator]): return value -@dataclass +@dataclass(frozen=True) class QswEntityDescriptionMixin: """Mixin to describe a QSW entity.""" subkey: str +@dataclass(frozen=True) class QswEntityDescription(EntityDescription, QswEntityDescriptionMixin): """Class to describe a QSW entity.""" diff --git a/homeassistant/components/qnap_qsw/sensor.py b/homeassistant/components/qnap_qsw/sensor.py index 0c287c66073..3168e4511d2 100644 --- a/homeassistant/components/qnap_qsw/sensor.py +++ b/homeassistant/components/qnap_qsw/sensor.py @@ -50,7 +50,7 @@ from .coordinator import QswDataCoordinator from .entity import QswEntityDescription, QswEntityType, QswSensorEntity -@dataclass +@dataclass(frozen=True) class QswSensorEntityDescription(SensorEntityDescription, QswEntityDescription): """A class that describes QNAP QSW sensor entities.""" diff --git a/homeassistant/components/radarr/sensor.py b/homeassistant/components/radarr/sensor.py index f36516ac05b..ad9dd4e1ae0 100644 --- a/homeassistant/components/radarr/sensor.py +++ b/homeassistant/components/radarr/sensor.py @@ -47,14 +47,14 @@ def get_modified_description( return desc, name -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class RadarrSensorEntityDescriptionMixIn(Generic[T]): """Mixin for required keys.""" value_fn: Callable[[T, str], str | int | datetime] -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class RadarrSensorEntityDescription( SensorEntityDescription, RadarrSensorEntityDescriptionMixIn[T], Generic[T] ): diff --git a/homeassistant/components/rainmachine/binary_sensor.py b/homeassistant/components/rainmachine/binary_sensor.py index 7f93db67c4c..f0cbfd636fa 100644 --- a/homeassistant/components/rainmachine/binary_sensor.py +++ b/homeassistant/components/rainmachine/binary_sensor.py @@ -32,7 +32,7 @@ TYPE_RAINSENSOR = "rainsensor" TYPE_WEEKDAY = "weekday" -@dataclass +@dataclass(frozen=True) class RainMachineBinarySensorDescription( BinarySensorEntityDescription, RainMachineEntityDescription, diff --git a/homeassistant/components/rainmachine/button.py b/homeassistant/components/rainmachine/button.py index 82829094957..a13d2069007 100644 --- a/homeassistant/components/rainmachine/button.py +++ b/homeassistant/components/rainmachine/button.py @@ -24,14 +24,14 @@ from .const import DATA_PROVISION_SETTINGS, DOMAIN from .model import RainMachineEntityDescription -@dataclass +@dataclass(frozen=True) class RainMachineButtonDescriptionMixin: """Define an entity description mixin for RainMachine buttons.""" push_action: Callable[[Controller], Awaitable] -@dataclass +@dataclass(frozen=True) class RainMachineButtonDescription( ButtonEntityDescription, RainMachineEntityDescription, diff --git a/homeassistant/components/rainmachine/model.py b/homeassistant/components/rainmachine/model.py index 9ae99fe247a..e45448c0fe4 100644 --- a/homeassistant/components/rainmachine/model.py +++ b/homeassistant/components/rainmachine/model.py @@ -4,28 +4,28 @@ from dataclasses import dataclass from homeassistant.helpers.entity import EntityDescription -@dataclass +@dataclass(frozen=True) class RainMachineEntityDescriptionMixinApiCategory: """Define an entity description mixin to include an API category.""" api_category: str -@dataclass +@dataclass(frozen=True) class RainMachineEntityDescriptionMixinDataKey: """Define an entity description mixin to include a data payload key.""" data_key: str -@dataclass +@dataclass(frozen=True) class RainMachineEntityDescriptionMixinUid: """Define an entity description mixin to include an activity UID.""" uid: int -@dataclass +@dataclass(frozen=True) class RainMachineEntityDescription( EntityDescription, RainMachineEntityDescriptionMixinApiCategory ): diff --git a/homeassistant/components/rainmachine/select.py b/homeassistant/components/rainmachine/select.py index 2a5bc93f601..513c02ddc19 100644 --- a/homeassistant/components/rainmachine/select.py +++ b/homeassistant/components/rainmachine/select.py @@ -22,7 +22,7 @@ from .model import ( from .util import key_exists -@dataclass +@dataclass(frozen=True) class RainMachineSelectDescription( SelectEntityDescription, RainMachineEntityDescription, @@ -40,14 +40,14 @@ class FreezeProtectionSelectOption: metric_label: str -@dataclass +@dataclass(frozen=True) class FreezeProtectionTemperatureMixin: """Define an entity description mixin to include an options list.""" extended_options: list[FreezeProtectionSelectOption] -@dataclass +@dataclass(frozen=True) class FreezeProtectionSelectDescription( RainMachineSelectDescription, FreezeProtectionTemperatureMixin ): diff --git a/homeassistant/components/rainmachine/sensor.py b/homeassistant/components/rainmachine/sensor.py index bdae62c1bd8..624deeb46c6 100644 --- a/homeassistant/components/rainmachine/sensor.py +++ b/homeassistant/components/rainmachine/sensor.py @@ -48,7 +48,7 @@ TYPE_RAIN_SENSOR_RAIN_START = "rain_sensor_rain_start" TYPE_ZONE_RUN_COMPLETION_TIME = "zone_run_completion_time" -@dataclass +@dataclass(frozen=True) class RainMachineSensorDataDescription( SensorEntityDescription, RainMachineEntityDescription, @@ -57,7 +57,7 @@ class RainMachineSensorDataDescription( """Describe a RainMachine sensor.""" -@dataclass +@dataclass(frozen=True) class RainMachineSensorCompletionTimerDescription( SensorEntityDescription, RainMachineEntityDescription, diff --git a/homeassistant/components/rainmachine/switch.py b/homeassistant/components/rainmachine/switch.py index e6ed92d04dc..361f8b2583b 100644 --- a/homeassistant/components/rainmachine/switch.py +++ b/homeassistant/components/rainmachine/switch.py @@ -133,7 +133,7 @@ def raise_on_request_error( return decorator -@dataclass +@dataclass(frozen=True) class RainMachineSwitchDescription( SwitchEntityDescription, RainMachineEntityDescription, @@ -141,14 +141,14 @@ class RainMachineSwitchDescription( """Describe a RainMachine switch.""" -@dataclass +@dataclass(frozen=True) class RainMachineActivitySwitchDescription( RainMachineSwitchDescription, RainMachineEntityDescriptionMixinUid ): """Describe a RainMachine activity (program/zone) switch.""" -@dataclass +@dataclass(frozen=True) class RainMachineRestrictionSwitchDescription( RainMachineSwitchDescription, RainMachineEntityDescriptionMixinDataKey ): diff --git a/homeassistant/components/rdw/binary_sensor.py b/homeassistant/components/rdw/binary_sensor.py index 96311266db4..ce8e2908251 100644 --- a/homeassistant/components/rdw/binary_sensor.py +++ b/homeassistant/components/rdw/binary_sensor.py @@ -23,7 +23,7 @@ from homeassistant.helpers.update_coordinator import ( from .const import DOMAIN -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class RDWBinarySensorEntityDescription(BinarySensorEntityDescription): """Describes RDW binary sensor entity.""" diff --git a/homeassistant/components/rdw/sensor.py b/homeassistant/components/rdw/sensor.py index d25c23c09bd..a6ad9047852 100644 --- a/homeassistant/components/rdw/sensor.py +++ b/homeassistant/components/rdw/sensor.py @@ -24,7 +24,7 @@ from homeassistant.helpers.update_coordinator import ( from .const import CONF_LICENSE_PLATE, DOMAIN -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class RDWSensorEntityDescription(SensorEntityDescription): """Describes RDW sensor entity.""" diff --git a/homeassistant/components/renault/binary_sensor.py b/homeassistant/components/renault/binary_sensor.py index ef2d7196f04..0d66e5444e7 100644 --- a/homeassistant/components/renault/binary_sensor.py +++ b/homeassistant/components/renault/binary_sensor.py @@ -22,7 +22,7 @@ from .entity import RenaultDataEntity, RenaultDataEntityDescription from .renault_hub import RenaultHub -@dataclass +@dataclass(frozen=True) class RenaultBinarySensorRequiredKeysMixin: """Mixin for required keys.""" @@ -30,7 +30,7 @@ class RenaultBinarySensorRequiredKeysMixin: on_value: StateType -@dataclass +@dataclass(frozen=True) class RenaultBinarySensorEntityDescription( BinarySensorEntityDescription, RenaultDataEntityDescription, diff --git a/homeassistant/components/renault/button.py b/homeassistant/components/renault/button.py index 5f916a2d140..87883204890 100644 --- a/homeassistant/components/renault/button.py +++ b/homeassistant/components/renault/button.py @@ -15,14 +15,14 @@ from .entity import RenaultEntity from .renault_hub import RenaultHub -@dataclass +@dataclass(frozen=True) class RenaultButtonRequiredKeysMixin: """Mixin for required keys.""" async_press: Callable[[RenaultButtonEntity], Coroutine[Any, Any, Any]] -@dataclass +@dataclass(frozen=True) class RenaultButtonEntityDescription( ButtonEntityDescription, RenaultButtonRequiredKeysMixin ): diff --git a/homeassistant/components/renault/entity.py b/homeassistant/components/renault/entity.py index aa83c935957..fd7f0eb3654 100644 --- a/homeassistant/components/renault/entity.py +++ b/homeassistant/components/renault/entity.py @@ -12,14 +12,14 @@ from .coordinator import RenaultDataUpdateCoordinator, T from .renault_vehicle import RenaultVehicleProxy -@dataclass +@dataclass(frozen=True) class RenaultDataRequiredKeysMixin: """Mixin for required keys.""" coordinator: str -@dataclass +@dataclass(frozen=True) class RenaultDataEntityDescription(EntityDescription, RenaultDataRequiredKeysMixin): """Class describing Renault data entities.""" diff --git a/homeassistant/components/renault/select.py b/homeassistant/components/renault/select.py index 1ec891a51e4..9dcc52abc87 100644 --- a/homeassistant/components/renault/select.py +++ b/homeassistant/components/renault/select.py @@ -18,7 +18,7 @@ from .entity import RenaultDataEntity, RenaultDataEntityDescription from .renault_hub import RenaultHub -@dataclass +@dataclass(frozen=True) class RenaultSelectRequiredKeysMixin: """Mixin for required keys.""" @@ -26,7 +26,7 @@ class RenaultSelectRequiredKeysMixin: icon_lambda: Callable[[RenaultSelectEntity], str] -@dataclass +@dataclass(frozen=True) class RenaultSelectEntityDescription( SelectEntityDescription, RenaultDataEntityDescription, diff --git a/homeassistant/components/renault/sensor.py b/homeassistant/components/renault/sensor.py index 92deb3438de..d30b8d01fb3 100644 --- a/homeassistant/components/renault/sensor.py +++ b/homeassistant/components/renault/sensor.py @@ -43,7 +43,7 @@ from .renault_hub import RenaultHub from .renault_vehicle import RenaultVehicleProxy -@dataclass +@dataclass(frozen=True) class RenaultSensorRequiredKeysMixin(Generic[T]): """Mixin for required keys.""" @@ -51,7 +51,7 @@ class RenaultSensorRequiredKeysMixin(Generic[T]): entity_class: type[RenaultSensor[T]] -@dataclass +@dataclass(frozen=True) class RenaultSensorEntityDescription( SensorEntityDescription, RenaultDataEntityDescription, diff --git a/homeassistant/components/renson/binary_sensor.py b/homeassistant/components/renson/binary_sensor.py index 39c2b1b883d..012ecee2e98 100644 --- a/homeassistant/components/renson/binary_sensor.py +++ b/homeassistant/components/renson/binary_sensor.py @@ -30,14 +30,14 @@ from .coordinator import RensonCoordinator from .entity import RensonEntity -@dataclass +@dataclass(frozen=True) class RensonBinarySensorEntityDescriptionMixin: """Mixin for required keys.""" field: FieldEnum -@dataclass +@dataclass(frozen=True) class RensonBinarySensorEntityDescription( BinarySensorEntityDescription, RensonBinarySensorEntityDescriptionMixin ): diff --git a/homeassistant/components/renson/button.py b/homeassistant/components/renson/button.py index a91a057e0e7..117fadb502b 100644 --- a/homeassistant/components/renson/button.py +++ b/homeassistant/components/renson/button.py @@ -21,14 +21,14 @@ from .const import DOMAIN from .entity import RensonEntity -@dataclass +@dataclass(frozen=True) class RensonButtonEntityDescriptionMixin: """Action function called on press.""" action_fn: Callable[[RensonVentilation], None] -@dataclass +@dataclass(frozen=True) class RensonButtonEntityDescription( ButtonEntityDescription, RensonButtonEntityDescriptionMixin ): diff --git a/homeassistant/components/renson/sensor.py b/homeassistant/components/renson/sensor.py index 004be661f02..380a83b6818 100644 --- a/homeassistant/components/renson/sensor.py +++ b/homeassistant/components/renson/sensor.py @@ -52,7 +52,7 @@ from .coordinator import RensonCoordinator from .entity import RensonEntity -@dataclass +@dataclass(frozen=True) class RensonSensorEntityDescriptionMixin: """Mixin for required keys.""" @@ -60,7 +60,7 @@ class RensonSensorEntityDescriptionMixin: raw_format: bool -@dataclass +@dataclass(frozen=True) class RensonSensorEntityDescription( SensorEntityDescription, RensonSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/reolink/binary_sensor.py b/homeassistant/components/reolink/binary_sensor.py index 226b81b1c74..03b30d8195e 100644 --- a/homeassistant/components/reolink/binary_sensor.py +++ b/homeassistant/components/reolink/binary_sensor.py @@ -28,7 +28,7 @@ from .const import DOMAIN from .entity import ReolinkChannelCoordinatorEntity, ReolinkChannelEntityDescription -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkBinarySensorEntityDescription( BinarySensorEntityDescription, ReolinkChannelEntityDescription, diff --git a/homeassistant/components/reolink/button.py b/homeassistant/components/reolink/button.py index 88204d9a806..5656f178db6 100644 --- a/homeassistant/components/reolink/button.py +++ b/homeassistant/components/reolink/button.py @@ -38,7 +38,7 @@ ATTR_SPEED = "speed" SUPPORT_PTZ_SPEED = CameraEntityFeature.STREAM -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkButtonEntityDescription( ButtonEntityDescription, ReolinkChannelEntityDescription, @@ -50,7 +50,7 @@ class ReolinkButtonEntityDescription( ptz_cmd: str | None = None -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkHostButtonEntityDescription( ButtonEntityDescription, ReolinkHostEntityDescription, diff --git a/homeassistant/components/reolink/camera.py b/homeassistant/components/reolink/camera.py index 2ad8105c66c..715588a8225 100644 --- a/homeassistant/components/reolink/camera.py +++ b/homeassistant/components/reolink/camera.py @@ -24,7 +24,7 @@ from .entity import ReolinkChannelCoordinatorEntity, ReolinkChannelEntityDescrip _LOGGER = logging.getLogger(__name__) -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkCameraEntityDescription( CameraEntityDescription, ReolinkChannelEntityDescription, diff --git a/homeassistant/components/reolink/entity.py b/homeassistant/components/reolink/entity.py index 8da64991c27..042e6b45717 100644 --- a/homeassistant/components/reolink/entity.py +++ b/homeassistant/components/reolink/entity.py @@ -20,7 +20,7 @@ from .const import DOMAIN _T = TypeVar("_T") -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkChannelEntityDescription(EntityDescription): """A class that describes entities for a camera channel.""" @@ -28,7 +28,7 @@ class ReolinkChannelEntityDescription(EntityDescription): supported: Callable[[Host, int], bool] = lambda api, ch: True -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkHostEntityDescription(EntityDescription): """A class that describes host entities.""" diff --git a/homeassistant/components/reolink/light.py b/homeassistant/components/reolink/light.py index bc739343c46..222ab984e3f 100644 --- a/homeassistant/components/reolink/light.py +++ b/homeassistant/components/reolink/light.py @@ -25,7 +25,7 @@ from .const import DOMAIN from .entity import ReolinkChannelCoordinatorEntity, ReolinkChannelEntityDescription -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkLightEntityDescription( LightEntityDescription, ReolinkChannelEntityDescription, diff --git a/homeassistant/components/reolink/number.py b/homeassistant/components/reolink/number.py index aaf549453ed..09869b06e96 100644 --- a/homeassistant/components/reolink/number.py +++ b/homeassistant/components/reolink/number.py @@ -24,7 +24,7 @@ from .const import DOMAIN from .entity import ReolinkChannelCoordinatorEntity, ReolinkChannelEntityDescription -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkNumberEntityDescription( NumberEntityDescription, ReolinkChannelEntityDescription, diff --git a/homeassistant/components/reolink/select.py b/homeassistant/components/reolink/select.py index eb2ea58cc40..769ccdf7e01 100644 --- a/homeassistant/components/reolink/select.py +++ b/homeassistant/components/reolink/select.py @@ -29,7 +29,7 @@ from .entity import ReolinkChannelCoordinatorEntity, ReolinkChannelEntityDescrip _LOGGER = logging.getLogger(__name__) -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkSelectEntityDescription( SelectEntityDescription, ReolinkChannelEntityDescription, diff --git a/homeassistant/components/reolink/sensor.py b/homeassistant/components/reolink/sensor.py index 5eef880fc91..6f4af489fe5 100644 --- a/homeassistant/components/reolink/sensor.py +++ b/homeassistant/components/reolink/sensor.py @@ -29,7 +29,7 @@ from .entity import ( ) -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkSensorEntityDescription( SensorEntityDescription, ReolinkChannelEntityDescription, @@ -39,7 +39,7 @@ class ReolinkSensorEntityDescription( value: Callable[[Host, int], int] -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkHostSensorEntityDescription( SensorEntityDescription, ReolinkHostEntityDescription, diff --git a/homeassistant/components/reolink/siren.py b/homeassistant/components/reolink/siren.py index ec709f6ae3d..90590acb4e4 100644 --- a/homeassistant/components/reolink/siren.py +++ b/homeassistant/components/reolink/siren.py @@ -23,7 +23,7 @@ from .const import DOMAIN from .entity import ReolinkChannelCoordinatorEntity, ReolinkChannelEntityDescription -@dataclass +@dataclass(frozen=True) class ReolinkSirenEntityDescription( SirenEntityDescription, ReolinkChannelEntityDescription ): diff --git a/homeassistant/components/reolink/switch.py b/homeassistant/components/reolink/switch.py index 2ec3149dc8d..7f57b78df1e 100644 --- a/homeassistant/components/reolink/switch.py +++ b/homeassistant/components/reolink/switch.py @@ -25,7 +25,7 @@ from .entity import ( ) -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkSwitchEntityDescription( SwitchEntityDescription, ReolinkChannelEntityDescription, @@ -36,7 +36,7 @@ class ReolinkSwitchEntityDescription( value: Callable[[Host, int], bool] -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class ReolinkNVRSwitchEntityDescription( SwitchEntityDescription, ReolinkHostEntityDescription, diff --git a/homeassistant/components/repetier/__init__.py b/homeassistant/components/repetier/__init__.py index 6a0df99ce1d..91a16ea3fbe 100644 --- a/homeassistant/components/repetier/__init__.py +++ b/homeassistant/components/repetier/__init__.py @@ -124,14 +124,14 @@ def has_all_unique_names(value): return value -@dataclass +@dataclass(frozen=True) class RepetierRequiredKeysMixin: """Mixin for required keys.""" type: str -@dataclass +@dataclass(frozen=True) class RepetierSensorEntityDescription( SensorEntityDescription, RepetierRequiredKeysMixin ): diff --git a/homeassistant/components/rfxtrx/sensor.py b/homeassistant/components/rfxtrx/sensor.py index 60f35a93d1a..66803edffc5 100644 --- a/homeassistant/components/rfxtrx/sensor.py +++ b/homeassistant/components/rfxtrx/sensor.py @@ -58,7 +58,7 @@ def _rssi_convert(value: int | None) -> str | None: return f"{value*8-120}" -@dataclass +@dataclass(frozen=True) class RfxtrxSensorEntityDescription(SensorEntityDescription): """Description of sensor entities.""" diff --git a/homeassistant/components/ring/binary_sensor.py b/homeassistant/components/ring/binary_sensor.py index 05d26812f54..27eb82d34ee 100644 --- a/homeassistant/components/ring/binary_sensor.py +++ b/homeassistant/components/ring/binary_sensor.py @@ -18,14 +18,14 @@ from .const import DOMAIN, RING_API, RING_DEVICES, RING_NOTIFICATIONS_COORDINATO from .entity import RingEntityMixin -@dataclass +@dataclass(frozen=True) class RingRequiredKeysMixin: """Mixin for required keys.""" category: list[str] -@dataclass +@dataclass(frozen=True) class RingBinarySensorEntityDescription( BinarySensorEntityDescription, RingRequiredKeysMixin ): diff --git a/homeassistant/components/ring/sensor.py b/homeassistant/components/ring/sensor.py index 465f6196689..a596d413ac7 100644 --- a/homeassistant/components/ring/sensor.py +++ b/homeassistant/components/ring/sensor.py @@ -173,7 +173,7 @@ class HistoryRingSensor(RingSensor): return attrs -@dataclass +@dataclass(frozen=True) class RingRequiredKeysMixin: """Mixin for required keys.""" @@ -181,7 +181,7 @@ class RingRequiredKeysMixin: cls: type[RingSensor] -@dataclass +@dataclass(frozen=True) class RingSensorEntityDescription(SensorEntityDescription, RingRequiredKeysMixin): """Describes Ring sensor entity.""" diff --git a/homeassistant/components/rituals_perfume_genie/binary_sensor.py b/homeassistant/components/rituals_perfume_genie/binary_sensor.py index ab13898394c..f33a687b88f 100644 --- a/homeassistant/components/rituals_perfume_genie/binary_sensor.py +++ b/homeassistant/components/rituals_perfume_genie/binary_sensor.py @@ -21,7 +21,7 @@ from .coordinator import RitualsDataUpdateCoordinator from .entity import DiffuserEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class RitualsBinarySensorEntityDescription(BinarySensorEntityDescription): """Class describing Rituals binary sensor entities.""" diff --git a/homeassistant/components/rituals_perfume_genie/number.py b/homeassistant/components/rituals_perfume_genie/number.py index 35b5a3bd008..164b6de52c9 100644 --- a/homeassistant/components/rituals_perfume_genie/number.py +++ b/homeassistant/components/rituals_perfume_genie/number.py @@ -17,7 +17,7 @@ from .coordinator import RitualsDataUpdateCoordinator from .entity import DiffuserEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class RitualsNumberEntityDescription(NumberEntityDescription): """Class describing Rituals number entities.""" diff --git a/homeassistant/components/rituals_perfume_genie/select.py b/homeassistant/components/rituals_perfume_genie/select.py index 2126ecb147f..b9f0c29b267 100644 --- a/homeassistant/components/rituals_perfume_genie/select.py +++ b/homeassistant/components/rituals_perfume_genie/select.py @@ -17,7 +17,7 @@ from .coordinator import RitualsDataUpdateCoordinator from .entity import DiffuserEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class RitualsSelectEntityDescription(SelectEntityDescription): """Class describing Rituals select entities.""" diff --git a/homeassistant/components/rituals_perfume_genie/sensor.py b/homeassistant/components/rituals_perfume_genie/sensor.py index 5f7ae45d330..cd139c94f1c 100644 --- a/homeassistant/components/rituals_perfume_genie/sensor.py +++ b/homeassistant/components/rituals_perfume_genie/sensor.py @@ -21,7 +21,7 @@ from .coordinator import RitualsDataUpdateCoordinator from .entity import DiffuserEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class RitualsSensorEntityDescription(SensorEntityDescription): """Class describing Rituals sensor entities.""" diff --git a/homeassistant/components/rituals_perfume_genie/switch.py b/homeassistant/components/rituals_perfume_genie/switch.py index 77776704a60..9c9a5f73d16 100644 --- a/homeassistant/components/rituals_perfume_genie/switch.py +++ b/homeassistant/components/rituals_perfume_genie/switch.py @@ -17,7 +17,7 @@ from .coordinator import RitualsDataUpdateCoordinator from .entity import DiffuserEntity -@dataclass +@dataclass(frozen=True) class RitualsEntityDescriptionMixin: """Mixin values for Rituals entities.""" @@ -26,7 +26,7 @@ class RitualsEntityDescriptionMixin: turn_off_fn: Callable[[Diffuser], Awaitable[None]] -@dataclass +@dataclass(frozen=True) class RitualsSwitchEntityDescription( SwitchEntityDescription, RitualsEntityDescriptionMixin ): diff --git a/homeassistant/components/roborock/binary_sensor.py b/homeassistant/components/roborock/binary_sensor.py index 203f981e51d..03e1eabe45a 100644 --- a/homeassistant/components/roborock/binary_sensor.py +++ b/homeassistant/components/roborock/binary_sensor.py @@ -22,14 +22,14 @@ from .coordinator import RoborockDataUpdateCoordinator from .device import RoborockCoordinatedEntity -@dataclass +@dataclass(frozen=True) class RoborockBinarySensorDescriptionMixin: """A class that describes binary sensor entities.""" value_fn: Callable[[DeviceProp], bool | int | None] -@dataclass +@dataclass(frozen=True) class RoborockBinarySensorDescription( BinarySensorEntityDescription, RoborockBinarySensorDescriptionMixin ): diff --git a/homeassistant/components/roborock/button.py b/homeassistant/components/roborock/button.py index aba86ccb6b6..7744c5988d8 100644 --- a/homeassistant/components/roborock/button.py +++ b/homeassistant/components/roborock/button.py @@ -17,7 +17,7 @@ from .coordinator import RoborockDataUpdateCoordinator from .device import RoborockEntity -@dataclass +@dataclass(frozen=True) class RoborockButtonDescriptionMixin: """Define an entity description mixin for button entities.""" @@ -25,7 +25,7 @@ class RoborockButtonDescriptionMixin: param: list | dict | None -@dataclass +@dataclass(frozen=True) class RoborockButtonDescription( ButtonEntityDescription, RoborockButtonDescriptionMixin ): diff --git a/homeassistant/components/roborock/number.py b/homeassistant/components/roborock/number.py index d91606418d9..8957c487a64 100644 --- a/homeassistant/components/roborock/number.py +++ b/homeassistant/components/roborock/number.py @@ -23,7 +23,7 @@ from .device import RoborockEntity _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class RoborockNumberDescriptionMixin: """Define an entity description mixin for button entities.""" @@ -33,7 +33,7 @@ class RoborockNumberDescriptionMixin: update_value: Callable[[AttributeCache, float], Coroutine[Any, Any, dict]] -@dataclass +@dataclass(frozen=True) class RoborockNumberDescription( NumberEntityDescription, RoborockNumberDescriptionMixin ): diff --git a/homeassistant/components/roborock/select.py b/homeassistant/components/roborock/select.py index 1a05f3ec9c1..ae5dd12689d 100644 --- a/homeassistant/components/roborock/select.py +++ b/homeassistant/components/roborock/select.py @@ -18,7 +18,7 @@ from .coordinator import RoborockDataUpdateCoordinator from .device import RoborockCoordinatedEntity -@dataclass +@dataclass(frozen=True) class RoborockSelectDescriptionMixin: """Define an entity description mixin for select entities.""" @@ -32,7 +32,7 @@ class RoborockSelectDescriptionMixin: parameter_lambda: Callable[[str, Status], list[int]] -@dataclass +@dataclass(frozen=True) class RoborockSelectDescription( SelectEntityDescription, RoborockSelectDescriptionMixin ): diff --git a/homeassistant/components/roborock/sensor.py b/homeassistant/components/roborock/sensor.py index 775fc0cfb5f..e3cea00476f 100644 --- a/homeassistant/components/roborock/sensor.py +++ b/homeassistant/components/roborock/sensor.py @@ -36,14 +36,14 @@ from .coordinator import RoborockDataUpdateCoordinator from .device import RoborockCoordinatedEntity -@dataclass +@dataclass(frozen=True) class RoborockSensorDescriptionMixin: """A class that describes sensor entities.""" value_fn: Callable[[DeviceProp], StateType | datetime.datetime] -@dataclass +@dataclass(frozen=True) class RoborockSensorDescription( SensorEntityDescription, RoborockSensorDescriptionMixin ): diff --git a/homeassistant/components/roborock/switch.py b/homeassistant/components/roborock/switch.py index 3dd7307da72..37e8488dd22 100644 --- a/homeassistant/components/roborock/switch.py +++ b/homeassistant/components/roborock/switch.py @@ -24,7 +24,7 @@ from .device import RoborockEntity _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class RoborockSwitchDescriptionMixin: """Define an entity description mixin for switch entities.""" @@ -36,7 +36,7 @@ class RoborockSwitchDescriptionMixin: attribute: str -@dataclass +@dataclass(frozen=True) class RoborockSwitchDescription( SwitchEntityDescription, RoborockSwitchDescriptionMixin ): diff --git a/homeassistant/components/roborock/time.py b/homeassistant/components/roborock/time.py index d02d63597ac..7a8d21fc0f1 100644 --- a/homeassistant/components/roborock/time.py +++ b/homeassistant/components/roborock/time.py @@ -25,7 +25,7 @@ from .device import RoborockEntity _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class RoborockTimeDescriptionMixin: """Define an entity description mixin for time entities.""" @@ -37,7 +37,7 @@ class RoborockTimeDescriptionMixin: get_value: Callable[[AttributeCache], datetime.time] -@dataclass +@dataclass(frozen=True) class RoborockTimeDescription(TimeEntityDescription, RoborockTimeDescriptionMixin): """Class to describe an Roborock time entity.""" diff --git a/homeassistant/components/roku/binary_sensor.py b/homeassistant/components/roku/binary_sensor.py index b08933dcd91..144fded24b9 100644 --- a/homeassistant/components/roku/binary_sensor.py +++ b/homeassistant/components/roku/binary_sensor.py @@ -19,14 +19,14 @@ from .const import DOMAIN from .entity import RokuEntity -@dataclass +@dataclass(frozen=True) class RokuBinarySensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[RokuDevice], bool | None] -@dataclass +@dataclass(frozen=True) class RokuBinarySensorEntityDescription( BinarySensorEntityDescription, RokuBinarySensorEntityDescriptionMixin ): diff --git a/homeassistant/components/roku/select.py b/homeassistant/components/roku/select.py index 430133b7f77..ef0f198f586 100644 --- a/homeassistant/components/roku/select.py +++ b/homeassistant/components/roku/select.py @@ -18,7 +18,7 @@ from .entity import RokuEntity from .helpers import format_channel_name, roku_exception_handler -@dataclass +@dataclass(frozen=True) class RokuSelectEntityDescriptionMixin: """Mixin for required keys.""" @@ -85,7 +85,7 @@ async def _tune_channel(device: RokuDevice, roku: Roku, value: str) -> None: await roku.tune(_channel.number) -@dataclass +@dataclass(frozen=True) class RokuSelectEntityDescription( SelectEntityDescription, RokuSelectEntityDescriptionMixin ): diff --git a/homeassistant/components/roku/sensor.py b/homeassistant/components/roku/sensor.py index 69b8c34d312..b462b8c531b 100644 --- a/homeassistant/components/roku/sensor.py +++ b/homeassistant/components/roku/sensor.py @@ -17,14 +17,14 @@ from .coordinator import RokuDataUpdateCoordinator from .entity import RokuEntity -@dataclass +@dataclass(frozen=True) class RokuSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[RokuDevice], str | None] -@dataclass +@dataclass(frozen=True) class RokuSensorEntityDescription( SensorEntityDescription, RokuSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/roomba/sensor.py b/homeassistant/components/roomba/sensor.py index 7d103111301..09d4d643be9 100644 --- a/homeassistant/components/roomba/sensor.py +++ b/homeassistant/components/roomba/sensor.py @@ -21,14 +21,14 @@ from .irobot_base import IRobotEntity from .models import RoombaData -@dataclass +@dataclass(frozen=True) class RoombaSensorEntityDescriptionMixin: """Mixin for describing Roomba data.""" value_fn: Callable[[IRobotEntity], StateType] -@dataclass +@dataclass(frozen=True) class RoombaSensorEntityDescription( SensorEntityDescription, RoombaSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/sabnzbd/sensor.py b/homeassistant/components/sabnzbd/sensor.py index d4920ef77f3..ff33c084ffa 100644 --- a/homeassistant/components/sabnzbd/sensor.py +++ b/homeassistant/components/sabnzbd/sensor.py @@ -20,14 +20,14 @@ from . import DOMAIN, SIGNAL_SABNZBD_UPDATED from .const import DEFAULT_NAME, KEY_API_DATA -@dataclass +@dataclass(frozen=True) class SabnzbdRequiredKeysMixin: """Mixin for required keys.""" key: str -@dataclass +@dataclass(frozen=True) class SabnzbdSensorEntityDescription(SensorEntityDescription, SabnzbdRequiredKeysMixin): """Describes Sabnzbd sensor entity.""" diff --git a/homeassistant/components/schlage/binary_sensor.py b/homeassistant/components/schlage/binary_sensor.py index 749a961a53b..5c97a903c72 100644 --- a/homeassistant/components/schlage/binary_sensor.py +++ b/homeassistant/components/schlage/binary_sensor.py @@ -20,7 +20,7 @@ from .coordinator import LockData, SchlageDataUpdateCoordinator from .entity import SchlageEntity -@dataclass +@dataclass(frozen=True) class SchlageBinarySensorEntityDescriptionMixin: """Mixin for required keys.""" @@ -32,7 +32,7 @@ class SchlageBinarySensorEntityDescriptionMixin: value_fn: Callable[[LockData], bool] -@dataclass +@dataclass(frozen=True) class SchlageBinarySensorEntityDescription( BinarySensorEntityDescription, SchlageBinarySensorEntityDescriptionMixin ): diff --git a/homeassistant/components/schlage/switch.py b/homeassistant/components/schlage/switch.py index 1a4eeb7bcc7..36c8fa74244 100644 --- a/homeassistant/components/schlage/switch.py +++ b/homeassistant/components/schlage/switch.py @@ -24,7 +24,7 @@ from .coordinator import SchlageDataUpdateCoordinator from .entity import SchlageEntity -@dataclass +@dataclass(frozen=True) class SchlageSwitchEntityDescriptionMixin: """Mixin for required keys.""" @@ -38,7 +38,7 @@ class SchlageSwitchEntityDescriptionMixin: value_fn: Callable[[Lock], bool] -@dataclass +@dataclass(frozen=True) class SchlageSwitchEntityDescription( SwitchEntityDescription, SchlageSwitchEntityDescriptionMixin ): diff --git a/homeassistant/components/screenlogic/binary_sensor.py b/homeassistant/components/screenlogic/binary_sensor.py index eb808835c58..cb73fab90ee 100644 --- a/homeassistant/components/screenlogic/binary_sensor.py +++ b/homeassistant/components/screenlogic/binary_sensor.py @@ -32,14 +32,14 @@ from .util import cleanup_excluded_entity _LOGGER = logging.getLogger(__name__) -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class ScreenLogicBinarySensorDescription( BinarySensorEntityDescription, ScreenLogicEntityDescription ): """A class that describes ScreenLogic binary sensor eneites.""" -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class ScreenLogicPushBinarySensorDescription( ScreenLogicBinarySensorDescription, ScreenLogicPushEntityDescription ): diff --git a/homeassistant/components/screenlogic/climate.py b/homeassistant/components/screenlogic/climate.py index d78c2c16e48..1e9a90395f4 100644 --- a/homeassistant/components/screenlogic/climate.py +++ b/homeassistant/components/screenlogic/climate.py @@ -68,7 +68,7 @@ async def async_setup_entry( async_add_entities(entities) -@dataclass +@dataclass(frozen=True) class ScreenLogicClimateDescription( ClimateEntityDescription, ScreenLogicPushEntityDescription ): diff --git a/homeassistant/components/screenlogic/entity.py b/homeassistant/components/screenlogic/entity.py index 253d16610e4..06551c2736b 100644 --- a/homeassistant/components/screenlogic/entity.py +++ b/homeassistant/components/screenlogic/entity.py @@ -28,14 +28,14 @@ from .util import generate_unique_id _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class ScreenLogicEntityRequiredKeyMixin: """Mixin for required ScreenLogic entity data_path.""" data_root: ScreenLogicDataPath -@dataclass +@dataclass(frozen=True) class ScreenLogicEntityDescription( EntityDescription, ScreenLogicEntityRequiredKeyMixin ): @@ -103,14 +103,14 @@ class ScreenlogicEntity(CoordinatorEntity[ScreenlogicDataUpdateCoordinator]): raise HomeAssistantError(f"Data not found: {self._data_path}") from ke -@dataclass +@dataclass(frozen=True) class ScreenLogicPushEntityRequiredKeyMixin: """Mixin for required key for ScreenLogic push entities.""" subscription_code: CODE -@dataclass +@dataclass(frozen=True) class ScreenLogicPushEntityDescription( ScreenLogicEntityDescription, ScreenLogicPushEntityRequiredKeyMixin, diff --git a/homeassistant/components/screenlogic/light.py b/homeassistant/components/screenlogic/light.py index 80499f7790a..60cf7d52a48 100644 --- a/homeassistant/components/screenlogic/light.py +++ b/homeassistant/components/screenlogic/light.py @@ -60,7 +60,7 @@ async def async_setup_entry( async_add_entities(entities) -@dataclass +@dataclass(frozen=True) class ScreenLogicLightDescription( LightEntityDescription, ScreenLogicPushEntityDescription ): diff --git a/homeassistant/components/screenlogic/number.py b/homeassistant/components/screenlogic/number.py index 091d377a56b..a275705f646 100644 --- a/homeassistant/components/screenlogic/number.py +++ b/homeassistant/components/screenlogic/number.py @@ -29,14 +29,14 @@ _LOGGER = logging.getLogger(__name__) PARALLEL_UPDATES = 1 -@dataclass +@dataclass(frozen=True) class ScreenLogicNumberRequiredMixin: """Describes a required mixin for a ScreenLogic number entity.""" set_value_name: str -@dataclass +@dataclass(frozen=True) class ScreenLogicNumberDescription( NumberEntityDescription, ScreenLogicEntityDescription, diff --git a/homeassistant/components/screenlogic/sensor.py b/homeassistant/components/screenlogic/sensor.py index 5cb4e5acfe9..87bc101a074 100644 --- a/homeassistant/components/screenlogic/sensor.py +++ b/homeassistant/components/screenlogic/sensor.py @@ -35,21 +35,21 @@ from .util import cleanup_excluded_entity, get_ha_unit _LOGGER = logging.getLogger(__name__) -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class ScreenLogicSensorMixin: """Mixin for SecreenLogic sensor entity.""" value_mod: Callable[[int | str], int | str] | None = None -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class ScreenLogicSensorDescription( ScreenLogicSensorMixin, SensorEntityDescription, ScreenLogicEntityDescription ): """Describes a ScreenLogic sensor.""" -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class ScreenLogicPushSensorDescription( ScreenLogicSensorDescription, ScreenLogicPushEntityDescription ): diff --git a/homeassistant/components/screenlogic/switch.py b/homeassistant/components/screenlogic/switch.py index 4900ed938a1..e64f7a3a164 100644 --- a/homeassistant/components/screenlogic/switch.py +++ b/homeassistant/components/screenlogic/switch.py @@ -56,7 +56,7 @@ async def async_setup_entry( async_add_entities(entities) -@dataclass +@dataclass(frozen=True) class ScreenLogicSwitchDescription( SwitchEntityDescription, ScreenLogicPushEntityDescription ): diff --git a/homeassistant/components/sensibo/binary_sensor.py b/homeassistant/components/sensibo/binary_sensor.py index 08f45b94789..5cd71a2b0e4 100644 --- a/homeassistant/components/sensibo/binary_sensor.py +++ b/homeassistant/components/sensibo/binary_sensor.py @@ -24,28 +24,28 @@ from .entity import SensiboDeviceBaseEntity, SensiboMotionBaseEntity PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class MotionBaseEntityDescriptionMixin: """Mixin for required Sensibo base description keys.""" value_fn: Callable[[MotionSensor], bool | None] -@dataclass +@dataclass(frozen=True) class DeviceBaseEntityDescriptionMixin: """Mixin for required Sensibo base description keys.""" value_fn: Callable[[SensiboDevice], bool | None] -@dataclass +@dataclass(frozen=True) class SensiboMotionBinarySensorEntityDescription( BinarySensorEntityDescription, MotionBaseEntityDescriptionMixin ): """Describes Sensibo Motion sensor entity.""" -@dataclass +@dataclass(frozen=True) class SensiboDeviceBinarySensorEntityDescription( BinarySensorEntityDescription, DeviceBaseEntityDescriptionMixin ): diff --git a/homeassistant/components/sensibo/button.py b/homeassistant/components/sensibo/button.py index b47023f3ec4..942f7eaeb00 100644 --- a/homeassistant/components/sensibo/button.py +++ b/homeassistant/components/sensibo/button.py @@ -17,14 +17,14 @@ from .entity import SensiboDeviceBaseEntity, async_handle_api_call PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class SensiboEntityDescriptionMixin: """Mixin values for Sensibo entities.""" data_key: str -@dataclass +@dataclass(frozen=True) class SensiboButtonEntityDescription( ButtonEntityDescription, SensiboEntityDescriptionMixin ): diff --git a/homeassistant/components/sensibo/number.py b/homeassistant/components/sensibo/number.py index d4e268ea44d..ac76277fb20 100644 --- a/homeassistant/components/sensibo/number.py +++ b/homeassistant/components/sensibo/number.py @@ -24,7 +24,7 @@ from .entity import SensiboDeviceBaseEntity, async_handle_api_call PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class SensiboEntityDescriptionMixin: """Mixin values for Sensibo entities.""" @@ -32,7 +32,7 @@ class SensiboEntityDescriptionMixin: value_fn: Callable[[SensiboDevice], float | None] -@dataclass +@dataclass(frozen=True) class SensiboNumberEntityDescription( NumberEntityDescription, SensiboEntityDescriptionMixin ): diff --git a/homeassistant/components/sensibo/select.py b/homeassistant/components/sensibo/select.py index 3e13c6cec70..bbac3fbdbd0 100644 --- a/homeassistant/components/sensibo/select.py +++ b/homeassistant/components/sensibo/select.py @@ -20,7 +20,7 @@ from .entity import SensiboDeviceBaseEntity, async_handle_api_call PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class SensiboSelectDescriptionMixin: """Mixin values for Sensibo entities.""" @@ -30,7 +30,7 @@ class SensiboSelectDescriptionMixin: transformation: Callable[[SensiboDevice], dict | None] -@dataclass +@dataclass(frozen=True) class SensiboSelectEntityDescription( SelectEntityDescription, SensiboSelectDescriptionMixin ): diff --git a/homeassistant/components/sensibo/sensor.py b/homeassistant/components/sensibo/sensor.py index f6d62d79dff..805b888204b 100644 --- a/homeassistant/components/sensibo/sensor.py +++ b/homeassistant/components/sensibo/sensor.py @@ -36,14 +36,14 @@ from .entity import SensiboDeviceBaseEntity, SensiboMotionBaseEntity PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class MotionBaseEntityDescriptionMixin: """Mixin for required Sensibo base description keys.""" value_fn: Callable[[MotionSensor], StateType] -@dataclass +@dataclass(frozen=True) class DeviceBaseEntityDescriptionMixin: """Mixin for required Sensibo base description keys.""" @@ -51,14 +51,14 @@ class DeviceBaseEntityDescriptionMixin: extra_fn: Callable[[SensiboDevice], dict[str, str | bool | None] | None] | None -@dataclass +@dataclass(frozen=True) class SensiboMotionSensorEntityDescription( SensorEntityDescription, MotionBaseEntityDescriptionMixin ): """Describes Sensibo Motion sensor entity.""" -@dataclass +@dataclass(frozen=True) class SensiboDeviceSensorEntityDescription( SensorEntityDescription, DeviceBaseEntityDescriptionMixin ): diff --git a/homeassistant/components/sensibo/switch.py b/homeassistant/components/sensibo/switch.py index a27307fcceb..0911985ed7d 100644 --- a/homeassistant/components/sensibo/switch.py +++ b/homeassistant/components/sensibo/switch.py @@ -24,7 +24,7 @@ from .entity import SensiboDeviceBaseEntity, async_handle_api_call PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class DeviceBaseEntityDescriptionMixin: """Mixin for required Sensibo Device description keys.""" @@ -35,7 +35,7 @@ class DeviceBaseEntityDescriptionMixin: data_key: str -@dataclass +@dataclass(frozen=True) class SensiboDeviceSwitchEntityDescription( SwitchEntityDescription, DeviceBaseEntityDescriptionMixin ): diff --git a/homeassistant/components/sensibo/update.py b/homeassistant/components/sensibo/update.py index 62e8bbff3ae..c51d57dd9d1 100644 --- a/homeassistant/components/sensibo/update.py +++ b/homeassistant/components/sensibo/update.py @@ -23,7 +23,7 @@ from .entity import SensiboDeviceBaseEntity PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class DeviceBaseEntityDescriptionMixin: """Mixin for required Sensibo base description keys.""" @@ -31,7 +31,7 @@ class DeviceBaseEntityDescriptionMixin: value_available: Callable[[SensiboDevice], str | None] -@dataclass +@dataclass(frozen=True) class SensiboDeviceUpdateEntityDescription( UpdateEntityDescription, DeviceBaseEntityDescriptionMixin ): diff --git a/homeassistant/components/sfr_box/binary_sensor.py b/homeassistant/components/sfr_box/binary_sensor.py index 79533576efb..9bf053a3897 100644 --- a/homeassistant/components/sfr_box/binary_sensor.py +++ b/homeassistant/components/sfr_box/binary_sensor.py @@ -26,14 +26,14 @@ from .models import DomainData _T = TypeVar("_T") -@dataclass +@dataclass(frozen=True) class SFRBoxBinarySensorMixin(Generic[_T]): """Mixin for SFR Box sensors.""" value_fn: Callable[[_T], bool | None] -@dataclass +@dataclass(frozen=True) class SFRBoxBinarySensorEntityDescription( BinarySensorEntityDescription, SFRBoxBinarySensorMixin[_T] ): diff --git a/homeassistant/components/sfr_box/button.py b/homeassistant/components/sfr_box/button.py index c9418bcc2e9..80f7d6d51e4 100644 --- a/homeassistant/components/sfr_box/button.py +++ b/homeassistant/components/sfr_box/button.py @@ -49,14 +49,14 @@ def with_error_wrapping( return wrapper -@dataclass +@dataclass(frozen=True) class SFRBoxButtonMixin: """Mixin for SFR Box buttons.""" async_press: Callable[[SFRBox], Coroutine[None, None, None]] -@dataclass +@dataclass(frozen=True) class SFRBoxButtonEntityDescription(ButtonEntityDescription, SFRBoxButtonMixin): """Description for SFR Box buttons.""" diff --git a/homeassistant/components/sfr_box/sensor.py b/homeassistant/components/sfr_box/sensor.py index f56a9765618..6f77ca8d285 100644 --- a/homeassistant/components/sfr_box/sensor.py +++ b/homeassistant/components/sfr_box/sensor.py @@ -32,14 +32,14 @@ from .models import DomainData _T = TypeVar("_T") -@dataclass +@dataclass(frozen=True) class SFRBoxSensorMixin(Generic[_T]): """Mixin for SFR Box sensors.""" value_fn: Callable[[_T], StateType] -@dataclass +@dataclass(frozen=True) class SFRBoxSensorEntityDescription(SensorEntityDescription, SFRBoxSensorMixin[_T]): """Description for SFR Box sensors.""" diff --git a/homeassistant/components/shelly/binary_sensor.py b/homeassistant/components/shelly/binary_sensor.py index caed52279da..b07747f298e 100644 --- a/homeassistant/components/shelly/binary_sensor.py +++ b/homeassistant/components/shelly/binary_sensor.py @@ -39,19 +39,19 @@ from .utils import ( ) -@dataclass +@dataclass(frozen=True) class BlockBinarySensorDescription( BlockEntityDescription, BinarySensorEntityDescription ): """Class to describe a BLOCK binary sensor.""" -@dataclass +@dataclass(frozen=True) class RpcBinarySensorDescription(RpcEntityDescription, BinarySensorEntityDescription): """Class to describe a RPC binary sensor.""" -@dataclass +@dataclass(frozen=True) class RestBinarySensorDescription(RestEntityDescription, BinarySensorEntityDescription): """Class to describe a REST binary sensor.""" diff --git a/homeassistant/components/shelly/button.py b/homeassistant/components/shelly/button.py index e5cc6b6580b..17f60f566aa 100644 --- a/homeassistant/components/shelly/button.py +++ b/homeassistant/components/shelly/button.py @@ -30,14 +30,14 @@ _ShellyCoordinatorT = TypeVar( ) -@dataclass +@dataclass(frozen=True) class ShellyButtonDescriptionMixin(Generic[_ShellyCoordinatorT]): """Mixin to describe a Button entity.""" press_action: Callable[[_ShellyCoordinatorT], Coroutine[Any, Any, None]] -@dataclass +@dataclass(frozen=True) class ShellyButtonDescription( ButtonEntityDescription, ShellyButtonDescriptionMixin[_ShellyCoordinatorT] ): diff --git a/homeassistant/components/shelly/entity.py b/homeassistant/components/shelly/entity.py index 368a997c62e..796402c8bba 100644 --- a/homeassistant/components/shelly/entity.py +++ b/homeassistant/components/shelly/entity.py @@ -266,7 +266,7 @@ def async_setup_entry_rest( ) -@dataclass +@dataclass(frozen=True) class BlockEntityDescription(EntityDescription): """Class to describe a BLOCK entity.""" @@ -283,14 +283,14 @@ class BlockEntityDescription(EntityDescription): extra_state_attributes: Callable[[Block], dict | None] | None = None -@dataclass +@dataclass(frozen=True) class RpcEntityRequiredKeysMixin: """Class for RPC entity required keys.""" sub_key: str -@dataclass +@dataclass(frozen=True) class RpcEntityDescription(EntityDescription, RpcEntityRequiredKeysMixin): """Class to describe a RPC entity.""" @@ -306,7 +306,7 @@ class RpcEntityDescription(EntityDescription, RpcEntityRequiredKeysMixin): supported: Callable = lambda _: False -@dataclass +@dataclass(frozen=True) class RestEntityDescription(EntityDescription): """Class to describe a REST entity.""" diff --git a/homeassistant/components/shelly/event.py b/homeassistant/components/shelly/event.py index e93303d7191..5425f71366f 100644 --- a/homeassistant/components/shelly/event.py +++ b/homeassistant/components/shelly/event.py @@ -37,14 +37,14 @@ from .utils import ( ) -@dataclass +@dataclass(frozen=True) class ShellyBlockEventDescription(EventEntityDescription): """Class to describe Shelly event.""" removal_condition: Callable[[dict, Block], bool] | None = None -@dataclass +@dataclass(frozen=True) class ShellyRpcEventDescription(EventEntityDescription): """Class to describe Shelly event.""" diff --git a/homeassistant/components/shelly/number.py b/homeassistant/components/shelly/number.py index f2b6bedb443..77d066a6106 100644 --- a/homeassistant/components/shelly/number.py +++ b/homeassistant/components/shelly/number.py @@ -30,7 +30,7 @@ from .entity import ( ) -@dataclass +@dataclass(frozen=True) class BlockNumberDescription(BlockEntityDescription, NumberEntityDescription): """Class to describe a BLOCK sensor.""" diff --git a/homeassistant/components/shelly/sensor.py b/homeassistant/components/shelly/sensor.py index 4518135214c..fa5f51b00b0 100644 --- a/homeassistant/components/shelly/sensor.py +++ b/homeassistant/components/shelly/sensor.py @@ -55,17 +55,17 @@ from .entity import ( from .utils import get_device_entry_gen, get_device_uptime -@dataclass +@dataclass(frozen=True) class BlockSensorDescription(BlockEntityDescription, SensorEntityDescription): """Class to describe a BLOCK sensor.""" -@dataclass +@dataclass(frozen=True) class RpcSensorDescription(RpcEntityDescription, SensorEntityDescription): """Class to describe a RPC sensor.""" -@dataclass +@dataclass(frozen=True) class RestSensorDescription(RestEntityDescription, SensorEntityDescription): """Class to describe a REST sensor.""" diff --git a/homeassistant/components/shelly/switch.py b/homeassistant/components/shelly/switch.py index 5ef39cd33af..98811c2ff6f 100644 --- a/homeassistant/components/shelly/switch.py +++ b/homeassistant/components/shelly/switch.py @@ -30,7 +30,7 @@ from .utils import ( ) -@dataclass +@dataclass(frozen=True) class BlockSwitchDescription(BlockEntityDescription, SwitchEntityDescription): """Class to describe a BLOCK switch.""" diff --git a/homeassistant/components/shelly/update.py b/homeassistant/components/shelly/update.py index 975b61e631a..9e8b1505afe 100644 --- a/homeassistant/components/shelly/update.py +++ b/homeassistant/components/shelly/update.py @@ -40,7 +40,7 @@ from .utils import get_device_entry_gen, get_release_url LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class RpcUpdateRequiredKeysMixin: """Class for RPC update required keys.""" @@ -48,7 +48,7 @@ class RpcUpdateRequiredKeysMixin: beta: bool -@dataclass +@dataclass(frozen=True) class RestUpdateRequiredKeysMixin: """Class for REST update required keys.""" @@ -56,14 +56,14 @@ class RestUpdateRequiredKeysMixin: beta: bool -@dataclass +@dataclass(frozen=True) class RpcUpdateDescription( RpcEntityDescription, UpdateEntityDescription, RpcUpdateRequiredKeysMixin ): """Class to describe a RPC update.""" -@dataclass +@dataclass(frozen=True) class RestUpdateDescription( RestEntityDescription, UpdateEntityDescription, RestUpdateRequiredKeysMixin ): diff --git a/homeassistant/components/sia/alarm_control_panel.py b/homeassistant/components/sia/alarm_control_panel.py index 149a0427ed0..e7850a5f9d2 100644 --- a/homeassistant/components/sia/alarm_control_panel.py +++ b/homeassistant/components/sia/alarm_control_panel.py @@ -29,7 +29,7 @@ from .sia_entity_base import SIABaseEntity, SIAEntityDescription _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class SIAAlarmControlPanelEntityDescription( AlarmControlPanelEntityDescription, SIAEntityDescription, diff --git a/homeassistant/components/sia/binary_sensor.py b/homeassistant/components/sia/binary_sensor.py index db0845473fd..f6e2533be93 100644 --- a/homeassistant/components/sia/binary_sensor.py +++ b/homeassistant/components/sia/binary_sensor.py @@ -32,7 +32,7 @@ from .sia_entity_base import SIABaseEntity, SIAEntityDescription _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class SIABinarySensorEntityDescription( BinarySensorEntityDescription, SIAEntityDescription, diff --git a/homeassistant/components/sia/sia_entity_base.py b/homeassistant/components/sia/sia_entity_base.py index a947f9e177b..f6895cc48a9 100644 --- a/homeassistant/components/sia/sia_entity_base.py +++ b/homeassistant/components/sia/sia_entity_base.py @@ -35,14 +35,14 @@ from .utils import ( _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class SIARequiredKeysMixin: """Required keys for SIA entities.""" code_consequences: dict[str, StateType | bool] -@dataclass +@dataclass(frozen=True) class SIAEntityDescription(EntityDescription, SIARequiredKeysMixin): """Entity Description for SIA entities.""" diff --git a/homeassistant/components/simplisafe/button.py b/homeassistant/components/simplisafe/button.py index bd60c040f56..a11ddc04d64 100644 --- a/homeassistant/components/simplisafe/button.py +++ b/homeassistant/components/simplisafe/button.py @@ -19,14 +19,14 @@ from .const import DOMAIN from .typing import SystemType -@dataclass +@dataclass(frozen=True) class SimpliSafeButtonDescriptionMixin: """Define an entity description mixin for SimpliSafe buttons.""" push_action: Callable[[System], Awaitable] -@dataclass +@dataclass(frozen=True) class SimpliSafeButtonDescription( ButtonEntityDescription, SimpliSafeButtonDescriptionMixin ): diff --git a/homeassistant/components/skybell/sensor.py b/homeassistant/components/skybell/sensor.py index 130196a990d..7093c5cad20 100644 --- a/homeassistant/components/skybell/sensor.py +++ b/homeassistant/components/skybell/sensor.py @@ -22,14 +22,14 @@ from homeassistant.helpers.typing import StateType from .entity import DOMAIN, SkybellEntity -@dataclass +@dataclass(frozen=True) class SkybellSensorEntityDescriptionMixIn: """Mixin for Skybell sensor.""" value_fn: Callable[[SkybellDevice], StateType | datetime] -@dataclass +@dataclass(frozen=True) class SkybellSensorEntityDescription( SensorEntityDescription, SkybellSensorEntityDescriptionMixIn ): diff --git a/homeassistant/components/sleepiq/button.py b/homeassistant/components/sleepiq/button.py index cca9253d589..0d9a118d3c9 100644 --- a/homeassistant/components/sleepiq/button.py +++ b/homeassistant/components/sleepiq/button.py @@ -17,14 +17,14 @@ from .coordinator import SleepIQData from .entity import SleepIQEntity -@dataclass +@dataclass(frozen=True) class SleepIQButtonEntityDescriptionMixin: """Describes a SleepIQ Button entity.""" press_action: Callable[[SleepIQBed], Any] -@dataclass +@dataclass(frozen=True) class SleepIQButtonEntityDescription( ButtonEntityDescription, SleepIQButtonEntityDescriptionMixin ): diff --git a/homeassistant/components/sleepiq/number.py b/homeassistant/components/sleepiq/number.py index 5523f931bd4..b1819d7088d 100644 --- a/homeassistant/components/sleepiq/number.py +++ b/homeassistant/components/sleepiq/number.py @@ -17,7 +17,7 @@ from .coordinator import SleepIQData, SleepIQDataUpdateCoordinator from .entity import SleepIQBedEntity -@dataclass +@dataclass(frozen=True) class SleepIQNumberEntityDescriptionMixin: """Mixin to describe a SleepIQ number entity.""" @@ -27,7 +27,7 @@ class SleepIQNumberEntityDescriptionMixin: get_unique_id_fn: Callable[[SleepIQBed, Any], str] -@dataclass +@dataclass(frozen=True) class SleepIQNumberEntityDescription( NumberEntityDescription, SleepIQNumberEntityDescriptionMixin ): diff --git a/homeassistant/components/smappee/sensor.py b/homeassistant/components/smappee/sensor.py index 82bc60936b3..ad6e5af963e 100644 --- a/homeassistant/components/smappee/sensor.py +++ b/homeassistant/components/smappee/sensor.py @@ -18,26 +18,26 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from .const import DOMAIN -@dataclass +@dataclass(frozen=True) class SmappeeRequiredKeysMixin: """Mixin for required keys.""" sensor_id: str -@dataclass +@dataclass(frozen=True) class SmappeeSensorEntityDescription(SensorEntityDescription, SmappeeRequiredKeysMixin): """Describes Smappee sensor entity.""" -@dataclass +@dataclass(frozen=True) class SmappeePollingSensorEntityDescription(SmappeeSensorEntityDescription): """Describes Smappee sensor entity.""" local_polling: bool = False -@dataclass +@dataclass(frozen=True) class SmappeeVoltageSensorEntityDescription(SmappeeSensorEntityDescription): """Describes Smappee sensor entity.""" diff --git a/homeassistant/components/solaredge/sensor.py b/homeassistant/components/solaredge/sensor.py index 5e298ae2a6f..bb82da5fc89 100644 --- a/homeassistant/components/solaredge/sensor.py +++ b/homeassistant/components/solaredge/sensor.py @@ -33,14 +33,14 @@ from .coordinator import ( ) -@dataclass +@dataclass(frozen=True) class SolarEdgeSensorEntityRequiredKeyMixin: """Sensor entity description with json_key for SolarEdge.""" json_key: str -@dataclass +@dataclass(frozen=True) class SolarEdgeSensorEntityDescription( SensorEntityDescription, SolarEdgeSensorEntityRequiredKeyMixin ): diff --git a/homeassistant/components/solaredge_local/sensor.py b/homeassistant/components/solaredge_local/sensor.py index f8e0595f28f..0475489a6f4 100644 --- a/homeassistant/components/solaredge_local/sensor.py +++ b/homeassistant/components/solaredge_local/sensor.py @@ -50,7 +50,7 @@ INVERTER_MODES = ( ) -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class SolarEdgeLocalSensorEntityDescription(SensorEntityDescription): """Describes SolarEdge-local sensor entity.""" diff --git a/homeassistant/components/solarlog/sensor.py b/homeassistant/components/solarlog/sensor.py index cd8304a1198..a8025c7fc0f 100644 --- a/homeassistant/components/solarlog/sensor.py +++ b/homeassistant/components/solarlog/sensor.py @@ -26,7 +26,7 @@ from . import SolarlogData from .const import DOMAIN -@dataclass +@dataclass(frozen=True) class SolarLogSensorEntityDescription(SensorEntityDescription): """Describes Solarlog sensor entity.""" diff --git a/homeassistant/components/sonarr/sensor.py b/homeassistant/components/sonarr/sensor.py index def44d382ce..5753d0d23ea 100644 --- a/homeassistant/components/sonarr/sensor.py +++ b/homeassistant/components/sonarr/sensor.py @@ -31,7 +31,7 @@ from .coordinator import SonarrDataT, SonarrDataUpdateCoordinator from .entity import SonarrEntity -@dataclass +@dataclass(frozen=True) class SonarrSensorEntityDescriptionMixIn(Generic[SonarrDataT]): """Mixin for Sonarr sensor.""" @@ -39,7 +39,7 @@ class SonarrSensorEntityDescriptionMixIn(Generic[SonarrDataT]): value_fn: Callable[[SonarrDataT], StateType] -@dataclass +@dataclass(frozen=True) class SonarrSensorEntityDescription( SensorEntityDescription, SonarrSensorEntityDescriptionMixIn[SonarrDataT] ): diff --git a/homeassistant/components/speedtestdotnet/sensor.py b/homeassistant/components/speedtestdotnet/sensor.py index af41c400e0b..53e80be0cc0 100644 --- a/homeassistant/components/speedtestdotnet/sensor.py +++ b/homeassistant/components/speedtestdotnet/sensor.py @@ -33,7 +33,7 @@ from .const import ( from .coordinator import SpeedTestDataCoordinator -@dataclass +@dataclass(frozen=True) class SpeedtestSensorEntityDescription(SensorEntityDescription): """Class describing Speedtest sensor entities.""" diff --git a/homeassistant/components/starline/switch.py b/homeassistant/components/starline/switch.py index b4a1561dd26..600dac34fe3 100644 --- a/homeassistant/components/starline/switch.py +++ b/homeassistant/components/starline/switch.py @@ -15,7 +15,7 @@ from .const import DOMAIN from .entity import StarlineEntity -@dataclass +@dataclass(frozen=True) class StarlineRequiredKeysMixin: """Mixin for required keys.""" @@ -23,7 +23,7 @@ class StarlineRequiredKeysMixin: icon_off: str -@dataclass +@dataclass(frozen=True) class StarlineSwitchEntityDescription( SwitchEntityDescription, StarlineRequiredKeysMixin ): diff --git a/homeassistant/components/starlink/binary_sensor.py b/homeassistant/components/starlink/binary_sensor.py index 87614460096..d346c19fec4 100644 --- a/homeassistant/components/starlink/binary_sensor.py +++ b/homeassistant/components/starlink/binary_sensor.py @@ -32,14 +32,14 @@ async def async_setup_entry( ) -@dataclass +@dataclass(frozen=True) class StarlinkBinarySensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[StarlinkData], bool | None] -@dataclass +@dataclass(frozen=True) class StarlinkBinarySensorEntityDescription( BinarySensorEntityDescription, StarlinkBinarySensorEntityDescriptionMixin ): diff --git a/homeassistant/components/starlink/button.py b/homeassistant/components/starlink/button.py index 2df9d9b033b..daf3122a00d 100644 --- a/homeassistant/components/starlink/button.py +++ b/homeassistant/components/starlink/button.py @@ -31,14 +31,14 @@ async def async_setup_entry( ) -@dataclass +@dataclass(frozen=True) class StarlinkButtonEntityDescriptionMixin: """Mixin for required keys.""" press_fn: Callable[[StarlinkUpdateCoordinator], Awaitable[None]] -@dataclass +@dataclass(frozen=True) class StarlinkButtonEntityDescription( ButtonEntityDescription, StarlinkButtonEntityDescriptionMixin ): diff --git a/homeassistant/components/starlink/device_tracker.py b/homeassistant/components/starlink/device_tracker.py index eb832741f40..f260a7d1c32 100644 --- a/homeassistant/components/starlink/device_tracker.py +++ b/homeassistant/components/starlink/device_tracker.py @@ -26,7 +26,7 @@ async def async_setup_entry( ) -@dataclass +@dataclass(frozen=True) class StarlinkDeviceTrackerEntityDescriptionMixin: """Describes a Starlink device tracker.""" @@ -34,7 +34,7 @@ class StarlinkDeviceTrackerEntityDescriptionMixin: longitude_fn: Callable[[StarlinkData], float] -@dataclass +@dataclass(frozen=True) class StarlinkDeviceTrackerEntityDescription( EntityDescription, StarlinkDeviceTrackerEntityDescriptionMixin ): diff --git a/homeassistant/components/starlink/sensor.py b/homeassistant/components/starlink/sensor.py index ab76a8dffdd..d5116d49305 100644 --- a/homeassistant/components/starlink/sensor.py +++ b/homeassistant/components/starlink/sensor.py @@ -40,14 +40,14 @@ async def async_setup_entry( ) -@dataclass +@dataclass(frozen=True) class StarlinkSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[StarlinkData], datetime | StateType] -@dataclass +@dataclass(frozen=True) class StarlinkSensorEntityDescription( SensorEntityDescription, StarlinkSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/starlink/switch.py b/homeassistant/components/starlink/switch.py index 31932fe9854..551afa8e73c 100644 --- a/homeassistant/components/starlink/switch.py +++ b/homeassistant/components/starlink/switch.py @@ -31,7 +31,7 @@ async def async_setup_entry( ) -@dataclass +@dataclass(frozen=True) class StarlinkSwitchEntityDescriptionMixin: """Mixin for required keys.""" @@ -40,7 +40,7 @@ class StarlinkSwitchEntityDescriptionMixin: turn_off_fn: Callable[[StarlinkUpdateCoordinator], Awaitable[None]] -@dataclass +@dataclass(frozen=True) class StarlinkSwitchEntityDescription( SwitchEntityDescription, StarlinkSwitchEntityDescriptionMixin ): diff --git a/homeassistant/components/steamist/sensor.py b/homeassistant/components/steamist/sensor.py index 17cc0e8c272..beb8eea47b9 100644 --- a/homeassistant/components/steamist/sensor.py +++ b/homeassistant/components/steamist/sensor.py @@ -30,14 +30,14 @@ UNIT_MAPPINGS = { } -@dataclass +@dataclass(frozen=True) class SteamistSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[SteamistStatus], int | None] -@dataclass +@dataclass(frozen=True) class SteamistSensorEntityDescription( SensorEntityDescription, SteamistSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/sun/sensor.py b/homeassistant/components/sun/sensor.py index 0f867f9b7c4..437f1626c9d 100644 --- a/homeassistant/components/sun/sensor.py +++ b/homeassistant/components/sun/sensor.py @@ -26,7 +26,7 @@ from .const import DOMAIN, SIGNAL_EVENTS_CHANGED, SIGNAL_POSITION_CHANGED ENTITY_ID_SENSOR_FORMAT = SENSOR_DOMAIN + ".sun_{}" -@dataclass +@dataclass(frozen=True) class SunEntityDescriptionMixin: """Mixin for required Sun base description keys.""" @@ -34,7 +34,7 @@ class SunEntityDescriptionMixin: signal: str -@dataclass +@dataclass(frozen=True) class SunSensorEntityDescription(SensorEntityDescription, SunEntityDescriptionMixin): """Describes Sun sensor entity.""" diff --git a/homeassistant/components/sunweg/sensor_types/sensor_entity_description.py b/homeassistant/components/sunweg/sensor_types/sensor_entity_description.py index d9a48a331b1..a47818b694b 100644 --- a/homeassistant/components/sunweg/sensor_types/sensor_entity_description.py +++ b/homeassistant/components/sunweg/sensor_types/sensor_entity_description.py @@ -6,14 +6,14 @@ from dataclasses import dataclass from homeassistant.components.sensor import SensorEntityDescription -@dataclass +@dataclass(frozen=True) class SunWEGRequiredKeysMixin: """Mixin for required keys.""" api_variable_key: str -@dataclass +@dataclass(frozen=True) class SunWEGSensorEntityDescription(SensorEntityDescription, SunWEGRequiredKeysMixin): """Describes SunWEG sensor entity.""" diff --git a/homeassistant/components/switcher_kis/button.py b/homeassistant/components/switcher_kis/button.py index 4303c885106..5a1b7c821d2 100644 --- a/homeassistant/components/switcher_kis/button.py +++ b/homeassistant/components/switcher_kis/button.py @@ -30,7 +30,7 @@ from .const import SIGNAL_DEVICE_ADD from .utils import get_breeze_remote_manager -@dataclass +@dataclass(frozen=True) class SwitcherThermostatButtonDescriptionMixin: """Mixin to describe a Switcher Thermostat Button entity.""" @@ -38,7 +38,7 @@ class SwitcherThermostatButtonDescriptionMixin: supported: Callable[[SwitcherBreezeRemote], bool] -@dataclass +@dataclass(frozen=True) class SwitcherThermostatButtonEntityDescription( ButtonEntityDescription, SwitcherThermostatButtonDescriptionMixin ): diff --git a/homeassistant/components/synology_dsm/binary_sensor.py b/homeassistant/components/synology_dsm/binary_sensor.py index 1f335aee4b9..27c6b416cb4 100644 --- a/homeassistant/components/synology_dsm/binary_sensor.py +++ b/homeassistant/components/synology_dsm/binary_sensor.py @@ -27,7 +27,7 @@ from .entity import ( from .models import SynologyDSMData -@dataclass +@dataclass(frozen=True) class SynologyDSMBinarySensorEntityDescription( BinarySensorEntityDescription, SynologyDSMEntityDescription ): diff --git a/homeassistant/components/synology_dsm/button.py b/homeassistant/components/synology_dsm/button.py index d62f816b29e..0e737c48eb6 100644 --- a/homeassistant/components/synology_dsm/button.py +++ b/homeassistant/components/synology_dsm/button.py @@ -24,14 +24,14 @@ from .models import SynologyDSMData LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class SynologyDSMbuttonDescriptionMixin: """Mixin to describe a Synology DSM button entity.""" press_action: Callable[[SynoApi], Callable[[], Coroutine[Any, Any, None]]] -@dataclass +@dataclass(frozen=True) class SynologyDSMbuttonDescription( ButtonEntityDescription, SynologyDSMbuttonDescriptionMixin ): diff --git a/homeassistant/components/synology_dsm/camera.py b/homeassistant/components/synology_dsm/camera.py index a2f08202319..187db9fbba8 100644 --- a/homeassistant/components/synology_dsm/camera.py +++ b/homeassistant/components/synology_dsm/camera.py @@ -35,7 +35,7 @@ from .models import SynologyDSMData _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class SynologyDSMCameraEntityDescription( CameraEntityDescription, SynologyDSMEntityDescription ): diff --git a/homeassistant/components/synology_dsm/entity.py b/homeassistant/components/synology_dsm/entity.py index bb668e292cc..8d53284fee7 100644 --- a/homeassistant/components/synology_dsm/entity.py +++ b/homeassistant/components/synology_dsm/entity.py @@ -18,14 +18,14 @@ from .coordinator import ( _CoordinatorT = TypeVar("_CoordinatorT", bound=SynologyDSMUpdateCoordinator[Any]) -@dataclass +@dataclass(frozen=True) class SynologyDSMRequiredKeysMixin: """Mixin for required keys.""" api_key: str -@dataclass +@dataclass(frozen=True) class SynologyDSMEntityDescription(EntityDescription, SynologyDSMRequiredKeysMixin): """Generic Synology DSM entity description.""" diff --git a/homeassistant/components/synology_dsm/sensor.py b/homeassistant/components/synology_dsm/sensor.py index 29298647326..76606303c93 100644 --- a/homeassistant/components/synology_dsm/sensor.py +++ b/homeassistant/components/synology_dsm/sensor.py @@ -39,7 +39,7 @@ from .entity import ( from .models import SynologyDSMData -@dataclass +@dataclass(frozen=True) class SynologyDSMSensorEntityDescription( SensorEntityDescription, SynologyDSMEntityDescription ): diff --git a/homeassistant/components/synology_dsm/switch.py b/homeassistant/components/synology_dsm/switch.py index 074a423c53d..77dc854fa3a 100644 --- a/homeassistant/components/synology_dsm/switch.py +++ b/homeassistant/components/synology_dsm/switch.py @@ -22,7 +22,7 @@ from .models import SynologyDSMData _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class SynologyDSMSwitchEntityDescription( SwitchEntityDescription, SynologyDSMEntityDescription ): diff --git a/homeassistant/components/synology_dsm/update.py b/homeassistant/components/synology_dsm/update.py index c550b180553..c66fc3c3d73 100644 --- a/homeassistant/components/synology_dsm/update.py +++ b/homeassistant/components/synology_dsm/update.py @@ -19,7 +19,7 @@ from .entity import SynologyDSMBaseEntity, SynologyDSMEntityDescription from .models import SynologyDSMData -@dataclass +@dataclass(frozen=True) class SynologyDSMUpdateEntityEntityDescription( UpdateEntityDescription, SynologyDSMEntityDescription ): diff --git a/homeassistant/components/system_bridge/binary_sensor.py b/homeassistant/components/system_bridge/binary_sensor.py index 511feeaf93c..1d36c673eb6 100644 --- a/homeassistant/components/system_bridge/binary_sensor.py +++ b/homeassistant/components/system_bridge/binary_sensor.py @@ -19,7 +19,7 @@ from .coordinator import SystemBridgeDataUpdateCoordinator from .entity import SystemBridgeEntity -@dataclass +@dataclass(frozen=True) class SystemBridgeBinarySensorEntityDescription(BinarySensorEntityDescription): """Class describing System Bridge binary sensor entities.""" diff --git a/homeassistant/components/system_bridge/sensor.py b/homeassistant/components/system_bridge/sensor.py index e3fd2c14654..35cc0e00809 100644 --- a/homeassistant/components/system_bridge/sensor.py +++ b/homeassistant/components/system_bridge/sensor.py @@ -42,7 +42,7 @@ ATTR_USED: Final = "used" PIXELS: Final = "px" -@dataclass +@dataclass(frozen=True) class SystemBridgeSensorEntityDescription(SensorEntityDescription): """Class describing System Bridge sensor entities.""" diff --git a/homeassistant/components/systemmonitor/sensor.py b/homeassistant/components/systemmonitor/sensor.py index 4cfbdba4066..f34686ca3da 100644 --- a/homeassistant/components/systemmonitor/sensor.py +++ b/homeassistant/components/systemmonitor/sensor.py @@ -64,7 +64,7 @@ SENSOR_TYPE_MANDATORY_ARG = 4 SIGNAL_SYSTEMMONITOR_UPDATE = "systemmonitor_update" -@dataclass +@dataclass(frozen=True) class SysMonitorSensorEntityDescription(SensorEntityDescription): """Description for System Monitor sensor entities.""" diff --git a/homeassistant/components/tado/binary_sensor.py b/homeassistant/components/tado/binary_sensor.py index c5222112c02..0f7a1b2b307 100644 --- a/homeassistant/components/tado/binary_sensor.py +++ b/homeassistant/components/tado/binary_sensor.py @@ -32,14 +32,14 @@ from .entity import TadoDeviceEntity, TadoZoneEntity _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class TadoBinarySensorEntityDescriptionMixin: """Mixin for required keys.""" state_fn: Callable[[Any], bool] -@dataclass +@dataclass(frozen=True) class TadoBinarySensorEntityDescription( BinarySensorEntityDescription, TadoBinarySensorEntityDescriptionMixin ): diff --git a/homeassistant/components/tado/sensor.py b/homeassistant/components/tado/sensor.py index c665cc3c592..a9647c7e6e5 100644 --- a/homeassistant/components/tado/sensor.py +++ b/homeassistant/components/tado/sensor.py @@ -35,14 +35,14 @@ from .entity import TadoHomeEntity, TadoZoneEntity _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class TadoSensorEntityDescriptionMixin: """Mixin for required keys.""" state_fn: Callable[[Any], StateType] -@dataclass +@dataclass(frozen=True) class TadoSensorEntityDescription( SensorEntityDescription, TadoSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/tailscale/binary_sensor.py b/homeassistant/components/tailscale/binary_sensor.py index ee1c682c559..00fa21279ea 100644 --- a/homeassistant/components/tailscale/binary_sensor.py +++ b/homeassistant/components/tailscale/binary_sensor.py @@ -20,7 +20,7 @@ from . import TailscaleEntity from .const import DOMAIN -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class TailscaleBinarySensorEntityDescription(BinarySensorEntityDescription): """Describes a Tailscale binary sensor entity.""" diff --git a/homeassistant/components/tailscale/sensor.py b/homeassistant/components/tailscale/sensor.py index f5850848c8c..5d2e615945b 100644 --- a/homeassistant/components/tailscale/sensor.py +++ b/homeassistant/components/tailscale/sensor.py @@ -21,7 +21,7 @@ from . import TailscaleEntity from .const import DOMAIN -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class TailscaleSensorEntityDescription(SensorEntityDescription): """Describes a Tailscale sensor entity.""" diff --git a/homeassistant/components/tailwind/button.py b/homeassistant/components/tailwind/button.py index d860f7de3d6..e66a95f3ac4 100644 --- a/homeassistant/components/tailwind/button.py +++ b/homeassistant/components/tailwind/button.py @@ -22,7 +22,7 @@ from .coordinator import TailwindDataUpdateCoordinator from .entity import TailwindEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class TailwindButtonEntityDescription(ButtonEntityDescription): """Class describing Tailwind button entities.""" diff --git a/homeassistant/components/tailwind/number.py b/homeassistant/components/tailwind/number.py index 19d23457121..3d932939ba4 100644 --- a/homeassistant/components/tailwind/number.py +++ b/homeassistant/components/tailwind/number.py @@ -18,7 +18,7 @@ from .coordinator import TailwindDataUpdateCoordinator from .entity import TailwindEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class TailwindNumberEntityDescription(NumberEntityDescription): """Class describing Tailwind number entities.""" diff --git a/homeassistant/components/tautulli/sensor.py b/homeassistant/components/tautulli/sensor.py index a64f4312de1..ca9de9df8de 100644 --- a/homeassistant/components/tautulli/sensor.py +++ b/homeassistant/components/tautulli/sensor.py @@ -43,14 +43,14 @@ def get_top_stats( return value -@dataclass +@dataclass(frozen=True) class TautulliSensorEntityMixin: """Mixin for Tautulli sensor.""" value_fn: Callable[[PyTautulliApiHomeStats, PyTautulliApiActivity, str], StateType] -@dataclass +@dataclass(frozen=True) class TautulliSensorEntityDescription( SensorEntityDescription, TautulliSensorEntityMixin ): @@ -151,14 +151,14 @@ SENSOR_TYPES: tuple[TautulliSensorEntityDescription, ...] = ( ) -@dataclass +@dataclass(frozen=True) class TautulliSessionSensorEntityMixin: """Mixin for Tautulli session sensor.""" value_fn: Callable[[PyTautulliApiSession], StateType] -@dataclass +@dataclass(frozen=True) class TautulliSessionSensorEntityDescription( SensorEntityDescription, TautulliSessionSensorEntityMixin ): diff --git a/homeassistant/components/tesla_wall_connector/__init__.py b/homeassistant/components/tesla_wall_connector/__init__.py index 41403ab84f2..30e61dc7744 100644 --- a/homeassistant/components/tesla_wall_connector/__init__.py +++ b/homeassistant/components/tesla_wall_connector/__init__.py @@ -152,7 +152,7 @@ class WallConnectorEntity(CoordinatorEntity): ) -@dataclass() +@dataclass(frozen=True) class WallConnectorLambdaValueGetterMixin: """Mixin with a function pointer for getting sensor value.""" diff --git a/homeassistant/components/tesla_wall_connector/binary_sensor.py b/homeassistant/components/tesla_wall_connector/binary_sensor.py index e0a34460c8c..e9ac03c69e1 100644 --- a/homeassistant/components/tesla_wall_connector/binary_sensor.py +++ b/homeassistant/components/tesla_wall_connector/binary_sensor.py @@ -22,7 +22,7 @@ from .const import DOMAIN, WALLCONNECTOR_DATA_VITALS _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class WallConnectorBinarySensorDescription( BinarySensorEntityDescription, WallConnectorLambdaValueGetterMixin ): diff --git a/homeassistant/components/tesla_wall_connector/sensor.py b/homeassistant/components/tesla_wall_connector/sensor.py index 0322830890a..1b9433eb696 100644 --- a/homeassistant/components/tesla_wall_connector/sensor.py +++ b/homeassistant/components/tesla_wall_connector/sensor.py @@ -30,7 +30,7 @@ from .const import DOMAIN, WALLCONNECTOR_DATA_LIFETIME, WALLCONNECTOR_DATA_VITAL _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class WallConnectorSensorDescription( SensorEntityDescription, WallConnectorLambdaValueGetterMixin ): diff --git a/homeassistant/components/tessie/binary_sensor.py b/homeassistant/components/tessie/binary_sensor.py index 297a59cac6d..95cf789b694 100644 --- a/homeassistant/components/tessie/binary_sensor.py +++ b/homeassistant/components/tessie/binary_sensor.py @@ -19,7 +19,7 @@ from .coordinator import TessieDataUpdateCoordinator from .entity import TessieEntity -@dataclass +@dataclass(frozen=True) class TessieBinarySensorEntityDescription(BinarySensorEntityDescription): """Describes Tessie binary sensor entity.""" diff --git a/homeassistant/components/tessie/sensor.py b/homeassistant/components/tessie/sensor.py index 6f79d986998..6c39d2a8e77 100644 --- a/homeassistant/components/tessie/sensor.py +++ b/homeassistant/components/tessie/sensor.py @@ -32,7 +32,7 @@ from .coordinator import TessieDataUpdateCoordinator from .entity import TessieEntity -@dataclass +@dataclass(frozen=True) class TessieSensorEntityDescription(SensorEntityDescription): """Describes Tessie Sensor entity.""" diff --git a/homeassistant/components/tolo/number.py b/homeassistant/components/tolo/number.py index 3e07392c336..b31b5102394 100644 --- a/homeassistant/components/tolo/number.py +++ b/homeassistant/components/tolo/number.py @@ -18,7 +18,7 @@ from . import ToloSaunaCoordinatorEntity, ToloSaunaUpdateCoordinator from .const import DOMAIN, FAN_TIMER_MAX, POWER_TIMER_MAX, SALT_BATH_TIMER_MAX -@dataclass +@dataclass(frozen=True) class ToloNumberEntityDescriptionBase: """Required values when describing TOLO Number entities.""" @@ -26,7 +26,7 @@ class ToloNumberEntityDescriptionBase: setter: Callable[[ToloClient, int | None], Any] -@dataclass +@dataclass(frozen=True) class ToloNumberEntityDescription( NumberEntityDescription, ToloNumberEntityDescriptionBase ): diff --git a/homeassistant/components/tolo/sensor.py b/homeassistant/components/tolo/sensor.py index 2ff901939ae..ec57612a99f 100644 --- a/homeassistant/components/tolo/sensor.py +++ b/homeassistant/components/tolo/sensor.py @@ -26,7 +26,7 @@ from . import ToloSaunaCoordinatorEntity, ToloSaunaUpdateCoordinator from .const import DOMAIN -@dataclass +@dataclass(frozen=True) class ToloSensorEntityDescriptionBase: """Required values when describing TOLO Sensor entities.""" @@ -34,7 +34,7 @@ class ToloSensorEntityDescriptionBase: availability_checker: Callable[[SettingsInfo, StatusInfo], bool] | None -@dataclass +@dataclass(frozen=True) class ToloSensorEntityDescription( SensorEntityDescription, ToloSensorEntityDescriptionBase ): diff --git a/homeassistant/components/tomorrowio/sensor.py b/homeassistant/components/tomorrowio/sensor.py index 88b5af79604..6b285378e7e 100644 --- a/homeassistant/components/tomorrowio/sensor.py +++ b/homeassistant/components/tomorrowio/sensor.py @@ -70,7 +70,7 @@ from .const import ( ) -@dataclass +@dataclass(frozen=True) class TomorrowioSensorEntityDescription(SensorEntityDescription): """Describes a Tomorrow.io sensor entity.""" diff --git a/homeassistant/components/toon/binary_sensor.py b/homeassistant/components/toon/binary_sensor.py index e632915edf7..6edc656df06 100644 --- a/homeassistant/components/toon/binary_sensor.py +++ b/homeassistant/components/toon/binary_sensor.py @@ -91,14 +91,14 @@ class ToonBoilerModuleBinarySensor(ToonBinarySensor, ToonBoilerModuleDeviceEntit """Defines a Boiler module binary sensor.""" -@dataclass +@dataclass(frozen=True) class ToonBinarySensorRequiredKeysMixin(ToonRequiredKeysMixin): """Mixin for binary sensor required keys.""" cls: type[ToonBinarySensor] -@dataclass +@dataclass(frozen=True) class ToonBinarySensorEntityDescription( BinarySensorEntityDescription, ToonBinarySensorRequiredKeysMixin ): diff --git a/homeassistant/components/toon/models.py b/homeassistant/components/toon/models.py index 75e3ddb0370..44986b02143 100644 --- a/homeassistant/components/toon/models.py +++ b/homeassistant/components/toon/models.py @@ -151,7 +151,7 @@ class ToonBoilerDeviceEntity(ToonEntity): ) -@dataclass +@dataclass(frozen=True) class ToonRequiredKeysMixin: """Mixin for required keys.""" diff --git a/homeassistant/components/toon/sensor.py b/homeassistant/components/toon/sensor.py index 90dd466045c..7ff9d2b67f7 100644 --- a/homeassistant/components/toon/sensor.py +++ b/homeassistant/components/toon/sensor.py @@ -114,14 +114,14 @@ class ToonDisplayDeviceSensor(ToonSensor, ToonDisplayDeviceEntity): """Defines a Display sensor.""" -@dataclass +@dataclass(frozen=True) class ToonSensorRequiredKeysMixin(ToonRequiredKeysMixin): """Mixin for sensor required keys.""" cls: type[ToonSensor] -@dataclass +@dataclass(frozen=True) class ToonSensorEntityDescription(SensorEntityDescription, ToonSensorRequiredKeysMixin): """Describes Toon sensor entity.""" diff --git a/homeassistant/components/toon/switch.py b/homeassistant/components/toon/switch.py index bf283b203c7..8dddb657df0 100644 --- a/homeassistant/components/toon/switch.py +++ b/homeassistant/components/toon/switch.py @@ -94,14 +94,14 @@ class ToonHolidayModeSwitch(ToonSwitch, ToonDisplayDeviceEntity): ) -@dataclass +@dataclass(frozen=True) class ToonSwitchRequiredKeysMixin(ToonRequiredKeysMixin): """Mixin for switch required keys.""" cls: type[ToonSwitch] -@dataclass +@dataclass(frozen=True) class ToonSwitchEntityDescription(SwitchEntityDescription, ToonSwitchRequiredKeysMixin): """Describes Toon switch entity.""" diff --git a/homeassistant/components/tplink/sensor.py b/homeassistant/components/tplink/sensor.py index 46909f39dfe..4fd957c2d8f 100644 --- a/homeassistant/components/tplink/sensor.py +++ b/homeassistant/components/tplink/sensor.py @@ -35,7 +35,7 @@ from .coordinator import TPLinkDataUpdateCoordinator from .entity import CoordinatedTPLinkEntity -@dataclass +@dataclass(frozen=True) class TPLinkSensorEntityDescription(SensorEntityDescription): """Describes TPLink sensor entity.""" diff --git a/homeassistant/components/tractive/sensor.py b/homeassistant/components/tractive/sensor.py index 49eda4f8d09..ab9dad88e06 100644 --- a/homeassistant/components/tractive/sensor.py +++ b/homeassistant/components/tractive/sensor.py @@ -43,14 +43,14 @@ from .const import ( from .entity import TractiveEntity -@dataclass +@dataclass(frozen=True) class TractiveRequiredKeysMixin: """Mixin for required keys.""" signal_prefix: str -@dataclass +@dataclass(frozen=True) class TractiveSensorEntityDescription( SensorEntityDescription, TractiveRequiredKeysMixin ): diff --git a/homeassistant/components/tractive/switch.py b/homeassistant/components/tractive/switch.py index 58c82bd6514..b77c35e6904 100644 --- a/homeassistant/components/tractive/switch.py +++ b/homeassistant/components/tractive/switch.py @@ -28,14 +28,14 @@ from .entity import TractiveEntity _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class TractiveRequiredKeysMixin: """Mixin for required keys.""" method: Literal["async_set_buzzer", "async_set_led", "async_set_live_tracking"] -@dataclass +@dataclass(frozen=True) class TractiveSwitchEntityDescription( SwitchEntityDescription, TractiveRequiredKeysMixin ): diff --git a/homeassistant/components/tradfri/sensor.py b/homeassistant/components/tradfri/sensor.py index 383eec8a8fb..7f04b8aff03 100644 --- a/homeassistant/components/tradfri/sensor.py +++ b/homeassistant/components/tradfri/sensor.py @@ -37,14 +37,14 @@ from .const import ( from .coordinator import TradfriDeviceDataUpdateCoordinator -@dataclass +@dataclass(frozen=True) class TradfriSensorEntityDescriptionMixin: """Mixin for required keys.""" value: Callable[[Device], Any | None] -@dataclass +@dataclass(frozen=True) class TradfriSensorEntityDescription( SensorEntityDescription, TradfriSensorEntityDescriptionMixin, diff --git a/homeassistant/components/trafikverket_camera/binary_sensor.py b/homeassistant/components/trafikverket_camera/binary_sensor.py index c9da5bd5d8a..b725f6d2f95 100644 --- a/homeassistant/components/trafikverket_camera/binary_sensor.py +++ b/homeassistant/components/trafikverket_camera/binary_sensor.py @@ -19,14 +19,14 @@ from .entity import TrafikverketCameraNonCameraEntity PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class DeviceBaseEntityDescriptionMixin: """Mixin for required Trafikverket Camera base description keys.""" value_fn: Callable[[CameraData], bool | None] -@dataclass +@dataclass(frozen=True) class TVCameraSensorEntityDescription( BinarySensorEntityDescription, DeviceBaseEntityDescriptionMixin ): diff --git a/homeassistant/components/trafikverket_camera/sensor.py b/homeassistant/components/trafikverket_camera/sensor.py index 96231bba755..678c703307c 100644 --- a/homeassistant/components/trafikverket_camera/sensor.py +++ b/homeassistant/components/trafikverket_camera/sensor.py @@ -23,14 +23,14 @@ from .entity import TrafikverketCameraNonCameraEntity PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class DeviceBaseEntityDescriptionMixin: """Mixin for required Trafikverket Camera base description keys.""" value_fn: Callable[[CameraData], StateType | datetime] -@dataclass +@dataclass(frozen=True) class TVCameraSensorEntityDescription( SensorEntityDescription, DeviceBaseEntityDescriptionMixin ): diff --git a/homeassistant/components/trafikverket_ferry/sensor.py b/homeassistant/components/trafikverket_ferry/sensor.py index a673f624a47..cd0682c12bc 100644 --- a/homeassistant/components/trafikverket_ferry/sensor.py +++ b/homeassistant/components/trafikverket_ferry/sensor.py @@ -32,7 +32,7 @@ ICON = "mdi:ferry" SCAN_INTERVAL = timedelta(minutes=5) -@dataclass +@dataclass(frozen=True) class TrafikverketRequiredKeysMixin: """Mixin for required keys.""" @@ -40,7 +40,7 @@ class TrafikverketRequiredKeysMixin: info_fn: Callable[[dict[str, Any]], StateType | list] | None -@dataclass +@dataclass(frozen=True) class TrafikverketSensorEntityDescription( SensorEntityDescription, TrafikverketRequiredKeysMixin ): diff --git a/homeassistant/components/trafikverket_train/sensor.py b/homeassistant/components/trafikverket_train/sensor.py index a5e76299b61..3aff376ab27 100644 --- a/homeassistant/components/trafikverket_train/sensor.py +++ b/homeassistant/components/trafikverket_train/sensor.py @@ -25,14 +25,14 @@ from .coordinator import TrainData, TVDataUpdateCoordinator ATTR_PRODUCT_FILTER = "product_filter" -@dataclass +@dataclass(frozen=True) class TrafikverketRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[TrainData], StateType | datetime] -@dataclass +@dataclass(frozen=True) class TrafikverketSensorEntityDescription( SensorEntityDescription, TrafikverketRequiredKeysMixin ): diff --git a/homeassistant/components/trafikverket_weatherstation/sensor.py b/homeassistant/components/trafikverket_weatherstation/sensor.py index 607a230fbbe..9c025237187 100644 --- a/homeassistant/components/trafikverket_weatherstation/sensor.py +++ b/homeassistant/components/trafikverket_weatherstation/sensor.py @@ -42,14 +42,14 @@ PRECIPITATION_TYPE = [ ] -@dataclass +@dataclass(frozen=True) class TrafikverketRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[WeatherStationInfo], StateType | datetime] -@dataclass +@dataclass(frozen=True) class TrafikverketSensorEntityDescription( SensorEntityDescription, TrafikverketRequiredKeysMixin ): diff --git a/homeassistant/components/transmission/sensor.py b/homeassistant/components/transmission/sensor.py index 29d37f28bad..87bcb87da9a 100644 --- a/homeassistant/components/transmission/sensor.py +++ b/homeassistant/components/transmission/sensor.py @@ -43,7 +43,7 @@ MODES: dict[str, list[str] | None] = { } -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class TransmissionSensorEntityDescription(SensorEntityDescription): """Entity description class for Transmission sensors.""" diff --git a/homeassistant/components/transmission/switch.py b/homeassistant/components/transmission/switch.py index fecda94fbf8..643b2f0ba70 100644 --- a/homeassistant/components/transmission/switch.py +++ b/homeassistant/components/transmission/switch.py @@ -17,7 +17,7 @@ from .coordinator import TransmissionDataUpdateCoordinator _LOGGING = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class TransmissionSwitchEntityDescriptionMixin: """Mixin for required keys.""" @@ -26,7 +26,7 @@ class TransmissionSwitchEntityDescriptionMixin: off_func: Callable[[TransmissionDataUpdateCoordinator], None] -@dataclass +@dataclass(frozen=True) class TransmissionSwitchEntityDescription( SwitchEntityDescription, TransmissionSwitchEntityDescriptionMixin ): diff --git a/homeassistant/components/tuya/binary_sensor.py b/homeassistant/components/tuya/binary_sensor.py index c57a37365ed..8e934ae6593 100644 --- a/homeassistant/components/tuya/binary_sensor.py +++ b/homeassistant/components/tuya/binary_sensor.py @@ -21,7 +21,7 @@ from .base import TuyaEntity from .const import DOMAIN, TUYA_DISCOVERY_NEW, DPCode -@dataclass +@dataclass(frozen=True) class TuyaBinarySensorEntityDescription(BinarySensorEntityDescription): """Describes a Tuya binary sensor.""" diff --git a/homeassistant/components/tuya/climate.py b/homeassistant/components/tuya/climate.py index 6b3b84ba349..b8c66c5cc35 100644 --- a/homeassistant/components/tuya/climate.py +++ b/homeassistant/components/tuya/climate.py @@ -39,14 +39,14 @@ TUYA_HVAC_TO_HA = { } -@dataclass +@dataclass(frozen=True) class TuyaClimateSensorDescriptionMixin: """Define an entity description mixin for climate entities.""" switch_only_hvac_mode: HVACMode -@dataclass +@dataclass(frozen=True) class TuyaClimateEntityDescription( ClimateEntityDescription, TuyaClimateSensorDescriptionMixin ): diff --git a/homeassistant/components/tuya/cover.py b/homeassistant/components/tuya/cover.py index da9f7d29eb2..46bd0721ccb 100644 --- a/homeassistant/components/tuya/cover.py +++ b/homeassistant/components/tuya/cover.py @@ -24,7 +24,7 @@ from .base import IntegerTypeData, TuyaEntity from .const import DOMAIN, TUYA_DISCOVERY_NEW, DPCode, DPType -@dataclass +@dataclass(frozen=True) class TuyaCoverEntityDescription(CoverEntityDescription): """Describe an Tuya cover entity.""" diff --git a/homeassistant/components/tuya/humidifier.py b/homeassistant/components/tuya/humidifier.py index 6d09ba4314c..a8008ced953 100644 --- a/homeassistant/components/tuya/humidifier.py +++ b/homeassistant/components/tuya/humidifier.py @@ -21,7 +21,7 @@ from .base import IntegerTypeData, TuyaEntity from .const import DOMAIN, TUYA_DISCOVERY_NEW, DPCode, DPType -@dataclass +@dataclass(frozen=True) class TuyaHumidifierEntityDescription(HumidifierEntityDescription): """Describe an Tuya (de)humidifier entity.""" diff --git a/homeassistant/components/tuya/light.py b/homeassistant/components/tuya/light.py index b4396f617cd..8e98e8d6a41 100644 --- a/homeassistant/components/tuya/light.py +++ b/homeassistant/components/tuya/light.py @@ -49,7 +49,7 @@ DEFAULT_COLOR_TYPE_DATA_V2 = ColorTypeData( ) -@dataclass +@dataclass(frozen=True) class TuyaLightEntityDescription(LightEntityDescription): """Describe an Tuya light entity.""" diff --git a/homeassistant/components/tuya/sensor.py b/homeassistant/components/tuya/sensor.py index 4bf8808f5f1..62b59cb8ed9 100644 --- a/homeassistant/components/tuya/sensor.py +++ b/homeassistant/components/tuya/sensor.py @@ -38,7 +38,7 @@ from .const import ( ) -@dataclass +@dataclass(frozen=True) class TuyaSensorEntityDescription(SensorEntityDescription): """Describes Tuya sensor entity.""" diff --git a/homeassistant/components/twentemilieu/sensor.py b/homeassistant/components/twentemilieu/sensor.py index 1278f6523a5..32b4de47de4 100644 --- a/homeassistant/components/twentemilieu/sensor.py +++ b/homeassistant/components/twentemilieu/sensor.py @@ -21,7 +21,7 @@ from .const import DOMAIN from .entity import TwenteMilieuEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class TwenteMilieuSensorDescription(SensorEntityDescription): """Describe an Twente Milieu sensor.""" diff --git a/homeassistant/components/unifi/button.py b/homeassistant/components/unifi/button.py index af7ab5852ab..c77a1f01447 100644 --- a/homeassistant/components/unifi/button.py +++ b/homeassistant/components/unifi/button.py @@ -57,14 +57,14 @@ async def async_power_cycle_port_control_fn( await api.request(DevicePowerCyclePortRequest.create(mac, int(index))) -@dataclass +@dataclass(frozen=True) class UnifiButtonEntityDescriptionMixin(Generic[HandlerT, ApiItemT]): """Validate and load entities from different UniFi handlers.""" control_fn: Callable[[aiounifi.Controller, str], Coroutine[Any, Any, None]] -@dataclass +@dataclass(frozen=True) class UnifiButtonEntityDescription( ButtonEntityDescription, UnifiEntityDescription[HandlerT, ApiItemT], diff --git a/homeassistant/components/unifi/device_tracker.py b/homeassistant/components/unifi/device_tracker.py index 1be52b97974..88667d8e811 100644 --- a/homeassistant/components/unifi/device_tracker.py +++ b/homeassistant/components/unifi/device_tracker.py @@ -137,7 +137,7 @@ def async_device_heartbeat_timedelta_fn( return timedelta(seconds=device.next_interval + 60) -@dataclass +@dataclass(frozen=True) class UnifiEntityTrackerDescriptionMixin(Generic[HandlerT, ApiItemT]): """Device tracker local functions.""" @@ -147,7 +147,7 @@ class UnifiEntityTrackerDescriptionMixin(Generic[HandlerT, ApiItemT]): hostname_fn: Callable[[aiounifi.Controller, str], str | None] -@dataclass +@dataclass(frozen=True) class UnifiTrackerEntityDescription( UnifiEntityDescription[HandlerT, ApiItemT], UnifiEntityTrackerDescriptionMixin[HandlerT, ApiItemT], diff --git a/homeassistant/components/unifi/entity.py b/homeassistant/components/unifi/entity.py index 28a7b557b16..08dda12c11d 100644 --- a/homeassistant/components/unifi/entity.py +++ b/homeassistant/components/unifi/entity.py @@ -93,7 +93,7 @@ def async_client_device_info_fn(controller: UniFiController, obj_id: str) -> Dev ) -@dataclass +@dataclass(frozen=True) class UnifiDescription(Generic[HandlerT, ApiItemT]): """Validate and load entities from different UniFi handlers.""" @@ -110,7 +110,7 @@ class UnifiDescription(Generic[HandlerT, ApiItemT]): unique_id_fn: Callable[[UniFiController, str], str] -@dataclass +@dataclass(frozen=True) class UnifiEntityDescription(EntityDescription, UnifiDescription[HandlerT, ApiItemT]): """UniFi Entity Description.""" diff --git a/homeassistant/components/unifi/image.py b/homeassistant/components/unifi/image.py index 2318702f0d1..a4fb8d5eb33 100644 --- a/homeassistant/components/unifi/image.py +++ b/homeassistant/components/unifi/image.py @@ -36,7 +36,7 @@ def async_wlan_qr_code_image_fn(controller: UniFiController, wlan: Wlan) -> byte return controller.api.wlans.generate_wlan_qr_code(wlan) -@dataclass +@dataclass(frozen=True) class UnifiImageEntityDescriptionMixin(Generic[HandlerT, ApiItemT]): """Validate and load entities from different UniFi handlers.""" @@ -44,7 +44,7 @@ class UnifiImageEntityDescriptionMixin(Generic[HandlerT, ApiItemT]): value_fn: Callable[[ApiItemT], str | None] -@dataclass +@dataclass(frozen=True) class UnifiImageEntityDescription( ImageEntityDescription, UnifiEntityDescription[HandlerT, ApiItemT], diff --git a/homeassistant/components/unifi/sensor.py b/homeassistant/components/unifi/sensor.py index cc825ea51af..c7b851a8fbb 100644 --- a/homeassistant/components/unifi/sensor.py +++ b/homeassistant/components/unifi/sensor.py @@ -132,7 +132,7 @@ def async_device_outlet_supported_fn(controller: UniFiController, obj_id: str) - return controller.api.devices[obj_id].outlet_ac_power_budget is not None -@dataclass +@dataclass(frozen=True) class UnifiSensorEntityDescriptionMixin(Generic[HandlerT, ApiItemT]): """Validate and load entities from different UniFi handlers.""" @@ -145,7 +145,7 @@ def async_device_state_value_fn(controller: UniFiController, device: Device) -> return DEVICE_STATES[device.state] -@dataclass +@dataclass(frozen=True) class UnifiSensorEntityDescription( SensorEntityDescription, UnifiEntityDescription[HandlerT, ApiItemT], diff --git a/homeassistant/components/unifi/switch.py b/homeassistant/components/unifi/switch.py index 1e9ec8b14c8..371676f4786 100644 --- a/homeassistant/components/unifi/switch.py +++ b/homeassistant/components/unifi/switch.py @@ -180,7 +180,7 @@ async def async_wlan_control_fn( await controller.api.request(WlanEnableRequest.create(obj_id, target)) -@dataclass +@dataclass(frozen=True) class UnifiSwitchEntityDescriptionMixin(Generic[HandlerT, ApiItemT]): """Validate and load entities from different UniFi handlers.""" @@ -188,7 +188,7 @@ class UnifiSwitchEntityDescriptionMixin(Generic[HandlerT, ApiItemT]): is_on_fn: Callable[[UniFiController, ApiItemT], bool] -@dataclass +@dataclass(frozen=True) class UnifiSwitchEntityDescription( SwitchEntityDescription, UnifiEntityDescription[HandlerT, ApiItemT], diff --git a/homeassistant/components/unifi/update.py b/homeassistant/components/unifi/update.py index 65b26736cf1..a0d2da328a2 100644 --- a/homeassistant/components/unifi/update.py +++ b/homeassistant/components/unifi/update.py @@ -40,7 +40,7 @@ async def async_device_control_fn(api: aiounifi.Controller, obj_id: str) -> None await api.request(DeviceUpgradeRequest.create(obj_id)) -@dataclass +@dataclass(frozen=True) class UnifiUpdateEntityDescriptionMixin(Generic[_HandlerT, _DataT]): """Validate and load entities from different UniFi handlers.""" @@ -48,7 +48,7 @@ class UnifiUpdateEntityDescriptionMixin(Generic[_HandlerT, _DataT]): state_fn: Callable[[aiounifi.Controller, _DataT], bool] -@dataclass +@dataclass(frozen=True) class UnifiUpdateEntityDescription( UpdateEntityDescription, UnifiEntityDescription[_HandlerT, _DataT], diff --git a/homeassistant/components/unifiprotect/binary_sensor.py b/homeassistant/components/unifiprotect/binary_sensor.py index 0be18249e31..f32b53a5d7a 100644 --- a/homeassistant/components/unifiprotect/binary_sensor.py +++ b/homeassistant/components/unifiprotect/binary_sensor.py @@ -42,14 +42,14 @@ _LOGGER = logging.getLogger(__name__) _KEY_DOOR = "door" -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class ProtectBinaryEntityDescription( ProtectRequiredKeysMixin, BinarySensorEntityDescription ): """Describes UniFi Protect Binary Sensor entity.""" -@dataclasses.dataclass +@dataclasses.dataclass(frozen=True) class ProtectBinaryEventEntityDescription( ProtectEventMixin, BinarySensorEntityDescription ): diff --git a/homeassistant/components/unifiprotect/button.py b/homeassistant/components/unifiprotect/button.py index bc93c156866..01bde0d9248 100644 --- a/homeassistant/components/unifiprotect/button.py +++ b/homeassistant/components/unifiprotect/button.py @@ -28,7 +28,7 @@ from .utils import async_dispatch_id as _ufpd _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class ProtectButtonEntityDescription( ProtectSetableKeysMixin[T], ButtonEntityDescription ): diff --git a/homeassistant/components/unifiprotect/models.py b/homeassistant/components/unifiprotect/models.py index 9f57b92163c..7f5612a72a8 100644 --- a/homeassistant/components/unifiprotect/models.py +++ b/homeassistant/components/unifiprotect/models.py @@ -36,7 +36,7 @@ class PermRequired(int, Enum): DELETE = 3 -@dataclass +@dataclass(frozen=True) class ProtectRequiredKeysMixin(EntityDescription, Generic[T]): """Mixin for required keys.""" @@ -101,7 +101,7 @@ class ProtectRequiredKeysMixin(EntityDescription, Generic[T]): return bool(get_nested_attr(obj, ufp_required_field)) -@dataclass +@dataclass(frozen=True) class ProtectEventMixin(ProtectRequiredKeysMixin[T]): """Mixin for events.""" @@ -127,7 +127,7 @@ class ProtectEventMixin(ProtectRequiredKeysMixin[T]): return value -@dataclass +@dataclass(frozen=True) class ProtectSetableKeysMixin(ProtectRequiredKeysMixin[T]): """Mixin for settable values.""" diff --git a/homeassistant/components/unifiprotect/number.py b/homeassistant/components/unifiprotect/number.py index 08bc9f38527..7fed79499d2 100644 --- a/homeassistant/components/unifiprotect/number.py +++ b/homeassistant/components/unifiprotect/number.py @@ -26,7 +26,7 @@ from .models import PermRequired, ProtectSetableKeysMixin, T from .utils import async_dispatch_id as _ufpd -@dataclass +@dataclass(frozen=True) class NumberKeysMixin: """Mixin for required keys.""" @@ -35,7 +35,7 @@ class NumberKeysMixin: ufp_step: int | float -@dataclass +@dataclass(frozen=True) class ProtectNumberEntityDescription( ProtectSetableKeysMixin[T], NumberEntityDescription, NumberKeysMixin ): diff --git a/homeassistant/components/unifiprotect/select.py b/homeassistant/components/unifiprotect/select.py index 7605be17fc9..649c77bed5b 100644 --- a/homeassistant/components/unifiprotect/select.py +++ b/homeassistant/components/unifiprotect/select.py @@ -92,7 +92,7 @@ DEVICE_RECORDING_MODES = [ DEVICE_CLASS_LCD_MESSAGE: Final = "unifiprotect__lcd_message" -@dataclass +@dataclass(frozen=True) class ProtectSelectEntityDescription( ProtectSetableKeysMixin[T], SelectEntityDescription ): diff --git a/homeassistant/components/unifiprotect/sensor.py b/homeassistant/components/unifiprotect/sensor.py index 756da49eb4d..6344b852b63 100644 --- a/homeassistant/components/unifiprotect/sensor.py +++ b/homeassistant/components/unifiprotect/sensor.py @@ -54,7 +54,7 @@ _LOGGER = logging.getLogger(__name__) OBJECT_TYPE_NONE = "none" -@dataclass +@dataclass(frozen=True) class ProtectSensorEntityDescription( ProtectRequiredKeysMixin[T], SensorEntityDescription ): @@ -71,7 +71,7 @@ class ProtectSensorEntityDescription( return value -@dataclass +@dataclass(frozen=True) class ProtectSensorEventEntityDescription( ProtectEventMixin[T], SensorEntityDescription ): diff --git a/homeassistant/components/unifiprotect/switch.py b/homeassistant/components/unifiprotect/switch.py index f1e6185b010..e4cb4b7ff46 100644 --- a/homeassistant/components/unifiprotect/switch.py +++ b/homeassistant/components/unifiprotect/switch.py @@ -31,7 +31,7 @@ ATTR_PREV_MIC = "prev_mic_level" ATTR_PREV_RECORD = "prev_record_mode" -@dataclass +@dataclass(frozen=True) class ProtectSwitchEntityDescription( ProtectSetableKeysMixin[T], SwitchEntityDescription ): diff --git a/homeassistant/components/unifiprotect/text.py b/homeassistant/components/unifiprotect/text.py index c39f7895231..de777121ff5 100644 --- a/homeassistant/components/unifiprotect/text.py +++ b/homeassistant/components/unifiprotect/text.py @@ -24,7 +24,7 @@ from .models import PermRequired, ProtectSetableKeysMixin, T from .utils import async_dispatch_id as _ufpd -@dataclass +@dataclass(frozen=True) class ProtectTextEntityDescription(ProtectSetableKeysMixin[T], TextEntityDescription): """Describes UniFi Protect Text entity.""" diff --git a/homeassistant/components/upnp/binary_sensor.py b/homeassistant/components/upnp/binary_sensor.py index 0ab8962077b..676b9588ddb 100644 --- a/homeassistant/components/upnp/binary_sensor.py +++ b/homeassistant/components/upnp/binary_sensor.py @@ -18,7 +18,7 @@ from .const import DOMAIN, LOGGER, WAN_STATUS from .entity import UpnpEntity, UpnpEntityDescription -@dataclass +@dataclass(frozen=True) class UpnpBinarySensorEntityDescription( UpnpEntityDescription, BinarySensorEntityDescription ): diff --git a/homeassistant/components/upnp/entity.py b/homeassistant/components/upnp/entity.py index add8039345b..504602372f7 100644 --- a/homeassistant/components/upnp/entity.py +++ b/homeassistant/components/upnp/entity.py @@ -10,7 +10,7 @@ from homeassistant.helpers.update_coordinator import CoordinatorEntity from .coordinator import UpnpDataUpdateCoordinator -@dataclass +@dataclass(frozen=True) class UpnpEntityDescription(EntityDescription): """UPnP entity description.""" diff --git a/homeassistant/components/upnp/sensor.py b/homeassistant/components/upnp/sensor.py index 46d748f6939..e493118f58e 100644 --- a/homeassistant/components/upnp/sensor.py +++ b/homeassistant/components/upnp/sensor.py @@ -41,7 +41,7 @@ from .coordinator import UpnpDataUpdateCoordinator from .entity import UpnpEntity, UpnpEntityDescription -@dataclass +@dataclass(frozen=True) class UpnpSensorEntityDescription(UpnpEntityDescription, SensorEntityDescription): """A class that describes a sensor UPnP entities.""" diff --git a/homeassistant/components/v2c/binary_sensor.py b/homeassistant/components/v2c/binary_sensor.py index 7776a3398c7..b30c632174a 100644 --- a/homeassistant/components/v2c/binary_sensor.py +++ b/homeassistant/components/v2c/binary_sensor.py @@ -20,14 +20,14 @@ from .coordinator import V2CUpdateCoordinator from .entity import V2CBaseEntity -@dataclass +@dataclass(frozen=True) class V2CRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[Trydan], bool] -@dataclass +@dataclass(frozen=True) class V2CBinarySensorEntityDescription( BinarySensorEntityDescription, V2CRequiredKeysMixin ): diff --git a/homeassistant/components/v2c/number.py b/homeassistant/components/v2c/number.py index 0f2551818a2..dd20b0de787 100644 --- a/homeassistant/components/v2c/number.py +++ b/homeassistant/components/v2c/number.py @@ -24,7 +24,7 @@ MIN_INTENSITY = 6 MAX_INTENSITY = 32 -@dataclass +@dataclass(frozen=True) class V2CSettingsRequiredKeysMixin: """Mixin for required keys.""" @@ -32,7 +32,7 @@ class V2CSettingsRequiredKeysMixin: update_fn: Callable[[Trydan, int], Coroutine[Any, Any, None]] -@dataclass +@dataclass(frozen=True) class V2CSettingsNumberEntityDescription( NumberEntityDescription, V2CSettingsRequiredKeysMixin ): diff --git a/homeassistant/components/v2c/sensor.py b/homeassistant/components/v2c/sensor.py index ed642510a34..0aa727fa408 100644 --- a/homeassistant/components/v2c/sensor.py +++ b/homeassistant/components/v2c/sensor.py @@ -25,14 +25,14 @@ from .entity import V2CBaseEntity _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class V2CRequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[TrydanData], float] -@dataclass +@dataclass(frozen=True) class V2CSensorEntityDescription(SensorEntityDescription, V2CRequiredKeysMixin): """Describes an EVSE Power sensor entity.""" diff --git a/homeassistant/components/v2c/switch.py b/homeassistant/components/v2c/switch.py index 4e56e72dcbf..a876af75d86 100644 --- a/homeassistant/components/v2c/switch.py +++ b/homeassistant/components/v2c/switch.py @@ -21,7 +21,7 @@ from .entity import V2CBaseEntity _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class V2CRequiredKeysMixin: """Mixin for required keys.""" @@ -30,7 +30,7 @@ class V2CRequiredKeysMixin: turn_off_fn: Callable[[Trydan], Coroutine[Any, Any, Any]] -@dataclass +@dataclass(frozen=True) class V2CSwitchEntityDescription(SwitchEntityDescription, V2CRequiredKeysMixin): """Describes a V2C EVSE switch entity.""" diff --git a/homeassistant/components/vallox/binary_sensor.py b/homeassistant/components/vallox/binary_sensor.py index 05085c24424..00c25897d1c 100644 --- a/homeassistant/components/vallox/binary_sensor.py +++ b/homeassistant/components/vallox/binary_sensor.py @@ -41,14 +41,14 @@ class ValloxBinarySensorEntity(ValloxEntity, BinarySensorEntity): return self.coordinator.data.get_metric(self.entity_description.metric_key) == 1 -@dataclass +@dataclass(frozen=True) class ValloxMetricKeyMixin: """Dataclass to allow defining metric_key without a default value.""" metric_key: str -@dataclass +@dataclass(frozen=True) class ValloxBinarySensorEntityDescription( BinarySensorEntityDescription, ValloxMetricKeyMixin ): diff --git a/homeassistant/components/vallox/number.py b/homeassistant/components/vallox/number.py index ce43ca9c3fb..fa5dfff4a6d 100644 --- a/homeassistant/components/vallox/number.py +++ b/homeassistant/components/vallox/number.py @@ -60,14 +60,14 @@ class ValloxNumberEntity(ValloxEntity, NumberEntity): await self.coordinator.async_request_refresh() -@dataclass +@dataclass(frozen=True) class ValloxMetricMixin: """Holds Vallox metric key.""" metric_key: str -@dataclass +@dataclass(frozen=True) class ValloxNumberEntityDescription(NumberEntityDescription, ValloxMetricMixin): """Describes Vallox number entity.""" diff --git a/homeassistant/components/vallox/sensor.py b/homeassistant/components/vallox/sensor.py index ee0e1e43204..af5994b66d9 100644 --- a/homeassistant/components/vallox/sensor.py +++ b/homeassistant/components/vallox/sensor.py @@ -125,7 +125,7 @@ class ValloxCellStateSensor(ValloxSensorEntity): return VALLOX_CELL_STATE_TO_STR.get(super_native_value) -@dataclass +@dataclass(frozen=True) class ValloxSensorEntityDescription(SensorEntityDescription): """Describes Vallox sensor entity.""" diff --git a/homeassistant/components/vallox/switch.py b/homeassistant/components/vallox/switch.py index 194659d40cd..8e7835e0bd7 100644 --- a/homeassistant/components/vallox/switch.py +++ b/homeassistant/components/vallox/switch.py @@ -63,14 +63,14 @@ class ValloxSwitchEntity(ValloxEntity, SwitchEntity): await self.coordinator.async_request_refresh() -@dataclass +@dataclass(frozen=True) class ValloxMetricKeyMixin: """Dataclass to allow defining metric_key without a default value.""" metric_key: str -@dataclass +@dataclass(frozen=True) class ValloxSwitchEntityDescription(SwitchEntityDescription, ValloxMetricKeyMixin): """Describes Vallox switch entity.""" diff --git a/homeassistant/components/venstar/sensor.py b/homeassistant/components/venstar/sensor.py index 7125dfd4540..1e31fb9407b 100644 --- a/homeassistant/components/venstar/sensor.py +++ b/homeassistant/components/venstar/sensor.py @@ -65,7 +65,7 @@ SCHEDULE_PARTS: dict[int, str] = { } -@dataclass +@dataclass(frozen=True) class VenstarSensorTypeMixin: """Mixin for sensor required keys.""" @@ -74,7 +74,7 @@ class VenstarSensorTypeMixin: uom_fn: Callable[[Any], str | None] -@dataclass +@dataclass(frozen=True) class VenstarSensorEntityDescription(SensorEntityDescription, VenstarSensorTypeMixin): """Base description of a Sensor entity.""" diff --git a/homeassistant/components/vesync/sensor.py b/homeassistant/components/vesync/sensor.py index 4277460c3ea..97a557ef49f 100644 --- a/homeassistant/components/vesync/sensor.py +++ b/homeassistant/components/vesync/sensor.py @@ -35,14 +35,14 @@ from .const import DEV_TYPE_TO_HA, DOMAIN, SKU_TO_BASE_DEVICE, VS_DISCOVERY, VS_ _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class VeSyncSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[VeSyncAirBypass | VeSyncOutlet | VeSyncSwitch], StateType] -@dataclass +@dataclass(frozen=True) class VeSyncSensorEntityDescription( SensorEntityDescription, VeSyncSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/vicare/__init__.py b/homeassistant/components/vicare/__init__.py index 2e3284c37c4..603a42bae41 100644 --- a/homeassistant/components/vicare/__init__.py +++ b/homeassistant/components/vicare/__init__.py @@ -37,14 +37,14 @@ _LOGGER = logging.getLogger(__name__) _TOKEN_FILENAME = "vicare_token.save" -@dataclass() +@dataclass(frozen=True) class ViCareRequiredKeysMixin: """Mixin for required keys.""" value_getter: Callable[[Device], Any] -@dataclass() +@dataclass(frozen=True) class ViCareRequiredKeysMixinWithSet(ViCareRequiredKeysMixin): """Mixin for required keys with setter.""" diff --git a/homeassistant/components/vicare/binary_sensor.py b/homeassistant/components/vicare/binary_sensor.py index 95a4bcdc9f0..f3cf585b470 100644 --- a/homeassistant/components/vicare/binary_sensor.py +++ b/homeassistant/components/vicare/binary_sensor.py @@ -35,7 +35,7 @@ from .utils import get_burners, get_circuits, get_compressors, is_supported _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class ViCareBinarySensorEntityDescription( BinarySensorEntityDescription, ViCareRequiredKeysMixin ): diff --git a/homeassistant/components/vicare/button.py b/homeassistant/components/vicare/button.py index 374d98b3397..8f11fdf0ac5 100644 --- a/homeassistant/components/vicare/button.py +++ b/homeassistant/components/vicare/button.py @@ -28,7 +28,7 @@ from .utils import is_supported _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class ViCareButtonEntityDescription( ButtonEntityDescription, ViCareRequiredKeysMixinWithSet ): diff --git a/homeassistant/components/vicare/number.py b/homeassistant/components/vicare/number.py index 965b5a619fc..d4dd0437b04 100644 --- a/homeassistant/components/vicare/number.py +++ b/homeassistant/components/vicare/number.py @@ -37,7 +37,7 @@ from .utils import get_circuits, is_supported _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class ViCareNumberEntityDescription(NumberEntityDescription, ViCareRequiredKeysMixin): """Describes ViCare number entity.""" diff --git a/homeassistant/components/vicare/sensor.py b/homeassistant/components/vicare/sensor.py index 875d8790c52..142e3cbabfa 100644 --- a/homeassistant/components/vicare/sensor.py +++ b/homeassistant/components/vicare/sensor.py @@ -58,7 +58,7 @@ VICARE_UNIT_TO_DEVICE_CLASS = { } -@dataclass +@dataclass(frozen=True) class ViCareSensorEntityDescription(SensorEntityDescription, ViCareRequiredKeysMixin): """Describes ViCare sensor entity.""" diff --git a/homeassistant/components/vilfo/sensor.py b/homeassistant/components/vilfo/sensor.py index 511e25bbfba..c72edf1b7db 100644 --- a/homeassistant/components/vilfo/sensor.py +++ b/homeassistant/components/vilfo/sensor.py @@ -24,14 +24,14 @@ from .const import ( ) -@dataclass +@dataclass(frozen=True) class VilfoRequiredKeysMixin: """Mixin for required keys.""" api_key: str -@dataclass +@dataclass(frozen=True) class VilfoSensorEntityDescription(SensorEntityDescription, VilfoRequiredKeysMixin): """Describes Vilfo sensor entity.""" diff --git a/homeassistant/components/vodafone_station/button.py b/homeassistant/components/vodafone_station/button.py index 7f93f8023ef..3840af3d593 100644 --- a/homeassistant/components/vodafone_station/button.py +++ b/homeassistant/components/vodafone_station/button.py @@ -20,7 +20,7 @@ from .const import _LOGGER, DOMAIN from .coordinator import VodafoneStationRouter -@dataclass +@dataclass(frozen=True) class VodafoneStationBaseEntityDescriptionMixin: """Mixin to describe a Button entity.""" @@ -28,7 +28,7 @@ class VodafoneStationBaseEntityDescriptionMixin: is_suitable: Callable[[dict], bool] -@dataclass +@dataclass(frozen=True) class VodafoneStationEntityDescription( ButtonEntityDescription, VodafoneStationBaseEntityDescriptionMixin ): diff --git a/homeassistant/components/vodafone_station/sensor.py b/homeassistant/components/vodafone_station/sensor.py index 8d9cb444fc9..fcf26c6eb55 100644 --- a/homeassistant/components/vodafone_station/sensor.py +++ b/homeassistant/components/vodafone_station/sensor.py @@ -24,7 +24,7 @@ from .coordinator import VodafoneStationRouter NOT_AVAILABLE: list = ["", "N/A", "0.0.0.0"] -@dataclass +@dataclass(frozen=True) class VodafoneStationBaseEntityDescription: """Vodafone Station entity base description.""" @@ -34,7 +34,7 @@ class VodafoneStationBaseEntityDescription: is_suitable: Callable[[dict], bool] = lambda val: True -@dataclass +@dataclass(frozen=True) class VodafoneStationEntityDescription( VodafoneStationBaseEntityDescription, SensorEntityDescription ): diff --git a/homeassistant/components/wallbox/number.py b/homeassistant/components/wallbox/number.py index b47eb14d58a..76cf8316959 100644 --- a/homeassistant/components/wallbox/number.py +++ b/homeassistant/components/wallbox/number.py @@ -38,7 +38,7 @@ def min_charging_current_value(coordinator: WallboxCoordinator) -> float: return 6 -@dataclass +@dataclass(frozen=True) class WallboxNumberEntityDescriptionMixin: """Load entities from different handlers.""" @@ -47,7 +47,7 @@ class WallboxNumberEntityDescriptionMixin: set_value_fn: Callable[[WallboxCoordinator], Callable[[float], Awaitable[None]]] -@dataclass +@dataclass(frozen=True) class WallboxNumberEntityDescription( NumberEntityDescription, WallboxNumberEntityDescriptionMixin ): diff --git a/homeassistant/components/wallbox/sensor.py b/homeassistant/components/wallbox/sensor.py index 4a1cf365bb1..5a825722d53 100644 --- a/homeassistant/components/wallbox/sensor.py +++ b/homeassistant/components/wallbox/sensor.py @@ -51,7 +51,7 @@ UPDATE_INTERVAL = 30 _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class WallboxSensorEntityDescription(SensorEntityDescription): """Describes Wallbox sensor entity.""" diff --git a/homeassistant/components/waqi/sensor.py b/homeassistant/components/waqi/sensor.py index d94a2e19f67..43be729e10f 100644 --- a/homeassistant/components/waqi/sensor.py +++ b/homeassistant/components/waqi/sensor.py @@ -153,7 +153,7 @@ async def async_setup_platform( ) -@dataclass +@dataclass(frozen=True) class WAQIMixin: """Mixin for required keys.""" @@ -161,7 +161,7 @@ class WAQIMixin: value_fn: Callable[[WAQIAirQuality], StateType] -@dataclass +@dataclass(frozen=True) class WAQISensorEntityDescription(SensorEntityDescription, WAQIMixin): """Describes WAQI sensor entity.""" diff --git a/homeassistant/components/weatherflow/sensor.py b/homeassistant/components/weatherflow/sensor.py index f3e5b8744e6..bbdd79e1533 100644 --- a/homeassistant/components/weatherflow/sensor.py +++ b/homeassistant/components/weatherflow/sensor.py @@ -46,7 +46,7 @@ from homeassistant.util.unit_system import METRIC_SYSTEM from .const import DOMAIN, LOGGER, format_dispatch_call -@dataclass +@dataclass(frozen=True) class WeatherFlowSensorRequiredKeysMixin: """Mixin for required keys.""" @@ -60,7 +60,7 @@ def precipitation_raw_conversion_fn(raw_data: Enum): return raw_data.name.lower() -@dataclass +@dataclass(frozen=True) class WeatherFlowSensorEntityDescription( SensorEntityDescription, WeatherFlowSensorRequiredKeysMixin ): diff --git a/homeassistant/components/wemo/sensor.py b/homeassistant/components/wemo/sensor.py index 2547dc0ad0d..ecb0c16055c 100644 --- a/homeassistant/components/wemo/sensor.py +++ b/homeassistant/components/wemo/sensor.py @@ -22,7 +22,7 @@ from .entity import WemoEntity from .wemo_device import DeviceCoordinator -@dataclass +@dataclass(frozen=True) class AttributeSensorDescription(SensorEntityDescription): """SensorEntityDescription for WeMo AttributeSensor entities.""" diff --git a/homeassistant/components/whirlpool/sensor.py b/homeassistant/components/whirlpool/sensor.py index c3cad90e045..227c0e9f653 100644 --- a/homeassistant/components/whirlpool/sensor.py +++ b/homeassistant/components/whirlpool/sensor.py @@ -89,14 +89,14 @@ def washer_state(washer: WasherDryer) -> str | None: return MACHINE_STATE.get(machine_state, None) -@dataclass +@dataclass(frozen=True) class WhirlpoolSensorEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable -@dataclass +@dataclass(frozen=True) class WhirlpoolSensorEntityDescription( SensorEntityDescription, WhirlpoolSensorEntityDescriptionMixin ): diff --git a/homeassistant/components/whois/sensor.py b/homeassistant/components/whois/sensor.py index 0116f542a3c..7118701a868 100644 --- a/homeassistant/components/whois/sensor.py +++ b/homeassistant/components/whois/sensor.py @@ -27,7 +27,7 @@ from homeassistant.util import dt as dt_util from .const import ATTR_EXPIRES, ATTR_NAME_SERVERS, ATTR_REGISTRAR, ATTR_UPDATED, DOMAIN -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class WhoisSensorEntityDescription(SensorEntityDescription): """Describes a Whois sensor entity.""" diff --git a/homeassistant/components/withings/sensor.py b/homeassistant/components/withings/sensor.py index 36ac9ea7d73..c7ff66e9b4d 100644 --- a/homeassistant/components/withings/sensor.py +++ b/homeassistant/components/withings/sensor.py @@ -58,7 +58,7 @@ from .coordinator import ( from .entity import WithingsEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class WithingsMeasurementSensorEntityDescription(SensorEntityDescription): """Immutable class for describing withings data.""" @@ -236,7 +236,7 @@ MEASUREMENT_SENSORS: dict[ } -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class WithingsSleepSensorEntityDescription(SensorEntityDescription): """Immutable class for describing withings data.""" @@ -396,7 +396,7 @@ SLEEP_SENSORS = [ ] -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class WithingsActivitySensorEntityDescription(SensorEntityDescription): """Immutable class for describing withings data.""" @@ -494,7 +494,7 @@ SLEEP_GOAL = "sleep" WEIGHT_GOAL = "weight" -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class WithingsGoalsSensorEntityDescription(SensorEntityDescription): """Immutable class for describing withings data.""" @@ -531,7 +531,7 @@ GOALS_SENSORS: dict[str, WithingsGoalsSensorEntityDescription] = { } -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class WithingsWorkoutSensorEntityDescription(SensorEntityDescription): """Immutable class for describing withings data.""" diff --git a/homeassistant/components/wiz/number.py b/homeassistant/components/wiz/number.py index 76c4b197534..91436674d7f 100644 --- a/homeassistant/components/wiz/number.py +++ b/homeassistant/components/wiz/number.py @@ -22,7 +22,7 @@ from .entity import WizEntity from .models import WizData -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class WizNumberEntityDescription(NumberEntityDescription): """Class to describe a WiZ number entity.""" diff --git a/homeassistant/components/wled/number.py b/homeassistant/components/wled/number.py index 9ab5554a6b7..0fa7d464722 100644 --- a/homeassistant/components/wled/number.py +++ b/homeassistant/components/wled/number.py @@ -39,7 +39,7 @@ async def async_setup_entry( update_segments() -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class WLEDNumberEntityDescription(NumberEntityDescription): """Class describing WLED number entities.""" diff --git a/homeassistant/components/wled/sensor.py b/homeassistant/components/wled/sensor.py index 64cc3dc2812..709edaf424f 100644 --- a/homeassistant/components/wled/sensor.py +++ b/homeassistant/components/wled/sensor.py @@ -31,7 +31,7 @@ from .coordinator import WLEDDataUpdateCoordinator from .models import WLEDEntity -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class WLEDSensorEntityDescription(SensorEntityDescription): """Describes WLED sensor entity.""" diff --git a/homeassistant/components/xiaomi_miio/binary_sensor.py b/homeassistant/components/xiaomi_miio/binary_sensor.py index 130b5ebd922..e1b06175493 100644 --- a/homeassistant/components/xiaomi_miio/binary_sensor.py +++ b/homeassistant/components/xiaomi_miio/binary_sensor.py @@ -44,7 +44,7 @@ ATTR_WATER_BOX_ATTACHED = "is_water_box_attached" ATTR_WATER_SHORTAGE = "is_water_shortage" -@dataclass +@dataclass(frozen=True) class XiaomiMiioBinarySensorDescription(BinarySensorEntityDescription): """A class that describes binary sensor entities.""" diff --git a/homeassistant/components/xiaomi_miio/button.py b/homeassistant/components/xiaomi_miio/button.py index e5e11b85e58..4ebbf34f295 100644 --- a/homeassistant/components/xiaomi_miio/button.py +++ b/homeassistant/components/xiaomi_miio/button.py @@ -37,7 +37,7 @@ ATTR_RESET_VACUUM_FILTER = "reset_vacuum_filter" ATTR_RESET_VACUUM_SENSOR_DIRTY = "reset_vacuum_sensor_dirty" -@dataclass +@dataclass(frozen=True) class XiaomiMiioButtonDescription(ButtonEntityDescription): """A class that describes button entities.""" diff --git a/homeassistant/components/xiaomi_miio/number.py b/homeassistant/components/xiaomi_miio/number.py index 1062b2d42b0..2660a1b2be1 100644 --- a/homeassistant/components/xiaomi_miio/number.py +++ b/homeassistant/components/xiaomi_miio/number.py @@ -108,14 +108,14 @@ ATTR_OSCILLATION_ANGLE = "angle" ATTR_VOLUME = "volume" -@dataclass +@dataclass(frozen=True) class XiaomiMiioNumberMixin: """A class that describes number entities.""" method: str -@dataclass +@dataclass(frozen=True) class XiaomiMiioNumberDescription(NumberEntityDescription, XiaomiMiioNumberMixin): """A class that describes number entities.""" diff --git a/homeassistant/components/xiaomi_miio/select.py b/homeassistant/components/xiaomi_miio/select.py index f6123ad0f0c..b70dab1921a 100644 --- a/homeassistant/components/xiaomi_miio/select.py +++ b/homeassistant/components/xiaomi_miio/select.py @@ -71,7 +71,7 @@ ATTR_MODE = "mode" _LOGGER = logging.getLogger(__name__) -@dataclass +@dataclass(frozen=True) class XiaomiMiioSelectDescription(SelectEntityDescription): """A class that describes select entities.""" diff --git a/homeassistant/components/xiaomi_miio/sensor.py b/homeassistant/components/xiaomi_miio/sensor.py index 200a67e5f54..a8435d6a8a1 100644 --- a/homeassistant/components/xiaomi_miio/sensor.py +++ b/homeassistant/components/xiaomi_miio/sensor.py @@ -150,7 +150,7 @@ ATTR_CONSUMABLE_STATUS_FILTER_LEFT = "filter_left" ATTR_CONSUMABLE_STATUS_SENSOR_DIRTY_LEFT = "sensor_dirty_left" -@dataclass +@dataclass(frozen=True) class XiaomiMiioSensorDescription(SensorEntityDescription): """Class that holds device specific info for a xiaomi aqara or humidifier sensor.""" diff --git a/homeassistant/components/xiaomi_miio/switch.py b/homeassistant/components/xiaomi_miio/switch.py index 7de6192e736..68714f1a6ff 100644 --- a/homeassistant/components/xiaomi_miio/switch.py +++ b/homeassistant/components/xiaomi_miio/switch.py @@ -219,7 +219,7 @@ MODEL_TO_FEATURES_MAP = { } -@dataclass +@dataclass(frozen=True) class XiaomiMiioSwitchRequiredKeyMixin: """A class that describes switch entities.""" @@ -228,7 +228,7 @@ class XiaomiMiioSwitchRequiredKeyMixin: method_off: str -@dataclass +@dataclass(frozen=True) class XiaomiMiioSwitchDescription( SwitchEntityDescription, XiaomiMiioSwitchRequiredKeyMixin ): diff --git a/homeassistant/components/yalexs_ble/sensor.py b/homeassistant/components/yalexs_ble/sensor.py index 9d702ff52eb..da698d1b501 100644 --- a/homeassistant/components/yalexs_ble/sensor.py +++ b/homeassistant/components/yalexs_ble/sensor.py @@ -27,14 +27,14 @@ from .entity import YALEXSBLEEntity from .models import YaleXSBLEData -@dataclass +@dataclass(frozen=True) class YaleXSBLERequiredKeysMixin: """Mixin for required keys.""" value_fn: Callable[[LockState, LockInfo, ConnectionInfo], int | float | None] -@dataclass +@dataclass(frozen=True) class YaleXSBLESensorEntityDescription( SensorEntityDescription, YaleXSBLERequiredKeysMixin ): diff --git a/homeassistant/components/yolink/binary_sensor.py b/homeassistant/components/yolink/binary_sensor.py index e65896cdd42..0650cc3a203 100644 --- a/homeassistant/components/yolink/binary_sensor.py +++ b/homeassistant/components/yolink/binary_sensor.py @@ -28,7 +28,7 @@ from .coordinator import YoLinkCoordinator from .entity import YoLinkEntity -@dataclass +@dataclass(frozen=True) class YoLinkBinarySensorEntityDescription(BinarySensorEntityDescription): """YoLink BinarySensorEntityDescription.""" diff --git a/homeassistant/components/yolink/sensor.py b/homeassistant/components/yolink/sensor.py index 2fc4a2b0725..4ac9379d763 100644 --- a/homeassistant/components/yolink/sensor.py +++ b/homeassistant/components/yolink/sensor.py @@ -48,14 +48,14 @@ from .coordinator import YoLinkCoordinator from .entity import YoLinkEntity -@dataclass +@dataclass(frozen=True) class YoLinkSensorEntityDescriptionMixin: """Mixin for device type.""" exists_fn: Callable[[YoLinkDevice], bool] = lambda _: True -@dataclass +@dataclass(frozen=True) class YoLinkSensorEntityDescription( YoLinkSensorEntityDescriptionMixin, SensorEntityDescription ): diff --git a/homeassistant/components/yolink/siren.py b/homeassistant/components/yolink/siren.py index 81c2b46a840..4a35e9506e9 100644 --- a/homeassistant/components/yolink/siren.py +++ b/homeassistant/components/yolink/siren.py @@ -23,7 +23,7 @@ from .coordinator import YoLinkCoordinator from .entity import YoLinkEntity -@dataclass +@dataclass(frozen=True) class YoLinkSirenEntityDescription(SirenEntityDescription): """YoLink SirenEntityDescription.""" diff --git a/homeassistant/components/yolink/switch.py b/homeassistant/components/yolink/switch.py index 018fcb84988..69a958ba6d1 100644 --- a/homeassistant/components/yolink/switch.py +++ b/homeassistant/components/yolink/switch.py @@ -29,7 +29,7 @@ from .coordinator import YoLinkCoordinator from .entity import YoLinkEntity -@dataclass +@dataclass(frozen=True) class YoLinkSwitchEntityDescription(SwitchEntityDescription): """YoLink SwitchEntityDescription.""" diff --git a/homeassistant/components/youtube/sensor.py b/homeassistant/components/youtube/sensor.py index 99cd3ecf095..d037a8c3c4b 100644 --- a/homeassistant/components/youtube/sensor.py +++ b/homeassistant/components/youtube/sensor.py @@ -26,7 +26,7 @@ from .const import ( from .entity import YouTubeChannelEntity -@dataclass +@dataclass(frozen=True) class YouTubeMixin: """Mixin for required keys.""" @@ -36,7 +36,7 @@ class YouTubeMixin: attributes_fn: Callable[[Any], dict[str, Any] | None] | None -@dataclass +@dataclass(frozen=True) class YouTubeSensorEntityDescription(SensorEntityDescription, YouTubeMixin): """Describes YouTube sensor entity.""" diff --git a/homeassistant/components/zamg/sensor.py b/homeassistant/components/zamg/sensor.py index 344ba560f6a..adc07212a5f 100644 --- a/homeassistant/components/zamg/sensor.py +++ b/homeassistant/components/zamg/sensor.py @@ -37,14 +37,14 @@ from .const import ( from .coordinator import ZamgDataUpdateCoordinator -@dataclass +@dataclass(frozen=True) class ZamgRequiredKeysMixin: """Mixin for required keys.""" para_name: str -@dataclass +@dataclass(frozen=True) class ZamgSensorEntityDescription(SensorEntityDescription, ZamgRequiredKeysMixin): """Describes Zamg sensor entity.""" diff --git a/homeassistant/components/zeversolar/sensor.py b/homeassistant/components/zeversolar/sensor.py index ee9aa5531c8..9e2333a1e24 100644 --- a/homeassistant/components/zeversolar/sensor.py +++ b/homeassistant/components/zeversolar/sensor.py @@ -22,14 +22,14 @@ from .coordinator import ZeversolarCoordinator from .entity import ZeversolarEntity -@dataclass +@dataclass(frozen=True) class ZeversolarEntityDescriptionMixin: """Mixin for required keys.""" value_fn: Callable[[zeversolar.ZeverSolarData], zeversolar.kWh | zeversolar.Watt] -@dataclass +@dataclass(frozen=True) class ZeversolarEntityDescription( SensorEntityDescription, ZeversolarEntityDescriptionMixin ): diff --git a/homeassistant/components/zwave_js/binary_sensor.py b/homeassistant/components/zwave_js/binary_sensor.py index acd6780d39f..cb460f37000 100644 --- a/homeassistant/components/zwave_js/binary_sensor.py +++ b/homeassistant/components/zwave_js/binary_sensor.py @@ -50,7 +50,7 @@ NOTIFICATION_IRRIGATION = "17" NOTIFICATION_GAS = "18" -@dataclass +@dataclass(frozen=True) class NotificationZWaveJSEntityDescription(BinarySensorEntityDescription): """Represent a Z-Wave JS binary sensor entity description.""" @@ -58,14 +58,14 @@ class NotificationZWaveJSEntityDescription(BinarySensorEntityDescription): states: tuple[str, ...] | None = None -@dataclass +@dataclass(frozen=True) class PropertyZWaveJSMixin: """Represent the mixin for property sensor descriptions.""" on_states: tuple[str, ...] -@dataclass +@dataclass(frozen=True) class PropertyZWaveJSEntityDescription( BinarySensorEntityDescription, PropertyZWaveJSMixin ): diff --git a/homeassistant/components/zwave_js/humidifier.py b/homeassistant/components/zwave_js/humidifier.py index 02c6abbc732..14a43bea3af 100644 --- a/homeassistant/components/zwave_js/humidifier.py +++ b/homeassistant/components/zwave_js/humidifier.py @@ -34,7 +34,7 @@ from .entity import ZWaveBaseEntity PARALLEL_UPDATES = 0 -@dataclass +@dataclass(frozen=True) class ZwaveHumidifierEntityDescriptionRequiredKeys: """A class for humidifier entity description required keys.""" @@ -48,7 +48,7 @@ class ZwaveHumidifierEntityDescriptionRequiredKeys: setpoint_type: HumidityControlSetpointType -@dataclass +@dataclass(frozen=True) class ZwaveHumidifierEntityDescription( HumidifierEntityDescription, ZwaveHumidifierEntityDescriptionRequiredKeys ): diff --git a/homeassistant/components/zwave_me/sensor.py b/homeassistant/components/zwave_me/sensor.py index 89048f4fec9..f96e2d789ff 100644 --- a/homeassistant/components/zwave_me/sensor.py +++ b/homeassistant/components/zwave_me/sensor.py @@ -31,7 +31,7 @@ from . import ZWaveMeController, ZWaveMeEntity from .const import DOMAIN, ZWaveMePlatform -@dataclass +@dataclass(frozen=True) class ZWaveMeSensorEntityDescription(SensorEntityDescription): """Class describing ZWaveMeSensor sensor entities.""" diff --git a/homeassistant/util/frozen_dataclass_compat.py b/homeassistant/util/frozen_dataclass_compat.py index 456fc4f1570..858084bcabc 100644 --- a/homeassistant/util/frozen_dataclass_compat.py +++ b/homeassistant/util/frozen_dataclass_compat.py @@ -45,6 +45,7 @@ def _class_fields(cls: type, kw_only: bool) -> list[tuple[str, Any, Any]]: @dataclass_transform( field_specifiers=(dataclasses.field, dataclasses.Field), + frozen_default=True, # Set to allow setting frozen in child classes kw_only_default=True, # Set to allow setting kw_only in child classes ) class FrozenOrThawed(type):