#!/usr/bin/env python # -*- coding: utf-8 -*- """ demeter web page name:device.py author:rabin """ from __load__ import * from demeter.mqtt import * # 首页 class index_path(Load): @Web.auth @Web.setting def get(self): # 获取网关列表 self.data['gateway'] = self.service('common').list('device_gateway', state=True, search={'farm_id':self.data['setting']['farm']}) # 获取页面 self.data['page'] = self.service('common').list('device_page', order='inorder asc,cdate desc', search={'farm_id':self.data['setting']['farm']}) self.view("device/index.html") #批量控制 class mul_path(Load): @Web.auth @Web.setting def get(self): self.data['list'] = self.service('common').list('device_mul', search={'farm_id':self.data['setting']['farm']}) if self.data['list']: model = Demeter.model('device_mul_queue') for key, value in enumerate(self.data['list']): model.status.ins((2,3)) model.mul_id = value['id'] info = model.select() #self.data['list'][key]['oper'] = '' if info: for v in info: if v['oper']: self.data['list'][key]['oper'] = v['oper'] self.view("device/mul.html") @Web.auth @Web.setting def post(self): id = self.input('id') value = self.input('value') if id: info = self.service('common').one('device_mul', id=id) if info: update = {} update['value'] = value if info['device_type'] == 1: if value == '1': update['oper'] = '批量启动中' else: update['oper'] = '批量关闭中' else: if value == '1': update['oper'] = '批量升起中' elif value == '2': update['oper'] = '批量下降中' elif value == '5': update['oper'] = '批量停止中' self.service('common').update('device_mul', id, update, cdate=False) if info['devices']: devices = tuple(eval(info['devices'])) for device in devices: Demeter.service('device').switch(device, switch=value, mul=id) self.out('yes', {'id':id}) else: self.out('no') #大屏幕 class screen_path(Load): @Web.auth @Web.setting def get(self): device = self.input('device') # 获取摄像头图片 self.data['camera'] = Device.get(self, search={'hardware_type':6,'farm_id':self.data['setting']['farm']}) # 获取当前数据 self.data['device'] = Device.get(self, search={'id--ins':self.data['setting']['farmInfo']['gateway'], 'hardware_type--ins':(2,4,5),'farm_id':self.data['setting']['farm']}) deviceInfo = {} if self.data['device']: for key, value in enumerate(self.data['device']): if value['type_id'] > 0: type_info = self.service('common').one('device_type', id=value['type_id']) self.data['device'][key]['unit'] = type_info['unit'] self.data['device'][key]['typeName'] = type_info['name'] if not device and not deviceInfo: deviceInfo = self.data['device'][key] self.data['list'] = ({'name':'实时数据监测', 'device':self.data['device']},) Device.statBase(self, deviceInfo) log_search = {} if device: log_search['device_id'] = device else: log_search['device_id--ins'] = self.data['setting']['farmInfo']['gateways'] log_search['device_id--ins'] = self.data['setting']['farmInfo']['gateways'] log_search['type_id'] = 2 log_search['farm_id'] = self.data['setting']['farm'] # 获取设备日志 self.data['logs'] = self.service('common').list('msg', search=log_search, limit='0,1') if self.data['logs']: for key, value in enumerate(self.data['logs']): type_info = self.service('common').one('msg_type', id=value['type_id']) self.data['logs'][key]['type'] = type_info['name'] self.data['logs'][key]['cdates'] = Demeter.date(value['cdate']) self.data['info'] = self.data['setting']['farmInfo'] if not self.data['info']['welcome']: self.data['info']['welcome'] = self.data['info']['name'] self.data['noset'] = True self.data['stat'] = True self.view("device/screen.html") #大屏幕设置 class screen_set_path(Load): @Web.auth @Web.setting def get(self): self.data['info'] = self.data['setting']['farmInfo'] self.data['info']['devices'] = self.data['info']['gateway'] self.data['gateway'] = self.service('common').list('device_gateway', search={'farm_id':self.data['setting']['farm']}) self.data['device'] = Device.getByGateway(self, search={'hardware_type--ins' : (2,4,5),'farm_id':self.data['setting']['farm']}) self.view("device/alert/screen.html") @Web.auth @Web.setting def post(self): id = self.input('id') update = {} update['welcome'] = self.input('update_name') update['gateway'] = self.inputs('update_devices') if not update['gateway']: self.out(u'请选择设备') return update['gateway'] = str(update['gateway']) if update['welcome']: value = update['welcome'] else: value = self.data['setting']['farmInfo']['name'] key = 'update/w/' + id pub = Pub() pub.push(key, value) state = self.service('common').update('farm', id, update) self.out('yes', {'id':state}) #特殊的大屏幕 class screens_path(Load): @Web.setting def get(self): farm = self.input('ids', '2,3,4') self.data['farm'] = farm farm = farm.split(',') device = self.input('device') farmInfo = self.service('common').one('farm', id=farm[0]) # 获取摄像头图片 #self.data['camera'] = Device.get(self, search={'hardware_type':6,'farm_id--ins':farm}) self.data['camera'] = [] # 获取当前数据 deviceList = Device.get(self, search={'hardware_type--ins':(2,4,5),'farm_id--ins':farm}) self.data['device'] = {} for v in farm: self.data['device'][v] = [] deviceInfo = {} devices = [] if deviceList: for key, value in enumerate(deviceList): if value['type_id'] > 0: type_info = self.service('common').one('device_type', id=value['type_id']) value['unit'] = type_info['unit'] value['typeName'] = type_info['name'] self.data['device'][str(value['farm_id'])].append(value) devices.append(value['id']) if not device and not deviceInfo: deviceInfo = value else: self.data['device'][str(value['farm_id'])].append(value) devices.append(value['id']) self.data['deviceList'] = {} for v in farm: farmData = self.service('common').one('farm', id=int(v)) if farmData: self.data['deviceList'][v] = ({'name':farmData['name'] + '实时检测', 'device':self.data['device'][v]},) Device.statBase(self, deviceInfo) log_search = {} if device: log_search['device_id'] = device else: log_search['device_id--ins'] = devices log_search['device_id--ins'] = devices log_search['type_id'] = 2 log_search['farm_id--ins'] = farm # 获取设备日志 self.data['logs'] = self.service('common').list('msg', search=log_search, limit='0,1') if self.data['logs']: for key, value in enumerate(self.data['logs']): type_info = self.service('common').one('msg_type', id=value['type_id']) self.data['logs'][key]['type'] = type_info['name'] self.data['logs'][key]['cdates'] = Demeter.date(value['cdate']) self.data['info'] = farmInfo if not self.data['info']['welcome']: self.data['info']['welcome'] = self.data['info']['name'] self.data['info']['welcome'] = '保定清苑农业局物联网监测系统' self.data['noset'] = True self.data['stat'] = True self.view("device/screens.html") #获取设备数据和设备控制 class data_path(Load): @Web.auth @Web.setting def get(self): Device.data(self) if 'stat' in self.data and self.data['stat']: Device.statBase(self, self.data['stat']) self.view("device/data.html") #获取图像 class pic_path(Load): @Web.auth @Web.setting def get(self): Device.pic(self) self.view("device/pic.html") #数据统计 class stat_path(Load): @Web.auth @Web.setting def get(self): Device.stat(self) self.view("device/stat.html") #数据导出 class out_path(Load): @Web.auth @Web.setting def get(self): #Device.out(self) print 22 self.view("device/out.html") #设备日志 class log_path(Load): @Web.auth @Web.setting def get(self): Device.log(self) self.view("device/logs.html") #设备分组 class group_path(Load): @Web.auth @Web.setting def get(self): # 获取页面 self.data['page'] = self.service('common').list('device_page', order='inorder asc,cdate desc', search={'farm_id':self.data['setting']['farm']}) if self.data['page']: for key, value in enumerate(self.data['page']): self.data['page'][key]['group'] = self.service('common').list('device_group', search={'page_id':value['id'],'farm_id':self.data['setting']['farm']} , order='inorder asc,cdate desc') if self.data['page'][key]['group']: for groupk, groupv in enumerate(self.data['page'][key]['group']): self.data['page'][key]['group'][groupk]['device'] = Device.get(self, search={'id--ins':groupv['devices'],'farm_id':self.data['setting']['farm']}) self.view("device/group.html") #更新设备的上下限 class update_device_path(Load): @Web.auth @Web.setting def get(self): id = self.input('device_id') if id: Device.data(self) else: id = self.input('id') self.data['set'] = {} if id: self.data['set'] = self.service('common').one('device_info', id=id) if self.data['set'] and self.data['set']['type_id'] > 0: self.data['type'] = self.service('common').one('device_type', id=self.data['set']['type_id']) self.view("device/alert/device.html") @Web.auth @Web.setting def post(self): id = self.input('id') update = {} update['max'] = self.input('update_max') update['min'] = self.input('update_min') if not update['max'] and not update['min']: self.out(u'请至少输入一个上限或者下限') return if not update['min']: del update['min'] if not update['max']: del update['max'] state = self.service('common').update('device_info', id, update) self.out('yes', {'id':state}) #更新页面 class update_page_path(Load): @Web.auth @Web.setting def get(self): id = self.input('id') #self.data['ico'] = ('cj', 'kz', 'syt', 'wg', 'pl', 'dpm', 'fz', 'zn') self.data['ico'] = ('cj', 'kz', 'syt') self.data['info'] = {} if id: self.data['info'] = self.service('common').one('device_page', id=id) else: self.data['info']['ico'] = self.data['ico'][0] self.view("device/alert/page.html") @Web.auth @Web.setting def post(self): id = self.input('id') update = {} update['name'] = self.input('update_name') update['ico'] = self.input('update_ico') update['inorder'] = self.input('update_inorder', 0) if not update['inorder']: update['inorder'] = 0 update['inorder'] = int(update['inorder']) update['stat'] = self.input('update_stat') if not update['name']: self.out(u'请输入页面名称') return if not update['ico']: self.out(u'请选择图标') return if update['stat']: update['stat'] = True else: update['stat'] = False state = self.service('common').update('device_page', id, update) self.out('yes', {'id':state}) #更新分组 class update_group_path(Load): @Web.auth @Web.setting def get(self): page = self.input('page') self.data['page'] = self.service('common').one('device_page', id=page) id = self.input('id') self.data['info'] = {} if id: self.data['info'] = self.service('common').one('device_group', id=id) self.data['gateway'] = self.service('common').list('device_gateway', search={'farm_id':self.data['setting']['farm']}) self.data['device'] = Device.getByGateway(self, search={'farm_id':self.data['setting']['farm']}) self.view("device/alert/group.html") @Web.auth @Web.setting def post(self): id = self.input('id') update = {} update['page_id'] = self.input('update_page_id') update['name'] = self.input('update_name') update['devices'] = self.inputs('update_devices') update['inorder'] = self.input('update_inorder', 0) if not update['inorder']: update['inorder'] = 0 update['inorder'] = int(update['inorder']) if not update['name']: self.out(u'请输入分组名称') return if not update['devices']: self.out(u'请选择设备') return update['devices'] = str(update['devices']) state = self.service('common').update('device_group', id, update) self.out('yes', {'id':state}) @Web.auth @Web.setting def delete(self): id = self.input('id') if not id: self.out('no') return state = self.service('common').rDelete('device_group', id) self.out('yes', {'state':state}) #智能设置-批量设置 class set_mul_path(Load): @Web.auth @Web.setting def get(self): self.data['name'] = '批量控制' Device.set(self) self.data['mul'] = self.service('common').list('device_mul', search={'farm_id':self.data['setting']['farm']}) if self.data['mul']: for key, value in enumerate(self.data['mul']): self.data['mul'][key]['device'] = Device.get(self, search={'id--ins':value['devices'],'farm_id':self.data['setting']['farm']}) self.view("device/set/mul.html") #更新批量控制 class update_set_mul_path(Load): @Web.auth @Web.setting def get(self): id = self.input('id') self.data['info'] = {} if id: self.data['info'] = self.service('common').one('device_mul', id=id) self.data['gateway'] = self.service('common').list('device_gateway', search={'farm_id':self.data['setting']['farm']}) self.data['device'] = Device.getByGateway(self, search={'hardware_type' : 3,'farm_id':self.data['setting']['farm']}) self.data['type'] = ({'id':1, 'name':'开关'},{'id':2, 'name':'卷帘'}) self.view("device/alert/mul.html") @Web.auth @Web.setting def post(self): id = self.input('id') update = {} update['name'] = self.input('update_name') update['device_type'] = self.input('update_type') update['devices'] = self.inputs('update_devices') if not update['name']: self.out(u'请输入名称') return if not update['device_type']: self.out(u'请选择设备类型') return if not update['devices']: self.out(u'请选择设备') return update['devices'] = str(update['devices']) state = self.service('common').update('device_mul', id, update) self.out('yes', {'id':state}) @Web.auth @Web.setting def delete(self): id = self.input('id') if not id: self.out('no') return state = self.service('common').rDelete('device_mul', id) self.out('yes', {'state':state}) #智能设置-定时设置 class set_timing_path(Load): @Web.auth @Web.setting def get(self): self.data['name'] = '定时设置' Device.set(self) Device.setCronOper(self) self.data['gateway'] = self.service('common').list('device_gateway', search={'farm_id':self.data['setting']['farm']}) self.data['device'] = Device.getByGateway(self, search={'hardware_type': 3,'farm_id':self.data['setting']['farm']}) self.data['list'] = self.service('common').list('device_set_timing', state=True, page={'num':10}, search={'farm_id':self.data['setting']['farm']}) if self.data['list']: for key, value in enumerate(self.data['list']): self.data['list'][key]['device'] = [] if value['devices']: device = Device.get(self, search={'id--ins':value['devices'],'farm_id':self.data['setting']['farm']}) if device: self.data['list'][key]['device'] = device self.data['list'][key]['oper'] = self.data['oper'][value['oper']-1]['name'] self.data['list'][key]['cdates'] = Demeter.date(value['cdate']) self.data['list'][key]['zdates'] = Demeter.date(value['zdate']) if value['status'] == 1: self.data['list'][key]['status_text'] = '执行成功' elif value['status'] == 2: self.data['list'][key]['status_text'] = '执行失败' self.view("device/set/timing.html") class update_set_timing_path(Load): @Web.auth @Web.setting def get(self): id = self.input('id') Device.setCronOper(self) self.data['info'] = {} if id: self.data['info'] = self.service('common').one('device_set_timing', id=id) if self.data['info'] and self.data['info']['zdate']: self.data['info']['zdate'] = Demeter.date(self.data['info']['zdate']) self.data['gateway'] = self.service('common').list('device_gateway', search={'farm_id':self.data['setting']['farm']}) self.data['device'] = Device.getByGateway(self, search={'hardware_type' : 3,'farm_id':self.data['setting']['farm']}) self.view("device/alert/timing.html") @Web.auth @Web.setting def post(self): id = self.input('id') update = {} update['devices'] = self.inputs('update_devices') update['oper'] = self.input('update_oper') update['zdate'] = self.input('update_zdate') if not update['devices']: self.out(u'请选择设备') return if not update['oper']: self.out(u'请选择执行结果') return if not update['zdate']: self.out(u'请选择执行时间') return update['devices'] = str(update['devices']) state = self.service('common').update('device_set_timing', id, update) self.out('yes', {'id':state}) @Web.auth @Web.setting def delete(self): id = self.input('id') if not id: self.out('no') return state = self.service('common').rDelete('device_set_timing', id) self.out('yes', {'state':state}) #智能设置-周期设置 class set_loop_path(Load): @Web.auth @Web.setting def get(self): self.data['name'] = '周期设置' Device.set(self) Device.setCronOper(self) self.data['gateway'] = self.service('common').list('device_gateway', search={'farm_id':self.data['setting']['farm']}) self.data['device'] = Device.getByGateway(self, search={'hardware_type': 3,'farm_id':self.data['setting']['farm']}) self.data['list'] = self.service('common').list('device_set_loop', page={'num':10}, search={'farm_id':self.data['setting']['farm']}) if self.data['list']: for key, value in enumerate(self.data['list']): self.data['list'][key]['device'] = [] if value['devices']: device = Device.get(self, search={'id--ins':value['devices'],'farm_id':self.data['setting']['farm']}) if device: self.data['list'][key]['device'] = device if value['looptype'] == 2: value['loop'] = value['loop'].split(',') loop = [] for v in self.data['week']: if str(v['id']) in value['loop']: loop.append(v['name']) loop = ' '.join(loop) + ' ' elif value['looptype'] == 3: loop = value['loop'].replace(',', ' ') + ' ' else: loop = '' self.data['list'][key]['loop'] = loop self.data['list'][key]['oper'] = self.data['oper'][value['oper']-1]['name'] self.data['list'][key]['looptype'] = self.data['looptype'][value['looptype']-1]['list'] self.data['list'][key]['cdates'] = Demeter.date(value['cdate']) self.data['list'][key]['hour'] = Demeter.hour(value['hour']) self.data['list'][key]['minute'] = Demeter.hour(value['minute']) self.view("device/set/loop.html") class update_set_loop_path(Load): @Web.auth @Web.setting def get(self): id = self.input('id') Device.setCronOper(self) self.data['info'] = {} if id: self.data['info'] = self.service('common').one('device_set_loop', id=id) self.data['gateway'] = self.service('common').list('device_gateway', search={'farm_id':self.data['setting']['farm']}) self.data['device'] = Device.getByGateway(self, search={'hardware_type' : 3,'farm_id':self.data['setting']['farm']}) self.view("device/alert/loop.html") @Web.auth @Web.setting def post(self): id = self.input('id') update = {} update['devices'] = self.inputs('update_devices') update['oper'] = self.input('update_oper') update['loop'] = self.input('update_loop') update['hour'] = self.input('update_hour') update['minute'] = self.input('update_minute') update['looptype'] = self.input('update_looptype') if not update['devices']: self.out(u'请选择设备') return if not update['oper']: self.out(u'请选择执行结果') return if not update['hour']: self.out(u'请选择执行时间') return if not update['looptype']: self.out(u'请选择执行时间') return if update['looptype'] != '1' and not update['loop']: self.out(u'请选择执行时间') return update['devices'] = str(update['devices']) state = self.service('common').update('device_set_loop', id, update) self.out('yes', {'id':state}) @Web.auth @Web.setting def delete(self): id = self.input('id') if not id: self.out('no') return state = self.input('state', False) update = {} update['status'] = state state = self.service('common').update('device_set_loop', id, update) self.out('yes', {'state':state}) #智能设置-条件控制 class set_condition_path(Load): @Web.auth @Web.setting def get(self): self.data['name'] = '条件控制' Device.set(self) Device.setCronOper(self) self.data['gateway'] = self.service('common').list('device_gateway', search={'farm_id':self.data['setting']['farm']}) self.data['device'] = Device.getByGateway(self, search={'hardware_type': 3,'farm_id':self.data['setting']['farm']}) self.data['list'] = self.service('common').list('device_set_condition', state=True, page={'num':10}, search={'farm_id':self.data['setting']['farm']}) if self.data['list']: for key, value in enumerate(self.data['list']): self.data['list'][key]['device'] = [] if value['devices']: device = Device.get(self, search={'id--ins':value['devices'],'farm_id':self.data['setting']['farm']}) if device: self.data['list'][key]['device'] = device self.data['list'][key]['cdates'] = Demeter.date(value['cdate']) self.data['list'][key]['oper'] = self.data['opers'][value['oper']-1]['name'] self.data['list'][key]['condition'] = self.data['condition'][value['condition']-1]['exp'] gateway = self.service('common').one('device_gateway', id=value['gateway_id']) self.data['list'][key]['gatewayName'] = gateway['name'] device = self.service('common').one('device_info', id=value['device_id']) if device: self.data['list'][key]['deviceName'] = device['name'] type_info = self.service('common').one('device_type', id=device['type_id']) self.data['list'][key]['unit'] = type_info['unit'] self.view("device/set/condition.html") class update_set_condition_path(Load): @Web.auth @Web.setting def get(self): id = self.input('id') Device.setCronOper(self) self.data['info'] = {} if id: self.data['info'] = self.service('common').one('device_set_condition', id=id) self.data['gateway'] = self.service('common').list('device_gateway', search={'farm_id':self.data['setting']['farm']}) self.data['device'] = Device.getByGateway(self, search={'hardware_type' : 3,'farm_id':self.data['setting']['farm']}) self.data['device_list'] = self.service('common').list('device_info', search={'hardware_type--ins' : (2,4),'gateway_id':self.data['gateway'][0]['id']}) self.view("device/alert/condition.html") @Web.auth @Web.setting def post(self): id = self.input('id') update = {} update['devices'] = self.inputs('update_devices') update['oper'] = self.input('update_oper') update['gateway_id'] = self.input('update_gateway_id') update['device_id'] = self.input('update_device_id') update['condition'] = self.input('update_condition') update['value'] = self.input('update_value') update['notice'] = self.input('update_notice') if not update['devices']: self.out(u'请选择设备') return if not update['oper']: self.out(u'请选择执行结果') return if not update['gateway_id']: self.out(u'请选择设备条件') return if not update['device_id']: self.out(u'请选择设备条件') return if not update['condition']: self.out(u'请选择判断条件') return if not update['value']: self.out(u'请输入判断条件的值') return if update['notice']: update['notice'] = True else: update['notice'] = False update['devices'] = str(update['devices']) state = self.service('common').update('device_set_condition', id, update) self.out('yes', {'id':state}) @Web.auth @Web.setting def delete(self): id = self.input('id') if not id: self.out('no') return state = self.input('state', False) update = {} update['status'] = state state = self.service('common').update('device_set_condition', id, update) self.out('yes', {'state':state}) #更新控制设备的状态 class update_path(Load): @Web.auth @Web.setting def post(self): id = self.input('id') value = self.input('value') if id: Demeter.service('device').switch(id, switch=value) self.out('yes', {'id':id}) """ yield self.switch(id, value) Shell.popen(Demeter.path + 'switch.py ' + id + ' ' + value, bg=True) response = response.replace("\n", "") if response == 'ok': self.out('yes', {'id':id}) else: model = Demeter.model('notice_type') model.key = response info = model.select(type='fetchone') if info: response = info['name'] self.out(response) """ else: self.out('no') @tornado.gen.coroutine def switch(self, id, value): Demeter.service('device').switch(id, switch=value) class get_path(Load): @Web.auth @Web.setting def get(self): # 根据网关id获取设备 id = self.input('id') device = Device.get(self, search={'gateway_id':id, 'hardware_type': 2,'farm_id':self.data['setting']['farm']}) self.view("device/alert/select_device.html")