def download(config, args): db = config.database() for system in config.systems(): for inv in system.inverters(): print("%s (SN: %s)" % (inv.name, inv.serial)) try: data, daily = smadata2.download.download_inverter(inv, db) if len(data): print("Downloaded %d observations from %s to %s" % (len(data), smadata2.datetimeutil.format_time(data[0][0]), smadata2.datetimeutil.format_time(data[-1][0]))) else: print("No new fast sampled data") if len(daily): print("Downloaded %d daily observations from %s to %s" % (len(daily), smadata2.datetimeutil.format_time(daily[0][0]), smadata2.datetimeutil.format_time(daily[-1][0]))) else: print("No new daily data") except Exception as e: print("ERROR downloading inverter: %s" % e, file=sys.stderr)
def yieldat(config, args): db = config.database() if args.datetime is None: print("No date specified", file=sys.stderr) sys.exit(1) dt = dateutil.parser.parse(args.datetime) for system in config.systems(): print("%s:" % system.name) if dt.tzinfo is None: sdt = datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, tzinfo=system.timezone()) else: sdt = dt ts = smadata2.datetimeutil.totimestamp(sdt) ids = [inv.serial for inv in system.inverters()] val = db.get_aggregate_one_historic(ts, ids) print("\tTotal generation at %s: %d Wh" % (sdt, val))
def record_now(config, args): db = config.database() for system in config.systems(): for inv in system.inverters(): sma = inv.connect_and_logon() ttime, total = sma.total_yield() timestamp = int(time.time()) db.add_historic(inv.serial, timestamp, total) db.commit()
def upload(config, args): db = config.database() if args.upload_date is None: print("No date specified", file=sys.stderr) sys.exit(1) d = dateutil.parser.parse(args.upload_date).date() print("Uploading data for %s" % d) for system in config.systems(): print("%s" % system.name) smadata2.upload.upload_date(system, d, db)
def download(config, args): db = config.database() for system in config.systems(): for inv in system.inverters(): print("%s (SN: %s)" % (inv.name, inv.serial)) ic = inv.connect_and_logon() data = smadata2.download.download_inverter(ic, db) if len(data): print( "Downloaded %d observations from %s to %s" % (len(data), smadata2.datetimeutil.format_time(data[0][0]), smadata2.datetimeutil.format_time(data[-1][0]))) else: print("No new data")
def yieldat(config, args): db = config.database() if args.datetime is None: print("No date specified", file=sys.stderr) sys.exit(1) dt = dateutil.parser.parse(args.datetime) for system in config.systems(): print("%s:" % system.name) if dt.tzinfo is None: sdt = datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, tzinfo=system.timezone()) else: sdt = dt ts = smadata2.datetimeutil.totimestamp(sdt) ids = [inv.serial for inv in system.inverters()] details = db.get_yield_at_details(ts, ids) for inv in system.inverters(): iyield, its = details[inv.serial] print("\t\t{}: {} Wh @ {}".format( inv.name, iyield, smadata2.datetimeutil.format_time(its))) sys.stdout.flush() val = db.get_yield_at(ts, ids) print("\tTotal generation at %s: %d Wh" % (sdt, val))
def yieldlog(config, args): db = config.database() if args.start is None: print("No start date specified", file=sys.stderr) sys.exit(1) if args.end is None: print("No end date specified", file=sys.stderr) sys.exit(1) start = dateutil.parser.parse(args.start) end = dateutil.parser.parse(args.end) l = [s for s in config.systems() if s.name.find(args.system) >= 0] if len(l) != 1: print("Must specify exactly one system", file=sys.stderr) sys.exit(1) system = l[0] if start.tzinfo is None: start = datetime.datetime(start.year, start.month, start.day, start.hour, start.minute, start.second, start.microsecond, tzinfo=system.timezone()) start_ts = smadata2.datetimeutil.totimestamp(start) if end.tzinfo is None: end = datetime.datetime(end.year, end.month, end.day, end.hour, end.minute, end.second, end.microsecond, tzinfo=system.timezone()) end_ts = smadata2.datetimeutil.totimestamp(end) if args.csv: csvf = csv.writer(sys.stdout) else: print("{}: {} ({}) .. {} ({})".format(system.name, start, start_ts, end, end_ts)) ids = [inv.serial for inv in system.inverters()] data = db.get_daily_yields(start_ts, end_ts, ids) if args.csv: csvf.writerow(["Date"] + [inv.name for inv in system.inverters()]) else: print("Date\t\t\t" + "\t".join(inv.name for inv in system.inverters())) for row in data: if args.csv: ds = time.strftime( time.strftime("%Y-%m-%d", time.localtime(row[0]))) csvf.writerow((ds, ) + row[1:]) else: print( smadata2.datetimeutil.format_date(row[0]) + "\t" + "\t".join(str(y) for y in row[1:]))
def upload_energy(config, args): uploader = config.energy_uploader() db = config.database() for system in config.systems(): for inv in system.inverters(): uploader.upload_missing(inv)