1

我想知道它是否会做我所追求的。

我正在考虑用于家庭自动化的状态机,其逻辑类似于:

var stateMachine = new StateMachine<State, Trigger>(State.UnOccupied);
        stateMachine.Configure(State.UnOccupied)
            .Permit(Trigger.SensorActivity, State.Occupied)
            .Ignore(Trigger.AlarmFullSet);

        stateMachine.Configure(State.Occupied)
            .Permit(Trigger.AlarmFullSet, State.UnOccupied)
            .Permit(Trigger.AlarmPartSet, State.Asleep)
            .PermitReentry(Trigger.SensorActivity);

        stateMachine.Configure(State.Asleep)
            .SubstateOf(State.Occupied)
            .Permit(Trigger.AlarmUnset, State.Occupied);

但是,我想代表房子内房间的状态以及房子的整体状态..

IE

Home

    House Object
                        Upstairs
                                        Bedroom 1
                                        Bedroom 2
                        Downstairs
                                        Kitchen
                                        Living Room

    Garden
                        Front
                        Back
                        Side                       

因此,如果客厅被占用,那么楼下、房子和家也是如此。

提前道歉,我的 C# 不是最好的,我正在深陷其中!

是否可以定时离开状态......所以传感器可以触发一个房间被占用,然后更多的活动触发“重入”?(重新启动计数器/计时器/调整时间表)在占用状态条目上 - 然后在 15 分钟没有更多条目/活动事件后,该区域的占用清除并且该区域的状态转换为未占用。

4

1 回答 1

0

是的,我认为可以使用无状态存档。我会将每个房间建模为一个 Room 对象,它有一组触发器和状态。Room 对象可以有一个或多个计时器来处理预定的触发器,这些触发器将在计时器到期时触发触发器。有些房间可能很特殊,因此可以将它们建模为从 Room 类继承的特殊类。如果有意义的话,甚至可以创建 Floor 和 House 对象。然后你可以做house.SetVacationMode()。

Stateless 有一个 StateChanged 事件,您可以使用它让每个房间知道其他房间的状态。我怀疑您需要一个与 UI 交互的管理器对象,以及一个 UI / Control 对象。这些也可以有一个状态机。

于 2017-06-22T10:12:29.787 回答