Implement Volume Persistence
Updates the MediaPlayerEntity to handle the saving and loading logic. The entity's internal volume state is now initialized from the saved preferences.volume_level. When a volume change command is received from Home Assistant, the handle_message method now updates the Preferences object and calls save_preferences() to persist the new volume level to disk.
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
from collections.abc import Iterable
|
from collections.abc import Iterable
|
||||||
from typing import Callable, List, Optional, Union
|
from typing import TYPE_CHECKING, Callable, List, Optional, Union
|
||||||
|
|
||||||
# pylint: disable=no-name-in-module
|
# pylint: disable=no-name-in-module
|
||||||
from aioesphomeapi.api_pb2 import ( # type: ignore[attr-defined]
|
from aioesphomeapi.api_pb2 import ( # type: ignore[attr-defined]
|
||||||
@@ -17,10 +17,14 @@ from .api_server import APIServer
|
|||||||
from .mpv_player import MpvMediaPlayer
|
from .mpv_player import MpvMediaPlayer
|
||||||
from .util import call_all
|
from .util import call_all
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from .models import ServerState
|
||||||
|
|
||||||
|
|
||||||
class ESPHomeEntity:
|
class ESPHomeEntity:
|
||||||
def __init__(self, server: APIServer) -> None:
|
def __init__(self, server: APIServer, state: "ServerState") -> None:
|
||||||
self.server = server
|
self.server = server
|
||||||
|
self.state = state
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def handle_message(self, msg: message.Message) -> Iterable[message.Message]:
|
def handle_message(self, msg: message.Message) -> Iterable[message.Message]:
|
||||||
@@ -34,19 +38,20 @@ class MediaPlayerEntity(ESPHomeEntity):
|
|||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
server: APIServer,
|
server: APIServer,
|
||||||
|
state: "ServerState",
|
||||||
key: int,
|
key: int,
|
||||||
name: str,
|
name: str,
|
||||||
object_id: str,
|
object_id: str,
|
||||||
music_player: MpvMediaPlayer,
|
music_player: MpvMediaPlayer,
|
||||||
announce_player: MpvMediaPlayer,
|
announce_player: MpvMediaPlayer,
|
||||||
) -> None:
|
) -> None:
|
||||||
ESPHomeEntity.__init__(self, server)
|
super().__init__(server, state)
|
||||||
|
|
||||||
self.key = key
|
self.key = key
|
||||||
self.name = name
|
self.name = name
|
||||||
self.object_id = object_id
|
self.object_id = object_id
|
||||||
self.state = MediaPlayerState.IDLE
|
self.state_enum = MediaPlayerState.IDLE
|
||||||
self.volume = 1.0
|
self.volume = state.preferences.volume_level # Initialize with saved volume
|
||||||
self.muted = False
|
self.muted = False
|
||||||
self.music_player = music_player
|
self.music_player = music_player
|
||||||
self.announce_player = announce_player
|
self.announce_player = announce_player
|
||||||
@@ -104,12 +109,18 @@ class MediaPlayerEntity(ESPHomeEntity):
|
|||||||
elif msg.command == MediaPlayerCommand.PLAY:
|
elif msg.command == MediaPlayerCommand.PLAY:
|
||||||
self.music_player.resume()
|
self.music_player.resume()
|
||||||
yield self._update_state(MediaPlayerState.PLAYING)
|
yield self._update_state(MediaPlayerState.PLAYING)
|
||||||
elif msg.has_volume:
|
if msg.has_volume:
|
||||||
volume = int(msg.volume * 100)
|
# This block is called when the volume slider changes in HA
|
||||||
self.music_player.set_volume(volume)
|
self.volume = msg.volume # HA sends volume as 0.0-1.0
|
||||||
self.announce_player.set_volume(volume)
|
volume_int = int(self.volume * 100)
|
||||||
self.volume = msg.volume
|
self.music_player.set_volume(volume_int)
|
||||||
yield self._update_state(self.state)
|
self.announce_player.set_volume(volume_int)
|
||||||
|
|
||||||
|
# Save the new volume level to preferences
|
||||||
|
self.state.preferences.volume_level = self.volume
|
||||||
|
self.state.save_preferences()
|
||||||
|
|
||||||
|
yield self._update_state(self.state_enum)
|
||||||
elif isinstance(msg, ListEntitiesRequest):
|
elif isinstance(msg, ListEntitiesRequest):
|
||||||
yield ListEntitiesMediaPlayerResponse(
|
yield ListEntitiesMediaPlayerResponse(
|
||||||
object_id=self.object_id,
|
object_id=self.object_id,
|
||||||
@@ -121,13 +132,13 @@ class MediaPlayerEntity(ESPHomeEntity):
|
|||||||
yield self._get_state_message()
|
yield self._get_state_message()
|
||||||
|
|
||||||
def _update_state(self, new_state: MediaPlayerState) -> MediaPlayerStateResponse:
|
def _update_state(self, new_state: MediaPlayerState) -> MediaPlayerStateResponse:
|
||||||
self.state = new_state
|
self.state_enum = new_state
|
||||||
return self._get_state_message()
|
return self._get_state_message()
|
||||||
|
|
||||||
def _get_state_message(self) -> MediaPlayerStateResponse:
|
def _get_state_message(self) -> MediaPlayerStateResponse:
|
||||||
return MediaPlayerStateResponse(
|
return MediaPlayerStateResponse(
|
||||||
key=self.key,
|
key=self.key,
|
||||||
state=self.state,
|
state=self.state_enum,
|
||||||
volume=self.volume,
|
volume=self.volume,
|
||||||
muted=self.muted,
|
muted=self.muted,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user