#!/usr/local/bin/python """Script to run pydaikin.""" import argparse from asyncio import run, sleep from contextlib import nullcontext from aiohttp import ClientError from pydaikin import discovery # pylint: disable=cyclic-import from pydaikin.daikin_brp069 import ( # noqa: E0611; pylint: disable=no-name-in-module DaikinBRP069 as appliance, ) from pydaikin.factory import DaikinFactory async def list_all_devices(): """Print all discovered devices.""" for dev in discovery.get_devices(): try: appl = await DaikinFactory(dev['ip']) support_energy_consumption = ( "Supported" if appl.support_energy_consumption else "Unsupported" ) except ClientError: support_energy_consumption = "Unknown" print( f"{dev['ip'][:18]}" f" ({dev['mac']}): {dev['name']}" f" - {support_energy_consumption} energy consumption" ) parser = argparse.ArgumentParser(description='Daikin wireless interface.') group = parser.add_mutually_exclusive_group(required=True) group.add_argument( 'device', metavar='dev', nargs='?', help='device, either ip or common name' ) group.add_argument( '-l', '--list', action='store_true', help='list all the devices found' ) parser.add_argument( '-a', '--all', action='store_true', help='show all the values available for the device', ) parser.add_argument( '-p', '--password', help='unit\'s password (only used by SkyFi devices)' ) parser.add_argument('-k', '--key', help='unit\'s key (only used by BRP072Cxx devices)') settings = parser.add_argument_group('device settings', 'Modify paramaters of a device') settings.add_argument( '-m', '--mode', choices=appliance.daikin_values('mode'), help='set working mode' ) settings.add_argument('-t', '--temp', type=float, help='set target temperature') settings.add_argument('-y', '--humidity', type=int, help='set target humidity') settings.add_argument( '-f', '--fan', choices=appliance.daikin_values('f_rate'), help='set fan speed' ) settings.add_argument( '-d', '--direction', choices=appliance.daikin_values('f_dir'), help='set fan movement', ) settings.add_argument( '-w', '--away', choices=appliance.daikin_values('en_hol'), help='set away mode' ) settings.add_argument( '-s', '--sensor', action='store_true', help='tail sensors\'s value' ) settings.add_argument('--file', type=str, help='file path for sensors logging') settings.add_argument( '-v', '--verbose', help='Verbose level (none: critical, v: error, vv: warning, vvv: info, vvvv: debug)', action='count', default=0, ) async def main(): # pylint: disable=too-many-branches """Main function.""" args = parser.parse_args() if args.verbose: import logging # pylint: disable=import-outside-toplevel logging.basicConfig( level=[ logging.CRITICAL, logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG, ][args.verbose] ) _settings = {} if args.mode: _settings.update({"mode": args.mode}) if args.temp: _settings.update({"stemp": str(args.temp)}) if args.humidity: _settings.update({"shum": str(args.humidity)}) if args.fan: _settings.update({"f_rate": args.fan}) if args.direction: _settings.update({"f_dir": args.direction}) if args.away: _settings.update({"en_hol": args.away}) if args.list: await list_all_devices() else: daikin = await DaikinFactory(args.device, key=args.key, password=args.password) if not _settings: daikin.show_values(not args.all) else: await daikin.set(_settings) if args.sensor: print('\nPress CTRL+C to stop logging sensor data...\n') with ( open(args.file, 'a', encoding='utf-8') if args.file else nullcontext() ) as file: try: while True: await daikin.update_status() daikin.show_sensors() if args.file: daikin.log_sensors(file) await sleep(30) except KeyboardInterrupt: pass run(main())