device.py 17 KB

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