Files
freedavis/web/modules/voltage.py
2019-08-22 16:12:05 +02:00

126 lines
4.7 KiB
Python
Executable File

#!/usr/bin/python3
import cherrypy
import influxdb
from modules import dynamic
import config
class EnergyInfo(object):
def __init__(self):
base_url = 'https://bastart.spoton.cz/static'
self.array_full = base_url + '/img/battery_full.png' #100-90
self.array_80 = base_url + '/img/battery_80.png' # 90-70
self.array_60 = base_url + '/img/battery_60.png' # 70-50
self.array_40 = base_url + '/img/battery_40.png' # 50-30
self.array_20 = base_url + '/img/battery_20.png' # 30-10
self.array_0 = base_url + '/img/battery_0.png' # 10-0
self.array_ch = base_url + '/img/battery_charging.png'
self.charge_current_icon = base_url + '/img/battery_current.png'
self.solar_power_icon = base_url + '/img/solar_power.png'
self.battery_icon = self.array_full
self.measures_obj = dynamic.DynamicEnergy()
@cherrypy.expose
def index(self):
header = config.read_html('header', config._templates)
menu_raw = config.read_html('top_menu', config._templates)
menu = menu_raw.format(energy = 'active',
weather = '',
status = '',
temphumi = '')
body = self.body()
footer = config.read_html('footer', config._templates)
result = header\
+ menu\
+ body\
+ footer
return result
def set_battery_icon(self, percentage, state):
''' Interprets % of battery state in icon changes
expects:
float(percentage): Percentage -> battery icon
sets:
str(self.battery_icon): the path to appropriate icon image
'''
if state == 1:
self.battery_icon = self.array_ch
else:
if percentage > 70.0 and percentage < 89.9:
self.battery_icon = self.array_80
if percentage > 50.0 and percentage < 69.9:
self.battery_icon = self.array_60
if percentage > 30.0 and percentage < 49.9:
self.battery_icon = self.array_40
if percentage > 10.0 and percentage < 29.9:
self.battery_icon = self.array_20
if percentage > 0.0 and percentage < 9.9:
self.battery_icon = self.array_0
def tableConstructor(self, header, body):
''' The idea behind is to have a method of constructing <table> html
element and to separate data and html code.
expects:
list(header): [str(header1), str(header2), ...]
list(body): [str(td1), str(td2), ...], row2, row3, ...]
returns:
str(html_table)
'''
table_header = ''
table_body = ''
table_begin = '<table class="table table-striped">'
thead = '<thead>'
thead_end = '</thead>'
tbody = '<tbody>'
tbody_end = '</tbody>'
table_end = '</table>'
table_header = '</tr>'
for th in header:
table_header = table_header + '<th>' + th + '</th>'
table_header = table_header + '</tr>'
for tr in body:
table_body = table_body + '<tr>'
for td in tr:
table_body = table_body + '<td>' + str(td) + '</td>'
table_body = table_body + '</tr>'
html_table = "{} {} {} {} {}".format(
table_begin + thead,
table_header,
thead_end + tbody,
table_body,
tbody_end + table_end
)
return html_table
def body(self):
current_values = self.measures_obj.FreshValues(type='dict')
fresh_voltage_array = float(current_values['V_array'])
self.set_battery_icon(current_values['perc_array'], 0)
# Table with statistical values
stat_header = ['Date',
'Pmax [W]',
'Pday [Wh]']
stats_content = self.measures_obj.stat_values(days = 7)
stats_table = self.tableConstructor(stat_header, stats_content)
# Format and output HTML fot he whole page
admin_preformat = config.read_html('voltage_admin', config._templates)
admin_html = admin_preformat.format(
timestamp = current_values['time'],
array_voltage = fresh_voltage_array,
charge_current = current_values['ChCurr'],
solar_power = current_values['Psol'],
pmax_day = current_values['Pmax_day'],
charge_current_icon = self.charge_current_icon,
solar_power_icon = self.solar_power_icon,
array_voltage_icon = self.battery_icon,
array_percent = current_values['perc_array'],
stats_table = stats_table
)
return admin_html