module Main (main) where
--------------------------------------------------------------------------------
import Control.Monad.IO.Class
import qualified Data.Aeson as JSON
import qualified Data.ByteString.Char8 as C8
import qualified Data.ByteString.Lazy as LBS
import Data.Maybe
import System.Environment
import System.Exit
import Network.HTTP.Client
import Network.HTTP.Client.TLS
import HomeAssistant.Client
import HomeAssistant.Common.HomeAssistant
import HomeAssistant.Common.Notify
import Options
--------------------------------------------------------------------------------
-- | This is the default address that Home Assistant installations can be found at.
-- Used only if no address is explicitly specified.
defaultAddress :: String
defaultAddress = "http://homeassistant.local:8123/"
--------------------------------------------------------------------------------
managerForBaseUrl :: BaseUrl -> IO Manager
managerForBaseUrl address = newManager $ case baseUrlScheme address of
Http -> defaultManagerSettings
Https -> tlsManagerSettings
--------------------------------------------------------------------------------
runAndFormat :: JSON.ToJSON v => ClientEnv -> HA v -> IO ()
runAndFormat env m = runClientM m env >>= \case
Left err -> print err
Right v -> LBS.putStr (JSON.encode v)
runConfigCmd :: ClientEnv -> ConfigCommand -> IO ()
runConfigCmd env ShowConfig = runAndFormat env config
runConfigCmd env CheckConfig = runAndFormat env $ do
result <- check
case result of
JSON.Error err -> liftIO $ do
print err
exitFailure
JSON.Success v -> pure v
runConfigCmd env ReloadAllConfig = runAndFormat env reloadAll
runServiceCmd :: ClientEnv -> ServiceCommand -> IO ()
runServiceCmd env ListServices = runAndFormat env services
runNotificationCmd :: ClientEnv -> NotificationCommand -> IO ()
runNotificationCmd env SendNotification{..} = runAndFormat env $ do
let notificationData = OtherNotificationData <$> sendNotificationData
payload = setNotificationData notificationData $ notification sendNotificationMessage
notify sendNotificationDevice payload
-- | 'main' is the main entry point for this application.
main :: IO ()
main = do
-- Parse command-line arguments
opts <- parseCmdLineArgs
mToken <- fmap C8.pack <$> lookupEnv "HA_TOKEN"
address <- fromMaybe defaultAddress <$> lookupEnv "HA_ADDRESS" >>= parseBaseUrl
case mToken of
Nothing -> do
putStrLn "Error: HA_TOKEN must be set"
exitFailure
Just token -> do
httpManager <- managerForBaseUrl address
let env = mkHomeAssistantEnv token httpManager address
case clientOptionsCommand opts of
ConfigCommand cmd -> runConfigCmd env cmd
ServiceCommand cmd -> runServiceCmd env cmd
NotificationCommand cmd -> runNotificationCmd env cmd
--------------------------------------------------------------------------------