多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
本章主要实现智能设备管理系统中的电表管理功能,主要包括**电表详情页面展示**,**电笔用电记录展示**,**电表异常记录页面展示**等功能。 # 4.1 电表管理接口实现 本节将实现电表管理的基础功能,如:设置付费模式(set\_room\_pay\_type),获取电表详情(get\_elemeter\_info),获取电表用电记录(含公摊)(elemeter\_fetch\_power\_history\_with\_pool),获取电表操作记录(search_device_op_log), 获取电表异常记录(device_fetch_exceptions)。 具体实现:在apis文件夹下新建elemeter.py, vim elemeter.py. ``` ~~~ import requests def set_room_pay_type(access_token, uuid, pay_type): ''' 设置房间付费模式 :param access_token: 调用接口凭证 :param uuid: 电表设备uuid, 唯一 :param pay_type: 付费类型 1:预付费 2:后付费 ''' url = 'https://saas-openapi.dding.net/v2/set_room_pay_type' headers = { 'Content-type': 'Application/json', 'User-Agent': 'PostmanRuntime/7.13.0', } payload = { 'access_token': access_token, 'uuid': uuid, 'pay_type': pay_type } response = requests.request('POST', url, headers=headers, json=payload) return response.json() def get_elemeter_info(access_token, home_id, uuid): ''' 获取电表详情 :param access_token: 调用接口凭证 :param home_id: 电表所在房源id :param uuid: 电表设备的uuid ''' url = 'https://saas-openapi.dding.net/v2/get_elemeter_info' headers = { 'Content-type': 'Application/json', 'User-Agent': 'PostmanRuntime/7.13.0', } query_string = { 'access_token': access_token, 'home_id': home_id, 'uuid': uuid } response = requests.request('GET', url, headers=headers, params=query_string) return response.json() def elemeter_fetch_power_history_with_pool(access_token, home_id, uuid): ''' 获取电表用电记录(含公摊) :param access_token: 调用接口凭证 :param home_id: 电表所在房源id :param uuid: 电表设备的uuid ''' url = 'https://saas-openapi.dding.net/v2/elemeter_fetch_power_history_with_pool' headers = { 'Content-type': 'Application/json', 'User-Agent': 'PostmanRuntime/7.13.0', } query_string = { 'access_token': access_token, 'home_id': home_id, 'uuid': uuid } response = requests.request('GET', url, headers=headers, params=query_string) return response.json() def search_elemeter_op_log(access_token, uuid): ''' 查询电表操作记录 :param access_token: :param uuid: :return: ''' url = 'https://saas-openapi.dding.net/v2/search_device_op_log' headers = { 'Content-type': 'Application/json', 'User-Agent': 'PostmanRuntime/7.13.0', } query_string = { 'access_token': access_token, 'uuid': uuid } response = requests.request('GET', url, headers=headers, params=query_string) return response.json() def elemeter_fetch_exceptions(access_token, uuid): ''' 电表异常记录获取 :param access_token: 接口调用凭证 :param uuid: 电表设备uuid ''' url = 'https://saas-openapi.dding.net/v2/device_fetch_exceptions' headers = { 'Content-type': 'Application/json', 'User-Agent': 'PostmanRuntime/7.13.0', } query_string = { 'access_token': access_token, 'uuid': uuid } response = requests.request('GET', url, headers=headers, params=query_string) return response.json() ~~~ ``` 实现接口函数后,新建elemeter_model.py, 实现Elemeter类的定义以及相关实例方法。vim elemeter_model.py ``` from apis.elemeter import set_room_pay_type, get_elemeter_info, elemeter_fetch_exceptions, \ elemeter_fetch_power_history_with_pool, search_elemeter_op_log class Elemeter: def __init__(self, access_token, uuid): self.access_token = access_token self.uuid = uuid def set_room_pay_type(self, pay_type): res = set_room_pay_type(self.access_token, self.uuid, pay_type) return res def get_elemeter_info(self, home_id): res = get_elemeter_info(self.access_token, home_id, self.uuid) return res def elemeter_fetch_power_history_with_pool(self, home_id): res = elemeter_fetch_power_history_with_pool(self.access_token, home_id, self.uuid) return res def search_elemeter_op_log(self): res = search_elemeter_op_log(self.access_token, self.uuid) return res def elemeter_fetch_exceptions(self): res = elemeter_fetch_exceptions(self.access_token, self.uuid) return res ``` # 4.2 电表详情页面展示 这一节实现电表详情页面展示,vim main.py ``` from elemeter_model import Elemeter def main(): access_token = 'xxxxxxxxxxx' #请填写商户账号的access_token uuid = 'f0a0c5abd9769ebe2efae3e27a5fbea7' home_id = 'cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a' elemeter = Elemeter(access_token, uuid) res = elemeter.get_elemeter_info(home_id) print(res) if __name__ == '__main__': main() ``` 先实例化电表,然后使用get_elemeter_info实例化方法,获取该电表的详情。 返回结果如下:包括电表版本信息,信号值等等基本信息。可以将其展示给前端。 ``` { "ReqID": "1SSFPZJWbyf", "ErrNo": 0, "ErrMsg": "成功", "sn": "190215103584", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7", "versions": { "elemeter_potocol_version": "07", "elemeter_potocol_type": "01" }, "name": "北川电表", "power": -1, "status": 1, "model": "DDSU1225", "model_name": "A1P", "onoff_line": 1, "onoff_time": 1567395901032, "time": 1563628490452, "bind_time": 1563628490641, "overdraft": 0, "overdraft_time": 1567408957336, "capacity": 14.52, "capacity_time": 1567408957336, "consume_amount": 314.34, "consume_amount_time": 1567407600000, "power_total": 0, "power_total_time": 1567408957336, "enable_state": 1, "enable_state_time": 1564632109395, "charge_stage": 3, "overdraft_stage": 3, "capacity_stage": 3, "trans_status": 1, "trans_status_time": 1566478811023, "switch_stage": 3, "switch_stage_time": 1567408957336, "control_switch": 1, "syn_stage_time": 1567408957336, "syn_stage": 3, "reset_stage_time": 1564648064289, "reset_stage": 3, "elecollector_uuid": "bc516a8cb656de8a33aa2c6b4bc8ce70" } ``` 电表详情页面展示效果如下: ![](https://img.kancloud.cn/10/9f/109f2ae94c1bcef7a796e83b7f40e076_2310x1188.png) # 4.3 用电记录页面展示 用电记录展示是电表智能管理的一项基本功能,通过elemeter\_fetch\_power\_history\_with\_pool接口可以获取该电表历史用电记录。 具体的代码示例:vim main.py ``` from elemeter_model import Elemeter def main(): access_token = 'xxxxxxxxxxxxxxxx' #请填写商户自己的access_token uuid = 'f0a0c5abd9769ebe2efae3e27a5fbea7' home_id = 'cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a' elemeter = Elemeter(access_token, uuid) # res = elemeter.get_elemeter_info(home_id) res = elemeter.elemeter_fetch_power_history_with_pool(home_id) print(res) if __name__ == '__main__': main() ``` 返回结果如下:history字段中含有该电表的用电量历史记录。使用history字段中的两条记录consume_amount相减,便可以计算出每小时的房间用电量;使用history字段中第一条记录,用total\_amount - consume\_amount + charge\_pooling\_amount - pooling\_amount便可以计算该电表当前的剩余电量。 ``` { "ReqID": "1SSIpPIQpOB", "ErrNo": 0, "ErrMsg": "", "history": [ { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.34, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567407600000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.34, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567404000000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.34, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567400400000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.33, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567396800000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.33, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567393200000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.33, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567389600000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.32, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567386000000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.32, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567382400000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.32, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567378800000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.31, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567375200000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.31, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567371600000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.31, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567368000000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.3, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567364400000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.3, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567360800000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.3, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567357200000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "home_id": "5d2949817c83c22451d14263", "room_id": "5d2949f7039d2a2452555664", "consume_amount": 314.29, "pooling_amount": 0, "total_amount": 0, "charge_pooling_amount": 0, "time": 1567353600000, "date": "2019-09-02", "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" } ] } ``` 房间用电记录展示效果如下: ![](https://img.kancloud.cn/6a/58/6a58642b72ed1bee9768ed0b6800c77d_2312x1240.png) # 4.4 异常记录页面展示 本节演示获取电表异常记录,vim main.py ``` from elemeter_model import Elemeter def main(): access_token = 'xxxxxxxxxxxxxxxxxxx' #请填写商户自己的access_token uuid = 'f0a0c5abd9769ebe2efae3e27a5fbea7' home_id = 'cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a' elemeter = Elemeter(access_token, uuid) # res = elemeter.get_elemeter_info(home_id) # res = elemeter.elemeter_fetch_power_history_with_pool(home_id) res = elemeter.elemeter_fetch_exceptions() print(res) if __name__ == '__main__': main() ``` 返回的结果如下:device_exceptions字段中含有该电表的异常记录,可以将其发送给前端进行异常记录页面展示。 返回结果如下:device_exceptions字段里面每一个元素都是一条异常记录。 ``` ~~~ { "ReqID": "1SSQr1vNHoI", "ErrNo": 0, "ErrMsg": "", "device_exceptions": [ { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1567128030000, "type": 1007, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1567042655000, "type": 1006, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1566634238000, "type": 1007, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1566633785000, "type": 1006, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1566470154000, "type": 1007, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1566469791000, "type": 1006, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1566465006000, "type": 1007, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1566464914000, "type": 1006, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1566311201000, "type": 1007, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1566309285000, "type": 1006, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1564632109000, "type": 2014, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1564560012000, "type": 2003, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1564557239000, "type": 1007, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" }, { "client_id": 100041, "device_type": "elemeter", "home_id": "cadc71cb-6dec-4155-8ddb-4e99ae8f9f5a", "time": 1563629395000, "type": 1006, "uuid": "f0a0c5abd9769ebe2efae3e27a5fbea7" } ] } ``` 异常页面展示效果如下: ![](https://img.kancloud.cn/55/78/55783789a00c5f0170df8a5efb6eb1c1_2272x1390.png) # 4.5 小结 本章实现了智能电表管理常见的功能,当然还有其他的电表管理接口可以使用。为避免重复在此不一一赘述,开发者可根据需求自行对其进行组合。