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 States { get; } public List Results { get; } public DeviceActionRunner Runner { get; } public DeviceSceneContext(DeviceActionRunner runner, IReadOnlyDictionary states, List 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 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; } } }