diff --git a/myems-api/core/meter.py b/myems-api/core/meter.py index 11812ea3..c821afee 100644 --- a/myems-api/core/meter.py +++ b/myems-api/core/meter.py @@ -3,7 +3,9 @@ import simplejson as json import mysql.connector import config import uuid + from core.useractivity import user_logger, access_control +from core.utilities import qrcode_to_base64 class MeterCollection: @@ -80,6 +82,7 @@ class MeterCollection: result = list() if rows_meters is not None and len(rows_meters) > 0: for row in rows_meters: + meter_qrcode = qrcode_to_base64(data="meter" + row['uuid']) energy_category = energy_category_dict.get(row['energy_category_id'], None) cost_center = cost_center_dict.get(row['cost_center_id'], None) energy_item = energy_item_dict.get(row['energy_item_id'], None) @@ -94,7 +97,8 @@ class MeterCollection: "cost_center": cost_center, "energy_item": energy_item, "master_meter": master_meter, - "description": row['description']} + "description": row['description'], + "qrcode": meter_qrcode} result.append(meta_result) cursor.close() @@ -353,6 +357,7 @@ class MeterItem: raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', description='API.METER_NOT_FOUND') else: + meter_qrcode = qrcode_to_base64(data="meter"+row['uuid']) energy_category = energy_category_dict.get(row['energy_category_id'], None) cost_center = cost_center_dict.get(row['cost_center_id'], None) energy_item = energy_item_dict.get(row['energy_item_id'], None) @@ -367,7 +372,8 @@ class MeterItem: "cost_center": cost_center, "energy_item": energy_item, "master_meter": master_meter, - "description": row['description']} + "description": row['description'], + "qrcode": meter_qrcode} resp.text = json.dumps(meta_result) diff --git a/myems-api/core/utilities.py b/myems-api/core/utilities.py index edf55e4e..df129ac4 100644 --- a/myems-api/core/utilities.py +++ b/myems-api/core/utilities.py @@ -1,8 +1,13 @@ +import base64 import calendar +import io from datetime import datetime, timedelta import mysql.connector import collections from decimal import Decimal +import qrcode.image.svg +import qrcode + import config import statistics @@ -248,7 +253,7 @@ def get_energy_category_tariffs(cost_center_id, energy_category_id, start_dateti query_timeofuse_tariffs = (" SELECT tariff_id, start_time_of_day, end_time_of_day, price " " FROM tbl_tariffs_timeofuses " " WHERE tariff_id IN ( " + ', '.join(map(str, tariff_dict.keys())) + ")" - " ORDER BY tariff_id, start_time_of_day ") + " ORDER BY tariff_id, start_time_of_day ") cursor.execute(query_timeofuse_tariffs, ) rows_timeofuse_tariffs = cursor.fetchall() except Exception as e: @@ -352,7 +357,7 @@ def get_energy_category_peak_types(cost_center_id, energy_category_id, start_dat query_timeofuse_tariffs = (" SELECT tariff_id, start_time_of_day, end_time_of_day, peak_type " " FROM tbl_tariffs_timeofuses " " WHERE tariff_id IN ( " + ', '.join(map(str, tariff_dict.keys())) + ")" - " ORDER BY tariff_id, start_time_of_day ") + " ORDER BY tariff_id, start_time_of_day ") cursor.execute(query_timeofuse_tariffs, ) rows_timeofuse_tariffs = cursor.fetchall() except Exception as e: @@ -1001,3 +1006,23 @@ def statistics_hourly_data_by_period(rows_hourly, start_datetime_utc, end_dateti variance = statistics.variance(sample_data) return result_rows_yearly, mean, median, minimum, maximum, stdev, variance + + +def qrcode_to_base64(version=1, error_correction=qrcode.ERROR_CORRECT_L, box_size=10, border=4, + factory=qrcode.image.svg.SvgImage, data=None): + if version < 1 or version > 40 or \ + box_size < 0 or border < 0 or \ + error_correction not in \ + (qrcode.ERROR_CORRECT_L, qrcode.ERROR_CORRECT_M, qrcode.ERROR_CORRECT_H, qrcode.ERROR_CORRECT_Q): + return " " + qr = qrcode.QRCode( + version=1, + error_correction=qrcode.ERROR_CORRECT_L, + box_size=10, + border=4, + ) + qr.add_data(data) + img = qr.make_image(image_factory=factory) + f = io.BytesIO() + img.save(f) + return base64.b64encode(f.getvalue())