nixos-configs/configurations/homie/modules/home-assistant/netdaemon/apps/Timer/Setup/Setup.cs
matt1432 bb1b42fd21
All checks were successful
Discord / discord commits (push) Has been skipped
refactor(hass): move some timer logic to netd
2024-12-27 04:27:03 -05:00

73 lines
2.4 KiB
C#

using System;
using System.Linq;
using System.Reactive.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using HomeAssistantGenerated;
using NetDaemon.AppModel;
using NetDaemon.HassModel;
using NetDaemon.HassModel.Entities;
namespace NetDaemonConfig.Apps.Timer.Setup
{
public record TimerFinishedEventData
{
[JsonPropertyName("entity_id")]
public string? entity_id { get; init; }
}
[NetDaemonApp]
public class Setup
{
private readonly string _timerTarget = "media_player.music_player_daemon";
private readonly string _timerTtsTarget = "tts.piper";
private readonly string _timerTtsMessage = "A set timer has finished.";
// TODO: private readonly string timerMediaLocation = "/path/to/file.mp3";
public Setup(IHaContext ha, Services services, Entities entities)
{
ha.Events
.Where(x => x.EventType == "timer.finished")
.Subscribe(x =>
{
if (x.DataElement.HasValue)
{
var data = JsonSerializer.Deserialize<TimerFinishedEventData>(x.DataElement.Value);
if (data?.entity_id?.StartsWith("timer.assist_timer") ?? false)
{
var timer = entities.Timer
.EnumerateAll()
.ToLookup((timer) => timer.EntityId,
(timer) => timer)[data.entity_id].First();
if (timer is not null)
{
services.Tts.Speak(
cache: true,
mediaPlayerEntityId: _timerTarget,
target: new ServiceTarget { EntityIds = [_timerTtsTarget] },
message: _timerTtsMessage);
}
}
}
});
/*
entities.Timer.EnumerateAll()
.Where((timer) => timer.EntityId.StartsWith("timer.assist_timer"))
.StateChanges()
.Subscribe((timer) =>
{
if (timer.Old?.State != "idle" && timer.New?.State == "idle")
{}
});
*/
}
}
}