Skip to content
2 changes: 1 addition & 1 deletion src/enerbitdso/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.1.18
0.1.19
1 change: 1 addition & 0 deletions src/enerbitdso/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .enerbit import DSOClient, InvalidParameterError
95 changes: 57 additions & 38 deletions src/enerbitdso/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,19 +80,16 @@ def fetch(
frt_file: pathlib.Path = typer.Option(
None, help="Path file with one frt code per line"
),
meter_serial: str = typer.Option(
None, help="Filter by specific meter serial number"
),
frts: list[str] = typer.Argument(None, help="List of frt codes separated by ' '"),
):
try:
ebconnector = enerbit.DSOClient(
api_base_url=api_base_url,
api_username=api_username,
api_password=api_password.get_secret_value(),
)
except Exception:
err_console.print(
f"Failed to authenticate to '{api_base_url}' as '{api_username}'"
)
raise typer.Exit(code=1)
ebconnector = enerbit.DSOClient(
api_base_url=api_base_url,
api_username=api_username,
api_password=api_password.get_secret_value(),
)

today = dt.datetime.now(TZ_INFO).replace(**DATE_PARTS_TO_START_DAY)
if since is None:
Expand All @@ -107,39 +104,61 @@ def fetch(
if frts is None:
frts = []

if not operator.xor(frt_file is not None, len(frts) != 0):
err_console.print("Can't use '--FRT_FILE' and 'FRTS' on the same call")
if not operator.xor(frt_file is not None, len(frts) != 0) and meter_serial is None:
err_console.print("Debe proporcionar FRTs (--frt-file o argumentos FRTS) o --meter-serial, pero no ambos")
raise typer.Exit(code=1)

if meter_serial and (frt_file is not None or len(frts) != 0):
err_console.print("No se puede usar --meter-serial junto con FRTs. Use uno u otro.")
raise typer.Exit(code=1)

if frt_file is not None:
with open(frt_file, "r") as frts_src:
frts = frts_src.read().splitlines()

err_console.print(
f"Fetching usages for {len(frts)} frts since={since} until={until}"
)

header = True
for i, f in enumerate(frts):
try:
usage_records = ebconnector.fetch_schedule_usage_records_large_interval(
f, since=since, until=until
)
except Exception:
err_console.print(f"Failed to fetch usage records for frt code '{f}'")
err_console.print_exception()
continue

match out_format:
case OutputFormat.csv:
content = formats.as_csv(usage_records, header=header)
header = False
case OutputFormat.jsonl:
content = formats.as_jsonl(usage_records)

content.seek(0)
for s in content:
sys.stdout.write(s)
if meter_serial:
err_console.print(
f"Fetching usages for meter {meter_serial} since={since} until={until}"
)
query_type = "meter"
items_to_process = [meter_serial]
else:
err_console.print(
f"Fetching usages for {len(frts)} frts since={since} until={until}"
)
query_type = "frt"
items_to_process = frts

with ebconnector:
header = True
for i, item in enumerate(items_to_process, 1):
try:
if query_type == "meter":
usage_records = ebconnector.fetch_schedule_usage_records_large_interval(
frt_code=None, since=since, until=until, meter_serial=item
)
item_description = f"meter {item}"
else:
usage_records = ebconnector.fetch_schedule_usage_records_large_interval(
frt_code=item, since=since, until=until, meter_serial=None
)
item_description = f"frt code {item}"

except Exception:
err_console.print(f"Failed to fetch usage records for {item_description}")
err_console.print_exception()
continue

match out_format:
case OutputFormat.csv:
content = formats.as_csv(usage_records, header=header)
header = False
case OutputFormat.jsonl:
content = formats.as_jsonl(usage_records)

content.seek(0)
for s in content:
sys.stdout.write(s)


if __name__ == "__main__":
Expand Down
Loading