WIP: Rendering shape #8
No files matched your search
+2
-2
@@ -507,7 +507,7 @@ thenA f g = f >>> arr Left ||| g
|
||||
(>>|) :: (ArrowChoice cat, Arrow cat) => cat a (Either b1 c) -> cat c (Either b1 b2) -> cat a (Either b1 b2)
|
||||
(>>|) = thenA
|
||||
|
||||
infixl 2 >>||
|
||||
infixl 2 >>|
|
||||
|
||||
(>>||) :: (ArrowChoice cat, Arrow cat) => cat a (Event b) -> cat b c -> cat a (Event c)
|
||||
f >>|| g = proc x -> do
|
||||
@@ -516,7 +516,7 @@ f >>|| g = proc x -> do
|
||||
Event e' -> g >>> arr Event -< e'
|
||||
Tick -> arr (const Tick) -< ()
|
||||
|
||||
infixr 3 >>|
|
||||
infixr 1 >>||
|
||||
|
||||
toEvent :: Mealy eff (Either () a) (Event a)
|
||||
toEvent = arr (either (const Tick) Event)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
{-# LANGUAGE Arrows #-}
|
||||
module HomeAssistant.Controller.Kitchen where
|
||||
import HomeAssistant.Controller
|
||||
import AFRP (Event (..))
|
||||
import AFRP (Event (..), (>>||))
|
||||
import qualified AFRP
|
||||
import Data.Aeson (Value)
|
||||
import Control.Arrow ((>>>), Arrow (..), returnA)
|
||||
@@ -36,44 +36,39 @@ dinnerLightLevel = entityRead "sensor.sijainti_keittio_light_level" >>> AFRP.hol
|
||||
dinnerPresence :: HASS (Event Value) Presence
|
||||
dinnerPresence = presence "binary_sensor.sijainti_keittio_occupancy" >>> AFRP.hold Unoccupied
|
||||
|
||||
dinnerLightEvents :: HASS (Event Value) (Event LightingMode)
|
||||
dinnerLightEvents =
|
||||
|
||||
dinnerTableController :: HASS (Event Value) ()
|
||||
dinnerTableController =
|
||||
((,) <$> dinnerLightLevel <*> dinnerPresence)
|
||||
>>> arr lightWanted
|
||||
>>> (sleepEvent &&& offEvent &&& onEvent)
|
||||
>>> arr (\(s, (o, n)) -> s `AFRP.lMerge` o `AFRP.lMerge` n)
|
||||
-- These are done "in parallel", there is a chance that two services are called in one go
|
||||
>>> mconcat
|
||||
[ AFRP.named "Lights on" lightsOn
|
||||
, AFRP.named "Lights sleep" lightsSleep
|
||||
, AFRP.named "Lights off" lightsOff ]
|
||||
>>> arr (const ()) -- I don't like this extra arr here
|
||||
where
|
||||
lightWanted (lightLevel, occ) = occ == Occupied && lightLevel < 13
|
||||
|
||||
onEvent =
|
||||
lightsOn =
|
||||
AFRP.edge
|
||||
>>> arr (fmap (const LightingOn))
|
||||
>>|| sleep "sleep off" False
|
||||
>>> callService "Dining light on" (light [EntityId "light.kitchen_dining_large"] $ On def)
|
||||
|
||||
sleepEvent =
|
||||
lightsSleep =
|
||||
arr not
|
||||
>>> AFRP.edge
|
||||
>>> arr (fmap (const LightingSleep))
|
||||
>>|| sleep "sleep on" True
|
||||
|
||||
offEvent =
|
||||
lightsOff =
|
||||
arr not
|
||||
>>> AFRP.waitFor 300
|
||||
>>> arr (fmap (const LightingOff))
|
||||
>>|| sleep "sleep off" False
|
||||
>>> callService "Dining light on" (light [EntityId "light.kitchen_dining_large"] Off)
|
||||
|
||||
|
||||
sleep lbl b = callService lbl (switchService [EntityId "switch.adaptive_lighting_ruokapoydan_valot_sleep_mode"] b)
|
||||
|
||||
dinnerTableController :: HASS (Event Value) ()
|
||||
dinnerTableController = proc x -> do
|
||||
ev <- dinnerLightEvents -< x
|
||||
case ev of
|
||||
Event LightingOn -> do
|
||||
sleep "sleep off"-< False
|
||||
callServiceDyn "Dining light on" (light [EntityId "light.kitchen_dining_large"]) -< On def
|
||||
Event LightingOff -> do
|
||||
sleep "sleep off" -< False
|
||||
callServiceDyn "Dining light off" (light [EntityId "light.kitchen_dining_large"]) -< Off
|
||||
Event LightingSleep -> do
|
||||
sleep "sleep on" -< True
|
||||
_ -> returnA -< ()
|
||||
where
|
||||
sleep lbl = callServiceDyn lbl (switchService [EntityId "switch.adaptive_lighting_ruokapoydan_valot_sleep_mode"])
|
||||
|
||||
kitchenMotionController :: HASS (Event Value) ()
|
||||
kitchenMotionController = kitchenCeilingController <> dinnerTableController
|
||||
Reference in new issue
Block a user