citizenwatt-refactor/base/libcitizenwatt/tools.py

109 lines
3.2 KiB
Python

#!/usr/bin/env python3
import numpy
import os
import sys
from libcitizenwatt import database
def warning(*objs):
"""Write warnings to stderr"""
print("WARNING: ", *objs, file=sys.stderr)
def to_dict(model):
"""Returns a JSON representation of an SQLAlchemy-backed object.
Returns a timestamp for DateTime fields, to be easily JSON serializable.
TODO : Use runtime inspection API
From https://zato.io/blog/posts/converting-sqlalchemy-objects-to-json.html
"""
if isinstance(model, list):
return [to_dict(i) for i in model]
else:
dict = {}
dict['id'] = getattr(model, 'id')
for col in model._sa_class_manager.mapper.mapped_table.columns:
if str(col.type) == "TIMESTAMP":
dict[col.name] = getattr(model, col.name).timestamp()
else:
dict[col.name] = getattr(model, col.name)
return dict
def last_day(month, year):
"""Returns the last day of month <month> of year <year>."""
if month in [1, 3, 5, 7, 8, 10, 12]:
return 31
elif month == 2:
if year % 4 == 0 and (not year % 100 or year % 400):
return 29
else:
return 28
else:
return 30
def energy(powers, default_timestep=8):
"""Compute the energy associated to a list of measures (in W)
and associated timestamps (in s).
"""
energy = {'night_rate': 0, 'day_rate': 0, 'value': 0}
if len(powers) == 1:
if powers[0].night_rate == 1:
energy["night_rate"] = (powers[0].value / 1000 *
default_timestep / 3600)
else:
energy["day_rate"] = (powers[0].value / 1000 *
default_timestep / 3600)
energy['value'] = energy['day_rate'] + energy['night_rate']
else:
x = []
day_rate = []
night_rate = []
for i in powers:
x.append(i.timestamp)
if i.night_rate == 1:
night_rate.append(i.value)
day_rate.append(0)
else:
day_rate.append(i.value)
night_rate.append(0)
energy["night_rate"] = numpy.trapz(night_rate, x) / 1000 / 3600
energy["day_rate"] = numpy.trapz(day_rate, x) / 1000 / 3600
energy['value'] = energy['day_rate'] + energy['night_rate']
return energy
def watt_euros(energy_provider, tariff, consumption, db):
if energy_provider != 0:
provider = (db.query(database.Provider)
.filter_by(id=energy_provider)
.first())
else:
provider = (db.query(database.Provider)
.filter_by(current=1)
.first())
if not provider:
data = None
else:
if tariff == "night":
data = provider.night_slope_watt_euros * consumption
elif tariff == "day":
data = provider.day_slope_watt_euros * consumption
else:
data = None
return data
def update_base_address(base_address):
"""Update the address of the base stored in
~/.config/citizenwatt/base_address
"""
path = os.path.expanduser("~/.config/citizenwatt/base_address")
with open(path, "w+") as fh:
fh.write(str(base_address))