Skip to content
Snippets Groups Projects
Commit 8153d59e authored by Jens Nolte's avatar Jens Nolte
Browse files

Update home automation

parent 604e12fa
No related branches found
No related tags found
No related merge requests found
......@@ -3,6 +3,7 @@ module Q.Home (
) where
import Data.Text
import Data.ByteString.Lazy qualified as BSL
import Q.Mqtt
import Q.Mqtt.Zigbee2Mqtt
import Quasar
......@@ -11,12 +12,16 @@ import Network.MQTT.Client
homeDaemon :: String -> IO ()
data LightPreset = Bright | Colorful | Mood | Off
homeDaemon mqttUri = do
traceIO $ "Connecting to " <> mqttUri
mqtt <- connectMqtt mqttUri statusTopic
traceIO $ "Connected"
subscribeIkeaDimmer mqtt "Kitchen switch" (kitchenDimmer mqtt)
liftIO $ subscribeIkeaDimmer mqtt "Kitchen switch" (kitchenDimmer mqtt)
liftIO $ subscribeIkeaDimmer mqtt "Bedroom switch" (bedroomDimmer mqtt)
liftIO $ subscribeIkeaDimmer mqtt "Hallway switch" (hallwayDimmer mqtt)
await mqtt
......@@ -26,17 +31,32 @@ statusTopic = "q/home/status"
kitchenHue :: Text
kitchenHue = "0x0017880100c54096"
dimmer :: (LightPreset -> IO ()) -> IkeaDimmerCallbacks
dimmer fn =
ikeaDimmerCallbacks {
on = fn Colorful,
onLongPress = fn Bright,
off = fn Off,
offLongPress = fn Mood
}
kitchenDimmer :: Mqtt -> IkeaDimmerCallbacks
kitchenDimmer mqtt =
ikeaDimmerCallbacks {
-- Bright and colorful is swapped for the kitchen
on = setKitchenPreset mqtt Bright,
onLongPress = setKitchenPreset mqtt Colorful,
off = setKitchenPreset mqtt Off,
offLongPress = setKitchenPreset mqtt Mood
}
bedroomDimmer :: Mqtt -> IkeaDimmerCallbacks
bedroomDimmer mqtt = dimmer (setBedroomPreset mqtt)
hallwayDimmer :: Mqtt -> IkeaDimmerCallbacks
hallwayDimmer mqtt = dimmer (setHallwayPreset mqtt)
data LightPreset = Bright | Colorful | Mood | Off
setKitchenPreset :: Mqtt -> LightPreset -> IO ()
setKitchenPreset mqtt preset = do
......@@ -52,6 +72,37 @@ setKitchenPreset mqtt preset = do
stoveLight Mood = False
stoveLight Off = False
setBedroomPreset :: Mqtt -> LightPreset -> IO ()
setBedroomPreset mqtt Bright = do
ringclock mqtt "k8"
switchTasmota mqtt "sms04" True
heribert mqtt "warm_white"
setBedroomPreset mqtt Colorful = do
ringclock mqtt "k8"
switchTasmota mqtt "sms04" True
heribert mqtt "peachy"
setBedroomPreset mqtt Mood = do
heribert mqtt "off"
switchTasmota mqtt "sms04" False
ringclock mqtt "k8"
setBedroomPreset mqtt Off = do
heribert mqtt "off"
switchTasmota mqtt "sms04" False
ringclock mqtt "off"
setHallwayPreset :: Mqtt -> LightPreset -> IO ()
setHallwayPreset mqtt Bright = do
fairyLights mqtt "cozy"
fairyLightsBrightness mqtt "1"
setHallwayPreset mqtt Colorful = do
fairyLights mqtt "cozy"
fairyLightsBrightness mqtt "0.4"
setHallwayPreset mqtt Mood = do
fairyLights mqtt "cozy"
fairyLightsBrightness mqtt "0.1"
setHallwayPreset mqtt Off = do
fairyLightsBrightness mqtt "0"
switchTasmota :: Mqtt -> Text -> Bool -> IO ()
switchTasmota Mqtt{mqttClient} name value =
......@@ -59,3 +110,22 @@ switchTasmota Mqtt{mqttClient} name value =
where
topic = mconcat ["cmnd/", name, "/POWER"]
message = if value then "on" else "off"
qthingAnimation :: Mqtt -> Text -> BSL.ByteString -> IO ()
qthingAnimation Mqtt{mqttClient} name animation = publish mqttClient (mconcat ["device/", name, "/animation"]) animation False
qthingBrightness :: Mqtt -> Text -> BSL.ByteString -> IO ()
qthingBrightness Mqtt{mqttClient} name value = publish mqttClient (mconcat ["device/", name, "/brightness"]) value False
ringclock :: Mqtt -> BSL.ByteString -> IO ()
ringclock mqtt = qthingAnimation mqtt "ringclock"
heribert :: Mqtt -> BSL.ByteString -> IO ()
heribert mqtt = qthingAnimation mqtt "heribert"
fairyLights :: Mqtt -> BSL.ByteString -> IO ()
fairyLights mqtt = qthingAnimation mqtt "fairy-lights"
fairyLightsBrightness :: Mqtt -> BSL.ByteString -> IO ()
fairyLightsBrightness Mqtt{mqttClient} brightness = publish mqttClient (mconcat ["device/fairy-lights/update/brightness"]) brightness False
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment