This commit is contained in:
fuenmao
2026-11-11 16:11:41 +08:00
parent 3ca90c4cf3
commit 61e25175db
39 changed files with 2176 additions and 31 deletions
@@ -15,6 +15,7 @@ using Evergreen.Health.Application.Health.Sleep;
using Evergreen.Health.Application.Health.Integrations.Tuya;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Evergreen.Health.Application.Health.Integrations.Ib43;
namespace Evergreen.Health.Application.Health.Devices;
@@ -23,6 +24,20 @@ public static class HealthDeviceRegistration
public static IServiceCollection AddHealthDevices(this IServiceCollection services)
{
services.AddSingleton(TimeProvider.System);
services.AddOptions<Ib43Options>();
services.AddSingleton<Ib43Parser>();
services.AddSingleton<Ib43StateStore>();
services.AddScoped(provider => new Ib43DataRepository(
provider.GetRequiredService<SqlSugar.ISqlSugarClient>().AsTenant().GetConnectionScope(SqlSugarConst.MainConfigId)));
services.AddSingleton<IIb43ReportSink, Ib43ReportSink>();
services.AddSingleton<IIb43MqttTransportFactory, Ib43MqttTransportFactory>();
services.AddOptions<BedPresenceAutomationOptions>();
services.AddSingleton<IBedPresenceAction, BedPresenceSleepLightAction>();
services.AddSingleton<IBedPresenceAction, BedPresenceCurtainCloseAction>();
services.AddSingleton<BedPresenceAutomation>();
services.AddSingleton<IBedPresenceSink>(provider => provider.GetRequiredService<BedPresenceAutomation>());
services.AddHostedService(provider => provider.GetRequiredService<BedPresenceAutomation>());
services.AddHostedService<Ib43MqttService>();
services.AddSingleton(new DeviceExecutionOptions());
// 仅注册扩展契约,不启动传感器轮询、上床流程或占位音频播放。
services.AddSingleton(new SleepWorkflowOptions());
@@ -49,7 +64,6 @@ public static class HealthDeviceRegistration
services.AddSingleton<CurtainModule>();
services.AddSingleton<IHealthDeviceModule>(provider => provider.GetRequiredService<CurtainModule>());
services.AddSingleton<OutletModule>();
services.AddSingleton<IHealthDeviceModule>(provider => provider.GetRequiredService<OutletModule>());
services.AddSingleton<TcmMusicTransitionService>();
services.AddSingleton<ITcmMusicRuntime>(provider => provider.GetRequiredService<TcmMusicTransitionService>());
services.AddHostedService(provider => provider.GetRequiredService<TcmMusicTransitionService>());
@@ -65,15 +79,20 @@ public static class HealthDeviceRegistration
provider.GetRequiredService<HomeAssistantLightTransitionService>().ForEntity(
provider.GetRequiredService<IOptions<HomeAssistantOptions>>().Value.Entities.AmbientLight),
provider.GetRequiredService<LightOffDispatcher>()));
services.AddSingleton<IHealthDeviceModule>(provider => provider.GetRequiredService<LightingModule>());
services.AddSingleton<AudioModule>();
services.AddSingleton<IHealthDeviceModule>(provider => provider.GetRequiredService<AudioModule>());
services.AddSingleton<LightOffDispatcher>();
services.AddSingleton<DeviceModuleRegistry>(provider => new(
provider.GetServices<IHealthDeviceModule>().Concat(
provider.GetRequiredService<IOptions<HomeAssistantOptions>>().Value.AdditionalSleepLights.Select(light =>
new ConfiguredSleepLightModule(provider.GetRequiredService<DeviceActionRunner>(), light,
provider.GetRequiredService<HomeAssistantLightTransitionService>().ForEntity(light.EntityId))))));
services.AddSingleton<DeviceModuleRegistry>(provider =>
{
var options = provider.GetRequiredService<IOptions<HomeAssistantOptions>>().Value;
var modules = provider.GetServices<IHealthDeviceModule>().Where(module => module.EntityIds.Any()).ToList();
if (!string.IsNullOrWhiteSpace(options.Entities.Outlet)) modules.Add(provider.GetRequiredService<OutletModule>());
if (!string.IsNullOrWhiteSpace(options.Entities.AmbientLight)) modules.Add(provider.GetRequiredService<LightingModule>());
var lights = provider.GetRequiredService<HomeAssistantLightTransitionService>();
var runner = provider.GetRequiredService<DeviceActionRunner>();
modules.AddRange(options.AdditionalSleepLights.Select(light => new ConfiguredSleepLightModule(runner, light, lights.ForEntity(light.EntityId))));
return new DeviceModuleRegistry(modules);
});
services.AddSingleton<IStandardDeviceControl, StandardLightControl>();
services.AddSingleton<DeviceParameterController>();
services.AddSingleton<HomeAssistantDeviceCatalog>();