Skip to content

Commit

Permalink
Add custom conditions to fsm (#23)
Browse files Browse the repository at this point in the history
* Add custom sensor and switch conditions

* Add debug message about sensor conditions met

---------

Co-authored-by: x00Pavel <[email protected]>
  • Loading branch information
x00Pavel and PavelVeeamer authored Oct 13, 2023
1 parent d05ce18 commit 2536528
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 8 deletions.
10 changes: 10 additions & 0 deletions src/Automations/AutomationConfig/IFsmConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,14 @@ public interface IFsmConfig<TFsmState> where TFsmState : Enum

public bool IsWorkingHours { get; }
public double Transition { get; set; }



public IEnumerable<Func<bool>> SensorConditions { get; init; }

public IEnumerable<Func<bool>> SwitchConditions { get; init; }

public bool SensorConditionMet { get; }

public bool SwitchConditionMet { get; }
}
9 changes: 8 additions & 1 deletion src/FSM/LightFsm/BaseFsm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,18 @@ protected BaseFsm(ILogger logger, IFsmConfig<TState> 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);
Expand Down
9 changes: 7 additions & 2 deletions src/FSM/LightFsm/FsmConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ public class FsmConfig<TFsmState>: IFsmConfig<TFsmState> where TFsmState : Enum
/// <summary> Function that dynamically returns the stop time </summary>
public Func<TimeSpan> StopAtTimeFunc { get; set; } = () => DateTime.Parse(DefaultStopTime).TimeOfDay;

public double Transition { get; set; } = 2.5;
public IEnumerable<Func<bool>> SensorConditions { get; init; } = new [] { () => true };
public IEnumerable<Func<bool>> SwitchConditions { get; init; } = new [] { () => true };
public bool SensorConditionMet => SensorConditions.All(c => c());
public bool SwitchConditionMet => SwitchConditions.All(c => c());

public bool IsWorkingHours
{
get
Expand All @@ -36,6 +42,5 @@ public bool IsWorkingHours
return now >= StartAtTimeFunc() || now <= StopAtTimeFunc();
}
}

public double Transition { get; set; } = 2.5;

}
7 changes: 4 additions & 3 deletions src/FSM/LightFsm/OnOffFsm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,16 @@ public MotionSwitchLightFsm(ILogger logger, IFsmConfig<OnOffFsmState> config) :

protected override void InitFsm()
{
// Switch triggers the action without any conditions
StateMachine.OnTransitionCompleted(_ => UpdateState());

StateMachine.Configure(OnOffFsmState.Off)
.OnEntry(TurnOffLights)
.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)
Expand All @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/FSM/LightFsm/ToggleFsm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 2536528

Please sign in to comment.