Can someone help me with the following code? I am not getting any output
from datetime import datetime
import json
import StringIO
import urllib2
import smtplib
from email.mime.text import MIMEText
hours = ['00:00', '01:00', '02:00', '03:00', '04:00', '05:00', '06:00',
'07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00',
'14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00',
'21:00', '22:00', '23:00']
normalized = {1: 4.55, 2: 4.43, 3: 4.58, 4: 4.81, 5: 4.51, 6: 4.32,
7: 3.54, 8: 3.71, 9: 4.66, 10: 4.77, 11: 4.37, 12: 4.06}
sites = [{'name': 'Atlas',
'key': '2tGucWLG',
'id': '2313528',
'path': 'components',
'installed': '100000'},
{'name': 'Institute of Business Management',
'key': 'Icdn3ZjZ',
'id': '3667293',
'path': 'sites',
'installed': '31620'},
{'name': 'McDonald''s Corniche Branch',
'key': 'CmTgpuq9',
'id': '3666787',
'path': 'sites',
'installed': '39680'},
{'name': 'Daewoo',
'key': 'NNpxBmb2',
'id': '3692077',
'path': 'sites',
'installed': '63200'},
{'name': 'Crescent Steel & Allied Products Limited',
'key': 'k8PLXeoC',
'id': '3694088',
'path': 'sites',
'installed': '20800'},
{'name': 'Happy Home School',
'key': 'Snh1jzUX',
'id': '3694012',
'path': 'sites',
'installed': '15800'},
{'name': 'Reflections School Korangi Creek Project',
'key': 'frDgX5VY',
'id': '3698900',
'path': 'sites',
'installed': '26380'},
{'name': 'Jaffer Brothers Rental Yard',
'key': 'LTdOSqo4',
'id': '3737109',
'path': 'sites',
'installed': '10080'},
{'name': 'Alsons Autoparts',
'key': '6iU7C5zT',
'id': '3714094',
'path': 'sites',
'installed': '5680'},
{'name': 'Nadir Jaffer Residence',
'key': 'Fqy7fhm4',
'id': '3723750',
'path': 'sites',
'installed': '8680'},
{'name': 'Habib Metro Korangi Branch',
'key': 'kfMCRuDA',
'id': '3677650',
'path': 'sites',
'installed': '14500'},
{'name': 'Bank Al Habib Highway Branch',
'key': 'G3ntMUmS',
'id': '3698916',
'path': 'sites',
'installed': '11250'}
]
def build_url(item):
return "https://kiosk.datareadings.com/v1/kiosks/%s/api/%s/%s/data?tz=Asia/Karachi&" % (item['ke
y'], item['path'], item['id'])
def build_url_hourly(item, date):
return "%sfields=Wh_sum&gran=hourly&start=%sT00:00:00&end=%sT23:59:59" % \
(build_url(item), date.strftime('%Y-%m-%d'), date.strftime('%Y-%m-%d'))
def build_url_avg(item):
return "%sfields=W_avg&gran=latest" % build_url(item)
def build_dashboard_url(item):
return "http://kiosk.datareadings.com/%s/overview" % item['key']
def get_hourly_data(item, date):
url = build_url_hourly(item, date)
#f = open('test_hourly.json')
f = urllib2.urlopen(url)
data = json.loads(f.read())
f.close()
return data
def get_avg_data(item):
url = build_url_avg(item)
#f = open('test_avg.json')
f = urllib2.urlopen(url)
data = json.loads(f.read())
f.close()
return data
def get_daily_output(data):
total = 0
for row in data:
total += row.get('Wh_sum', 0)
return total
def get_daily_max_output(data):
max_unit = 0
max_time = ''
for row in data:
if row.get('Wh_sum', 0) > max_unit:
max_unit = row['Wh_sum']
max_time = row['ts'].split('T')[1].split('+')[0]
return (max_unit, max_time)
def split_hourly_data(data):
hourly_data = {}
for item in data:
data_ = item[7]['data']
for hour_row in data_:
id_ = hourly_data.get(hour_row.get('id', 0), {})
hour_ = hour_row.get('ts', '0000-00-00T00:00:00+05:00').split('T')[1].split('+')[0][:5]
id_[hour_] = hour_row.get('Wh_sum', 0)
hourly_data[hour_row.get('id')] = id_
return hourly_data
def create_report_rows(sites):
today = datetime.now()
items = []
for site in sites:
data = get_hourly_data(site, today)
avg = get_avg_data(site)
total_units = get_daily_output(data['data'])
avg_unit = avg.get('data', [{'W_avg': 0}])[0].get('W_avg', 0)
max_unit = get_daily_max_output(data['data'])[0]
max_percent = max_unit/float(site['installed'])
normalized = total_units/float(site['installed'])
items.append((site['name'], float(site['installed']), total_units, avg_unit, max_unit, max_p
ercent, normalized, data, site))
return items, today
def get_summary_table(sites, hourly_data):
pass
def create_report(sites):
data, dt = create_report_rows(sites)
hourly_data = split_hourly_data(data)
json_data = json.dumps(data)
html = StringIO.StringIO()
html.write("""
<style type='text/css'>
body { font-family: Helvetica, sans-serif}
table { padding: 3px; border-spacing: 0px; border-collapse: all}
td, th { border: solid 1px #333; padding: 2px}
td { text-align: right; padding-right: 5px;}
td:first-child { text-align: left; }
</style>
""")
html.write("""<table>
<thead>
<tr>
<th>Name</th>
<th>Installed kWp</th>
<th>Total Units (kWh)</th>
<th>Peak Power (kW)</th>
<th>Peak Power % (kW/kWp)</th>
<th>Normalized Units (kWh/kWp)</th>
<th>Expected</th>
</tr>
</thead>""")
html.write("<tbody>")
for item in sorted(data, key=lambda i: i[6], reverse=True):
html.write("<tr>")
html.write("<td><a href='%s' target='_new'>%s</a></td>\n" % (build_dashboard_url(item[8]),it
em[0]))
html.write("<td>%s</td>" % '{:,.3f}'.format(item[1]/1000.0))
html.write("<td>%s</td>" % '{:,.3f}'.format(item[2]/1000.0))
html.write("<td>%s</td>" % '{:,.3f}'.format(item[4]/1000.0))
html.write("<td>%s%%</td>\n" % '{:,.2f}'.format(item[5]*100))
if item[8]['name'].startswith('Nadir'):
html.write("<td style='color: red; font-weight: bold'>%s</td>" % '{:,.3f}'.format(item[6
]))
else:
html.write("<td>%s</td>" % '{:,.3f}'.format(item[6]))
html.write("<td>%s</td>" % normalized.get(dt.month, 0))
html.write("</tr>\n")
html.write("</tbody></table><br /><br /><br />\n")
html.write("<table>")
html.write("<thead><tr>")
html.write("<th></th>")
for hour in hours:
html.write("<th>%s</th>" % hour)
html.write("</tr></thead>\n")
html.write("<tbody>")
for site in sorted(sites, key=lambda s: s['name']):
html.write("<tr><td>%s</td>" % site['name'])
hour_data = hourly_data.get(int(site['id']), {})
for hour in hours:
if hour_data.get(hour, 0.0) != 0:
html.write("<td>%skW</td>\n" % '{:,.3f}'.format(hour_data.get(hour, 0.0)/1000.0))
else:
html.write("<td></td>")
html.write("</tr>\n")
html.write("</tbody>")
html.write("</table><br /><br /><br />\n")
html.write("<table>")
html.write("<thead><tr>")
html.write("<th></th>")
for hour in hours:
html.write("<th>%s</th>" % hour)
html.write("</tr></thead>")
html.write("<tbody>")
for site in sorted(sites, key=lambda s: s['name']):
html.write("<tr><td>%s</td>" % site['name'])
hour_data = hourly_data.get(int(site['id']), {})
for hour in hours:
if hour_data.get(hour, 0.0) > 0:
percent_utilized = hour_data.get(hour, 0.0)/float(site['installed'])
html.write("<td>%s%%</td>" % '{:,.2f}'.format((percent_utilized*100)))
else:
html.write("<td></td>")
html.write("</tr>")
html.write("</tbody>")
