def data():
    ##    import sys
    sys.path.insert(1, cwdf)
    import settingsHandler as sh, loginHandler as lh
    if (F.request.json != None and lh.isLogin(str(F.request.json.get('fgt')))):
        data = {'isSetup':sh.readSettings()[0],\
                'datalogging':sh.readSettings()[1],\
                'threshold':sh.readSettings()[2],\
                'debug':sh.readSettings()[3],\
                'nodename':sh.readSettings()[4],\
                'version':sh.readSettings()[5],\
                'nodetype':sh.readSettings()[6],\
                'permanence':sh.readSettings()[7],\
                'carbfpt':sh.readSettings()[8],\
                'refresh':sh.readSettings()[9],\
                'kilowattlimit':sh.readSettings()[10],\
                'kilowattlimitenabled':sh.readSettings()[11],\
                }
        return F.jsonify(data)
    else:
        data = {'nodename': sh.readSettings()[4], \
                'nodetype': sh.readSettings()[6], \
                'isSetup' : sh.readSettings()[0], \
                }
        return F.jsonify(data)
예제 #2
0
def realtimeGraph():
    import sys, lxml.etree as ET, portalocker
    sys.path.insert(1, cwdf)
    import loginHandler as lh, settingsHandler as sh
    refreshrate = int(sh.readSettings()[9])
    if (F.request.json != None and lh.isLogin(str(F.request.json.get('fgt')))):
        datafile = open(cwdf + '/measurements.xml', 'r+')
        lock = False
        while lock == False:
            try:
                lock = True
                with portalocker.Lock(cwdf + '/measurements.xml', 'r+') as datafile:
                    root = ET.parse(datafile)
                    item = root.findall("plot")
                    kilowatts = 0            
                    for entries in item:
                        kilowatts += float(entries.get('voltage')) * float(entries.get('current')) * float(entries.get('pf'))
                    kilowatts = kilowatts/refreshrate/1000
                    data = {'voltage': item[-1].get('voltage'), 'current': item[-1].get('current'), \
                            'variation': item[-1].get('variation'), 'notify':item[-1].get('notify'), \
                            'nodename': sh.readSettings()[4], 'firmware':sh.readSettings()[5],\
                            'wattage': float(item[-1].get('voltage')) * float(item[-1].get('current')) * float(item[-1].get('pf')), 'kwh': kilowatts, 'pf': item[-1].get('pf')}                    
            except portalocker.exceptions.LockException:
                pass
        return F.jsonify(data)
    else:
        return("Not logged in yet.")
def write():
    d = {0:'IsSetup',1:'DataLogging',2:'SensitivityThreshold'\
     ,3:'Debug', 4:'NodeName', 5:'Version', 6:'NodeType',\
     7:'Permanence', 8:'CarbonFootprint', 9:'RefreshRate', 10:'KilowattLimit', 11:'KilowattLimitEnabled'}
    sys.path.insert(1, cwdf)
    import settingsHandler as sh, loginHandler as lh
    if (F.request.json != None and lh.isLogin(str(F.request.json.get('fgt')))):
        for data in range(len(d)):
            if (F.request.json.get(d[data]) != None):
                sh.riteSettings(data, F.request.json.get(d[data]))
    return ("yuh")
def emails():
    sys.path.insert(1, cwdf)
    import settingsHandler as sh, loginHandler as lh
    if (F.request.json != None and lh.isLogin(str(F.request.json.get('fgt')))):
        data = {'emailaddr1':sh.readSettings()[12],\
                'emailaddr2':sh.readSettings()[13],\
                'emailaddr3':sh.readSettings()[14],\
                'emailaddr4':sh.readSettings()[15],\
                'emailaddr5':sh.readSettings()[16],\
                'emailaddr6':sh.readSettings()[17],\
                'emailaddr7':sh.readSettings()[18],\
                'emailaddr8':sh.readSettings()[19],\
                'emailaddr9':sh.readSettings()[20],\
                'emailaddr10':sh.readSettings()[21],\
                }
        return F.jsonify(data)
    else:
        return "You are not allowed to access this resource."
예제 #5
0
def pastData():
    import sys, lxml.etree as ET, datetime, portalocker
    sys.path.insert(1, cwdf)
    import loginHandler as lh, settingsHandler as sh
    if (F.request.json != None and lh.isLogin(str(F.request.json.get('fgt')))):
        data = []
        lock = False
        while lock == False:
            try:
                with portalocker.Lock(cwdf + '/measurements.xml', 'r+') as datafile:
                    lock = True
                    root = ET.parse(datafile)
                    if (F.request.json.get('mode') == "start"): ## since last data reset
                        data = [{'voltage': k.get('voltage'), 'current': k.get('current'), 'pf': k.get('pf'), 'date': k.get('date')} for k in root.iter("plot")]
                    if (F.request.json.get('mode') == "lastmin"): ## readings from the last n minute
                        item = root.findall("plot")
                        mins = int(F.request.json.get('time'))
                        for k in item:
                            if (datetime.datetime.strptime(k.get('date'), "%m/%d/%Y %H:%M:%S") >= datetime.datetime.strptime(item[-1].get('date'), "%m/%d/%Y %H:%M:%S") - datetime.timedelta(minutes=mins, seconds=-1)):
                                data.append({'voltage': k.get('voltage'), 'current': k.get('current'), 'pf': k.get('pf'), 'date': k.get('date')})
                    if (F.request.json.get('mode') == "day"): ##readings throughout a day
                        timeparam = datetime.datetime.strptime(F.request.json.get('time'), "%m/%d/%Y")
                        for k in root.iter("plot"):
                            if (datetime.datetime.strptime(k.get('date'), "%m/%d/%Y %H:%M:%S").date() == timeparam):
                                data.append({'voltage': k.get('voltage'), 'current': k.get('current'), 'pf': k.get('pf'), 'date': k.get('date')})
                    if (F.request.json.get('mode') == "week"): ##readings throughout a week
                        timeparam = datetime.datetime.strptime(F.request.json.get('time'), "%m/%d/%Y").date().strftime("%U")
                        for k in root.iter("plot"):
                            if (datetime.datetime.strptime(k.get('date'), "%m/%d/%Y %H:%M:%S").date().strftime("%U") == timeparam):
                                data.append({'voltage': k.get('voltage'), 'current': k.get('current'), 'pf': k.get('pf'), 'date': k.get('date')})
                    if (F.request.json.get('mode') == "month"): ##readings throughout a month
                        timeparam = datetime.datetime.strptime(F.request.json.get('time'), "%m/%Y").month)
                        for k in root.iter("plot"):
                            if (datetime.datetime.strptime(k.get('date'), "%m/%d/%Y %H:%M:%S").month == timeparam):
                                data.append({'voltage': k.get('voltage'), 'current': k.get('current'), 'pf': k.get('pf'), 'date': k.get('date')})                    
            except portalocker.exceptions.LockException:
                pass
        return F.jsonify(data)
    else:
        return("Not logged in yet.")
예제 #6
0
def dates():
    import sys, xml.etree.ElementTree as ET, datetime, portalocker
    sys.path.insert(1, cwdf)
    import loginHandler as lh, settingsHandler as sh
    if (F.request.json != None and lh.isLogin(str(F.request.json.get('fgt')))):
        data = []
        lock = False
        while lock == False:
            try:
                with portalocker.Lock(cwdf + '/measurements.xml', 'r+') as datafile:
                    lock = True
                    item = ET.parse(datafile).iter("plot")
                    if (F.request.json.get('mode') == "months"): ## available months for year
                        year = datetime.datetime.strptime(F.request.json.get('time'), "%Y").year
                        for k in item:
                            if datetime.datetime.strptime(k.get('date'), "%m/%d/%Y %H:%M:%S").year == year and datetime.datetime.strptime(k.get('date'), "%m/%d/%Y %H:%M:%S").month not in data:
                                data.append(datetime.datetime.strptime(k.get('date'), "%m/%d/%Y %H:%M:%S").month)
                    if (F.request.json.get('mode') == "weeks"): ##mm-dd-yyyy for within a week
                        weekr = datetime.datetime.strptime(F.request.json.get('time'), "%m/%d/%Y %H:%M:%S").strftime("%U")## date and time from request
                        for k in item:
                            if datetime.datetime.strptime(k.get('date'), "%m/%d/%Y %H:%M:%S").strftime("%U") == weekr and datetime.datetime.strftime(datetime.datetime.strptime(k.get('time'), "%m/%d/%Y %H:%M:%S"), "%m/%d/%Y") not in data:
                                data.append(datetime.datetime.strftime(datetime.datetime.strptime(k.get('time'), "%m/%d/%Y %H:%M:%S"), "%m/%d/%Y"))
                    if (F.request.json.get('mode') == "days"): ##available days within a month
                        request = [datetime.datetime.strptime(F.request.json.get('time'), "%m/%Y").month, datetime.datetime.strptime(F.request.json.get('time'), "%m/%Y").year]
                        for k in item:
                            datefile = datetime.datetime.strptime(k.get('date'), "%m/%d/%Y %H:%M:%S")
                            if datefile.month == request[0] and datefile.year == request[1] and datetime.datetime.strftime(datefile, "%d") not in data:
                                data.append(datetime.datetime.strftime(datefile, "%d"))
                    if (F.request.json.get('mode') == "years"): ## available years
                        for k in item:
                            if datetime.datetime.strptime(k.get('date'), "%m/%d/%Y %H:%M:%S").year not in data:
                                data.append(datetime.datetime.strptime(k.get('date'), "%m/%d/%Y %H:%M:%S").year)
            except portalocker.exceptions.LockException:
                pass
        return F.jsonify(data)
    else:
        return("Not logged in yet.")        
예제 #7
0
def dump():
    import sys, lxml.etree as ET, csv, uuid, datetime, os
    rand = str(uuid.uuid4())
    sys.path.insert(1, cwdf)
    import loginHandler as lh, settingsHandler as sh
    if (F.request.args != None or lh.isLogin(str(F.request.args.get('fgt')))):
        files = [cwd_csv + '/' + file for file in os.listdir(cwd_csv)]
        if len(files) > 10: ##checking for extraneous files
            for files_delete in sorted(files, key=os.path.getctime)[:len(files)-10]:
                os.remove(files_delete)
        with open(cwd_csv + '/' + rand + '.csv', mode='w+') as file:
            item = ET.parse(cwdf+'/measurements.xml').iter("plot")
            timeoffset = int(F.request.args.get('timeoffset'))
            file_writer = csv.writer(file, dialect='excel')
            file_writer.writerow(['PowerHub Data Log', "Created " + datetime.datetime.now().strftime("%m/%d/%Y, %H:%M:%S")]) 
            file_writer.writerow(['',"Hint: Trends in power consumption can be seen easier if you use your favorite spreadsheet program's graphing tools."])
            if timeoffset/60 > 0 and timeoffset%60 == 0: 
                file_writer.writerow(['Date / Time (UTC +'+str(int(-timeoffset/60))+')', 'Voltage', 'Current', 'Power Factor', 'Wattage', 'Notification Triggered?'])
            if timeoffset/60 < 0 and timeoffset%60 == 0:
                file_writer.writerow(['Date / Time (UTC -'+str(int(timeoffset/60))+')', 'Voltage', 'Current', 'Power Factor', 'Wattage', 'Notification Triggered?'])
            if timeoffset/60 > 0 and timeoffset%60 != 0:
                file_writer.writerow(['Date / Time (UTC +'+str(-timeoffset/60)+')', 'Voltage', 'Current', 'Power Factor', 'Wattage', 'Notification Triggered?'])
            if timeoffset/60 < 0 and timeoffset%60 != 0:
                file_writer.writerow(['Date / Time (UTC -'+str(timeoffset/60)+')', 'Voltage', 'Current', 'Power Factor', 'Wattage', 'Notification Triggered?'])
            if timeoffset/60 == 0:
                file_writer.writerow(['Date / Time (UTC)', 'Voltage', 'Current', 'Power Factor', 'Wattage', 'Notification Triggered?'])
            
            if (F.request.args.get('mode') == "entire"):
                for k in item:
                    if timeoffset < 0:
                        timeoffset = -timeoffset
                        time = datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S") - datetime.timedelta(hours=int(timeoffset/60), minutes=timeoffset%60)
                    else:
                        time = datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S") + datetime.timedelta(hours=int(timeoffset/60), minutes=timeoffset%60)
                    file_writer.writerow([time.strftime("%m/%d/%Y %H:%M:%S"),\
                                          k.attrib['voltage'], k.attrib['current'],\
                                          k.attrib['pf'], float(k.attrib['voltage']) * float(k.attrib['current']) * float(k.attrib['pf']),\
                                          k.attrib['notify']])
            if (F.request.args.get('mode') == "month"):
                date = [datetime.datetime.strptime(F.request.args.get('time'), "%m/%Y").month, datetime.datetime.strptime(F.request.args.get('time'), "%m/%Y").year]
                for k in item:
                    datadate = [datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S").month, datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S").year]
                    if datadate == date:
                        if timeoffset < 0:
                            timeoffset = -timeoffset
                            time = datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S") - datetime.timedelta(hours=int(timeoffset/60), minutes=timeoffset%60)
                        else:
                            time = datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S") + datetime.timedelta(hours=int(timeoffset/60), minutes=timeoffset%60)
                        file_writer.writerow([time.strftime("%m/%d/%Y %H:%M:%S"),\
                                          k.attrib['voltage'], k.attrib['current'],\
                                          k.attrib['pf'], float(k.attrib['voltage']) * float(k.attrib['current']) * float(k.attrib['pf']),\
                                          k.attrib['notify']])
            if (F.request.args.get('mode') == "week"):
                date = [datetime.datetime.strptime(F.request.args.get('time'), "%m/%d/%Y").strftime("%U"), datetime.datetime.strptime(F.request.args.get('time'), "%m/%d/%Y").year]
                for k in item:
                    datadate = [datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S").strftime("%U"), datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S").year]
                    if datadate == date:
                        if timeoffset < 0:
                            timeoffset = -timeoffset
                            time = datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S") - datetime.timedelta(hours=int(timeoffset/60), minutes=timeoffset%60)
                        else:
                            time = datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S") + datetime.timedelta(hours=int(timeoffset/60), minutes=timeoffset%60)
                        file_writer.writerow([time.strftime("%m/%d/%Y %H:%M:%S"),\
                                          k.attrib['voltage'], k.attrib['current'],\
                                          k.attrib['pf'], float(k.attrib['voltage']) * float(k.attrib['current']) * float(k.attrib['pf']),\
                                          k.attrib['notify']])
            if (F.request.args.get('mode') == "day"):
                for k in item:
                    if datetime.datetime.strptime(F.request.args.get('time'), "%m/%d/%Y").date() == datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S").date():
                        if timeoffset < 0:
                            timeoffset = -timeoffset
                            time = datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S") - datetime.timedelta(hours=int(timeoffset/60), minutes=timeoffset%60)
                        else:
                            time = datetime.datetime.strptime(k.attrib['date'], "%m/%d/%Y %H:%M:%S") + datetime.timedelta(hours=int(timeoffset/60), minutes=timeoffset%60)
                        file_writer.writerow([time.strftime("%m/%d/%Y %H:%M:%S"),\
                                          k.attrib['voltage'], k.attrib['current'],\
                                          k.attrib['pf'], float(k.attrib['voltage']) * float(k.attrib['current']) * float(k.attrib['pf']),\
                                          k.attrib['notify']])
        return F.send_file(cwd_csv + '/' + rand + '.csv', attachment_filename='PowerHub_dump.csv', as_attachment=True)