device.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. demeter web page
  5. name:device.py 设备相关页面
  6. author:rabin
  7. """
  8. from __load__ import *
  9. class gateway_path(Load):
  10. @Web.auth
  11. def get(self):
  12. self.common(
  13. name = u'网关'
  14. ,path = 'gateway'
  15. ,width = '600'
  16. ,height = '500'
  17. #,add = False
  18. #,edit = False
  19. ,search = (('label-1','cdate-time-start','cdate-time-end','farm_id-select-','name-input-mlike'), (u'日期范围',u'开始时间',u'截止时间',u'选择农场',u'网关名称'))
  20. ,thead = (u'所属农场',u'网关名称', u'设备id', u'网关连接状态', u'电源数值', u'电源连接状态', u'更新时间')
  21. ,tbody = ('farm','name', 'hardware_id', 'status', 'power_num', 'power_status', 'cdate')
  22. ,state = False
  23. )
  24. self.data['common']['search_farm_id-select-'] = Demeter.config['setting']['farmList']
  25. self.commonList('device_gateway')
  26. if self.data['list']:
  27. for key, value in enumerate(self.data['list']):
  28. farm = self.service('common').one('farm', id=value['farm_id'])
  29. self.data['list'][key]['farm'] = farm['name']
  30. device = self.service('common').list('device_info', search={'hardware_id':value['hardware_id']})
  31. self.data['list'][key]['status'] = '断开'
  32. self.data['list'][key]['power_status'] = '断开'
  33. self.data['list'][key]['power_num'] = 0
  34. if device:
  35. for v in device:
  36. if v['value']:
  37. v['value'] = float(v['value'])
  38. if v['hardware_type'] == 5 and v['value'] == 1:
  39. self.data['list'][key]['status'] = '连接'
  40. elif v['hardware_type'] == 4 and v['value']:
  41. self.data['list'][key]['power_status'] = '连接'
  42. self.data['list'][key]['power_num'] = v['value']
  43. self.commonView('list')
  44. class gateway_update_path(Load):
  45. @Web.auth
  46. def get(self):
  47. id = self.input('id')
  48. if id:
  49. hardware_id = 'hardware_id-show-required'
  50. else:
  51. hardware_id = 'hardware_id-input-required'
  52. self.common(
  53. path = 'gateway'
  54. ,label = (u'所属农场', u'网关名称', u'设备id', u'设备分布图纸')
  55. ,update = ('farm_id-select-required', 'name-input-required',hardware_id, 'pic-pic-')
  56. ,update_farm_id = Demeter.config['setting']['farmList']
  57. )
  58. self.commonOne('device_gateway')
  59. self.commonView('update')
  60. @Web.auth
  61. def post(self):
  62. id = self.commonUpdate('device_gateway')
  63. self.device(id)
  64. @Web.auth
  65. def delete(self):
  66. self.commonDelete('device_gateway')
  67. @Web.auth
  68. def device(self, id):
  69. info = self.service('common').one('device_gateway', id=id)
  70. hardware_id = info['hardware_id']
  71. self.service('device').upGatewayStatus(self.data['update']['farm_id'], id, hardware_id)
  72. class info_path(Load):
  73. @Web.auth
  74. def get(self):
  75. self.common(
  76. name = u'设备'
  77. ,path = 'info'
  78. ,width = '600'
  79. ,height = '400'
  80. ,button = ({'name':'添加摄像机','link':'/device/camera_update'},{'name':'添加摄像头','link':'/device/camera_pic_update'})
  81. ,add = False
  82. #,edit = False
  83. ,search = (('farm_id-select--gateway_id', 'hardware_type-select-','type_id-select-', 'status-hidden-'), (u'选择农场',u'硬件类型',u'设备类型', '设备状态'))
  84. ,thead = (u'所属农场', u'设备名称', u'设备id', u'当前值', u'设备类型', u'网关',u'硬件类型')
  85. ,tbody = ('farm','name', 'hardware_id', 'value', 'type', 'gateway', 'hardware_type')
  86. ,state = True
  87. )
  88. self.data['common']['search_farm_id-select--gateway_id'] = Demeter.config['setting']['farmList']
  89. self.data['common']['search_type_id-select-'] = self.service('common').list('device_type')
  90. self.data['common']['search_gateway_id-select---farm_id'] = self.service('common').list('device_gateway')
  91. self.data['common']['search_hardware_type-select-'] = self.service('common').list('hardware_type')
  92. """
  93. if self.data['common']['search_hardware_type-select-']:
  94. del self.data['common']['search_hardware_type-select-'][0]
  95. """
  96. status = self.input('search_status-hidden-', False)
  97. if status:
  98. self.data['search']['status'] = False
  99. self.commonList('device_info', order='id desc')
  100. if self.data['list']:
  101. for key, value in enumerate(self.data['list']):
  102. farm = self.service('common').one('farm', id=value['farm_id'])
  103. self.data['list'][key]['farm'] = farm['name']
  104. self.data['list'][key]['type'] = '无'
  105. if value['type_id'] > 0:
  106. type_info = self.service('common').one('device_type', id=value['type_id'])
  107. if type_info:
  108. self.data['list'][key]['type'] = type_info['name']
  109. info = self.service('common').one('device_gateway', id=value['gateway_id'])
  110. self.data['list'][key]['gateway'] = info['name']
  111. if value['status']:
  112. self.data['list'][key]['status'] = '已连接'
  113. else:
  114. self.data['list'][key]['status'] = '已断开'
  115. if not value['value']:
  116. value['value'] = ''
  117. if value['hardware_type'] == 2 or value['hardware_type'] == 4:
  118. if value['type_id'] > 0 and type_info:
  119. value['value'] = value['value'] + ' ' + type_info['unit']
  120. self.data['list'][key]['value'] = '<a href="/device/stat?id='+value['id']+'&search_date-select-=1&method=list">'+value['value'] + '</a><br />更新时间:' + Demeter.date(value['cdate']) + '<br /><a href="/device/stat?id='+value['id']+'&search_date-select-=1&method=avg">[平均值统计]</a> <a href="/device/stat?id='+value['id']+'&search_date-select-=1&method=maxmin">[高低值统计]</a>'
  121. elif value['hardware_type'] == 6:
  122. self.data['list'][key]['value'] = '<a href="/device/pic?id='+value['id']+'"><img src="'+value['value']+'" width="200px"/></a><br />更新时间:' + Demeter.date(value['cdate'])
  123. elif value['hardware_type'] == 3:
  124. if value['status']:
  125. status = ''
  126. else:
  127. status = 'disabled'
  128. url = '/device/info'
  129. if value['value'] == '1':
  130. #disabled
  131. self.data['list'][key]['value'] = '<input type="checkbox" name="switch" lay-filter="switch" lay-skin="switch" checked '+status+' value="1" data-value="0" data-id="'+value['id']+'" data-url="'+url+'">'
  132. else:
  133. self.data['list'][key]['value'] = '<input type="checkbox" lay-filter="switch" name="switch" lay-skin="switch" '+status+' value="0" data-value="1" data-id="'+value['id']+'" data-url="'+url+'">'
  134. elif value['hardware_type'] == 5:
  135. if value['value'] == '1':
  136. self.data['list'][key]['value'] = '已连接'
  137. else:
  138. self.data['list'][key]['value'] = '已断开'
  139. hardware_type = self.service('common').one('hardware_type', id=value['hardware_type'])
  140. self.data['list'][key]['hardware_type'] = hardware_type['name']
  141. self.commonView('list')
  142. @Web.auth
  143. def post(self):
  144. id = self.input('id')
  145. value = self.input('value')
  146. if id:
  147. Demeter.service('device').switch(id, value)
  148. self.out('yes', {'state':id})
  149. else:
  150. self.out('no')
  151. class info_update_path(Load):
  152. @Web.auth
  153. def get(self):
  154. self.commonOne('device_info')
  155. if self.data['info']['hardware_type'] == 7:
  156. self.common(
  157. path = 'camera'
  158. #,label = (u'摄像机名称', u'摄像机id', u'所属农场', u'选择网关', u'选择硬件类型', u'摄像机地址')
  159. #,update = ('name-input-required','hardware_id-show-','farm_id-select-required','gateway_id-select-required','hardware_type-select-required','value-text-required')
  160. ,label = (u'摄像机名称', u'摄像机id', u'所属农场', u'选择网关', u'摄像机地址')
  161. ,update = ('name-input-required','hardware_id-show-','farm_id-select-required-gateway_id','gateway_id-select-required--farm_id','value-text-required')
  162. ,update_farm_id = Demeter.config['setting']['farmList']
  163. ,update_gateway_id = self.service('common').list('device_gateway')
  164. #,update_hardware_type = self.service('common').list('hardware_type')
  165. )
  166. elif self.data['info']['hardware_type'] == 6:
  167. self.common(
  168. path = 'camera_pic'
  169. ,label = (u'摄像头名称', u'摄像头id', u'所属农场', u'选择网关', u'摄像头地址')
  170. ,update = ('name-input-required','hardware_id-show-','farm_id-select-required-gateway_id','gateway_id-select-required--farm_id','value-text-required')
  171. ,update_farm_id = Demeter.config['setting']['farmList']
  172. ,update_gateway_id = self.service('common').list('device_gateway')
  173. )
  174. elif self.data['info']['hardware_type'] in (2,4):
  175. self.common(
  176. path = 'info'
  177. #,label = (u'设备名称', u'设备id', u'计算公式', u'实时计算公式')
  178. #,update = ('name-input-required','hardware_id-show-',u'exp-text--{n}为当前数据,只处理最新数据',u'out_exp-text--处理所有数据,比较消耗服务器资源')
  179. ,label = (u'设备名称', u'设备id', u'计算公式')
  180. ,update = ('name-input-required','hardware_id-show-',u'exp-text--{n}为当前数据,只处理最新数据')
  181. )
  182. else:
  183. self.common(
  184. path = 'info'
  185. ,label = (u'设备名称', u'设备id')
  186. ,update = ('name-input-required','hardware_id-show-')
  187. )
  188. self.commonView('update')
  189. @Web.auth
  190. def post(self):
  191. self.commonUpdate('device_info')
  192. @Web.auth
  193. def delete(self):
  194. self.commonDelete('device_info')
  195. """
  196. self.commonOne('device_info')
  197. if self.input('state') == 'True' or (self.data['info'] and 'hardware_type' in self.data['info'] and self.data['info']['hardware_type'] == 7):
  198. self.commonDelete('device_info')
  199. else:
  200. #除摄像机之外,其余设备不允许删除
  201. self.out('no')
  202. """
  203. class camera_path(Load):
  204. @Web.auth
  205. def get(self):
  206. self.redirect('/device/info?search_hardware_type=7')
  207. class camera_update_path(Load):
  208. @Web.auth
  209. def get(self):
  210. self.common(
  211. path = 'camera'
  212. ,label = (u'摄像机名称', u'摄像机id', u'所属农场', u'选择网关', u'摄像机地址')
  213. ,update = ('name-input-required','hardware_id-input-required','farm_id-select-required-gateway_id','gateway_id-select-required--farm_id','value-text-required')
  214. ,update_farm_id = Demeter.config['setting']['farmList']
  215. ,update_gateway_id = self.service('common').list('device_gateway')
  216. )
  217. self.commonOne('device_info')
  218. self.commonView('update')
  219. @Web.auth
  220. def post(self):
  221. self.data['update']['hardware_type'] = 7
  222. self.data['update']['type_id'] = 0
  223. self.commonUpdate('device_info')
  224. @Web.auth
  225. def delete(self):
  226. self.commonDelete('device_info')
  227. class camera_pic_path(Load):
  228. @Web.auth
  229. def get(self):
  230. self.redirect('/device/info?search_hardware_type=6')
  231. class camera_pic_update_path(Load):
  232. @Web.auth
  233. def get(self):
  234. self.common(
  235. path = 'camera_pic'
  236. ,label = (u'摄像头名称', u'摄像头id', u'所属农场', u'选择网关', u'摄像头地址')
  237. ,update = ('name-input-required','hardware_id-input-required','farm_id-select-required-gateway_id','gateway_id-select-required--farm_id','value-text-required')
  238. ,update_farm_id = Demeter.config['setting']['farmList']
  239. ,update_gateway_id = self.service('common').list('device_gateway')
  240. )
  241. self.commonOne('device_info')
  242. self.commonView('update')
  243. @Web.auth
  244. def post(self):
  245. self.data['update']['hardware_type'] = 6
  246. self.data['update']['type_id'] = 0
  247. self.commonUpdate('device_info')
  248. @Web.auth
  249. def delete(self):
  250. self.commonDelete('device_info')
  251. class pic_path(Load):
  252. @Web.auth
  253. def get(self):
  254. self.common(
  255. name = u'摄像头图片'
  256. ,path = 'pic'
  257. ,width = '600'
  258. ,height = '300'
  259. ,add = False
  260. ,edit = False
  261. ,search = (('label-1','sdate-time-start','sdate-time-end'), (u'日期范围',u'开始时间',u'截止时间'))
  262. ,thead = (u'图片地址', u'更新时间')
  263. ,tbody = ('pic', 'sdate')
  264. ,state = False
  265. )
  266. self.commonList('device_pic', order='sdate desc')
  267. if self.data['list']:
  268. for key, value in enumerate(self.data['list']):
  269. self.data['list'][key]['pic'] = '<img src="'+value['pic']+'" width="200px" />'
  270. self.commonView('list')
  271. class stat_path(Load):
  272. @Web.auth
  273. def get(self):
  274. method = self.input('method', 'avg')
  275. id = self.input('id')
  276. self.common(
  277. name = u'设备统计'
  278. ,path = 'stat'
  279. ,search = (('label-1','cdate-time-start','cdate-time-end', 'date-select-'), (u'日期范围',u'开始时间',u'截止时间',u'周期选择'))
  280. )
  281. data = self.service('common').one('device_info', id=id)
  282. typeInfo = self.service('common').one('device_type', id=data['type_id'])
  283. farm = self.service('common').one('farm', id=data['farm_id'])
  284. self.data['info'] = data
  285. self.data['type'] = typeInfo
  286. self.data['farm'] = farm
  287. self.data['method'] = method
  288. model = Demeter.model('data', 'tsdb')
  289. self.data['common']['search_date-select-'] = model.dateConfig()
  290. search = {}
  291. if 'cdate-time-start' in self.data['search']:
  292. search['start'] = self.data['search']['cdate-time-start']
  293. if 'cdate-time-end' in self.data['search']:
  294. search['end'] = self.data['search']['cdate-time-end']
  295. if 'date-select-' in self.data['search']:
  296. search['group'] = self.data['search']['date-select-']
  297. self.data['list'] = model.getData(method, search, data)
  298. self.commonView('stat')
  299. class type_path(Load):
  300. @Web.auth
  301. def get(self):
  302. self.common(
  303. name = u'类型'
  304. ,path = 'type'
  305. ,width = '600'
  306. ,height = '400'
  307. ,search = (('label-1','cdate-time-start','cdate-time-end','name-input-mlike'), (u'日期范围',u'开始时间',u'截止时间',u'类型名称'))
  308. ,thead = (u'类型ID', u'类型名称', u'类型标识', u'类型单位', u'更新时间')
  309. ,tbody = ('id', 'name', 'key', 'unit', 'cdate')
  310. ,state = True
  311. )
  312. self.commonList('device_type')
  313. self.commonView('list')
  314. class type_update_path(Load):
  315. @Web.auth
  316. def get(self):
  317. self.common(
  318. path = 'type'
  319. #,label = (u'类型名称', u'类型标识',u'类型单位',u'表达式')
  320. #,update = ('name-input-required','key-input-required','unit-input-',u'exp-text--请输入表达式,{n}代表当前数据')
  321. ,label = (u'类型名称', u'类型标识',u'类型单位')
  322. ,update = ('name-input-required','key-input-required','unit-input-')
  323. )
  324. self.commonOne('device_type')
  325. self.commonView('update')
  326. @Web.auth
  327. def post(self):
  328. self.commonUpdate('device_type')
  329. @Web.auth
  330. def delete(self):
  331. self.commonDelete('device_type')
  332. class printer_path(Load):
  333. @Web.auth
  334. def get(self):
  335. self.common(
  336. name = u'打印机'
  337. ,path = 'printer'
  338. ,width = '600'
  339. ,height = '400'
  340. ,search = (('farm_id-select-','name-input-mlike'), (u'选择农场',u'打印机名称'))
  341. ,thead = (u'所属农场', u'打印机名称', u'打印机地址', u'更新时间')
  342. ,tbody = ('farm','name', 'host', 'cdate')
  343. ,state = True
  344. )
  345. self.data['common']['search_farm_id-select-'] = Demeter.config['setting']['farmList']
  346. self.commonList('device_printer')
  347. if self.data['list']:
  348. for key, value in enumerate(self.data['list']):
  349. farm = self.service('common').one('farm', id=value['farm_id'])
  350. self.data['list'][key]['farm'] = farm['name']
  351. self.commonView('list')
  352. class printer_update_path(Load):
  353. @Web.auth
  354. def get(self):
  355. self.common(
  356. path = 'printer'
  357. ,label = (u'所属农场', u'打印机名称', u'打印机地址')
  358. ,update = ('farm_id-select-required', 'name-input-required','host-input-required')
  359. ,update_farm_id = Demeter.config['setting']['farmList']
  360. )
  361. self.commonOne('device_printer')
  362. self.commonView('update')
  363. @Web.auth
  364. def post(self):
  365. self.commonUpdate('device_printer')
  366. @Web.auth
  367. def delete(self):
  368. self.commonDelete('device_printer')