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)
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."
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.")
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.")
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)