101 lines
3.3 KiB
Python
Executable File
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())
|