diff --git a/src/Automations/AutomationConfig/IFsmConfig.cs b/src/Automations/AutomationConfig/IFsmConfig.cs index 5efe382..84c78db 100644 --- a/src/Automations/AutomationConfig/IFsmConfig.cs +++ b/src/Automations/AutomationConfig/IFsmConfig.cs @@ -26,4 +26,14 @@ public interface IFsmConfig where TFsmState : Enum public bool IsWorkingHours { get; } public double Transition { get; set; } + + + + public IEnumerable> SensorConditions { get; init; } + + public IEnumerable> SwitchConditions { get; init; } + + public bool SensorConditionMet { get; } + + public bool SwitchConditionMet { get; } } \ No newline at end of file diff --git a/src/FSM/LightFsm/BaseFsm.cs b/src/FSM/LightFsm/BaseFsm.cs index 2daf02f..4f34ef5 100644 --- a/src/FSM/LightFsm/BaseFsm.cs +++ b/src/FSM/LightFsm/BaseFsm.cs @@ -31,11 +31,18 @@ protected BaseFsm(ILogger logger, IFsmConfig config) protected bool WorkingHours() { var now = DateTime.Now.TimeOfDay; - Logger.LogDebug("Working hors: {Start} - {Stop}", Config.StartAtTimeFunc(), Config.StopAtTimeFunc()); + Logger.LogDebug("Working hours: {Start} - {Stop}", Config.StartAtTimeFunc(), Config.StopAtTimeFunc()); Logger.LogDebug("Is working {Now} hours: {IsWorkingHours}", now, Config.IsWorkingHours); return Config.IsWorkingHours; } + protected bool SensorConditions() + { + var result = WorkingHours() && Config.SensorConditionMet; + Logger.LogDebug("Sensor conditions met: {Conditions}", result); + return result; + } + protected void UpdateState() { Logger.LogDebug("Updating state in storage {State}", State); diff --git a/src/FSM/LightFsm/FsmConfig.cs b/src/FSM/LightFsm/FsmConfig.cs index 40b89fa..b4b6337 100644 --- a/src/FSM/LightFsm/FsmConfig.cs +++ b/src/FSM/LightFsm/FsmConfig.cs @@ -28,6 +28,12 @@ public class FsmConfig: IFsmConfig where TFsmState : Enum /// Function that dynamically returns the stop time public Func StopAtTimeFunc { get; set; } = () => DateTime.Parse(DefaultStopTime).TimeOfDay; + public double Transition { get; set; } = 2.5; + public IEnumerable> SensorConditions { get; init; } = new [] { () => true }; + public IEnumerable> SwitchConditions { get; init; } = new [] { () => true }; + public bool SensorConditionMet => SensorConditions.All(c => c()); + public bool SwitchConditionMet => SwitchConditions.All(c => c()); + public bool IsWorkingHours { get @@ -36,6 +42,5 @@ public bool IsWorkingHours return now >= StartAtTimeFunc() || now <= StopAtTimeFunc(); } } - - public double Transition { get; set; } = 2.5; + } \ No newline at end of file diff --git a/src/FSM/LightFsm/OnOffFsm.cs b/src/FSM/LightFsm/OnOffFsm.cs index 9dbdc7e..68ccf6d 100644 --- a/src/FSM/LightFsm/OnOffFsm.cs +++ b/src/FSM/LightFsm/OnOffFsm.cs @@ -41,6 +41,7 @@ public MotionSwitchLightFsm(ILogger logger, IFsmConfig config) : protected override void InitFsm() { + // Switch triggers the action without any conditions StateMachine.OnTransitionCompleted(_ => UpdateState()); StateMachine.Configure(OnOffFsmState.Off) @@ -48,8 +49,8 @@ protected override void InitFsm() .PermitReentry(OnOffFsmTrigger.SwitchOff) .Ignore(OnOffFsmTrigger.MotionOff) .Ignore(OnOffFsmTrigger.TimeElapsed) - .PermitIf(OnOffFsmTrigger.MotionOn, OnOffFsmState.OnByMotion, WorkingHours) - .PermitIf(OnOffFsmTrigger.SwitchOn, OnOffFsmState.OnBySwitch); + .PermitIf(OnOffFsmTrigger.MotionOn, OnOffFsmState.OnByMotion, SensorConditions) + .PermitIf(OnOffFsmTrigger.SwitchOn, OnOffFsmState.OnBySwitch, () => Config.SwitchConditionMet); StateMachine.Configure(OnOffFsmState.OnByMotion) .OnEntry(TurnOnLights) @@ -71,7 +72,7 @@ protected override void InitFsm() StateMachine.Configure(OnOffFsmState.WaitingForMotion) .OnEntry(() => StartTimer(Config.WaitForOffTime)) .Ignore(OnOffFsmTrigger.MotionOff) - .Permit(OnOffFsmTrigger.MotionOn, OnOffFsmState.OnBySwitch) + .PermitIf(OnOffFsmTrigger.MotionOn, OnOffFsmState.OnBySwitch, SensorConditions) .Permit(OnOffFsmTrigger.SwitchOn, OnOffFsmState.OnBySwitch) .Permit(OnOffFsmTrigger.SwitchOff, OnOffFsmState.Off) .Permit(OnOffFsmTrigger.TimeElapsed, OnOffFsmState.Off); diff --git a/src/FSM/LightFsm/ToggleFsm.cs b/src/FSM/LightFsm/ToggleFsm.cs index a3ef885..d207eaf 100644 --- a/src/FSM/LightFsm/ToggleFsm.cs +++ b/src/FSM/LightFsm/ToggleFsm.cs @@ -30,8 +30,8 @@ protected override void InitFsm() StateMachine.Configure(ToggleFsmState.Off) .OnEntry(TurnOffLights) .Ignore(ToggleFsmTrigger.TimeElapsed) - .PermitReentry(ToggleFsmTrigger.MotionOff) - .PermitIf(ToggleFsmTrigger.MotionOn, ToggleFsmState.On, WorkingHours) + .Ignore(ToggleFsmTrigger.MotionOff) + .PermitIf(ToggleFsmTrigger.MotionOn, ToggleFsmState.On, SensorConditions) .Permit(ToggleFsmTrigger.Toggle, ToggleFsmState.On); StateMachine.Configure(ToggleFsmState.On)