我想知道它是否能完成我的目标。
我正在考虑一个家庭自动化的状态机,其逻辑与此类似:
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分钟之后,该区域的占用率将被清除,并且状态将转变为该区域未被占用。
答案 0 :(得分:0)
是的,我认为可以使用无状态存档。 我会将每个房间建模为一个Room对象,它有一组触发器和状态。 Room对象可以有一个或多个计时器来处理计划的触发器,这会在计时器到期时触发触发器。有些房间可能很特别,因此可以将它们建模为从Room类继承的专用类。如果有意义,甚至可以创建Floor和House对象。然后你可以做house.SetVacationMode()。
Stateless有一个StateChanged事件,您可以使用它来让每个房间了解其他房间的状态。我怀疑你需要一个与UI接口的管理器对象,以及一个UI / Control对象。这些也可能有状态机。