Pylint 2.9.3 (#52972)

Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
This commit is contained in:
Daniel Hjelseth Høyer 2021-07-15 06:44:57 +02:00 committed by GitHub
parent db8db18b54
commit fbad453c89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
92 changed files with 182 additions and 213 deletions

View File

@ -299,9 +299,9 @@ class AsusWrtRouter:
) )
track_unknown = self._options.get(CONF_TRACK_UNKNOWN, DEFAULT_TRACK_UNKNOWN) track_unknown = self._options.get(CONF_TRACK_UNKNOWN, DEFAULT_TRACK_UNKNOWN)
for device_mac in self._devices: for device_mac, device in self._devices.items():
dev_info = wrt_devices.get(device_mac) dev_info = wrt_devices.get(device_mac)
self._devices[device_mac].update(dev_info, consider_home) device.update(dev_info, consider_home)
for device_mac, dev_info in wrt_devices.items(): for device_mac, dev_info in wrt_devices.items():
if device_mac in self._devices: if device_mac in self._devices:

View File

@ -61,9 +61,9 @@ class ActivityStream(AugustSubscriberMixin):
"""Cleanup any debounces.""" """Cleanup any debounces."""
for debouncer in self._update_debounce.values(): for debouncer in self._update_debounce.values():
debouncer.async_cancel() debouncer.async_cancel()
for house_id in self._schedule_updates: for house_id, updater in self._schedule_updates.items():
if self._schedule_updates[house_id] is not None: if updater is not None:
self._schedule_updates[house_id]() updater()
self._schedule_updates[house_id] = None self._schedule_updates[house_id] = None
def get_latest_device_activity(self, device_id, activity_types): def get_latest_device_activity(self, device_id, activity_types):

View File

@ -112,10 +112,10 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
entities.append(AugustDoorBinarySensor(data, "door_open", door)) entities.append(AugustDoorBinarySensor(data, "door_open", door))
for doorbell in data.doorbells: for doorbell in data.doorbells:
for sensor_type in SENSOR_TYPES_DOORBELL: for sensor_type, sensor in SENSOR_TYPES_DOORBELL.items():
_LOGGER.debug( _LOGGER.debug(
"Adding doorbell sensor class %s for %s", "Adding doorbell sensor class %s for %s",
SENSOR_TYPES_DOORBELL[sensor_type][SENSOR_DEVICE_CLASS], sensor[SENSOR_DEVICE_CLASS],
doorbell.device_name, doorbell.device_name,
) )
entities.append(AugustDoorbellBinarySensor(data, sensor_type, doorbell)) entities.append(AugustDoorbellBinarySensor(data, sensor_type, doorbell))

View File

@ -193,8 +193,8 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
for player in target_players: for player in target_players:
await getattr(player, method["method"])(**params) await getattr(player, method["method"])(**params)
for service in SERVICE_TO_METHOD: for service, method in SERVICE_TO_METHOD.items():
schema = SERVICE_TO_METHOD[service]["schema"] schema = method["schema"]
hass.services.async_register( hass.services.async_register(
DOMAIN, service, async_service_handler, schema=schema DOMAIN, service, async_service_handler, schema=schema
) )

View File

@ -8,6 +8,7 @@ from bluepy.btle import BTLEException # pylint: disable=import-error
import decora # pylint: disable=import-error import decora # pylint: disable=import-error
import voluptuous as vol import voluptuous as vol
from homeassistant import util
from homeassistant.components.light import ( from homeassistant.components.light import (
ATTR_BRIGHTNESS, ATTR_BRIGHTNESS,
PLATFORM_SCHEMA, PLATFORM_SCHEMA,
@ -16,7 +17,6 @@ from homeassistant.components.light import (
) )
from homeassistant.const import CONF_API_KEY, CONF_DEVICES, CONF_NAME from homeassistant.const import CONF_API_KEY, CONF_DEVICES, CONF_NAME
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
import homeassistant.util as util
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)

View File

@ -108,8 +108,8 @@ TEMPLATE_SCHEMA = vol.Schema({str: TEMPLATE_DATA_SCHEMA})
def validate_area(config: dict[str, Any]) -> dict[str, Any]: def validate_area(config: dict[str, Any]) -> dict[str, Any]:
"""Validate that template parameters are only used if area is using the relevant template.""" """Validate that template parameters are only used if area is using the relevant template."""
conf_set = set() conf_set = set()
for template in DEFAULT_TEMPLATES: for configs in DEFAULT_TEMPLATES.values():
for conf in DEFAULT_TEMPLATES[template]: for conf in configs:
conf_set.add(conf) conf_set.add(conf)
if config.get(CONF_TEMPLATE): if config.get(CONF_TEMPLATE):
for conf in DEFAULT_TEMPLATES[config[CONF_TEMPLATE]]: for conf in DEFAULT_TEMPLATES[config[CONF_TEMPLATE]]:

View File

@ -148,8 +148,7 @@ async def async_setup(hass, config):
sensors = [] sensors = []
binary_sensors = [] binary_sensors = []
if eight.users: if eight.users:
for user in eight.users: for obj in eight.users.values():
obj = eight.users[user]
for sensor in SENSORS: for sensor in SENSORS:
sensors.append(f"{obj.side}_{sensor}") sensors.append(f"{obj.side}_{sensor}")
binary_sensors.append(f"{obj.side}_presence") binary_sensors.append(f"{obj.side}_presence")

View File

@ -86,7 +86,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
"""Handle devices which are added to Emby.""" """Handle devices which are added to Emby."""
new_devices = [] new_devices = []
active_devices = [] active_devices = []
for dev_id in emby.devices: for dev_id, dev in emby.devices.items():
active_devices.append(dev_id) active_devices.append(dev_id)
if ( if (
dev_id not in active_emby_devices dev_id not in active_emby_devices
@ -96,9 +96,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
active_emby_devices[dev_id] = new active_emby_devices[dev_id] = new
new_devices.append(new) new_devices.append(new)
elif ( elif dev_id in inactive_emby_devices and dev.state != "Off":
dev_id in inactive_emby_devices and emby.devices[dev_id].state != "Off"
):
add = inactive_emby_devices.pop(dev_id) add = inactive_emby_devices.pop(dev_id)
active_emby_devices[dev_id] = add active_emby_devices[dev_id] = add
_LOGGER.debug("Showing %s, item: %s", dev_id, add) _LOGGER.debug("Showing %s, item: %s", dev_id, add)

View File

@ -56,14 +56,13 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
name = data[NAME] name = data[NAME]
entities = [] entities = []
for condition in SENSORS: for condition, sensor in SENSORS.items():
entity_name = ""
if ( if (
condition == "inverters" condition == "inverters"
and coordinator.data.get("inverters_production") is not None and coordinator.data.get("inverters_production") is not None
): ):
for inverter in coordinator.data["inverters_production"]: for inverter in coordinator.data["inverters_production"]:
entity_name = f"{name} {SENSORS[condition][0]} {inverter}" entity_name = f"{name} {sensor[0]} {inverter}"
split_name = entity_name.split(" ") split_name = entity_name.split(" ")
serial_number = split_name[-1] serial_number = split_name[-1]
entities.append( entities.append(
@ -73,8 +72,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
name, name,
config_entry.unique_id, config_entry.unique_id,
serial_number, serial_number,
SENSORS[condition][1], sensor[1],
SENSORS[condition][2], sensor[2],
coordinator, coordinator,
) )
) )
@ -83,7 +82,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
if isinstance(data, str) and "not available" in data: if isinstance(data, str) and "not available" in data:
continue continue
entity_name = f"{name} {SENSORS[condition][0]}" entity_name = f"{name} {sensor[0]}"
entities.append( entities.append(
Envoy( Envoy(
condition, condition,
@ -91,8 +90,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
name, name,
config_entry.unique_id, config_entry.unique_id,
None, None,
SENSORS[condition][1], sensor[1],
SENSORS[condition][2], sensor[2],
coordinator, coordinator,
) )
) )

View File

@ -28,7 +28,7 @@ from homeassistant.components.weather import (
) )
from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME, TEMP_CELSIUS from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME, TEMP_CELSIUS
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
import homeassistant.util.dt as dt from homeassistant.util import dt
CONF_FORECAST = "forecast" CONF_FORECAST = "forecast"
CONF_ATTRIBUTION = "Data provided by Environment Canada" CONF_ATTRIBUTION = "Data provided by Environment Canada"

View File

@ -26,10 +26,6 @@ async def async_setup_entry(
) )
# Pylint gets confused with the EsphomeEntity generics -> let mypy handle member checking
# pylint: disable=no-member
class EsphomeBinarySensor( class EsphomeBinarySensor(
EsphomeEntity[BinarySensorInfo, BinarySensorState], BinarySensorEntity EsphomeEntity[BinarySensorInfo, BinarySensorState], BinarySensorEntity
): ):

View File

@ -32,10 +32,6 @@ async def async_setup_entry(
) )
# Pylint gets confused with the EsphomeEntity generics -> let mypy handle member checking
# pylint: disable=no-member
class EsphomeCamera(Camera, EsphomeBaseEntity[CameraInfo, CameraState]): class EsphomeCamera(Camera, EsphomeBaseEntity[CameraInfo, CameraState]):
"""A camera implementation for ESPHome.""" """A camera implementation for ESPHome."""

View File

@ -149,8 +149,7 @@ _PRESETS: EsphomeEnumMapper[ClimatePreset, str] = EsphomeEnumMapper(
# https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property # https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property
# Pylint gets confused with the EsphomeEntity generics -> let mypy handle member checking # pylint: disable=invalid-overridden-method
# pylint: disable=invalid-overridden-method,no-member
class EsphomeClimateEntity(EsphomeEntity[ClimateInfo, ClimateState], ClimateEntity): class EsphomeClimateEntity(EsphomeEntity[ClimateInfo, ClimateState], ClimateEntity):

View File

@ -40,8 +40,7 @@ async def async_setup_entry(
# https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property # https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property
# Pylint gets confused with the EsphomeEntity generics -> let mypy handle member checking # pylint: disable=invalid-overridden-method
# pylint: disable=invalid-overridden-method,no-member
class EsphomeCover(EsphomeEntity[CoverInfo, CoverState], CoverEntity): class EsphomeCover(EsphomeEntity[CoverInfo, CoverState], CoverEntity):

View File

@ -58,8 +58,7 @@ _FAN_DIRECTIONS: EsphomeEnumMapper[FanDirection, str] = EsphomeEnumMapper(
# https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property # https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property
# Pylint gets confused with the EsphomeEntity generics -> let mypy handle member checking # pylint: disable=invalid-overridden-method
# pylint: disable=invalid-overridden-method,no-member
class EsphomeFan(EsphomeEntity[FanInfo, FanState], FanEntity): class EsphomeFan(EsphomeEntity[FanInfo, FanState], FanEntity):

View File

@ -50,8 +50,7 @@ async def async_setup_entry(
# https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property # https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property
# Pylint gets confused with the EsphomeEntity generics -> let mypy handle member checking # pylint: disable=invalid-overridden-method
# pylint: disable=invalid-overridden-method,no-member
class EsphomeLight(EsphomeEntity[LightInfo, LightState], LightEntity): class EsphomeLight(EsphomeEntity[LightInfo, LightState], LightEntity):

View File

@ -36,8 +36,7 @@ async def async_setup_entry(
# https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property # https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property
# Pylint gets confused with the EsphomeEntity generics -> let mypy handle member checking # pylint: disable=invalid-overridden-method
# pylint: disable=invalid-overridden-method,no-member
class EsphomeNumber(EsphomeEntity[NumberInfo, NumberState], NumberEntity): class EsphomeNumber(EsphomeEntity[NumberInfo, NumberState], NumberEntity):

View File

@ -60,8 +60,7 @@ async def async_setup_entry(
# https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property # https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property
# Pylint gets confused with the EsphomeEntity generics -> let mypy handle member checking # pylint: disable=invalid-overridden-method
# pylint: disable=invalid-overridden-method,no-member
_STATE_CLASSES: EsphomeEnumMapper[SensorStateClass, str | None] = EsphomeEnumMapper( _STATE_CLASSES: EsphomeEnumMapper[SensorStateClass, str | None] = EsphomeEnumMapper(

View File

@ -29,8 +29,7 @@ async def async_setup_entry(
# https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property # https://github.com/PyCQA/pylint/issues/3150 for all @esphome_state_property
# Pylint gets confused with the EsphomeEntity generics -> let mypy handle member checking # pylint: disable=invalid-overridden-method
# pylint: disable=invalid-overridden-method,no-member
class EsphomeSwitch(EsphomeEntity[SwitchInfo, SwitchState], SwitchEntity): class EsphomeSwitch(EsphomeEntity[SwitchInfo, SwitchState], SwitchEntity):

View File

@ -47,7 +47,7 @@ def _setup_entry(hass: HomeAssistant, entry: ConfigEntry):
flume_devices = FlumeDeviceList(flume_auth, http_session=http_session) flume_devices = FlumeDeviceList(flume_auth, http_session=http_session)
except RequestException as ex: except RequestException as ex:
raise ConfigEntryNotReady from ex raise ConfigEntryNotReady from ex
except Exception as ex: # pylint: disable=broad-except except Exception as ex:
raise ConfigEntryAuthFailed from ex raise ConfigEntryAuthFailed from ex
return flume_auth, flume_devices, http_session return flume_auth, flume_devices, http_session

View File

@ -50,25 +50,23 @@ async def async_setup_entry(
) )
) )
for sensor_key in CONNECTION_SENSORS: for sensor_key, sensor in CONNECTION_SENSORS.items():
entities.append( entities.append(FreeboxSensor(router, sensor_key, sensor))
FreeboxSensor(router, sensor_key, CONNECTION_SENSORS[sensor_key])
)
for sensor_key in CALL_SENSORS: for sensor_key, sensor in CALL_SENSORS.items():
entities.append(FreeboxCallSensor(router, sensor_key, CALL_SENSORS[sensor_key])) entities.append(FreeboxCallSensor(router, sensor_key, sensor))
_LOGGER.debug("%s - %s - %s disk(s)", router.name, router.mac, len(router.disks)) _LOGGER.debug("%s - %s - %s disk(s)", router.name, router.mac, len(router.disks))
for disk in router.disks.values(): for disk in router.disks.values():
for partition in disk["partitions"]: for partition in disk["partitions"]:
for sensor_key in DISK_PARTITION_SENSORS: for sensor_key, sensor in DISK_PARTITION_SENSORS.items():
entities.append( entities.append(
FreeboxDiskSensor( FreeboxDiskSensor(
router, router,
disk, disk,
partition, partition,
sensor_key, sensor_key,
DISK_PARTITION_SENSORS[sensor_key], sensor,
) )
) )

View File

@ -262,8 +262,8 @@ def wifi_entities_list(
networks[i] = ssid networks[i] = ssid
return [ return [
FritzBoxWifiSwitch(fritzbox_tools, device_friendly_name, net, networks[net]) FritzBoxWifiSwitch(fritzbox_tools, device_friendly_name, net, network_name)
for net in networks for net, network_name in networks.items()
] ]
@ -428,8 +428,8 @@ class FritzBoxPortSwitch(FritzBoxBaseSwitch, SwitchEntity):
"NewPortMappingDescription": "description", "NewPortMappingDescription": "description",
} }
for key in attributes_dict: for key, attr in attributes_dict.items():
self._attributes[attributes_dict[key]] = self.port_mapping[key] self._attributes[attr] = self.port_mapping[key]
async def _async_handle_port_switch_on_off(self, turn_on: bool) -> bool: async def _async_handle_port_switch_on_off(self, turn_on: bool) -> bool:

View File

@ -25,9 +25,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
client, client,
name, name,
disk["mnt_point"], disk["mnt_point"],
SENSOR_TYPES[sensor_type][1], sensor_details[1],
sensor_type, sensor_type,
SENSOR_TYPES[sensor_type], sensor_details,
) )
) )
elif sensor_details[0] == "sensors": elif sensor_details[0] == "sensors":
@ -39,9 +39,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
client, client,
name, name,
sensor["label"], sensor["label"],
SENSOR_TYPES[sensor_type][1], sensor_details[1],
sensor_type, sensor_type,
SENSOR_TYPES[sensor_type], sensor_details,
) )
) )
elif client.api.data[sensor_details[0]]: elif client.api.data[sensor_details[0]]:
@ -50,9 +50,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
client, client,
name, name,
"", "",
SENSOR_TYPES[sensor_type][1], sensor_details[1],
sensor_type, sensor_type,
SENSOR_TYPES[sensor_type], sensor_details,
) )
) )

View File

@ -223,8 +223,8 @@ def setup(hass, config):
def check_correct_scopes(token_file): def check_correct_scopes(token_file):
"""Check for the correct scopes in file.""" """Check for the correct scopes in file."""
tokenfile = open(token_file).read() with open(token_file) as tokenfile:
if "readonly" in tokenfile: if "readonly" in tokenfile.read():
_LOGGER.warning("Please re-authenticate with Google") _LOGGER.warning("Please re-authenticate with Google")
return False return False
return True return True

View File

@ -214,8 +214,8 @@ async def handle_devices_execute(hass, data, payload):
execute_results = await asyncio.gather( execute_results = await asyncio.gather(
*[ *[
_entity_execute(entities[entity_id], data, executions[entity_id]) _entity_execute(entities[entity_id], data, execution)
for entity_id in executions for entity_id, execution in executions.items()
] ]
) )

View File

@ -59,7 +59,9 @@ def setup(hass: HomeAssistant, yaml_config: dict[str, Any]):
service_principal_path service_principal_path
) )
topic_path = publisher.topic_path(project_id, topic_name) topic_path = publisher.topic_path( # pylint: disable=no-member
project_id, topic_name
)
encoder = DateTimeJSONEncoder() encoder = DateTimeJSONEncoder()

View File

@ -27,7 +27,7 @@ from homeassistant.helpers import location
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import DiscoveryInfoType from homeassistant.helpers.typing import DiscoveryInfoType
import homeassistant.util.dt as dt from homeassistant.util import dt
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)

View File

@ -141,9 +141,9 @@ class Camera(HomeAccessory, PyhapCamera):
def __init__(self, hass, driver, name, entity_id, aid, config): def __init__(self, hass, driver, name, entity_id, aid, config):
"""Initialize a Camera accessory object.""" """Initialize a Camera accessory object."""
self._ffmpeg = hass.data[DATA_FFMPEG] self._ffmpeg = hass.data[DATA_FFMPEG]
for config_key in CONFIG_DEFAULTS: for config_key, conf in CONFIG_DEFAULTS.items():
if config_key not in config: if config_key not in config:
config[config_key] = CONFIG_DEFAULTS[config_key] config[config_key] = conf
max_fps = config[CONF_MAX_FPS] max_fps = config[CONF_MAX_FPS]
max_width = config[CONF_MAX_WIDTH] max_width = config[CONF_MAX_WIDTH]

View File

@ -160,8 +160,8 @@ class SensorManager:
) )
) )
for platform in to_add: for platform, value in to_add.items():
self._component_add_entities[platform](to_add[platform]) self._component_add_entities[platform](value)
class GenericHueSensor(GenericHueDevice, entity.Entity): class GenericHueSensor(GenericHueDevice, entity.Entity):

View File

@ -38,7 +38,7 @@ def log_rate_limits(hass, target, resp, level=20):
rate_limits["successful"], rate_limits["successful"],
rate_limits["maximum"], rate_limits["maximum"],
rate_limits["errors"], rate_limits["errors"],
str(resetsAtTime).split(".")[0], str(resetsAtTime).split(".", maxsplit=1)[0],
) )

View File

@ -384,7 +384,7 @@ class ItunesDevice(MediaPlayerEntity):
def media_next_track(self): def media_next_track(self):
"""Send media_next command to media player.""" """Send media_next command to media player."""
response = self.client.next() # pylint: disable=not-callable response = self.client.next()
self.update_state(response) self.update_state(response)
def media_previous_track(self): def media_previous_track(self):

View File

@ -185,7 +185,7 @@ class KNXClimate(KnxEntity, ClimateEntity):
f"{self._device.temperature.group_address_state}_" f"{self._device.temperature.group_address_state}_"
f"{self._device.target_temperature.group_address_state}_" f"{self._device.target_temperature.group_address_state}_"
f"{self._device.target_temperature.group_address}_" f"{self._device.target_temperature.group_address}_"
f"{self._device._setpoint_shift.group_address}" # pylint: disable=protected-access f"{self._device._setpoint_shift.group_address}"
) )
async def async_update(self) -> None: async def async_update(self) -> None:

View File

@ -142,7 +142,6 @@ class KulerskyLight(LightEntity):
try: try:
if not self._available: if not self._available:
await self._light.connect() await self._light.connect()
# pylint: disable=invalid-name
rgbw = await self._light.get_color() rgbw = await self._light.get_color()
except pykulersky.PykulerskyException as exc: except pykulersky.PykulerskyException as exc:
if self._available: if self._available:

View File

@ -139,7 +139,8 @@ class LgTVDevice(MediaPlayerEntity):
self._sources = dict(zip(channel_names, channel_list)) self._sources = dict(zip(channel_names, channel_list))
# sort source names by the major channel number # sort source names by the major channel number
source_tuples = [ source_tuples = [
(k, self._sources[k].find("major").text) for k in self._sources (k, source.find("major").text)
for k, source in self._sources.items()
] ]
sorted_sources = sorted( sorted_sources = sorted(
source_tuples, key=lambda channel: int(channel[1]) source_tuples, key=lambda channel: int(channel[1])

View File

@ -189,7 +189,7 @@ class Life360Scanner:
{ {
ATTR_ENTITY_ID: f"{DEVICE_TRACKER_DOMAIN}.{dev_id}", ATTR_ENTITY_ID: f"{DEVICE_TRACKER_DOMAIN}.{dev_id}",
ATTR_WAIT: str(last_seen - (prev_seen or self._started)).split( ATTR_WAIT: str(last_seen - (prev_seen or self._started)).split(
"." ".", maxsplit=1
)[0], )[0],
}, },
) )

View File

@ -81,7 +81,7 @@ class LuftDatenFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
return self._show_form({CONF_SENSOR_ID: "invalid_sensor"}) return self._show_form({CONF_SENSOR_ID: "invalid_sensor"})
available_sensors = [ available_sensors = [
x for x in luftdaten.values if luftdaten.values[x] is not None x for x, x_values in luftdaten.values.items() if x_values is not None
] ]
if available_sensors: if available_sensors:

View File

@ -79,7 +79,7 @@ def log_rate_limits(hass, device_name, resp, level=logging.INFO):
rate_limits[ATTR_PUSH_RATE_LIMITS_SUCCESSFUL], rate_limits[ATTR_PUSH_RATE_LIMITS_SUCCESSFUL],
rate_limits[ATTR_PUSH_RATE_LIMITS_MAXIMUM], rate_limits[ATTR_PUSH_RATE_LIMITS_MAXIMUM],
rate_limits[ATTR_PUSH_RATE_LIMITS_ERRORS], rate_limits[ATTR_PUSH_RATE_LIMITS_ERRORS],
str(resetsAtTime).split(".")[0], str(resetsAtTime).split(".", maxsplit=1)[0],
) )

View File

@ -8,7 +8,7 @@ import voluptuous as vol
from homeassistant.components.fan import SUPPORT_DIRECTION, SUPPORT_SET_SPEED, FanEntity from homeassistant.components.fan import SUPPORT_DIRECTION, SUPPORT_SET_SPEED, FanEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
import homeassistant.helpers.entity_platform as entity_platform from homeassistant.helpers import entity_platform
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import HomeAssistantType from homeassistant.helpers.typing import HomeAssistantType
from homeassistant.util.percentage import ( from homeassistant.util.percentage import (

View File

@ -12,7 +12,7 @@ from homeassistant.components.light import (
LightEntity, LightEntity,
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
import homeassistant.helpers.entity_platform as entity_platform from homeassistant.helpers import entity_platform
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import HomeAssistantType from homeassistant.helpers.typing import HomeAssistantType
from homeassistant.util.percentage import ( from homeassistant.util.percentage import (

View File

@ -163,6 +163,8 @@ class MySensorsLight(mysensors.device.MySensorsEntity, LightEntity):
if self.assumed_state: if self.assumed_state:
# optimistically assume that light has changed state # optimistically assume that light has changed state
# pylint: disable=no-value-for-parameter
# https://github.com/PyCQA/pylint/issues/4546
self._hs = color_util.color_RGB_to_hs(*rgb) # type: ignore[assignment] self._hs = color_util.color_RGB_to_hs(*rgb) # type: ignore[assignment]
self._white = white self._white = white
self._values[self.value_type] = hex_color self._values[self.value_type] = hex_color

View File

@ -87,11 +87,9 @@ class NetatmoScheduleSelect(NetatmoBase, SelectEntity):
self._attr_unique_id = f"{self._home_id}-schedule-select" self._attr_unique_id = f"{self._home_id}-schedule-select"
self._attr_current_option = ( self._attr_current_option = self._data._get_selected_schedule(
self._data._get_selected_schedule( # pylint: disable=protected-access
home_id=self._home_id home_id=self._home_id
).get("name") ).get("name")
)
self._attr_options = options self._attr_options = options
async def async_added_to_hass(self) -> None: async def async_added_to_hass(self) -> None:

View File

@ -22,10 +22,10 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
ombi = hass.data[DOMAIN]["instance"] ombi = hass.data[DOMAIN]["instance"]
for sensor in SENSOR_TYPES: for sensor, sensor_val in SENSOR_TYPES.items():
sensor_label = sensor sensor_label = sensor
sensor_type = SENSOR_TYPES[sensor]["type"] sensor_type = sensor_val["type"]
sensor_icon = SENSOR_TYPES[sensor]["icon"] sensor_icon = sensor_val["icon"]
sensors.append(OmbiSensor(sensor_label, sensor_type, ombi, sensor_icon)) sensors.append(OmbiSensor(sensor_label, sensor_type, ombi, sensor_icon))
add_entities(sensors, True) add_entities(sensors, True)

View File

@ -88,8 +88,7 @@ class OpenHardwareMonitorDevice(SensorEntity):
array = self._data.data[OHM_CHILDREN] array = self._data.data[OHM_CHILDREN]
_attributes = {} _attributes = {}
for path_index in range(0, len(self.path)): for path_index, path_number in enumerate(self.path):
path_number = self.path[path_index]
values = array[path_number] values = array[path_number]
if path_index == len(self.path) - 1: if path_index == len(self.path) - 1:

View File

@ -83,9 +83,9 @@ class ZWaveDeviceEntityValues:
return return
# Go through the possible values for this entity defined by the schema. # Go through the possible values for this entity defined by the schema.
for name in self._values: for name, name_value in self._values.items():
# Skip if it's already been added. # Skip if it's already been added.
if self._values[name] is not None: if name_value is not None:
continue continue
# Skip if the value doesn't match the schema. # Skip if the value doesn't match the schema.
if not check_value_schema(value, self._schema[const.DISC_VALUES][name]): if not check_value_schema(value, self._schema[const.DISC_VALUES][name]):

View File

@ -256,14 +256,18 @@ class PingDataSubProcess(PingData):
) )
if sys.platform == "win32": if sys.platform == "win32":
match = WIN32_PING_MATCHER.search(str(out_data).split("\n")[-1]) match = WIN32_PING_MATCHER.search(
str(out_data).rsplit("\n", maxsplit=1)[-1]
)
rtt_min, rtt_avg, rtt_max = match.groups() rtt_min, rtt_avg, rtt_max = match.groups()
return {"min": rtt_min, "avg": rtt_avg, "max": rtt_max, "mdev": ""} return {"min": rtt_min, "avg": rtt_avg, "max": rtt_max, "mdev": ""}
if "max/" not in str(out_data): if "max/" not in str(out_data):
match = PING_MATCHER_BUSYBOX.search(str(out_data).split("\n")[-1]) match = PING_MATCHER_BUSYBOX.search(
str(out_data).rsplit("\n", maxsplit=1)[-1]
)
rtt_min, rtt_avg, rtt_max = match.groups() rtt_min, rtt_avg, rtt_max = match.groups()
return {"min": rtt_min, "avg": rtt_avg, "max": rtt_max, "mdev": ""} return {"min": rtt_min, "avg": rtt_avg, "max": rtt_max, "mdev": ""}
match = PING_MATCHER.search(str(out_data).split("\n")[-1]) match = PING_MATCHER.search(str(out_data).rsplit("\n", maxsplit=1)[-1])
rtt_min, rtt_avg, rtt_max, rtt_mdev = match.groups() rtt_min, rtt_avg, rtt_max, rtt_mdev = match.groups()
return {"min": rtt_min, "avg": rtt_avg, "max": rtt_max, "mdev": rtt_mdev} return {"min": rtt_min, "avg": rtt_avg, "max": rtt_max, "mdev": rtt_mdev}
except asyncio.TimeoutError: except asyncio.TimeoutError:

View File

@ -230,10 +230,10 @@ class Proximity(Entity):
closest_device: str = None closest_device: str = None
dist_to_zone: float = None dist_to_zone: float = None
for device in distances_to_zone: for device, zone in distances_to_zone.items():
if not dist_to_zone or distances_to_zone[device] < dist_to_zone: if not dist_to_zone or zone < dist_to_zone:
closest_device = device closest_device = device
dist_to_zone = distances_to_zone[device] dist_to_zone = zone
# If the closest device is one of the other devices. # If the closest device is one of the other devices.
if closest_device != entity: if closest_device != entity:

View File

@ -30,8 +30,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
sensors = [] sensors = []
for device_type in ("doorbots", "authorized_doorbots", "stickup_cams"): for device_type in ("doorbots", "authorized_doorbots", "stickup_cams"):
for sensor_type in SENSOR_TYPES: for sensor_type, sensor in SENSOR_TYPES.items():
if device_type not in SENSOR_TYPES[sensor_type][1]: if device_type not in sensor[1]:
continue continue
for device in devices[device_type]: for device in devices[device_type]:

View File

@ -19,19 +19,15 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
sensors = [] sensors = []
for device_type in ("chimes", "doorbots", "authorized_doorbots", "stickup_cams"): for device_type in ("chimes", "doorbots", "authorized_doorbots", "stickup_cams"):
for sensor_type in SENSOR_TYPES: for sensor_type, sensor in SENSOR_TYPES.items():
if device_type not in SENSOR_TYPES[sensor_type][1]: if device_type not in sensor[1]:
continue continue
for device in devices[device_type]: for device in devices[device_type]:
if device_type == "battery" and device.battery_life is None: if device_type == "battery" and device.battery_life is None:
continue continue
sensors.append( sensors.append(sensor[6](config_entry.entry_id, device, sensor_type))
SENSOR_TYPES[sensor_type][6](
config_entry.entry_id, device, sensor_type
)
)
async_add_entities(sensors) async_add_entities(sensors)

View File

@ -26,9 +26,10 @@ _LOGGER = logging.getLogger(__name__)
def kill_raspistill(*args): def kill_raspistill(*args):
"""Kill any previously running raspistill process..""" """Kill any previously running raspistill process.."""
subprocess.Popen( with subprocess.Popen(
["killall", "raspistill"], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT ["killall", "raspistill"], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT
) ):
pass
def setup_platform(hass, config, add_entities, discovery_info=None): def setup_platform(hass, config, add_entities, discovery_info=None):
@ -116,7 +117,10 @@ class RaspberryCamera(Camera):
cmd_args.append("-a") cmd_args.append("-a")
cmd_args.append(str(device_info[CONF_OVERLAY_TIMESTAMP])) cmd_args.append(str(device_info[CONF_OVERLAY_TIMESTAMP]))
subprocess.Popen(cmd_args, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) with subprocess.Popen(
cmd_args, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT
):
pass
def camera_image(self): def camera_image(self):
"""Return raspistill image response.""" """Return raspistill image response."""

View File

@ -96,8 +96,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
for i in range(len(data.active_voltage)): for i in range(len(data.active_voltage)):
devices.append(SenseVoltageSensor(data, i, sense_monitor_id)) devices.append(SenseVoltageSensor(data, i, sense_monitor_id))
for type_id in TRENDS_SENSOR_TYPES: for type_id, typ in TRENDS_SENSOR_TYPES.items():
typ = TRENDS_SENSOR_TYPES[type_id]
for var in SENSOR_VARIANTS: for var in SENSOR_VARIANTS:
name = typ.name name = typ.name
sensor_type = typ.sensor_type sensor_type = typ.sensor_type

View File

@ -78,7 +78,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
), ),
} }
# pylint: disable=abstract-class-instantiated
sentry_sdk.init( sentry_sdk.init(
dsn=entry.data[CONF_DSN], dsn=entry.data[CONF_DSN],
environment=entry.options.get(CONF_ENVIRONMENT), environment=entry.options.get(CONF_ENVIRONMENT),

View File

@ -22,8 +22,7 @@ from homeassistant.components.notify import (
) )
from homeassistant.const import ATTR_ICON, CONF_API_KEY, CONF_ICON, CONF_USERNAME from homeassistant.const import ATTR_ICON, CONF_API_KEY, CONF_ICON, CONF_USERNAME
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import aiohttp_client, config_validation as cv from homeassistant.helpers import aiohttp_client, config_validation as cv, template
import homeassistant.helpers.template as template
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)

View File

@ -149,38 +149,38 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
for service_location in smappee_base.smappee.service_locations.values(): for service_location in smappee_base.smappee.service_locations.values():
# Add all basic sensors (realtime values and aggregators) # Add all basic sensors (realtime values and aggregators)
# Some are available in local only env # Some are available in local only env
for sensor in TREND_SENSORS: for sensor, attributes in TREND_SENSORS.items():
if not service_location.local_polling or TREND_SENSORS[sensor][5]: if not service_location.local_polling or attributes[5]:
entities.append( entities.append(
SmappeeSensor( SmappeeSensor(
smappee_base=smappee_base, smappee_base=smappee_base,
service_location=service_location, service_location=service_location,
sensor=sensor, sensor=sensor,
attributes=TREND_SENSORS[sensor], attributes=attributes,
) )
) )
if service_location.has_reactive_value: if service_location.has_reactive_value:
for reactive_sensor in REACTIVE_SENSORS: for reactive_sensor, attributes in REACTIVE_SENSORS.items():
entities.append( entities.append(
SmappeeSensor( SmappeeSensor(
smappee_base=smappee_base, smappee_base=smappee_base,
service_location=service_location, service_location=service_location,
sensor=reactive_sensor, sensor=reactive_sensor,
attributes=REACTIVE_SENSORS[reactive_sensor], attributes=attributes,
) )
) )
# Add solar sensors (some are available in local only env) # Add solar sensors (some are available in local only env)
if service_location.has_solar_production: if service_location.has_solar_production:
for sensor in SOLAR_SENSORS: for sensor, attributes in SOLAR_SENSORS.items():
if not service_location.local_polling or SOLAR_SENSORS[sensor][5]: if not service_location.local_polling or attributes[5]:
entities.append( entities.append(
SmappeeSensor( SmappeeSensor(
smappee_base=smappee_base, smappee_base=smappee_base,
service_location=service_location, service_location=service_location,
sensor=sensor, sensor=sensor,
attributes=SOLAR_SENSORS[sensor], attributes=attributes,
) )
) )

View File

@ -240,7 +240,7 @@ class SnmpSwitch(SwitchEntity):
await self._set(command) await self._set(command)
# User set vartype Null, command must be an empty string # User set vartype Null, command must be an empty string
elif self._vartype == "Null": elif self._vartype == "Null":
await self._set(Null)("") await self._set("")
# user did not set vartype but command is digit: defaulting to Integer # user did not set vartype but command is digit: defaulting to Integer
# or user did set vartype # or user did set vartype
else: else:

View File

@ -78,8 +78,8 @@ async def async_setup_platform(
device_data = hass.data[DOMAIN][DATA_DEVICE] device_data = hass.data[DOMAIN][DATA_DEVICE]
async_add_entities( async_add_entities(
SwitcherSensorEntity(device_data, attribute, SENSORS[attribute]) SwitcherSensorEntity(device_data, attribute, sensor)
for attribute in SENSORS for attribute, sensor in SENSORS.items()
) )

View File

@ -32,17 +32,13 @@ async def async_setup_entry(
| SynoDSMUpgradeBinarySensor | SynoDSMUpgradeBinarySensor
| SynoDSMStorageBinarySensor | SynoDSMStorageBinarySensor
] = [ ] = [
SynoDSMSecurityBinarySensor( SynoDSMSecurityBinarySensor(api, sensor_type, sensor, coordinator)
api, sensor_type, SECURITY_BINARY_SENSORS[sensor_type], coordinator for sensor_type, sensor in SECURITY_BINARY_SENSORS.items()
)
for sensor_type in SECURITY_BINARY_SENSORS
] ]
entities += [ entities += [
SynoDSMUpgradeBinarySensor( SynoDSMUpgradeBinarySensor(api, sensor_type, sensor, coordinator)
api, sensor_type, UPGRADE_BINARY_SENSORS[sensor_type], coordinator for sensor_type, sensor in UPGRADE_BINARY_SENSORS.items()
)
for sensor_type in UPGRADE_BINARY_SENSORS
] ]
# Handle all disks # Handle all disks
@ -52,11 +48,11 @@ async def async_setup_entry(
SynoDSMStorageBinarySensor( SynoDSMStorageBinarySensor(
api, api,
sensor_type, sensor_type,
STORAGE_DISK_BINARY_SENSORS[sensor_type], sensor,
coordinator, coordinator,
disk, disk,
) )
for sensor_type in STORAGE_DISK_BINARY_SENSORS for sensor_type, sensor in STORAGE_DISK_BINARY_SENSORS.items()
] ]
async_add_entities(entities) async_add_entities(entities)

View File

@ -46,10 +46,8 @@ async def async_setup_entry(
coordinator = data[COORDINATOR_CENTRAL] coordinator = data[COORDINATOR_CENTRAL]
entities: list[SynoDSMUtilSensor | SynoDSMStorageSensor | SynoDSMInfoSensor] = [ entities: list[SynoDSMUtilSensor | SynoDSMStorageSensor | SynoDSMInfoSensor] = [
SynoDSMUtilSensor( SynoDSMUtilSensor(api, sensor_type, sensor, coordinator)
api, sensor_type, UTILISATION_SENSORS[sensor_type], coordinator for sensor_type, sensor in UTILISATION_SENSORS.items()
)
for sensor_type in UTILISATION_SENSORS
] ]
# Handle all volumes # Handle all volumes
@ -59,11 +57,11 @@ async def async_setup_entry(
SynoDSMStorageSensor( SynoDSMStorageSensor(
api, api,
sensor_type, sensor_type,
STORAGE_VOL_SENSORS[sensor_type], sensor,
coordinator, coordinator,
volume, volume,
) )
for sensor_type in STORAGE_VOL_SENSORS for sensor_type, sensor in STORAGE_VOL_SENSORS.items()
] ]
# Handle all disks # Handle all disks
@ -73,18 +71,16 @@ async def async_setup_entry(
SynoDSMStorageSensor( SynoDSMStorageSensor(
api, api,
sensor_type, sensor_type,
STORAGE_DISK_SENSORS[sensor_type], sensor,
coordinator, coordinator,
disk, disk,
) )
for sensor_type in STORAGE_DISK_SENSORS for sensor_type, sensor in STORAGE_DISK_SENSORS.items()
] ]
entities += [ entities += [
SynoDSMInfoSensor( SynoDSMInfoSensor(api, sensor_type, sensor, coordinator)
api, sensor_type, INFORMATION_SENSORS[sensor_type], coordinator for sensor_type, sensor in INFORMATION_SENSORS.items()
)
for sensor_type in INFORMATION_SENSORS
] ]
async_add_entities(entities) async_add_entities(entities)

View File

@ -44,9 +44,9 @@ async def async_setup_entry(
await coordinator.async_refresh() await coordinator.async_refresh()
entities += [ entities += [
SynoDSMSurveillanceHomeModeToggle( SynoDSMSurveillanceHomeModeToggle(
api, sensor_type, SURVEILLANCE_SWITCH[sensor_type], version, coordinator api, sensor_type, switch, version, coordinator
) )
for sensor_type in SURVEILLANCE_SWITCH for sensor_type, switch in SURVEILLANCE_SWITCH.items()
] ]
async_add_entities(entities, True) async_add_entities(entities, True)

View File

@ -18,7 +18,7 @@ from hatasmota.models import DiscoveryHashType, TasmotaDeviceConfig
from hatasmota.mqtt import TasmotaMQTTClient from hatasmota.mqtt import TasmotaMQTTClient
from hatasmota.sensor import TasmotaBaseSensorConfig from hatasmota.sensor import TasmotaBaseSensorConfig
import homeassistant.components.sensor as sensor from homeassistant.components import sensor
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dev_reg from homeassistant.helpers import device_registry as dev_reg

View File

@ -127,9 +127,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
else: else:
continue continue
for datatype in sensor_value_descriptions: for datatype, sensor_info in sensor_value_descriptions.items():
if datatype & datatype_mask and tellcore_sensor.has_value(datatype): if datatype & datatype_mask and tellcore_sensor.has_value(datatype):
sensor_info = sensor_value_descriptions[datatype]
sensors.append( sensors.append(
TellstickSensor(sensor_name, tellcore_sensor, datatype, sensor_info) TellstickSensor(sensor_name, tellcore_sensor, datatype, sensor_info)
) )

View File

@ -95,10 +95,10 @@ class TorqueReceiveDataView(HomeAssistantView):
if pid in self.sensors: if pid in self.sensors:
self.sensors[pid].async_on_update(data[key]) self.sensors[pid].async_on_update(data[key])
for pid in names: for pid, name in names.items():
if pid not in self.sensors: if pid not in self.sensors:
self.sensors[pid] = TorqueSensor( self.sensors[pid] = TorqueSensor(
ENTITY_NAME_FORMAT.format(self.vehicle, names[pid]), units.get(pid) ENTITY_NAME_FORMAT.format(self.vehicle, name), units.get(pid)
) )
hass.async_add_job(self.add_entities, [self.sensors[pid]]) hass.async_add_job(self.add_entities, [self.sensors[pid]])

View File

@ -197,7 +197,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
@callback @callback
def _async_cancel_tuya_tracker(event): def _async_cancel_tuya_tracker(event):
domain_data[TUYA_TRACKER]() domain_data[TUYA_TRACKER]() # pylint: disable=not-callable
domain_data[STOP_CANCEL] = hass.bus.async_listen_once( domain_data[STOP_CANCEL] = hass.bus.async_listen_once(
EVENT_HOMEASSISTANT_STOP, _async_cancel_tuya_tracker EVENT_HOMEASSISTANT_STOP, _async_cancel_tuya_tracker

View File

@ -112,8 +112,8 @@ async def async_setup(hass, config):
hass.data[DOMAIN] = {"client": client, "state_proxy": state_proxy, "name": name} hass.data[DOMAIN] = {"client": client, "state_proxy": state_proxy, "name": name}
for vallox_service in SERVICE_TO_METHOD: for vallox_service, method in SERVICE_TO_METHOD.items():
schema = SERVICE_TO_METHOD[vallox_service]["schema"] schema = method["schema"]
hass.services.async_register( hass.services.async_register(
DOMAIN, vallox_service, service_handler.async_handle, schema=schema DOMAIN, vallox_service, service_handler.async_handle, schema=schema
) )

View File

@ -92,8 +92,8 @@ async def async_setup(hass, config):
data["method"] = method["method"] data["method"] = method["method"]
async_dispatcher_send(hass, DOMAIN, data) async_dispatcher_send(hass, DOMAIN, data)
for service in SERVICE_TO_METHOD: for service, method in SERVICE_TO_METHOD.items():
schema = SERVICE_TO_METHOD[service]["schema"] schema = method["schema"]
hass.services.async_register( hass.services.async_register(
DOMAIN, service, async_service_handler, schema=schema DOMAIN, service, async_service_handler, schema=schema
) )

View File

@ -1,7 +1,7 @@
"""Constants used by the Withings component.""" """Constants used by the Withings component."""
from enum import Enum from enum import Enum
import homeassistant.const as const from homeassistant import const
CONF_PROFILES = "profiles" CONF_PROFILES = "profiles"
CONF_USE_WEBHOOK = "use_webhook" CONF_USE_WEBHOOK = "use_webhook"

View File

@ -9,7 +9,7 @@ import voluptuous as vol
from homeassistant.components.binary_sensor import PLATFORM_SCHEMA, BinarySensorEntity from homeassistant.components.binary_sensor import PLATFORM_SCHEMA, BinarySensorEntity
from homeassistant.const import CONF_NAME, WEEKDAYS from homeassistant.const import CONF_NAME, WEEKDAYS
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
import homeassistant.util.dt as dt from homeassistant.util import dt
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)

View File

@ -634,8 +634,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
if update_tasks: if update_tasks:
await asyncio.wait(update_tasks) await asyncio.wait(update_tasks)
for air_purifier_service in SERVICE_TO_METHOD: for air_purifier_service, method in SERVICE_TO_METHOD.items():
schema = SERVICE_TO_METHOD[air_purifier_service].get( schema = method[air_purifier_service].get(
"schema", AIRPURIFIER_SERVICE_SCHEMA "schema", AIRPURIFIER_SERVICE_SCHEMA
) )
hass.services.async_register( hass.services.async_register(

View File

@ -241,10 +241,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
if update_tasks: if update_tasks:
await asyncio.wait(update_tasks) await asyncio.wait(update_tasks)
for xiaomi_miio_service in SERVICE_TO_METHOD: for xiaomi_miio_service, method in SERVICE_TO_METHOD.items():
schema = SERVICE_TO_METHOD[xiaomi_miio_service].get( schema = method.get("schema", XIAOMI_MIIO_SERVICE_SCHEMA)
"schema", XIAOMI_MIIO_SERVICE_SCHEMA
)
hass.services.async_register( hass.services.async_register(
DOMAIN, xiaomi_miio_service, async_service_handler, schema=schema DOMAIN, xiaomi_miio_service, async_service_handler, schema=schema
) )

View File

@ -250,8 +250,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
if update_tasks: if update_tasks:
await asyncio.wait(update_tasks) await asyncio.wait(update_tasks)
for plug_service in SERVICE_TO_METHOD: for plug_service, method in SERVICE_TO_METHOD.items():
schema = SERVICE_TO_METHOD[plug_service].get("schema", SERVICE_SCHEMA) schema = method[plug_service].get("schema", SERVICE_SCHEMA)
hass.services.async_register( hass.services.async_register(
DOMAIN, plug_service, async_service_handler, schema=schema DOMAIN, plug_service, async_service_handler, schema=schema
) )

View File

@ -190,7 +190,9 @@ async def async_send_message( # noqa: C901
_LOGGER.info("Sending file to %s", recipient) _LOGGER.info("Sending file to %s", recipient)
message = self.Message(sto=recipient, stype="chat") message = self.Message(sto=recipient, stype="chat")
message["body"] = url message["body"] = url
message["oob"]["url"] = url message["oob"][ # pylint: disable=invalid-sequence-index
"url"
] = url
try: try:
message.send() message.send()
except (IqError, IqTimeout, XMPPError) as ex: except (IqError, IqTimeout, XMPPError) as ex:

View File

@ -1,5 +1,5 @@
"""Closures channels module for Zigbee Home Automation.""" """Closures channels module for Zigbee Home Automation."""
import zigpy.zcl.clusters.closures as closures from zigpy.zcl.clusters import closures
from homeassistant.core import callback from homeassistant.core import callback

View File

@ -6,7 +6,7 @@ from collections.abc import Coroutine
from typing import Any from typing import Any
import zigpy.exceptions import zigpy.exceptions
import zigpy.zcl.clusters.general as general from zigpy.zcl.clusters import general
from zigpy.zcl.foundation import Status from zigpy.zcl.foundation import Status
from homeassistant.core import callback from homeassistant.core import callback

View File

@ -3,7 +3,7 @@ from __future__ import annotations
from collections.abc import Coroutine from collections.abc import Coroutine
import zigpy.zcl.clusters.homeautomation as homeautomation from zigpy.zcl.clusters import homeautomation
from .. import registries from .. import registries
from ..const import ( from ..const import (

View File

@ -11,7 +11,7 @@ from collections import namedtuple
from typing import Any from typing import Any
from zigpy.exceptions import ZigbeeException from zigpy.exceptions import ZigbeeException
import zigpy.zcl.clusters.hvac as hvac from zigpy.zcl.clusters import hvac
from zigpy.zcl.foundation import Status from zigpy.zcl.foundation import Status
from homeassistant.core import callback from homeassistant.core import callback

View File

@ -4,7 +4,7 @@ from __future__ import annotations
from collections.abc import Coroutine from collections.abc import Coroutine
from contextlib import suppress from contextlib import suppress
import zigpy.zcl.clusters.lighting as lighting from zigpy.zcl.clusters import lighting
from .. import registries from .. import registries
from ..const import REPORT_CONFIG_DEFAULT from ..const import REPORT_CONFIG_DEFAULT

View File

@ -2,7 +2,7 @@
import asyncio import asyncio
import zigpy.exceptions import zigpy.exceptions
import zigpy.zcl.clusters.lightlink as lightlink from zigpy.zcl.clusters import lightlink
from .. import registries from .. import registries
from .base import ChannelStatus, ZigbeeChannel from .base import ChannelStatus, ZigbeeChannel

View File

@ -1,5 +1,5 @@
"""Measurement channels module for Zigbee Home Automation.""" """Measurement channels module for Zigbee Home Automation."""
import zigpy.zcl.clusters.measurement as measurement from zigpy.zcl.clusters import measurement
from .. import registries from .. import registries
from ..const import ( from ..const import (

View File

@ -1,5 +1,5 @@
"""Protocol channels module for Zigbee Home Automation.""" """Protocol channels module for Zigbee Home Automation."""
import zigpy.zcl.clusters.protocol as protocol from zigpy.zcl.clusters import protocol
from .. import registries from .. import registries
from .base import ZigbeeChannel from .base import ZigbeeChannel

View File

@ -11,7 +11,7 @@ from collections.abc import Coroutine
import logging import logging
from zigpy.exceptions import ZigbeeException from zigpy.exceptions import ZigbeeException
import zigpy.zcl.clusters.security as security from zigpy.zcl.clusters import security
from zigpy.zcl.clusters.security import IasAce as AceCluster from zigpy.zcl.clusters.security import IasAce as AceCluster
from homeassistant.core import CALLABLE_T, callback from homeassistant.core import CALLABLE_T, callback

View File

@ -3,7 +3,7 @@ from __future__ import annotations
from collections.abc import Coroutine from collections.abc import Coroutine
import zigpy.zcl.clusters.smartenergy as smartenergy from zigpy.zcl.clusters import smartenergy
from homeassistant.const import ( from homeassistant.const import (
POWER_WATT, POWER_WATT,

View File

@ -5,9 +5,9 @@ import collections
from typing import Callable, Dict from typing import Callable, Dict
import attr import attr
from zigpy import zcl
import zigpy.profiles.zha import zigpy.profiles.zha
import zigpy.profiles.zll import zigpy.profiles.zll
import zigpy.zcl as zcl
from homeassistant.components.alarm_control_panel import DOMAIN as ALARM from homeassistant.components.alarm_control_panel import DOMAIN as ALARM
from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR

View File

@ -26,8 +26,8 @@ ZigpyGroupType = zigpy.group.Group
ZigpyZdoType = zigpy.zdo.ZDO ZigpyZdoType = zigpy.zdo.ZDO
if TYPE_CHECKING: if TYPE_CHECKING:
from homeassistant.components.zha.core import channels
import homeassistant.components.zha.core.channels import homeassistant.components.zha.core.channels
import homeassistant.components.zha.core.channels as channels
import homeassistant.components.zha.core.channels.base as base_channels import homeassistant.components.zha.core.channels.base as base_channels
import homeassistant.components.zha.core.device import homeassistant.components.zha.core.device
import homeassistant.components.zha.core.gateway import homeassistant.components.zha.core.gateway

View File

@ -67,8 +67,8 @@ async def async_get_actions(hass: HomeAssistant, device_id: str) -> list[dict]:
] ]
actions = [ actions = [
action action
for channel in DEVICE_ACTIONS for channel, channel_actions in DEVICE_ACTIONS.items()
for action in DEVICE_ACTIONS[channel] for action in channel_actions
if channel in cluster_channels if channel in cluster_channels
] ]
for action in actions: for action in actions:

View File

@ -6,7 +6,7 @@ import functools
import math import math
from zigpy.exceptions import ZigbeeException from zigpy.exceptions import ZigbeeException
import zigpy.zcl.clusters.hvac as hvac from zigpy.zcl.clusters import hvac
from homeassistant.components.fan import ( from homeassistant.components.fan import (
ATTR_PERCENTAGE, ATTR_PERCENTAGE,

View File

@ -1114,8 +1114,8 @@ class ZWaveDeviceEntityValues:
""" """
if not check_node_schema(value.node, self._schema): if not check_node_schema(value.node, self._schema):
return return
for name in self._values: for name, name_value in self._values.items():
if self._values[name] is not None: if name_value is not None:
continue continue
if not check_value_schema(value, self._schema[const.DISC_VALUES][name]): if not check_value_schema(value, self._schema[const.DISC_VALUES][name]):
continue continue

View File

@ -899,7 +899,7 @@ async def async_check_ha_config_file(hass: HomeAssistant) -> str | None:
This method is a coroutine. This method is a coroutine.
""" """
# pylint: disable=import-outside-toplevel # pylint: disable=import-outside-toplevel
import homeassistant.helpers.check_config as check_config from homeassistant.helpers import check_config
res = await check_config.async_check_ha_config_file(hass) res = await check_config.async_check_ha_config_file(hass)

View File

@ -201,7 +201,7 @@ class CoreState(enum.Enum):
final_write = "FINAL_WRITE" final_write = "FINAL_WRITE"
stopped = "STOPPED" stopped = "STOPPED"
def __str__(self) -> str: # pylint: disable=invalid-str-returned def __str__(self) -> str:
"""Return the event.""" """Return the event."""
return self.value return self.value
@ -593,7 +593,7 @@ class EventOrigin(enum.Enum):
local = "LOCAL" local = "LOCAL"
remote = "REMOTE" remote = "REMOTE"
def __str__(self) -> str: # pylint: disable=invalid-str-returned def __str__(self) -> str:
"""Return the event.""" """Return the event."""
return self.value return self.value
@ -669,7 +669,7 @@ class EventBus:
This method must be run in the event loop. This method must be run in the event loop.
""" """
return {key: len(self._listeners[key]) for key in self._listeners} return {key: len(listeners) for key, listeners in self._listeners.items()}
@property @property
def listeners(self) -> dict[str, int]: def listeners(self) -> dict[str, int]:
@ -1298,7 +1298,7 @@ class ServiceRegistry:
This method must be run in the event loop. This method must be run in the event loop.
""" """
return {domain: self._services[domain].copy() for domain in self._services} return {domain: service.copy() for domain, service in self._services.items()}
def has_service(self, domain: str, service: str) -> bool: def has_service(self, domain: str, service: str) -> bool:
"""Test if specified service exists. """Test if specified service exists.

View File

@ -977,10 +977,10 @@ class _TrackTemplateResultInfo:
self._track_state_changes.async_update_listeners( self._track_state_changes.async_update_listeners(
_render_infos_to_track_states( _render_infos_to_track_states(
[ [
_suppress_domain_all_in_render_info(self._info[template]) _suppress_domain_all_in_render_info(info)
if self._rate_limit.async_has_timer(template) if self._rate_limit.async_has_timer(template)
else self._info[template] else info
for template in self._info for template, info in self._info.items()
] ]
) )
) )

View File

@ -534,7 +534,7 @@ async def async_get_integration(hass: HomeAssistant, domain: str) -> Integration
try: try:
integration = await _async_get_integration(hass, domain) integration = await _async_get_integration(hass, domain)
except Exception: # pylint: disable=broad-except except Exception:
# Remove event from cache. # Remove event from cache.
cache.pop(domain) cache.pop(domain)
event.set() event.set()

View File

@ -161,9 +161,6 @@ def get_random_string(length: int = 10) -> str:
class OrderedEnum(enum.Enum): class OrderedEnum(enum.Enum):
"""Taken from Python 3.4.0 docs.""" """Taken from Python 3.4.0 docs."""
# https://github.com/PyCQA/pylint/issues/2306
# pylint: disable=comparison-with-callable
def __ge__(self, other: ENUM_T) -> bool: def __ge__(self, other: ENUM_T) -> bool:
"""Return the greater than element.""" """Return the greater than element."""
if self.__class__ is other.__class__: if self.__class__ is other.__class__:

View File

@ -13,9 +13,9 @@ import ciso8601
from homeassistant.const import MATCH_ALL from homeassistant.const import MATCH_ALL
if sys.version_info[:2] >= (3, 9): if sys.version_info[:2] >= (3, 9):
import zoneinfo # pylint: disable=import-error import zoneinfo
else: else:
from backports import zoneinfo # pylint: disable=import-error from backports import zoneinfo
DATE_STR_FORMAT = "%Y-%m-%d" DATE_STR_FORMAT = "%Y-%m-%d"
UTC = dt.timezone.utc UTC = dt.timezone.utc

View File

@ -10,7 +10,7 @@ jsonpickle==1.4.1
mock-open==1.4.0 mock-open==1.4.0
mypy==0.902 mypy==0.902
pre-commit==2.13.0 pre-commit==2.13.0
pylint==2.8.3 pylint==2.9.3
pipdeptree==1.0.0 pipdeptree==1.0.0
pylint-strict-informational==0.1 pylint-strict-informational==0.1
pytest-aiohttp==0.3.0 pytest-aiohttp==0.3.0