예제 #1
0
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))
예제 #2
0
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)
예제 #3
0
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()
예제 #4
0
def settime(config, args):
    for system in config.systems():
        for inv in system.inverters():
            print("%s (SN: %s)" % (inv.name, inv.serial))
            try:
                sma = inv.connect_and_logon()

                oldtime, tmp = sma.total_yield()
                print("\t\tPrevious time: %s"
                      % (smadata2.datetimeutil.format_time(oldtime)))
            except Exception as e:
                print("ERROR contacting inverter: %s" % e, file=sys.stderr)
예제 #5
0
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)
예제 #6
0
def status(config, args):
    for system in config.systems():
        print("%s:" % system.name)

        for inv in system.inverters():
            print("\t%s:" % inv.name)

            sma = inv.connect_and_logon()

            dtime, daily = sma.daily_yield()
            print("\t\tDaily generation at %s:\t%d Wh" %
                  (smadata2.datetimeutil.format_time(dtime), daily))

            ttime, total = sma.total_yield()
            print("\t\tTotal generation at %s:\t%d Wh" %
                  (smadata2.datetimeutil.format_time(ttime), total))
예제 #7
0
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")
예제 #8
0
def status(config, args):
    for system in config.systems():
        print("%s:" % system.name)

        for inv in system.inverters():
            print("\t%s:" % inv.name)

            try:
                sma = inv.connect_and_logon()

                dtime, daily = sma.daily_yield()
                print("\t\tDaily generation at %s:\t%d Wh" %
                      (smadata2.datetimeutil.format_time(dtime), daily))

                ttime, total = sma.total_yield()
                print("\t\tTotal generation at %s:\t%d Wh" %
                      (smadata2.datetimeutil.format_time(ttime), total))
            except Exception as e:
                print("ERROR contacting inverter: %s" % e, file=sys.stderr)
예제 #9
0
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))
예제 #10
0
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:]))
예제 #11
0
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)