Skip to content

Commit

Permalink
Add sensors for Automation enable state
Browse files Browse the repository at this point in the history
  • Loading branch information
PavelVeeamer committed Apr 5, 2024
1 parent 604e3f5 commit e89b492
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 9 deletions.
44 changes: 37 additions & 7 deletions src/Core/RoomManager/Room.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging;
using NetDaemon.Extensions.MqttEntityManager;
using NetDaemon.HassModel;
using NetDaemon.HassModel.Integration;
using NetEntityAutomation.Core.Automations;
Expand All @@ -13,25 +14,54 @@ public class Room
private readonly IHaContext _haContext;
private readonly IRoomConfig _roomConfig;
private readonly List<AutomationBase> _automations = [];

public Room(IRoomConfig roomConfig, IHaContext haContext)
private readonly IMqttEntityManager _entityManager;

public Room(IRoomConfig roomConfig, IHaContext haContext, IMqttEntityManager entityManager)
{
_roomConfig = roomConfig;
_roomConfig.Logger.LogDebug("Creating room {RoomName}", roomConfig.Name);
_haContext = haContext;
_entityManager = entityManager;
InitAutomations();
InitServices();
// InitSensors();
InitSensors();
}

private void AutomationEnabledSensor(string baseName, string friendlyName, AutomationBase automation)
{
var sensorName = baseName + "_enabled";
_entityManager.RemoveAsync(sensorName).ConfigureAwait(false);
_entityManager.CreateAsync(
sensorName,
new EntityCreationOptions
{
Name = friendlyName
}).ConfigureAwait(false);
_entityManager.SetStateAsync(sensorName, automation.IsEnabled ? "on" : "off").ConfigureAwait(false);
automation.IsEnabledObserver.Subscribe(isEnabled =>
_entityManager
.SetStateAsync(sensorName, isEnabled ? "on" : "off")
.ConfigureAwait(false));
}

private void InitSensors()
{
_automations.ForEach(a =>
{
var friendlyName = _roomConfig.Name + " " + a.GetType().Name;
var name = "sensor." + _roomConfig.Name.ToLower().Replace(' ', '_') + "_" + a.GetType().Name;
AutomationEnabledSensor(name, friendlyName, a);
});
}

private void InitServices()
{
var serviceName = _roomConfig.Name.ToLower().Replace(' ', '_') + "_service";
_haContext.RegisterServiceCallBack<RoomData>("toggle_" + serviceName, data =>
{
if (data.Automation != null)
if (data.AutomationClass != null)
{
var automationClass = GetType().Assembly.GetTypes().First(t => t.Name == data.Automation);
var automationClass = GetType().Assembly.GetTypes().First(t => t.Name == data.AutomationClass);
var automation = _automations.First(a => a.GetType() == automationClass);
automation.IsEnabled = !automation.IsEnabled;
_roomConfig.Logger.LogDebug("Toggling automation {AutomationName} to {IsEnabled}",
Expand All @@ -52,7 +82,7 @@ private void InitServices()
});
_roomConfig.Logger.LogDebug("Service {ServiceName} initialised", serviceName);
}

private void InitAutomations()
{
_roomConfig.Logger.LogDebug("Creating automations");
Expand All @@ -70,5 +100,5 @@ private void InitAutomations()

internal record RoomData
{
public string? Automation { get; set; }
public string? AutomationClass { get; set; }
}
5 changes: 3 additions & 2 deletions src/Core/RoomManager/RoomManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging;
using NetDaemon.Extensions.MqttEntityManager;
using NetDaemon.HassModel;

namespace NetEntityAutomation.Core.RoomManager;
Expand All @@ -14,12 +15,12 @@ public class RoomManager : IRoomManager
private readonly List<IRoomConfig> configs;
private readonly IHaContext haContext;

public RoomManager(IHaContext context, ILogger<RoomManager> logger, IEnumerable<IRoomConfig> rooms)
public RoomManager(IHaContext context, ILogger<RoomManager> logger, IEnumerable<IRoomConfig> rooms, IMqttEntityManager entityManager)
{
logger.LogInformation("Initialising room manager");
haContext = context ?? throw new ArgumentNullException(nameof(context));
configs = rooms.ToList();
configs.ForEach(config => _rooms.Add(new Room(config, haContext)));
configs.ForEach(config => _rooms.Add(new Room(config, haContext, entityManager)));
logger.LogInformation("Number of rooms: {RoomCount}", configs.Count);
}
}
1 change: 1 addition & 0 deletions src/Core/RoomManager/RoomManager.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="NetDaemon.Extensions.Mqtt" Version="24.12.0" />
<PackageReference Include="NetDaemon.HassModel.Integration" Version="24.8.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Scrutor" Version="4.2.2" />
Expand Down

0 comments on commit e89b492

Please sign in to comment.