hasspy/hasspy/__init__.py

71 lines
1.8 KiB
Python

import logging
import logging.config
import signal
import tomllib
from argparse import ArgumentParser
from pathlib import Path
from hasspy.mqtt import HassClient, HassSystemClient, HassUserClient
log = logging.getLogger(__name__)
def main() -> int:
parser = ArgumentParser(
prog="HassPy",
description="Home Assistant MQTT client",
)
parser.add_argument("-c", "--config", help="Path to configuration file")
parser.add_argument(
"-v", "--verbose", help="Enable verbose logging", action="count", default=0
)
parser.add_argument("-u", "--user", help="User mode client", action="store_true")
args = parser.parse_args()
if args.config:
config_file = Path(args.config)
else:
config_file = next(
(
x
for x in (Path("/etc/hasspy.toml"), Path("/etc/hasspy/config.toml"))
if x.exists()
),
Path("config.toml"),
)
if not config_file or not config_file.exists():
raise FileNotFoundError("No configuration file found")
with open(config_file, "rb") as file:
config = tomllib.load(file)
if isinstance(config.get("log_level"), str):
config["log_level"] = getattr(logging, config["log_level"])
config["log_level"] = config.get("log_level", logging.INFO) - (args.verbose * 10)
logging.basicConfig(level=config["log_level"])
log.info("Starting HassPy")
ha: HassClient
if not args.user:
ha = HassSystemClient(
"orchomenos",
config=config,
)
else:
ha = HassUserClient(
"orchomenos",
config=config,
)
ha.loop_start()
signal.sigwait([signal.SIGHUP, signal.SIGINT, signal.SIGTERM])
log.info("Shutting down")
ha.timer.cancel()
ha.loop_stop()
return 0