device.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  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 page_path(Load):
  10. @Web.auth
  11. def get(self):
  12. self.common(
  13. name = u'页面' #中文名
  14. ,path = 'page' #路径
  15. ,width = '600' # 新增页面的宽度
  16. ,height = '200' # 新增页面的高度
  17. ,search = (('label-1','cdate-time-start','cdate-time-end','name-input-mlike'), (u'日期范围',u'开始时间',u'截止时间',u'页面名称')) #搜索
  18. ,thead = (u'页面名称', '子页面', u'更新时间') #表头
  19. ,tbody = ('name', 'group', 'cdate') #表内容
  20. ,state = True #启用回收站
  21. )
  22. self.commonList('device_page')
  23. if self.data['list']:
  24. for key, value in enumerate(self.data['list']):
  25. self.data['list'][key]['group'] = '<a href="/device/group?search_page_id-select-='+value['id']+'">分组</a>'
  26. self.commonView('list')
  27. class page_update_path(Load):
  28. @Web.auth
  29. def get(self):
  30. self.common(
  31. path = 'page'
  32. ,label = (u'标题',)
  33. ,update = ('name-input-required',)
  34. )
  35. self.commonOne('device_page')
  36. self.commonView('update')
  37. @Web.auth
  38. def post(self):
  39. self.commonUpdate('device_page')
  40. @Web.auth
  41. def delete(self):
  42. self.commonDelete('device_page')
  43. class group_path(Load):
  44. @Web.auth
  45. def get(self):
  46. self.common(
  47. name = u'分组'
  48. ,path = 'group'
  49. ,width = '600'
  50. ,height = '250'
  51. ,full = True
  52. ,search = (('label-1','cdate-time-start','cdate-time-end','page_id-select-','name-input-mlike'), (u'日期范围',u'开始时间',u'截止时间',u'选择页面',u'分组名称'))
  53. ,thead = (u'页面名称', u'分组名称', '设备', u'更新时间')
  54. ,tbody = ('page', 'name', 'device', 'cdate')
  55. ,state = True
  56. )
  57. self.data['common']['search_page_id-select-'] = self.service('common').list('device_page')
  58. self.commonList('device_group')
  59. if self.data['list']:
  60. for key, value in enumerate(self.data['list']):
  61. page = self.service('common').one('device_page', id=value['page_id'])
  62. self.data['list'][key]['page'] = page['name']
  63. if value['devices']:
  64. #self.data['list'][key]['device'] = '<a href="/device/info?search_id-input-ins='+value['devices']+'">查看设备</a>'
  65. self.data['list'][key]['device'] = '<a>查看设备</a>'
  66. else:
  67. self.data['list'][key]['device'] = '暂无设备'
  68. self.commonView('list')
  69. class group_update_path(Load):
  70. @Web.auth
  71. def get(self):
  72. self.common(
  73. path = 'group'
  74. ,label = (u'所属页面', u'标题', u'选择设备')
  75. ,update = ('page_id-select-required','name-input-required', 'devices-checkboxs-')
  76. ,update_page_id = self.service('common').list('device_page')
  77. ,update_devices = self.getDevice()
  78. )
  79. self.commonOne('device_group')
  80. self.commonView('update')
  81. @Web.auth
  82. def post(self):
  83. self.commonUpdate('device_group')
  84. @Web.auth
  85. def delete(self):
  86. self.commonDelete('device_group')
  87. def getDevice(self):
  88. gateway = self.service('common').list('device_gateway')
  89. if gateway:
  90. for key, value in enumerate(gateway):
  91. gateway[key]['child'] = self.service('common').list('device_info', True, {'gateway_id-input-':value['id']})
  92. return gateway
  93. class mul_path(Load):
  94. @Web.auth
  95. def get(self):
  96. self.common(
  97. name = u'批量控制'
  98. ,path = 'mul'
  99. ,width = '600'
  100. ,height = '250'
  101. ,full = True
  102. ,search = (('label-1','cdate-time-start','cdate-time-end','name-input-mlike'), (u'日期范围',u'开始时间',u'截止时间',u'分组名称'))
  103. ,thead = (u'分组名称', '设备', u'更新时间')
  104. ,tbody = ('name', 'device', 'cdate')
  105. ,state = True
  106. )
  107. self.commonList('device_mul')
  108. if self.data['list']:
  109. for key, value in enumerate(self.data['list']):
  110. if value['devices']:
  111. #self.data['list'][key]['device'] = '<a href="/device/info?search_id-input-ins='+value['devices']+'">设备</a>'
  112. self.data['list'][key]['device'] = '<a>查看设备</a>'
  113. else:
  114. self.data['list'][key]['device'] = '暂无设备'
  115. self.commonView('list')
  116. class mul_update_path(Load):
  117. @Web.auth
  118. def get(self):
  119. self.common(
  120. path = 'mul'
  121. ,label = (u'标题', u'选择设备')
  122. ,update = ('name-input-required', 'devices-checkboxs-')
  123. ,update_devices = self.getDevice()
  124. )
  125. self.commonOne('device_mul')
  126. self.commonView('update')
  127. @Web.auth
  128. def post(self):
  129. self.commonUpdate('device_mul')
  130. @Web.auth
  131. def delete(self):
  132. self.commonDelete('device_mul')
  133. def getDevice(self):
  134. gateway = self.service('common').list('device_gateway')
  135. if gateway:
  136. for key, value in enumerate(gateway):
  137. gateway[key]['child'] = self.service('common').list('device_info', True, {'gateway_id-input-':value['id']})
  138. return gateway
  139. class gateway_path(Load):
  140. @Web.auth
  141. def get(self):
  142. self.common(
  143. name = u'网关'
  144. ,path = 'gateway'
  145. ,width = '600'
  146. ,height = '300'
  147. #,add = False
  148. #,edit = False
  149. ,search = (('label-1','cdate-time-start','cdate-time-end','farm_id-select-','name-input-mlike'), (u'日期范围',u'开始时间',u'截止时间',u'选择农场',u'网关名称'))
  150. ,thead = (u'所属农场',u'网关名称', u'设备id', u'网关连接状态', u'电源数值', u'电源连接状态', u'更新时间')
  151. ,tbody = ('farm','name', 'hardware_id', 'status', 'power_num', 'power_status', 'cdate')
  152. ,state = False
  153. )
  154. self.data['common']['search_farm_id-select-'] = Demeter.config['setting']['farmList']
  155. self.commonList('device_gateway')
  156. if self.data['list']:
  157. for key, value in enumerate(self.data['list']):
  158. farm = self.service('common').one('farm', id=value['farm_id'])
  159. self.data['list'][key]['farm'] = farm['name']
  160. if value['status']:
  161. self.data['list'][key]['status'] = '开启'
  162. else:
  163. self.data['list'][key]['status'] = '关闭'
  164. if value['power_status']:
  165. self.data['list'][key]['power_status'] = '连接'
  166. else:
  167. self.data['list'][key]['power_status'] = '断开'
  168. self.commonView('list')
  169. class gateway_update_path(Load):
  170. @Web.auth
  171. def get(self):
  172. self.common(
  173. path = 'gateway'
  174. #,label = (u'网关名称', u'设备id',u'网关连接状态',u'电源数值',u'电源连接状态')
  175. ,label = (u'所属农场', u'网关名称', u'设备id')
  176. ,update = ('farm_id-select-required', 'name-input-required','hardware_id-input-required')
  177. #,update = ('name-input-required','hardware_id-input-required','status-switch--开启|关闭','power_num-input-','power_status-switch--连接|断开')
  178. ,update_farm_id = Demeter.config['setting']['farmList']
  179. )
  180. self.commonOne('device_gateway')
  181. self.commonView('update')
  182. @Web.auth
  183. def post(self):
  184. id = self.commonUpdate('device_gateway')
  185. self.hardware(id)
  186. @Web.auth
  187. def delete(self):
  188. self.commonDelete('device_gateway')
  189. @Web.auth
  190. def hardware(self, id):
  191. hardware_id = self.data['update']['hardware_id']
  192. if hardware_id and id > 0:
  193. info = self.service('common').one('hardware', hardware_id=hardware_id)
  194. if not info:
  195. insert = {}
  196. insert['farm_id'] = self.data['update']['farm_id']
  197. insert['hardware_id'] = hardware_id
  198. insert['gateway_id'] = id
  199. insert['hardware_type'] = 1
  200. self.service('common').update('hardware', None, insert)
  201. class info_path(Load):
  202. @Web.auth
  203. def get(self):
  204. self.common(
  205. name = u'设备'
  206. ,path = 'info'
  207. ,width = '600'
  208. ,height = '300'
  209. ,add = False
  210. #,edit = False
  211. ,search = (('farm_id-select-','type_id-select-', 'gateway_id-select-', 'hardware_type-select-'), (u'选择农场',u'设备类型',u'网关',u'硬件类型'))
  212. ,thead = (u'所属农场', u'设备名称', u'设备id', u'连接状态', u'值', u'设备类型', u'网关',u'硬件类型')
  213. ,tbody = ('farm','name', 'hardware_id', 'status', 'show', 'type', 'gateway', 'hardware_type')
  214. ,state = False
  215. )
  216. self.data['common']['search_farm_id-select-'] = Demeter.config['setting']['farmList']
  217. self.data['common']['search_type_id-select-'] = self.service('common').list('device_type')
  218. self.data['common']['search_gateway_id-select-'] = self.service('common').list('device_gateway')
  219. self.data['common']['search_hardware_type-select-'] = self.service('common').list('hardware_type')
  220. del self.data['common']['search_hardware_type-select-'][0]
  221. self.commonList('device_info')
  222. if self.data['list']:
  223. for key, value in enumerate(self.data['list']):
  224. farm = self.service('common').one('farm', id=value['farm_id'])
  225. self.data['list'][key]['farm'] = farm['name']
  226. self.data['list'][key]['type'] = '无'
  227. if value['type_id']:
  228. info = self.service('common').one('device_type', id=value['type_id'])
  229. if info:
  230. self.data['list'][key]['type'] = info['name']
  231. info = self.service('common').one('device_gateway', id=value['gateway_id'])
  232. self.data['list'][key]['gateway'] = info['name']
  233. if value['status']:
  234. self.data['list'][key]['status'] = '连接'
  235. else:
  236. self.data['list'][key]['status'] = '断开'
  237. if value['num'] and value['show']:
  238. value['show'] = str(value['show'])
  239. # 根据设备类型type_id得到单位和计算公式
  240. self.data['list'][key]['show'] = '<a href="/device/stat?id='+value['id']+'&search_date-select-=1&method=list">'+value['show'] + '</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>'
  241. elif value['show']:
  242. self.data['list'][key]['show'] = '<a href="/device/pic?id='+value['id']+'"><img src="'+value['show']+'" width="200px"/></a><br />更新时间:' + Demeter.date(value['cdate'])
  243. else:
  244. self.data['list'][key]['show'] = ''
  245. hardware_type = self.service('common').one('hardware_type', id=value['hardware_type'])
  246. self.data['list'][key]['hardware_type'] = hardware_type['name']
  247. self.commonView('list')
  248. class info_update_path(Load):
  249. @Web.auth
  250. def get(self):
  251. self.common(
  252. path = 'info'
  253. #,label = (u'网关名称', u'设备id',u'网关连接状态',u'电源数值',u'电源连接状态')
  254. ,label = (u'设备名称', u'设备id')
  255. ,update = ('name-input-required','hardware_id-show-')
  256. #,update = ('name-input-required','hardware_id-input-required','status-switch--开启|关闭','power_num-input-','power_status-switch--连接|断开')
  257. ,update_farm_id = Demeter.config['setting']['farmList']
  258. )
  259. self.commonOne('device_info')
  260. self.commonView('update')
  261. @Web.auth
  262. def post(self):
  263. self.commonUpdate('device_info')
  264. @Web.auth
  265. def delete(self):
  266. self.commonDelete('device_info')
  267. class pic_path(Load):
  268. @Web.auth
  269. def get(self):
  270. self.common(
  271. name = u'摄像头图片'
  272. ,path = 'pic'
  273. ,width = '600'
  274. ,height = '300'
  275. #,add = False
  276. #,edit = False
  277. ,search = (('label-1','cdate-time-start','cdate-time-end'), (u'日期范围',u'开始时间',u'截止时间'))
  278. ,thead = (u'图片地址', u'更新时间')
  279. ,tbody = ('pic', 'cdate')
  280. ,state = False
  281. )
  282. self.commonList('device_pic')
  283. if self.data['list']:
  284. for key, value in enumerate(self.data['list']):
  285. self.data['list'][key]['pic'] = '<img src="'+value['pic']+'" width="200px" />'
  286. self.commonView('list')
  287. class stat_path(Load):
  288. @Web.auth
  289. def get(self):
  290. method = self.input('method', 'avg')
  291. id = self.input('id')
  292. self.common(
  293. name = u'设备统计'
  294. ,path = 'stat'
  295. ,search = (('label-1','cdate-time-start','cdate-time-end', 'date-select-'), (u'日期范围',u'开始时间',u'截止时间',u'周期选择'))
  296. )
  297. data = self.service('common').one('device_info', id=id)
  298. typeInfo = self.service('common').one('device_type', id=data['type_id'])
  299. farm = self.service('common').one('farm', id=data['farm_id'])
  300. self.data['info'] = data
  301. self.data['type'] = typeInfo
  302. self.data['farm'] = farm
  303. self.data['method'] = method
  304. model = Demeter.model('data', 'tsdb')
  305. self.data['common']['search_date-select-'] = model.dateConfig()
  306. search = {}
  307. if 'cdate-time-start' in self.data['search']:
  308. search['start'] = self.data['search']['cdate-time-start']
  309. if 'cdate-time-end' in self.data['search']:
  310. search['end'] = self.data['search']['cdate-time-end']
  311. if 'date-select-' in self.data['search']:
  312. search['group'] = self.data['search']['date-select-']
  313. self.data['list'] = model.getData(method, search, data)
  314. self.commonView('stat')
  315. class type_path(Load):
  316. @Web.auth
  317. def get(self):
  318. self.common(
  319. name = u'类型'
  320. ,path = 'type'
  321. ,width = '600'
  322. ,height = '400'
  323. ,search = (('label-1','cdate-time-start','cdate-time-end','name-input-mlike'), (u'日期范围',u'开始时间',u'截止时间',u'类型名称'))
  324. ,thead = (u'类型名称', u'类型标识', u'类型单位', u'表达式', u'更新时间')
  325. ,tbody = ('name', 'key', 'unit', 'exp', 'cdate')
  326. ,state = True
  327. )
  328. self.commonList('device_type')
  329. self.commonView('list')
  330. class type_update_path(Load):
  331. @Web.auth
  332. def get(self):
  333. self.common(
  334. path = 'type'
  335. ,label = (u'类型名称', u'类型标识',u'类型单位',u'表达式')
  336. ,update = ('name-input-required','key-input-required','unit-input-',u'exp-text--请输入表达式,{n}代表当前数据')
  337. )
  338. self.commonOne('device_type')
  339. self.commonView('update')
  340. @Web.auth
  341. def post(self):
  342. self.commonUpdate('device_type')
  343. @Web.auth
  344. def delete(self):
  345. self.commonDelete('device_type')
  346. class printer_path(Load):
  347. @Web.auth
  348. def get(self):
  349. self.common(
  350. name = u'打印机'
  351. ,path = 'printer'
  352. ,width = '600'
  353. ,height = '400'
  354. ,search = (('farm_id-select-','name-input-mlike'), (u'选择农场',u'打印机名称'))
  355. ,thead = (u'所属农场', u'打印机名称', u'打印机地址', u'更新时间')
  356. ,tbody = ('farm','name', 'host', 'cdate')
  357. ,state = True
  358. )
  359. self.data['common']['search_farm_id-select-'] = Demeter.config['setting']['farmList']
  360. self.commonList('device_printer')
  361. if self.data['list']:
  362. for key, value in enumerate(self.data['list']):
  363. farm = self.service('common').one('farm', id=value['farm_id'])
  364. self.data['list'][key]['farm'] = farm['name']
  365. self.commonView('list')
  366. class printer_update_path(Load):
  367. @Web.auth
  368. def get(self):
  369. self.common(
  370. path = 'printer'
  371. ,label = (u'所属农场', u'打印机名称', u'打印机地址')
  372. ,update = ('farm_id-select-required', 'name-input-required','host-input-required')
  373. ,update_farm_id = Demeter.config['setting']['farmList']
  374. )
  375. self.commonOne('device_printer')
  376. self.commonView('update')
  377. @Web.auth
  378. def post(self):
  379. self.commonUpdate('device_printer')
  380. @Web.auth
  381. def delete(self):
  382. self.commonDelete('device_printer')