{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Tesla.Car.Command.Climate (
hvacOn, hvacOff, ClimateKeeper(..), climateKeeper,
seatClimate, Seat(..), SeatLevel(..), SeatClimate(..), SeatMode(..),
setTemps, wheelHeater, wheelHeaterOff, wheelHeaterOn,
maxDefrost,
bioweaponMode,
Sometimes(..), OffPeakConfig(..), Preconditioning,
scheduledDepartureOff, scheduleDeparture
) where
import Control.Monad.IO.Class (MonadIO (..))
import Data.Aeson
import Tesla.Car.Command
wheelHeater :: MonadIO m => Bool -> Car m CommandResponse
wheelHeater :: forall (m :: * -> *). MonadIO m => Bool -> Car m CommandResponse
wheelHeater Bool
on = String -> [Pair] -> Car m CommandResponse
forall (m :: * -> *).
MonadIO m =>
String -> [Pair] -> Car m CommandResponse
runCmd String
"remote_steering_wheel_heater_request" [Key
"on" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
on]
wheelHeaterOn :: MonadIO m => Car m CommandResponse
wheelHeaterOn :: forall (m :: * -> *). MonadIO m => Car m CommandResponse
wheelHeaterOn = Bool -> Car m CommandResponse
forall (m :: * -> *). MonadIO m => Bool -> Car m CommandResponse
wheelHeater Bool
True
wheelHeaterOff :: MonadIO m => Car m CommandResponse
wheelHeaterOff :: forall (m :: * -> *). MonadIO m => Car m CommandResponse
wheelHeaterOff = Bool -> Car m CommandResponse
forall (m :: * -> *). MonadIO m => Bool -> Car m CommandResponse
wheelHeater Bool
False
bioweaponMode :: MonadIO m => Bool -> Car m CommandResponse
bioweaponMode :: forall (m :: * -> *). MonadIO m => Bool -> Car m CommandResponse
bioweaponMode Bool
on = String -> [Pair] -> Car m CommandResponse
forall (m :: * -> *).
MonadIO m =>
String -> [Pair] -> Car m CommandResponse
runCmd String
"set_bioweapon_mode" [Key
"on" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
on]
data Seat = DriverSeat | PassengerSeat | RearLeftSeat | RearCenterSeat | RearRightSeat
deriving (Seat -> Seat -> Bool
(Seat -> Seat -> Bool) -> (Seat -> Seat -> Bool) -> Eq Seat
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Seat -> Seat -> Bool
== :: Seat -> Seat -> Bool
$c/= :: Seat -> Seat -> Bool
/= :: Seat -> Seat -> Bool
Eq, Int -> Seat -> ShowS
[Seat] -> ShowS
Seat -> String
(Int -> Seat -> ShowS)
-> (Seat -> String) -> ([Seat] -> ShowS) -> Show Seat
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Seat -> ShowS
showsPrec :: Int -> Seat -> ShowS
$cshow :: Seat -> String
show :: Seat -> String
$cshowList :: [Seat] -> ShowS
showList :: [Seat] -> ShowS
Show, Seat
Seat -> Seat -> Bounded Seat
forall a. a -> a -> Bounded a
$cminBound :: Seat
minBound :: Seat
$cmaxBound :: Seat
maxBound :: Seat
Bounded, Int -> Seat
Seat -> Int
Seat -> [Seat]
Seat -> Seat
Seat -> Seat -> [Seat]
Seat -> Seat -> Seat -> [Seat]
(Seat -> Seat)
-> (Seat -> Seat)
-> (Int -> Seat)
-> (Seat -> Int)
-> (Seat -> [Seat])
-> (Seat -> Seat -> [Seat])
-> (Seat -> Seat -> [Seat])
-> (Seat -> Seat -> Seat -> [Seat])
-> Enum Seat
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Seat -> Seat
succ :: Seat -> Seat
$cpred :: Seat -> Seat
pred :: Seat -> Seat
$ctoEnum :: Int -> Seat
toEnum :: Int -> Seat
$cfromEnum :: Seat -> Int
fromEnum :: Seat -> Int
$cenumFrom :: Seat -> [Seat]
enumFrom :: Seat -> [Seat]
$cenumFromThen :: Seat -> Seat -> [Seat]
enumFromThen :: Seat -> Seat -> [Seat]
$cenumFromTo :: Seat -> Seat -> [Seat]
enumFromTo :: Seat -> Seat -> [Seat]
$cenumFromThenTo :: Seat -> Seat -> Seat -> [Seat]
enumFromThenTo :: Seat -> Seat -> Seat -> [Seat]
Enum)
seatNum :: Seat -> Int
seatNum :: Seat -> Int
seatNum Seat
DriverSeat = Int
0
seatNum Seat
PassengerSeat = Int
1
seatNum Seat
RearLeftSeat = Int
2
seatNum Seat
RearCenterSeat = Int
4
seatNum Seat
RearRightSeat = Int
5
data SeatLevel = SeatLeast | SeatMedium | SeatMost
deriving (SeatLevel -> SeatLevel -> Bool
(SeatLevel -> SeatLevel -> Bool)
-> (SeatLevel -> SeatLevel -> Bool) -> Eq SeatLevel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SeatLevel -> SeatLevel -> Bool
== :: SeatLevel -> SeatLevel -> Bool
$c/= :: SeatLevel -> SeatLevel -> Bool
/= :: SeatLevel -> SeatLevel -> Bool
Eq, Int -> SeatLevel -> ShowS
[SeatLevel] -> ShowS
SeatLevel -> String
(Int -> SeatLevel -> ShowS)
-> (SeatLevel -> String)
-> ([SeatLevel] -> ShowS)
-> Show SeatLevel
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SeatLevel -> ShowS
showsPrec :: Int -> SeatLevel -> ShowS
$cshow :: SeatLevel -> String
show :: SeatLevel -> String
$cshowList :: [SeatLevel] -> ShowS
showList :: [SeatLevel] -> ShowS
Show, SeatLevel
SeatLevel -> SeatLevel -> Bounded SeatLevel
forall a. a -> a -> Bounded a
$cminBound :: SeatLevel
minBound :: SeatLevel
$cmaxBound :: SeatLevel
maxBound :: SeatLevel
Bounded, Int -> SeatLevel
SeatLevel -> Int
SeatLevel -> [SeatLevel]
SeatLevel -> SeatLevel
SeatLevel -> SeatLevel -> [SeatLevel]
SeatLevel -> SeatLevel -> SeatLevel -> [SeatLevel]
(SeatLevel -> SeatLevel)
-> (SeatLevel -> SeatLevel)
-> (Int -> SeatLevel)
-> (SeatLevel -> Int)
-> (SeatLevel -> [SeatLevel])
-> (SeatLevel -> SeatLevel -> [SeatLevel])
-> (SeatLevel -> SeatLevel -> [SeatLevel])
-> (SeatLevel -> SeatLevel -> SeatLevel -> [SeatLevel])
-> Enum SeatLevel
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: SeatLevel -> SeatLevel
succ :: SeatLevel -> SeatLevel
$cpred :: SeatLevel -> SeatLevel
pred :: SeatLevel -> SeatLevel
$ctoEnum :: Int -> SeatLevel
toEnum :: Int -> SeatLevel
$cfromEnum :: SeatLevel -> Int
fromEnum :: SeatLevel -> Int
$cenumFrom :: SeatLevel -> [SeatLevel]
enumFrom :: SeatLevel -> [SeatLevel]
$cenumFromThen :: SeatLevel -> SeatLevel -> [SeatLevel]
enumFromThen :: SeatLevel -> SeatLevel -> [SeatLevel]
$cenumFromTo :: SeatLevel -> SeatLevel -> [SeatLevel]
enumFromTo :: SeatLevel -> SeatLevel -> [SeatLevel]
$cenumFromThenTo :: SeatLevel -> SeatLevel -> SeatLevel -> [SeatLevel]
enumFromThenTo :: SeatLevel -> SeatLevel -> SeatLevel -> [SeatLevel]
Enum)
instance ToJSON SeatLevel where
toJSON :: SeatLevel -> Value
toJSON = Int -> Value
forall a. ToJSON a => a -> Value
toJSON (Int -> Value) -> (SeatLevel -> Int) -> SeatLevel -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SeatLevel -> Int
forall a. Enum a => a -> Int
fromEnum
data SeatMode = SeatHeat | SeatCool
deriving (SeatMode -> SeatMode -> Bool
(SeatMode -> SeatMode -> Bool)
-> (SeatMode -> SeatMode -> Bool) -> Eq SeatMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SeatMode -> SeatMode -> Bool
== :: SeatMode -> SeatMode -> Bool
$c/= :: SeatMode -> SeatMode -> Bool
/= :: SeatMode -> SeatMode -> Bool
Eq, Int -> SeatMode -> ShowS
[SeatMode] -> ShowS
SeatMode -> String
(Int -> SeatMode -> ShowS)
-> (SeatMode -> String) -> ([SeatMode] -> ShowS) -> Show SeatMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SeatMode -> ShowS
showsPrec :: Int -> SeatMode -> ShowS
$cshow :: SeatMode -> String
show :: SeatMode -> String
$cshowList :: [SeatMode] -> ShowS
showList :: [SeatMode] -> ShowS
Show, SeatMode
SeatMode -> SeatMode -> Bounded SeatMode
forall a. a -> a -> Bounded a
$cminBound :: SeatMode
minBound :: SeatMode
$cmaxBound :: SeatMode
maxBound :: SeatMode
Bounded, Int -> SeatMode
SeatMode -> Int
SeatMode -> [SeatMode]
SeatMode -> SeatMode
SeatMode -> SeatMode -> [SeatMode]
SeatMode -> SeatMode -> SeatMode -> [SeatMode]
(SeatMode -> SeatMode)
-> (SeatMode -> SeatMode)
-> (Int -> SeatMode)
-> (SeatMode -> Int)
-> (SeatMode -> [SeatMode])
-> (SeatMode -> SeatMode -> [SeatMode])
-> (SeatMode -> SeatMode -> [SeatMode])
-> (SeatMode -> SeatMode -> SeatMode -> [SeatMode])
-> Enum SeatMode
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: SeatMode -> SeatMode
succ :: SeatMode -> SeatMode
$cpred :: SeatMode -> SeatMode
pred :: SeatMode -> SeatMode
$ctoEnum :: Int -> SeatMode
toEnum :: Int -> SeatMode
$cfromEnum :: SeatMode -> Int
fromEnum :: SeatMode -> Int
$cenumFrom :: SeatMode -> [SeatMode]
enumFrom :: SeatMode -> [SeatMode]
$cenumFromThen :: SeatMode -> SeatMode -> [SeatMode]
enumFromThen :: SeatMode -> SeatMode -> [SeatMode]
$cenumFromTo :: SeatMode -> SeatMode -> [SeatMode]
enumFromTo :: SeatMode -> SeatMode -> [SeatMode]
$cenumFromThenTo :: SeatMode -> SeatMode -> SeatMode -> [SeatMode]
enumFromThenTo :: SeatMode -> SeatMode -> SeatMode -> [SeatMode]
Enum)
data SeatClimate = SeatClimate SeatMode SeatLevel
deriving (SeatClimate -> SeatClimate -> Bool
(SeatClimate -> SeatClimate -> Bool)
-> (SeatClimate -> SeatClimate -> Bool) -> Eq SeatClimate
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SeatClimate -> SeatClimate -> Bool
== :: SeatClimate -> SeatClimate -> Bool
$c/= :: SeatClimate -> SeatClimate -> Bool
/= :: SeatClimate -> SeatClimate -> Bool
Eq, Int -> SeatClimate -> ShowS
[SeatClimate] -> ShowS
SeatClimate -> String
(Int -> SeatClimate -> ShowS)
-> (SeatClimate -> String)
-> ([SeatClimate] -> ShowS)
-> Show SeatClimate
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SeatClimate -> ShowS
showsPrec :: Int -> SeatClimate -> ShowS
$cshow :: SeatClimate -> String
show :: SeatClimate -> String
$cshowList :: [SeatClimate] -> ShowS
showList :: [SeatClimate] -> ShowS
Show)
seatClimate :: MonadIO m => Seat -> Maybe SeatClimate -> Car m CommandResponse
seatClimate :: forall (m :: * -> *).
MonadIO m =>
Seat -> Maybe SeatClimate -> Car m CommandResponse
seatClimate Seat
seat Maybe SeatClimate
Nothing = do
CommandResponse
_ <- String -> [Pair] -> Car m CommandResponse
forall (m :: * -> *).
MonadIO m =>
String -> [Pair] -> Car m CommandResponse
runCmd String
"remote_seat_heater_request" [Key
"heater" Key -> Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Seat -> Int
seatNum Seat
seat, Key
"level" Key -> Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Int
0::Int)]
String -> [Pair] -> Car m CommandResponse
forall (m :: * -> *).
MonadIO m =>
String -> [Pair] -> Car m CommandResponse
runCmd String
"remote_seat_cooler_request" [Key
"seat_position" Key -> Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Seat -> Int
seatNum Seat
seat, Key
"seat_cooler_level" Key -> Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Int
0 :: Int)]
seatClimate Seat
seat (Just (SeatClimate SeatMode
SeatHeat SeatLevel
level)) =
String -> [Pair] -> Car m CommandResponse
forall (m :: * -> *).
MonadIO m =>
String -> [Pair] -> Car m CommandResponse
runCmd String
"remote_seat_heater_request" [Key
"heater" Key -> Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Seat -> Int
seatNum Seat
seat, Key
"level" Key -> SeatLevel -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SeatLevel
level]
seatClimate Seat
seat (Just (SeatClimate SeatMode
SeatCool SeatLevel
level)) =
String -> [Pair] -> Car m CommandResponse
forall (m :: * -> *).
MonadIO m =>
String -> [Pair] -> Car m CommandResponse
runCmd String
"remote_seat_cooler_request" [Key
"seat_position" Key -> Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Seat -> Int
seatNum Seat
seat, Key
"seat_cooler_level" Key -> SeatLevel -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SeatLevel
level]
setTemps :: MonadIO m => (Double, Double) -> Car m CommandResponse
setTemps :: forall (m :: * -> *).
MonadIO m =>
(Double, Double) -> Car m CommandResponse
setTemps (Double
driver, Double
passenger) = String -> [Pair] -> Car m CommandResponse
forall (m :: * -> *).
MonadIO m =>
String -> [Pair] -> Car m CommandResponse
runCmd String
"set_temps" [Key
"driver_temp" Key -> Double -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Double
driver, Key
"passenger_temp" Key -> Double -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Double
passenger]
maxDefrost :: MonadIO m => Bool -> Car m CommandResponse
maxDefrost :: forall (m :: * -> *). MonadIO m => Bool -> Car m CommandResponse
maxDefrost Bool
on = String -> [Pair] -> Car m CommandResponse
forall (m :: * -> *).
MonadIO m =>
String -> [Pair] -> Car m CommandResponse
runCmd String
"set_preconditioning_max" [Key
"on" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
on]
scheduledDepartureOff :: MonadIO m => Car m CommandResponse
scheduledDepartureOff :: forall (m :: * -> *). MonadIO m => Car m CommandResponse
scheduledDepartureOff = String -> [Pair] -> Car m CommandResponse
forall (m :: * -> *).
MonadIO m =>
String -> [Pair] -> Car m CommandResponse
runCmd String
"set_scheduled_departure" [ Key
"enable" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
False ]
data Sometimes = Never | Always | WeekdaysOnly
deriving (Sometimes -> Sometimes -> Bool
(Sometimes -> Sometimes -> Bool)
-> (Sometimes -> Sometimes -> Bool) -> Eq Sometimes
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Sometimes -> Sometimes -> Bool
== :: Sometimes -> Sometimes -> Bool
$c/= :: Sometimes -> Sometimes -> Bool
/= :: Sometimes -> Sometimes -> Bool
Eq, Int -> Sometimes -> ShowS
[Sometimes] -> ShowS
Sometimes -> String
(Int -> Sometimes -> ShowS)
-> (Sometimes -> String)
-> ([Sometimes] -> ShowS)
-> Show Sometimes
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Sometimes -> ShowS
showsPrec :: Int -> Sometimes -> ShowS
$cshow :: Sometimes -> String
show :: Sometimes -> String
$cshowList :: [Sometimes] -> ShowS
showList :: [Sometimes] -> ShowS
Show, Sometimes
Sometimes -> Sometimes -> Bounded Sometimes
forall a. a -> a -> Bounded a
$cminBound :: Sometimes
minBound :: Sometimes
$cmaxBound :: Sometimes
maxBound :: Sometimes
Bounded, Int -> Sometimes
Sometimes -> Int
Sometimes -> [Sometimes]
Sometimes -> Sometimes
Sometimes -> Sometimes -> [Sometimes]
Sometimes -> Sometimes -> Sometimes -> [Sometimes]
(Sometimes -> Sometimes)
-> (Sometimes -> Sometimes)
-> (Int -> Sometimes)
-> (Sometimes -> Int)
-> (Sometimes -> [Sometimes])
-> (Sometimes -> Sometimes -> [Sometimes])
-> (Sometimes -> Sometimes -> [Sometimes])
-> (Sometimes -> Sometimes -> Sometimes -> [Sometimes])
-> Enum Sometimes
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Sometimes -> Sometimes
succ :: Sometimes -> Sometimes
$cpred :: Sometimes -> Sometimes
pred :: Sometimes -> Sometimes
$ctoEnum :: Int -> Sometimes
toEnum :: Int -> Sometimes
$cfromEnum :: Sometimes -> Int
fromEnum :: Sometimes -> Int
$cenumFrom :: Sometimes -> [Sometimes]
enumFrom :: Sometimes -> [Sometimes]
$cenumFromThen :: Sometimes -> Sometimes -> [Sometimes]
enumFromThen :: Sometimes -> Sometimes -> [Sometimes]
$cenumFromTo :: Sometimes -> Sometimes -> [Sometimes]
enumFromTo :: Sometimes -> Sometimes -> [Sometimes]
$cenumFromThenTo :: Sometimes -> Sometimes -> Sometimes -> [Sometimes]
enumFromThenTo :: Sometimes -> Sometimes -> Sometimes -> [Sometimes]
Enum)
type Preconditioning = Sometimes
data OffPeakConfig = OffPeakConfig {
OffPeakConfig -> Sometimes
_offPeakEnabled :: Sometimes,
OffPeakConfig -> Time
_offPeakEndTime :: Time
}
scheduleDeparture :: MonadIO m => Time -> Preconditioning -> Maybe OffPeakConfig -> Car m CommandResponse
scheduleDeparture :: forall (m :: * -> *).
MonadIO m =>
Time -> Sometimes -> Maybe OffPeakConfig -> Car m CommandResponse
scheduleDeparture Time
t Sometimes
p Maybe OffPeakConfig
o = String -> [Pair] -> Car m CommandResponse
forall (m :: * -> *).
MonadIO m =>
String -> [Pair] -> Car m CommandResponse
runCmd String
"set_scheduled_departure" ([Key
"enable" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
True, Key
"departure_time" Key -> Time -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Time
t] [Pair] -> [Pair] -> [Pair]
forall a. Semigroup a => a -> a -> a
<> [Pair]
pp [Pair] -> [Pair] -> [Pair]
forall a. Semigroup a => a -> a -> a
<> Maybe OffPeakConfig -> [Pair]
forall {e} {a}. KeyValue e a => Maybe OffPeakConfig -> [a]
op Maybe OffPeakConfig
o)
where
pp :: [Pair]
pp = Key -> Key -> Sometimes -> [Pair]
forall {e} {a}. KeyValue e a => Key -> Key -> Sometimes -> [a]
s Key
"preconditioning_enabled" Key
"preconditioning_weekdays_only" Sometimes
p
op :: Maybe OffPeakConfig -> [a]
op Maybe OffPeakConfig
Nothing = OffPeakConfig -> [a]
forall {e} {a}. KeyValue e a => OffPeakConfig -> [a]
opp (Sometimes -> Time -> OffPeakConfig
OffPeakConfig Sometimes
Never (Finite 1440 -> Time
Time Finite 1440
0))
op (Just OffPeakConfig
x) = OffPeakConfig -> [a]
forall {e} {a}. KeyValue e a => OffPeakConfig -> [a]
opp OffPeakConfig
x
opp :: OffPeakConfig -> [a]
opp OffPeakConfig{Time
Sometimes
_offPeakEnabled :: OffPeakConfig -> Sometimes
_offPeakEndTime :: OffPeakConfig -> Time
_offPeakEnabled :: Sometimes
_offPeakEndTime :: Time
..} = (Key
"end_off_peak_time" Key -> Time -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Time
_offPeakEndTime) a -> [a] -> [a]
forall a. a -> [a] -> [a]
: Key -> Key -> Sometimes -> [a]
forall {e} {a}. KeyValue e a => Key -> Key -> Sometimes -> [a]
s Key
"off_peak_charging_enabled" Key
"off_peak_charging_weekdays_only" Sometimes
_offPeakEnabled
s :: Key -> Key -> Sometimes -> [a]
s Key
e Key
w = \case
Sometimes
Never -> [Key
e Key -> Bool -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
False, Key
w Key -> Bool -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
False]
Sometimes
Always -> [Key
e Key -> Bool -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
True, Key
w Key -> Bool -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
False]
Sometimes
WeekdaysOnly -> [Key
e Key -> Bool -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
True, Key
w Key -> Bool -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
True]
data ClimateKeeper = ClimateKeeperOff | ClimateKeeperDefault | DogMode | CampMode
deriving (ClimateKeeper -> ClimateKeeper -> Bool
(ClimateKeeper -> ClimateKeeper -> Bool)
-> (ClimateKeeper -> ClimateKeeper -> Bool) -> Eq ClimateKeeper
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ClimateKeeper -> ClimateKeeper -> Bool
== :: ClimateKeeper -> ClimateKeeper -> Bool
$c/= :: ClimateKeeper -> ClimateKeeper -> Bool
/= :: ClimateKeeper -> ClimateKeeper -> Bool
Eq, Int -> ClimateKeeper -> ShowS
[ClimateKeeper] -> ShowS
ClimateKeeper -> String
(Int -> ClimateKeeper -> ShowS)
-> (ClimateKeeper -> String)
-> ([ClimateKeeper] -> ShowS)
-> Show ClimateKeeper
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ClimateKeeper -> ShowS
showsPrec :: Int -> ClimateKeeper -> ShowS
$cshow :: ClimateKeeper -> String
show :: ClimateKeeper -> String
$cshowList :: [ClimateKeeper] -> ShowS
showList :: [ClimateKeeper] -> ShowS
Show, ClimateKeeper
ClimateKeeper -> ClimateKeeper -> Bounded ClimateKeeper
forall a. a -> a -> Bounded a
$cminBound :: ClimateKeeper
minBound :: ClimateKeeper
$cmaxBound :: ClimateKeeper
maxBound :: ClimateKeeper
Bounded, Int -> ClimateKeeper
ClimateKeeper -> Int
ClimateKeeper -> [ClimateKeeper]
ClimateKeeper -> ClimateKeeper
ClimateKeeper -> ClimateKeeper -> [ClimateKeeper]
ClimateKeeper -> ClimateKeeper -> ClimateKeeper -> [ClimateKeeper]
(ClimateKeeper -> ClimateKeeper)
-> (ClimateKeeper -> ClimateKeeper)
-> (Int -> ClimateKeeper)
-> (ClimateKeeper -> Int)
-> (ClimateKeeper -> [ClimateKeeper])
-> (ClimateKeeper -> ClimateKeeper -> [ClimateKeeper])
-> (ClimateKeeper -> ClimateKeeper -> [ClimateKeeper])
-> (ClimateKeeper
-> ClimateKeeper -> ClimateKeeper -> [ClimateKeeper])
-> Enum ClimateKeeper
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: ClimateKeeper -> ClimateKeeper
succ :: ClimateKeeper -> ClimateKeeper
$cpred :: ClimateKeeper -> ClimateKeeper
pred :: ClimateKeeper -> ClimateKeeper
$ctoEnum :: Int -> ClimateKeeper
toEnum :: Int -> ClimateKeeper
$cfromEnum :: ClimateKeeper -> Int
fromEnum :: ClimateKeeper -> Int
$cenumFrom :: ClimateKeeper -> [ClimateKeeper]
enumFrom :: ClimateKeeper -> [ClimateKeeper]
$cenumFromThen :: ClimateKeeper -> ClimateKeeper -> [ClimateKeeper]
enumFromThen :: ClimateKeeper -> ClimateKeeper -> [ClimateKeeper]
$cenumFromTo :: ClimateKeeper -> ClimateKeeper -> [ClimateKeeper]
enumFromTo :: ClimateKeeper -> ClimateKeeper -> [ClimateKeeper]
$cenumFromThenTo :: ClimateKeeper -> ClimateKeeper -> ClimateKeeper -> [ClimateKeeper]
enumFromThenTo :: ClimateKeeper -> ClimateKeeper -> ClimateKeeper -> [ClimateKeeper]
Enum)
instance ToJSON ClimateKeeper where
toJSON :: ClimateKeeper -> Value
toJSON = Int -> Value
forall a. ToJSON a => a -> Value
toJSON (Int -> Value) -> (ClimateKeeper -> Int) -> ClimateKeeper -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ClimateKeeper -> Int
forall a. Enum a => a -> Int
fromEnum
climateKeeper :: MonadIO m => ClimateKeeper -> Car m CommandResponse
climateKeeper :: forall (m :: * -> *).
MonadIO m =>
ClimateKeeper -> Car m CommandResponse
climateKeeper ClimateKeeper
ck = String -> [Pair] -> Car m CommandResponse
forall (m :: * -> *).
MonadIO m =>
String -> [Pair] -> Car m CommandResponse
runCmd String
"set_climate_keeper_mode" [ Key
"climate_keeper_mode" Key -> ClimateKeeper -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ClimateKeeper
ck]
mkNamedCommands [("hvacOn", "auto_conditioning_start"),
("hvacOff", "auto_conditioning_stop")]