powerDraw.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. # coding=utf-8
  2. import csv
  3. import os, sys
  4. import uuid
  5. import datetime
  6. import pandas
  7. import simplejson as json
  8. from django.conf import settings
  9. from base import init_env
  10. env = sys.argv[1]
  11. os.environ.setdefault('DJANGO_SETTINGS_MODULE', env)
  12. init_env(interactive=False)
  13. from apilib.utils_mqtt import get_share_prefix
  14. from apps.web.constant import Const, MQTT_GROUP
  15. from apps.web.core.mqtt_client import MqttClient
  16. from apps.web.device.models import Device
  17. class M(MqttClient):
  18. def __init__(self, *args, **kwargs):
  19. super(M, self).__init__(*args, **kwargs)
  20. self.powerData = []
  21. @staticmethod
  22. def on_connect_func(client, *args, **kwargs):
  23. device_topic = get_share_prefix(MQTT_GROUP.event, Const.SERVER_TOPIC_PREFIX)+'/865650048394338'+"/100"
  24. client.subscribe(device_topic, qos=Const.MQTT_QOS)
  25. print "on connect ok"
  26. @staticmethod
  27. def on_message_func(client, obj, msg):
  28. msgDict = json.loads(bytes.decode(msg.payload))
  29. data = msgDict.get("data")
  30. handFunc = client.dispatch(msgDict)
  31. if not handFunc:
  32. return
  33. client.powerData = handFunc(data)
  34. print client.powerData
  35. client.collect_call_back(client.powerData)
  36. @staticmethod
  37. def handle_jiu_hen_data(data):
  38. needData = data[10:-2]
  39. dataList = list()
  40. timeStr = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  41. while needData:
  42. port = int(needData[:2], 16)
  43. status = needData[2:4]
  44. chargeTime = int(needData[4:8], 16)
  45. power = int(needData[8:12], 16)
  46. elec = int(needData[12:16], 16)
  47. needData = needData[16:]
  48. dataList.append(
  49. {
  50. "port": port,
  51. "status": status,
  52. "chargeTime": chargeTime,
  53. "elec": elec,
  54. "power": power,
  55. "timeStr": timeStr
  56. }
  57. )
  58. return dataList
  59. @staticmethod
  60. def handle_dian_chuan_data(data):
  61. needData = data[18:-2]
  62. timeStr = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  63. # 继电器状态字节
  64. statusData = needData[6:10]
  65. # 功率字节
  66. powerData = needData[10: 50]
  67. # 剩余时间字节
  68. timeData = needData[50:90]
  69. dataList = []
  70. statusData = "{:0>10}".format(bin(int(statusData, 16)).replace("0b", ""))
  71. for i in xrange(10):
  72. dataList.append(
  73. {
  74. "port": i + 1,
  75. "status": int(statusData[i]),
  76. "chargeTime": int(timeData[i * 4: (i + 1) * 4], 16),
  77. "elec": 0,
  78. "power": int(powerData[i * 4: (i + 1) * 4], 16),
  79. "timeStr": timeStr
  80. }
  81. )
  82. return dataList
  83. @staticmethod
  84. def get_jiu_hen_cmd(data):
  85. return data[4:6]
  86. @staticmethod
  87. def get_dian_chuan_cmd(data):
  88. return data[4:6]
  89. def dispatch(self, msgDict):
  90. FUNC_MAP = {
  91. "100210_24": self.handle_dian_chuan_data,
  92. "100202_21": self.handle_jiu_hen_data
  93. }
  94. CMD_MAP = {
  95. "100202": self.get_jiu_hen_cmd,
  96. "100210": self.get_dian_chuan_cmd
  97. }
  98. devNo = msgDict.get("IMEI", "")
  99. dev = Device.get_dev(devNo)
  100. if not dev:
  101. return
  102. driverCode = dev.get("devType", dict()).get("code")
  103. if not driverCode:
  104. return
  105. cmdFunc = CMD_MAP.get(driverCode)
  106. if not cmdFunc:
  107. return
  108. cmd = cmdFunc(msgDict.get("data", ""))
  109. _key = "{}_{}".format(driverCode, cmd)
  110. return FUNC_MAP.get(_key)
  111. class DrawPower(object):
  112. def __init__(self, path=None):
  113. if path is None:
  114. path = "power.csv"
  115. self.path = path
  116. self.client = M(client_id='webapp_'+str(uuid.uuid1()))
  117. self.client.collect_call_back = self.save_data
  118. def save_data(self, dataList):
  119. if not dataList or not len(dataList):
  120. return
  121. flag = os.path.exists(self.path)
  122. with open(self.path, "ab+") as f:
  123. fieldnames = dataList[0].keys()
  124. writer = csv.DictWriter(f, fieldnames=fieldnames)
  125. if not flag:
  126. writer.writeheader()
  127. writer.writerows(dataList)
  128. def read_data(self):
  129. return pandas.read_csv(self.path)
  130. def draw(self, port=None, allPorts=10):
  131. print "drawing......"
  132. if port:
  133. # data = self.read_data()[port-1: : allPorts]
  134. data = self.read_data()
  135. ax = data.plot(y=["power", "chargeTime"], x="timeStr")
  136. fig = ax.get_figure()
  137. fig.savefig("{}.png".format(self.path.split(".")[0]))
  138. else:
  139. for i in xrange(allPorts):
  140. data = self.read_data()[i:: allPorts]
  141. ax = data.plot(y=["power", "chargeTime"], x="timeStr")
  142. fig = ax.get_figure()
  143. fig.savefig("{}-{}.png".format(self.path.split(".")[0], i+1))
  144. def run(self):
  145. try:
  146. self.client.on_message = self.client.on_message_func
  147. self.client.on_connect = self.client.on_connect_func
  148. self.client.connect(settings.MQTT_HOSTNAME, settings.MQTT_PORT, 60)
  149. print settings.MQTT_HOSTNAME
  150. print settings.MQTT_PORT
  151. self.client.loop_forever()
  152. finally:
  153. self.client.disconnect()
  154. self.client.close()
  155. if __name__ == '__main__':
  156. d = DrawPower("1600601534269816.csv")
  157. # d.run()
  158. d.draw(1)