# -*- coding: utf-8 -*-
"""
demeter web page
name:device.py 设备相关页面
author:rabin
"""
from .__load__ import *
class gateway_path(Load):
@Web.auth
@Web.setting
def get(self):
self.set(
name = u'网关'
,path = 'gateway'
,width = '600'
,height = '500'
#,add = False
#,edit = False
,search = (('label-1','cdate-time-start','cdate-time-end','name-input-mlike'), (u'日期范围',u'开始时间',u'截止时间',u'网关名称'))
,thead = (u'网关名称', u'网关ID', u'所属产品', u'关联服务', u'网关连接状态', u'更新时间')
,tbody = ('name', 'hardware_id', 'product', 'server', 'status', 'cdate')
,state = False
)
self.list('device_gateway')
if self.data['list']:
for key, value in enumerate(self.data['list']):
device = self.service('common').list('device_info', search={'hardware_id':value['hardware_id']})
self.data['list'][key]['status'] = '断开'
self.data['list'][key]['product'] = '无'
self.data['list'][key]['server'] = '无'
if value['product_id']:
product = self.service('common').one('setting_product', id=value['product_id'])
self.data['list'][key]['product'] = product['name']
if value['server_id']:
server = self.service('common').one('setting_server', id=value['server_id'])
self.data['list'][key]['server'] = server['name']
if device:
for v in device:
if v['value']:
v['value'] = float(v['value'])
if v['hardware_type'] == 5 and v['value'] == 1:
self.data['list'][key]['status'] = '连接'
elif v['hardware_type'] == 4 and v['value']:
self.data['list'][key]['power_status'] = '连接'
self.data['list'][key]['power_num'] = v['value']
self.show('list')
class gateway_update_path(Load):
@Web.auth
@Web.setting
def get(self):
id = self.input('id')
if id:
#hardware_id = 'hardware_id-show-required'
hardware_id = 'hardware_id-input-required'
else:
hardware_id = 'hardware_id-input-required'
self.set(
path = 'gateway'
,label = (u'网关名称', u'网关ID', u'所属产品', u'关联服务', u'设备分布图纸')
,update = ('name-input-required',hardware_id,'product_id-select-','server_id-select-', 'pic-pic-')
,update_product_id = self.service('common').list('setting_product')
,update_server_id = self.service('common').list('setting_server')
)
self.one('device_gateway')
self.show('update')
@Web.auth
@Web.setting
def post(self):
id = self.update('device_gateway')
self.device(id)
@Web.auth
@Web.setting
def delete(self):
self.drop('device_gateway')
@Web.auth
@Web.setting
def device(self, id):
info = self.service('common').one('device_gateway', id=id)
self.service('device').addDeviceByGateway(info)
class info_path(Load):
@Web.auth
@Web.setting
def get(self):
self.set(
name = u'设备'
,path = 'info'
,width = '600'
,height = '400'
,button = ({'name':'添加摄像机','link':'/device/camera_update'},{'name':'添加摄像头','link':'/device/camera_pic_update'})
,add = False
#,edit = False
,search = (('hardware_type-select-','type_id-select-','name-input-mlike', 'status-hidden-'), (u'硬件类型',u'设备类型',u'设备名称', '设备状态'))
,thead = (u'设备名称', u'设备id', u'当前值', u'设备类型', u'网关',u'硬件类型')
,tbody = ('name', 'hardware_id', 'value', 'type', 'gateway', 'hardware_type')
,state = True
)
self.data['common']['search_type_id-select-'] = self.service('common').list('setting_device_type')
self.data['common']['search_gateway_id-select---farm_id'] = self.service('common').list('device_gateway', order='hardware_id asc')
self.data['common']['search_hardware_type-select-'] = self.service('common').list('hardware_type')
"""
if self.data['common']['search_hardware_type-select-']:
del self.data['common']['search_hardware_type-select-'][0]
"""
status = self.input('search_status-hidden-', False)
if status:
self.data['search']['status'] = False
#inorder asc, type_id asc,
self.list('device_info', order='cdate desc, udate asc,hardware_id asc')
if self.data['list']:
for key, value in enumerate(self.data['list']):
farm = self.service('common').one('farm', id=value['farm_id'])
self.data['list'][key]['farm'] = farm['name']
self.data['list'][key]['type'] = '无'
if value['type_id']:
type_info = self.service('common').one('setting_device_type', id=value['type_id'])
if type_info:
self.data['list'][key]['type'] = type_info['name']
info = self.service('common').one('device_gateway', id=value['gateway_id'])
self.data['list'][key]['gateway'] = info['name']
if value['status']:
self.data['list'][key]['status'] = '已连接'
else:
self.data['list'][key]['status'] = '已断开'
if not value['value']:
value['value'] = ''
self.data['list'][key]['value'] = '无'
elif value['hardware_type'] == 2 or value['hardware_type'] == 4:
if value['type_id'] and type_info:
value['value'] = value['value'] + ' ' + type_info['unit']
self.data['list'][key]['value'] = ''+value['value'] + '
更新时间:' + Demeter.date(value['cdate']) + '
[平均值统计] [高低值统计]'
elif value['hardware_type'] == 6:
self.data['list'][key]['value'] = '
更新时间:' + Demeter.date(value['cdate'])
elif value['hardware_type'] == 3:
if value['status']:
status = ''
else:
status = 'disabled'
url = '/device/info'
import math
value['value'] = math.ceil(float(value['value']))
if value['value'] == 1:
value['value'] = '开'
else:
value['value'] = '关'
'''
if value['value'] == 1:
#disabled
self.data['list'][key]['value'] = ''
else:
self.data['list'][key]['value'] = ''
'''
self.data['list'][key]['value'] = value['value']
elif value['hardware_type'] == 5:
if value['value'] == '1':
self.data['list'][key]['value'] = '已连接'
else:
self.data['list'][key]['value'] = '已断开'
hardware_type = self.service('common').one('hardware_type', id=value['hardware_type'])
self.data['list'][key]['hardware_type'] = hardware_type['name']
self.show('list')
@Web.auth
@Web.setting
def post(self):
id = self.input('id')
value = self.input('value')
if id:
Demeter.service('device').switch(id, value)
self.out('yes', {'state':id})
else:
self.out('no')
class info_update_path(Load):
@Web.auth
@Web.setting
def get(self):
self.one('device_info')
if self.data['info']['hardware_type'] == 7:
self.set(
path = 'camera'
#,label = (u'摄像机名称', u'摄像机id', u'所属农场', u'选择网关', u'选择硬件类型', u'摄像机地址')
#,update = ('name-input-required','hardware_id-show-','farm_id-select-required','gateway_id-select-required','hardware_type-select-required','value-text-required')
,label = (u'摄像机名称', u'摄像机id', u'所属农场', u'选择网关', u'摄像机地址', u'排序')
,update = ('name-input-required','hardware_id-show-','farm_id-select-required-gateway_id','gateway_id-select-required--farm_id','value-text-required','inorder-input-')
,update_farm_id = Demeter.config['setting']['farmList']
,update_gateway_id = self.service('common').list('device_gateway', order='hardware_id asc')
#,update_hardware_type = self.service('common').list('hardware_type')
)
elif self.data['info']['hardware_type'] == 6:
self.set(
path = 'camera_pic'
,label = (u'摄像头名称', u'摄像头id', u'所属农场', u'选择网关', u'摄像头地址', u'排序')
,update = ('name-input-required','hardware_id-show-','farm_id-select-required-gateway_id','gateway_id-select-required--farm_id','value-text-required','inorder-input-')
,update_farm_id = Demeter.config['setting']['farmList']
,update_gateway_id = self.service('common').list('device_gateway', order='hardware_id asc')
)
elif self.data['info']['hardware_type'] in (2,4):
self.set(
path = 'info'
#,label = (u'设备名称', u'设备id', u'计算公式', u'实时计算公式')
#,update = ('name-input-required','hardware_id-show-',u'exp-text--{n}为当前数据,只处理最新数据',u'out_exp-text--处理所有数据,比较消耗服务器资源')
,label = (u'设备名称', u'设备id', u'计算公式', u'排序')
,update = ('name-input-required','hardware_id-show-',u'exp-input--{n}为当前数据,只处理最新数据','inorder-text-')
)
else:
self.set(
path = 'info'
,label = (u'设备名称', u'设备id', u'排序')
,update = ('name-input-required','hardware_id-show-','inorder-input-')
)
self.show('update')
@Web.auth
@Web.setting
def post(self):
self.update('device_info')
@Web.auth
@Web.setting
def delete(self):
self.drop('device_info')
"""
self.one('device_info')
if self.input('state') == 'True' or (self.data['info'] and 'hardware_type' in self.data['info'] and self.data['info']['hardware_type'] == 7):
self.drop('device_info')
else:
#除摄像机之外,其余设备不允许删除
self.out('no')
"""
class camera_path(Load):
@Web.auth
@Web.setting
def get(self):
self.redirect('/device/info?search_hardware_type=7')
class camera_update_path(Load):
@Web.auth
@Web.setting
def get(self):
self.set(
path = 'camera'
,label = (u'摄像机名称', u'摄像机id', u'所属农场', u'选择网关', u'摄像机地址',u'排序')
,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-')
,update_farm_id = Demeter.config['setting']['farmList']
,update_gateway_id = self.service('common').list('device_gateway', order='hardware_id asc')
)
self.one('device_info')
self.show('update')
@Web.auth
@Web.setting
def post(self):
self.data['update']['hardware_type'] = 7
self.data['update']['type_id'] = 0
self.update('device_info')
@Web.auth
@Web.setting
def delete(self):
self.drop('device_info')
class camera_pic_path(Load):
@Web.auth
@Web.setting
def get(self):
self.redirect('/device/info?search_hardware_type=6')
class camera_pic_update_path(Load):
@Web.auth
@Web.setting
def get(self):
self.set(
path = 'camera_pic'
,label = (u'摄像头名称', u'摄像头id', u'所属农场', u'选择网关', u'摄像头地址',u'排序')
,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-')
,update_farm_id = Demeter.config['setting']['farmList']
,update_gateway_id = self.service('common').list('device_gateway', order='hardware_id asc')
)
self.one('device_info')
self.show('update')
@Web.auth
@Web.setting
def post(self):
self.data['update']['hardware_type'] = 6
self.data['update']['type_id'] = 0
self.update('device_info')
@Web.auth
@Web.setting
def delete(self):
self.drop('device_info')
class pic_path(Load):
@Web.auth
@Web.setting
def get(self):
self.set(
name = u'摄像头图片'
,path = 'pic'
,width = '600'
,height = '300'
,add = False
,edit = False
,search = (('label-1','sdate-time-start','sdate-time-end'), (u'日期范围',u'开始时间',u'截止时间'))
,thead = (u'图片地址', u'更新时间')
,tbody = ('pic', 'sdate')
,state = False
)
self.list('device_pic', order='sdate desc')
if self.data['list']:
for key, value in enumerate(self.data['list']):
self.data['list'][key]['pic'] = ''
self.show('list')
class stat_path(Load):
@Web.auth
@Web.setting
def get(self):
method = self.input('method', 'avg')
id = self.input('id')
self.set(
name = u'设备统计'
,path = 'stat'
,search = (('label-1','cdate-time-start','cdate-time-end', 'date-select-'), (u'日期范围',u'开始时间',u'截止时间',u'周期选择'))
)
data = self.service('common').one('device_info', id=id)
typeInfo = self.service('common').one('setting_device_type', id=data['type_id'])
farm = self.service('common').one('farm', id=data['farm_id'])
self.data['info'] = data
self.data['type'] = typeInfo
self.data['farm'] = farm
self.data['method'] = method
model = Demeter.model('data', 'tsdb')
self.data['common']['search_date-select-'] = model.dateConfig()
search = {}
if 'cdate-time-start' in self.data['search']:
search['start'] = self.data['search']['cdate-time-start']
if 'cdate-time-end' in self.data['search']:
search['end'] = self.data['search']['cdate-time-end']
if 'date-select-' in self.data['search']:
search['group'] = self.data['search']['date-select-']
self.data['list'] = model.getData(method, search, data)
self.show('stat')
class printer_path(Load):
@Web.auth
@Web.setting
def get(self):
self.set(
name = u'打印机'
,path = 'printer'
,width = '600'
,height = '400'
,search = (('farm_id-select-','name-input-mlike'), (u'选择农场',u'打印机名称'))
,thead = (u'所属农场', u'打印机名称', u'打印机地址', u'更新时间')
,tbody = ('farm','name', 'host', 'cdate')
,state = True
)
self.data['common']['search_farm_id-select-'] = Demeter.config['setting']['farmList']
self.list('device_printer')
if self.data['list']:
for key, value in enumerate(self.data['list']):
farm = self.service('common').one('farm', id=value['farm_id'])
self.data['list'][key]['farm'] = farm['name']
self.show('list')
class printer_update_path(Load):
@Web.auth
@Web.setting
def get(self):
self.set(
path = 'printer'
,label = (u'所属农场', u'打印机名称', u'打印机地址')
,update = ('farm_id-select-required', 'name-input-required','host-input-required')
,update_farm_id = Demeter.config['setting']['farmList']
)
self.one('device_printer')
self.show('update')
@Web.auth
@Web.setting
def post(self):
self.update('device_printer')
@Web.auth
@Web.setting
def delete(self):
self.drop('device_printer')
class notice_type_path(Load):
@Web.auth
@Web.setting
def get(self):
self.set(
name = u'错误码设置'
,path = '/device/notice_type'
,width = '600'
,height = '300'
,search = (('name-input-mlike','key-input-mlike'), (u'错误码描述',u'错误码key'))
,thead = (u'ID', u'错误码描述',u'错误码key', u'更新时间')
,tbody = ('id', 'name', 'key', 'cdate')
,state = False
,add = False
,edit = False
)
self.list('notice_type')
self.show('list')
class notice_type_update_path(Load):
@Web.auth
@Web.setting
def get(self):
self.set(
path = '/device/notice_type'
,label = (u'错误码描述', u'错误码key')
,update = ('name-input-required', 'key-input-required')
)
self.one('notice_type')
self.show('update')
@Web.auth
@Web.setting
def post(self):
self.update('notice_type')
@Web.auth
@Web.setting
def delete(self):
self.drop('notice_type')
class log_path(Load):
@Web.auth
@Web.setting
def get(self):
self.set(
name = u'网关日志'
,path = '/device/log'
,width = '600'
,height = '600'
,add = False
,edit = False
,search = (('farm_id-select-','content-input-mlike'), (u'选择农场', u'内容'))
,thead = (u'所属农场', u'所属网关', u'日志内容',u'发送时间')
,tbody = ('farm','gateway', 'content', 'cdate')
,state = False
)
self.data['common']['search_farm_id-select-'] = Demeter.config['setting']['farmList']
self.list('log')
if self.data['list']:
for key, value in enumerate(self.data['list']):
farm = self.service('common').one('farm', id=value['farm_id'])
self.data['list'][key]['farm'] = farm['name']
gateway = self.service('common').one('device_gateway', id=value['gateway_id'])
self.data['list'][key]['gateway'] = gateway['name']
self.show('list')