35 lines
1.6 KiB
C#
35 lines
1.6 KiB
C#
using Evergreen.Health.Application.Health.Devices.Contracts;
|
|
using Evergreen.Health.Application.Health.Integrations.HomeAssistant;
|
|
|
|
namespace Evergreen.Health.Application.Health.Scenes;
|
|
|
|
public sealed class DeviceSceneContext
|
|
{
|
|
public IReadOnlyDictionary<string, HomeAssistantState> States { get; }
|
|
public List<HomeAssistantActionResult> Results { get; }
|
|
public DeviceActionRunner Runner { get; }
|
|
public DeviceSceneContext(DeviceActionRunner runner, IReadOnlyDictionary<string, HomeAssistantState> states,
|
|
List<HomeAssistantActionResult> results) => (Runner, States, Results) = (runner, states, results);
|
|
|
|
public Task RunAsync(DeviceCommand command, CancellationToken cancellationToken)
|
|
=> Runner.RunAsync(States, Results, command, cancellationToken);
|
|
|
|
public async Task ExternalAsync(string name, string entityId, Func<CancellationToken, Task> operation,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
var result = new HomeAssistantActionResult { Name = name, EntityId = entityId };
|
|
Results.Add(result);
|
|
try
|
|
{
|
|
await operation(cancellationToken);
|
|
result.Status = string.IsNullOrWhiteSpace(entityId) ? "Completed" : "Succeeded";
|
|
result.Message = string.IsNullOrWhiteSpace(entityId) ? "内部任务已处理" : "控制指令已发送";
|
|
}
|
|
catch (Exception exception) when (exception is not OperationCanceledException)
|
|
{
|
|
result.Status = "Failed"; result.Message = exception.Message;
|
|
}
|
|
}
|
|
}
|