#!/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 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 = '
' thead = '' thead_end = '' tbody = '' tbody_end = '' table_end = '
' table_header = '' for th in header: table_header = table_header + '' + th + '' table_header = table_header + '' for tr in body: table_body = table_body + '' for td in tr: table_body = table_body + '' + str(td) + '' table_body = table_body + '' 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