diff --git a/grocy/battery.py b/grocy/battery.py new file mode 100644 index 0000000..3f66715 --- /dev/null +++ b/grocy/battery.py @@ -0,0 +1,41 @@ +import logging +from grocy.conf import Configuration +from grocy.request import Request + + +class Battery(object): + TRACK_CHARGE = '{domain}/api/batteries/{batteryId}/charge' + GET_BATTERY = '{domain}/api/batteries/{batteryId}' + + def __init__(self, id=None): + self.conf = Configuration() + self.conf.load() + self.id = id + + @property + def details(self): + logger = logging.getLogger('battery.details') + try: + if self.id is None: + raise Exception('battery id is required') + url = self.GET_BATTERY.format(domain=self.conf.domain, batteryId=self.id) + request = Request('get', url) + battery_details = request.send() + # Remove general battery info + del battery_details['battery'] + return battery_details + except Exception as e: + logger.error(e) + raise e + + def track_charge(self): + logger = logging.getLogger('battery.track_charge') + try: + if self.id is None: + raise Exception('battery id is required') + url = self.TRACK_CHARGE.format(domain=self.conf.domain, batteryId=self.id) + request = Request('post', url) + batteries = request.send() + except Exception as e: + logger.error(e) + raise e diff --git a/grocy/cli.py b/grocy/cli.py index 7bf23a1..e38705b 100644 --- a/grocy/cli.py +++ b/grocy/cli.py @@ -10,6 +10,7 @@ from grocy.recipe import Recipe from grocy.table import Table from grocy.entity import Entity from grocy.chore import Chore +from grocy.battery import Battery from grocy.stock import Stock from grocy.schema import get_schema from grocy.shoppinglist import ShoppingList @@ -744,11 +745,11 @@ def list(name, template): else: chores = entity.get() - data = {'chores': []} + data = {'fields': []} for chore in chores: chore_details = Chore(chore['id']) chore.update(chore_details.execution_times) - data['chores'].append({'fields': chore}) + data['fields'].append(chore) if template: loaded_template = cfg.templates(template) @@ -786,3 +787,157 @@ def create(template): except Exception as e: logger.error(e) raise e + + +@main.group() +def battery(): + pass + + +@battery.command() +@click.option('-t', 'template') +@click.option('--name', '-n', 'name') +def list(name, template): + logger = logging.getLogger('cli.battery.list') + cfg = Configuration() + cfg.load() + query = {} + try: + entity = Entity(name='batteries') + if name: + batteries = entity.find_by_name(name) + if len(batteries) == 0: + return + else: + batteries = entity.get() + + for battery in batteries: + battery_details = Battery(id=battery['id']).details + battery.update(battery_details) + + data = {'fields': {'batteries': batteries}} + if template: + loaded_template = cfg.templates(template) + else: + loaded_template = cfg.templates('battery/list') + + click.echo(loaded_template.render(grocy=data)) + except Exception as e: + logger.error(e) + raise e + + +@battery.command() +@click.option('-t', 'template') +def create(template): + logger = logging.getLogger('cli.battery.create') + try: + cfg = Configuration() + cfg.load() + util = Util(cfg=cfg) + meta = Meta() + data = {'meta': meta.generate()} + if template: + loaded_template = cfg.templates(template) + else: + loaded_template = cfg.templates('battery/create') + created_battery = click.edit(loaded_template.render(grocy=data), extension='.yml') + if not created_battery: + return + parsed_new_battery = util.load_yaml(created_battery)[0] + + if template == 'debug': + click.echo(parsed_new_battery) + return + entity = Entity(name='batteries') + entity.create(parsed_new_battery) + + except Exception as e: + logger.error(e) + raise e + + +@battery.command() +@click.argument('battery_id') +@click.option('-t', 'template') +def remove(battery_id, template): + logger = logging.getLogger('cli.battery.remove') + try: + entity = Entity(name='batteries') + entity.delete(battery_id) + except Exception as e: + logger.error(e) + raise e + + +@battery.command() +@click.argument('battery_id', required=False) +@click.option('-t', 'template') +@click.option('--name', '-n', 'name') +def edit(battery_id, name, template): + logger = logging.getLogger('cli.battery.edit') + try: + cfg = Configuration() + util = Util(cfg=cfg) + cfg.load() + if template: + loaded_template = cfg.templates(template) + else: + loaded_template = cfg.templates('battery/edit') + + entity = Entity(name='batteries') + if battery_id: + battery = entity.get(id=battery_id) + batteries = [battery] + elif name: + # Convert name args to a single string + string_name_arg = ' '.join(name) if type(name) == list else name + batteries = entity.find({'name': string_name_arg}) + else: + raise click.BadParameter('Missing BATTERY_ID or QUERY') + + if batteries is None: + click.echo('Could not find batteries') + return + + data = {'fields': {'batteries': batteries}} + edited_batteries = click.edit(loaded_template.render(grocy=data), extension='.yml') + if edited_batteries is None: + return + + schema = entity.schema + + parsed_edited_batteries = util.load_yaml(edited_batteries) + for index, edited_battery in enumerate(parsed_edited_batteries): + edited_battery['id'] = batteries[index]['id'] + util.verify_integrity(edited_battery, schema) + entity.update(edited_battery, id=batteries[index]['id']) + except Exception as e: + logger.error(e) + raise e + + +@battery.command() +@click.option('-t', 'template') +@click.argument('battery_id') +def track(template, battery_id): + logger = logging.getLogger('cli.battery.track') + cfg = Configuration() + cfg.load() + try: + if template: + loaded_template = cfg.templates(template) + else: + loaded_template = cfg.templates('battery/track') + + created_battery = click.edit(loaded_template.render(), extension='.yml') + parsed_created_battery = yaml.safe_load(created_battery) + if template == 'debug': + click.echo(parsed_created_battery) + return + + battery = Battery(id=battery_id) + battery.track_charge() + except Exception as e: + logger.error(e) + raise e diff --git a/grocy/util.py b/grocy/util.py index 27e457a..e55292e 100644 --- a/grocy/util.py +++ b/grocy/util.py @@ -31,9 +31,8 @@ class Util(object): for prop in new_data.keys(): if prop not in schema_keys: keys_not_found.append(prop) - print('{}'.format(keys_not_found)) if len(keys_not_found) > 0: - raise Exception('{} is not valid property'.format(keys_not_found.join(', '))) + raise Exception('{} are/is not valid properties'.format(', '.join(keys_not_found))) except Exception as e: logger.error(e) raise e