ha-kiosk-agent/src/ha-kiosk-agent

101 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import asyncio
import coloredlogs
import logging
import os
import subprocess
import time
import ha_mqtt_discoverable
import sensors
class InputListener():
last_input = 0
def get_last_input(self):
return self.last_input
async def read_stdout(self, logger, stdout):
logger.info('reading stdout')
while True:
buf = await stdout.readline()
if not buf:
break
now = time.time()
if self.last_input + 5 <= now:
logger.info('display input received')
self.last_input = now
async def run(self, logger, device: str):
logger.info('starting display event listener loop')
proc = await asyncio.create_subprocess_exec(
'libinput', 'record', device,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.DEVNULL)
asyncio.gather(self.read_stdout(logger, proc.stdout))
async def sensor_loop(logger, sensor_entities):
logger.info('starting sensor loop')
while True:
for sensor in sensor_entities.values():
sensor.update_value()
await asyncio.sleep(0.1)
async def main():
coloredlogs.install()
logger = logging.getLogger("HA kiosk agent")
logger.setLevel(logging.INFO)
parser = argparse.ArgumentParser()
parser.add_argument("--debug", action='store_true', default=False)
parser.add_argument("--device-id", dest='device_id', default=os.environ.get('DEVICE_ID'), required=True)
parser.add_argument("--device-name", dest='device_name', default=os.environ.get('DEVICE_NAME'), required=True)
parser.add_argument("--display-device", dest='display_device', default=os.environ.get('DISPLAY_DEVICE'))
parser.add_argument("--mqtt-host", dest='mqtt_host', default=os.environ.get('MQTT_HOST', 'localhost'))
parser.add_argument("--mqtt-port", dest='mqtt_port', default=os.environ.get('MQTT_PORT', 1883))
parser.add_argument("--mqtt-user", dest='mqtt_user', default=os.environ.get('MQTT_USER'))
parser.add_argument("--mqtt-pass", dest='mqtt_pass', default=os.environ.get('MQTT_PASS'))
args = parser.parse_args()
mqtt_args = {'host': args.mqtt_host}
if args.debug:
logger.setLevel(logging.DEBUG)
mqtt_args['debug'] = args.debug
if args.mqtt_port:
mqtt_args['port'] = args.mqtt_port
if args.mqtt_user:
mqtt_args['username'] = args.mqtt_user
if args.mqtt_pass:
mqtt_args['password'] = args.mqtt_pass
mqtt_settings = ha_mqtt_discoverable.Settings.MQTT(**mqtt_args)
device = sensors.Device(args.device_name, args.device_id, mqtt_settings)
sensor_entities = {
'battery': sensors.BatterySensor(device),
'display_brightness': sensors.DisplayBrightnessSensor(device),
'temperature': sensors.TemperatureSensor(device)
};
logger.info('finished setup')
tasks = [sensor_loop(logger, sensor_entities)]
if args.display_device:
listener = InputListener()
sensor_entities['display_touched'] = sensors.DisplayTouchedSensor(device, listener)
tasks.append(listener.run(logger, args.display_device))
await asyncio.gather(*tasks)
if __name__ == "__main__":
asyncio.run(main())