Files
Evergreen-Health/Evergreen.Health.Application/Health/Devices/Audio/BedPresenceSleepMusicAction.cs
T
2026-11-12 15:45:52 +08:00

32 lines
1.7 KiB
C#

using Evergreen.Health.Application.Health.Integrations.HomeAssistant;
using Evergreen.Health.Application.Health.Integrations.MiAirX;
using Evergreen.Health.Application.Health.Scenes;
using Evergreen.Health.Application.Health.Sleep;
using Microsoft.Extensions.Options;
namespace Evergreen.Health.Application.Health.Devices.Audio;
public sealed class BedPresenceSleepMusicAction(IHomeAssistantGateway gateway, TcmMusicTransitionService music,
IOptions<HomeAssistantOptions> options) : IBedPresenceAction
{
private const string Playlist = "balanced";
public string Key => "speaker-sleep-music";
public string Description => "用 Xiaomi Sound Pro 播放舒睡音乐";
public string ConditionLabel => "音箱空闲时播放默认舒睡曲目并渐弱音量。";
public bool SupportsTarget(string entityId) => options.Value.Enabled &&
entityId?.StartsWith("media_player.", StringComparison.Ordinal) == true && entityId == options.Value.Entities.Speaker;
public async Task<string> ExecuteAsync(string entityId, CancellationToken token)
{
if (!SupportsTarget(entityId)) return "target-not-configured";
if (!music.HasPlayableTracks(Playlist)) return "speaker-music-not-configured";
var states = await gateway.GetStatesAsync(token);
var speaker = states.FirstOrDefault(state => string.Equals(state.EntityId, entityId, StringComparison.OrdinalIgnoreCase));
if (speaker is null || !DeviceActionRunner.IsAvailable(speaker)) return "speaker-state-unavailable";
if (speaker.State is not ("idle" or "off" or "standby")) return "speaker-not-idle";
return await music.TryStartIdlePlaybackAsync(Playlist, token) ? "speaker-playback-sent" : "speaker-not-idle";
}
}