mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Use instance attributes in minecraft_server (#75157)
* Remove minecraft_server from mypy ignore list * Use new entity naming style
This commit is contained in:
parent
89985b93fb
commit
1725948d4a
@ -1,21 +1,22 @@
|
||||
"""The Minecraft Server integration."""
|
||||
from __future__ import annotations
|
||||
|
||||
from collections.abc import Mapping
|
||||
from datetime import datetime, timedelta
|
||||
import logging
|
||||
from typing import Any
|
||||
|
||||
from mcstatus.server import MinecraftServer as MCStatus
|
||||
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT, Platform
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback
|
||||
from homeassistant.helpers.dispatcher import (
|
||||
async_dispatcher_connect,
|
||||
async_dispatcher_send,
|
||||
)
|
||||
from homeassistant.helpers.entity import DeviceInfo, Entity
|
||||
from homeassistant.helpers.event import async_track_time_interval
|
||||
from homeassistant.helpers.typing import ConfigType
|
||||
|
||||
from . import helpers
|
||||
from .const import DOMAIN, MANUFACTURER, SCAN_INTERVAL, SIGNAL_NAME_PREFIX
|
||||
@ -30,6 +31,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||
domain_data = hass.data.setdefault(DOMAIN, {})
|
||||
|
||||
# Create and store server instance.
|
||||
assert entry.unique_id
|
||||
unique_id = entry.unique_id
|
||||
_LOGGER.debug(
|
||||
"Creating server instance for '%s' (%s)",
|
||||
@ -71,7 +73,7 @@ class MinecraftServer:
|
||||
_MAX_RETRIES_STATUS = 3
|
||||
|
||||
def __init__(
|
||||
self, hass: HomeAssistant, unique_id: str, config_data: ConfigType
|
||||
self, hass: HomeAssistant, unique_id: str, config_data: Mapping[str, Any]
|
||||
) -> None:
|
||||
"""Initialize server instance."""
|
||||
self._hass = hass
|
||||
@ -94,14 +96,14 @@ class MinecraftServer:
|
||||
self.latency_time = None
|
||||
self.players_online = None
|
||||
self.players_max = None
|
||||
self.players_list = None
|
||||
self.players_list: list[str] | None = None
|
||||
self.motd = None
|
||||
|
||||
# Dispatcher signal name
|
||||
self.signal_name = f"{SIGNAL_NAME_PREFIX}_{self.unique_id}"
|
||||
|
||||
# Callback for stopping periodic update.
|
||||
self._stop_periodic_update = None
|
||||
self._stop_periodic_update: CALLBACK_TYPE | None = None
|
||||
|
||||
def start_periodic_update(self) -> None:
|
||||
"""Start periodic execution of update method."""
|
||||
@ -111,7 +113,8 @@ class MinecraftServer:
|
||||
|
||||
def stop_periodic_update(self) -> None:
|
||||
"""Stop periodic execution of update method."""
|
||||
self._stop_periodic_update()
|
||||
if self._stop_periodic_update:
|
||||
self._stop_periodic_update()
|
||||
|
||||
async def async_check_connection(self) -> None:
|
||||
"""Check server connection using a 'status' request and store connection status."""
|
||||
@ -219,14 +222,21 @@ class MinecraftServer:
|
||||
class MinecraftServerEntity(Entity):
|
||||
"""Representation of a Minecraft Server base entity."""
|
||||
|
||||
_attr_has_entity_name = True
|
||||
_attr_should_poll = False
|
||||
|
||||
def __init__(
|
||||
self, server: MinecraftServer, type_name: str, icon: str, device_class: str
|
||||
self,
|
||||
server: MinecraftServer,
|
||||
type_name: str,
|
||||
icon: str,
|
||||
device_class: str | None,
|
||||
) -> None:
|
||||
"""Initialize base entity."""
|
||||
self._server = server
|
||||
self._name = f"{server.name} {type_name}"
|
||||
self._icon = icon
|
||||
self._unique_id = f"{self._server.unique_id}-{type_name}"
|
||||
self._attr_name = type_name
|
||||
self._attr_icon = icon
|
||||
self._attr_unique_id = f"{self._server.unique_id}-{type_name}"
|
||||
self._attr_device_info = DeviceInfo(
|
||||
identifiers={(DOMAIN, self._server.unique_id)},
|
||||
manufacturer=MANUFACTURER,
|
||||
@ -234,34 +244,9 @@ class MinecraftServerEntity(Entity):
|
||||
name=self._server.name,
|
||||
sw_version=self._server.protocol_version,
|
||||
)
|
||||
self._device_class = device_class
|
||||
self._attr_device_class = device_class
|
||||
self._extra_state_attributes = None
|
||||
self._disconnect_dispatcher = None
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
"""Return name."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def unique_id(self) -> str:
|
||||
"""Return unique ID."""
|
||||
return self._unique_id
|
||||
|
||||
@property
|
||||
def device_class(self) -> str:
|
||||
"""Return device class."""
|
||||
return self._device_class
|
||||
|
||||
@property
|
||||
def icon(self) -> str:
|
||||
"""Return icon."""
|
||||
return self._icon
|
||||
|
||||
@property
|
||||
def should_poll(self) -> bool:
|
||||
"""Disable polling."""
|
||||
return False
|
||||
self._disconnect_dispatcher: CALLBACK_TYPE | None = None
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Fetch data from the server."""
|
||||
@ -275,7 +260,8 @@ class MinecraftServerEntity(Entity):
|
||||
|
||||
async def async_will_remove_from_hass(self) -> None:
|
||||
"""Disconnect dispatcher before removal."""
|
||||
self._disconnect_dispatcher()
|
||||
if self._disconnect_dispatcher:
|
||||
self._disconnect_dispatcher()
|
||||
|
||||
@callback
|
||||
def _update_callback(self) -> None:
|
||||
|
@ -37,13 +37,8 @@ class MinecraftServerStatusBinarySensor(MinecraftServerEntity, BinarySensorEntit
|
||||
icon=ICON_STATUS,
|
||||
device_class=BinarySensorDeviceClass.CONNECTIVITY,
|
||||
)
|
||||
self._is_on = False
|
||||
|
||||
@property
|
||||
def is_on(self) -> bool:
|
||||
"""Return binary state."""
|
||||
return self._is_on
|
||||
self._attr_is_on = False
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Update status."""
|
||||
self._is_on = self._server.online
|
||||
self._attr_is_on = self._server.online
|
||||
|
@ -11,7 +11,9 @@ from homeassistant.core import HomeAssistant
|
||||
from .const import SRV_RECORD_PREFIX
|
||||
|
||||
|
||||
async def async_check_srv_record(hass: HomeAssistant, host: str) -> dict[str, Any]:
|
||||
async def async_check_srv_record(
|
||||
hass: HomeAssistant, host: str
|
||||
) -> dict[str, Any] | None:
|
||||
"""Check if the given host is a valid Minecraft SRV record."""
|
||||
# Check if 'host' is a valid SRV record.
|
||||
return_value = None
|
||||
|
@ -1,8 +1,6 @@
|
||||
"""The Minecraft Server sensor platform."""
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
|
||||
from homeassistant.components.sensor import SensorEntity
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import TIME_MILLISECONDS
|
||||
@ -62,30 +60,19 @@ class MinecraftServerSensorEntity(MinecraftServerEntity, SensorEntity):
|
||||
self,
|
||||
server: MinecraftServer,
|
||||
type_name: str,
|
||||
icon: str = None,
|
||||
unit: str = None,
|
||||
device_class: str = None,
|
||||
icon: str,
|
||||
unit: str | None,
|
||||
device_class: str | None = None,
|
||||
) -> None:
|
||||
"""Initialize sensor base entity."""
|
||||
super().__init__(server, type_name, icon, device_class)
|
||||
self._state = None
|
||||
self._unit = unit
|
||||
self._attr_native_unit_of_measurement = unit
|
||||
|
||||
@property
|
||||
def available(self) -> bool:
|
||||
"""Return sensor availability."""
|
||||
return self._server.online
|
||||
|
||||
@property
|
||||
def native_value(self) -> Any:
|
||||
"""Return sensor state."""
|
||||
return self._state
|
||||
|
||||
@property
|
||||
def native_unit_of_measurement(self) -> str:
|
||||
"""Return sensor measurement unit."""
|
||||
return self._unit
|
||||
|
||||
|
||||
class MinecraftServerVersionSensor(MinecraftServerSensorEntity):
|
||||
"""Representation of a Minecraft Server version sensor."""
|
||||
@ -98,7 +85,7 @@ class MinecraftServerVersionSensor(MinecraftServerSensorEntity):
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Update version."""
|
||||
self._state = self._server.version
|
||||
self._attr_native_value = self._server.version
|
||||
|
||||
|
||||
class MinecraftServerProtocolVersionSensor(MinecraftServerSensorEntity):
|
||||
@ -115,7 +102,7 @@ class MinecraftServerProtocolVersionSensor(MinecraftServerSensorEntity):
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Update protocol version."""
|
||||
self._state = self._server.protocol_version
|
||||
self._attr_native_value = self._server.protocol_version
|
||||
|
||||
|
||||
class MinecraftServerLatencyTimeSensor(MinecraftServerSensorEntity):
|
||||
@ -132,7 +119,7 @@ class MinecraftServerLatencyTimeSensor(MinecraftServerSensorEntity):
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Update latency time."""
|
||||
self._state = self._server.latency_time
|
||||
self._attr_native_value = self._server.latency_time
|
||||
|
||||
|
||||
class MinecraftServerPlayersOnlineSensor(MinecraftServerSensorEntity):
|
||||
@ -149,20 +136,15 @@ class MinecraftServerPlayersOnlineSensor(MinecraftServerSensorEntity):
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Update online players state and device state attributes."""
|
||||
self._state = self._server.players_online
|
||||
self._attr_native_value = self._server.players_online
|
||||
|
||||
extra_state_attributes = None
|
||||
extra_state_attributes = {}
|
||||
players_list = self._server.players_list
|
||||
|
||||
if players_list is not None and len(players_list) != 0:
|
||||
extra_state_attributes = {ATTR_PLAYERS_LIST: self._server.players_list}
|
||||
extra_state_attributes[ATTR_PLAYERS_LIST] = self._server.players_list
|
||||
|
||||
self._extra_state_attributes = extra_state_attributes
|
||||
|
||||
@property
|
||||
def extra_state_attributes(self) -> dict[str, Any]:
|
||||
"""Return players list in device state attributes."""
|
||||
return self._extra_state_attributes
|
||||
self._attr_extra_state_attributes = extra_state_attributes
|
||||
|
||||
|
||||
class MinecraftServerPlayersMaxSensor(MinecraftServerSensorEntity):
|
||||
@ -179,7 +161,7 @@ class MinecraftServerPlayersMaxSensor(MinecraftServerSensorEntity):
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Update maximum number of players."""
|
||||
self._state = self._server.players_max
|
||||
self._attr_native_value = self._server.players_max
|
||||
|
||||
|
||||
class MinecraftServerMOTDSensor(MinecraftServerSensorEntity):
|
||||
@ -196,4 +178,4 @@ class MinecraftServerMOTDSensor(MinecraftServerSensorEntity):
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Update MOTD."""
|
||||
self._state = self._server.motd
|
||||
self._attr_native_value = self._server.motd
|
||||
|
9
mypy.ini
9
mypy.ini
@ -2665,15 +2665,6 @@ ignore_errors = true
|
||||
[mypy-homeassistant.components.evohome]
|
||||
ignore_errors = true
|
||||
|
||||
[mypy-homeassistant.components.minecraft_server]
|
||||
ignore_errors = true
|
||||
|
||||
[mypy-homeassistant.components.minecraft_server.helpers]
|
||||
ignore_errors = true
|
||||
|
||||
[mypy-homeassistant.components.minecraft_server.sensor]
|
||||
ignore_errors = true
|
||||
|
||||
[mypy-homeassistant.components.sonos]
|
||||
ignore_errors = true
|
||||
|
||||
|
@ -19,9 +19,6 @@ IGNORED_MODULES: Final[list[str]] = [
|
||||
"homeassistant.components.cloud.client",
|
||||
"homeassistant.components.cloud.http_api",
|
||||
"homeassistant.components.evohome",
|
||||
"homeassistant.components.minecraft_server",
|
||||
"homeassistant.components.minecraft_server.helpers",
|
||||
"homeassistant.components.minecraft_server.sensor",
|
||||
"homeassistant.components.sonos",
|
||||
"homeassistant.components.sonos.alarms",
|
||||
"homeassistant.components.sonos.binary_sensor",
|
||||
|
Loading…
x
Reference in New Issue
Block a user