from rest_framework.views import APIView from rest_framework.response import Response import pymongo from urllib import parse import datetime import re import json def get_device(device_type=None): device = { "864865060482180": "5", "860181067701570": "15", "L31671797-1": "6", "L42185263-1": "6" } if not device_type: return device else: new_device = {} for k, v in device: if v == device_type: new_device[k] = v return new_device def get_table(): passwd = parse.quote_plus("yfkj@6020") user = parse.quote_plus("root") myclient = pymongo.MongoClient("mongodb://{0}:{1}@8.136.98.49:57017/".format(user,passwd)) return myclient class CountDeviceStatus(APIView): # 设备状态,在线与离线数量 def post(self, request): devices = get_device() device_ids = devices.keys() # 获取设备的版本,经纬度 myclient = get_table() db = myclient.smartfarming sa_device = db.sa_device query = { 'device_id': { "$in": list(device_ids) } } device = list(sa_device.find(query, {"device_id": 1,"lng":1, "lat": 1, "device_status": 1, "_id": 0, "uptime": 1, "province": 1, "city":1, "district": 1, "device_name": 1})) offline = 0 online = 0 new = [] for k in device: if k.get("device_status") == 1: online += 1 else: offline += 1 new.append(k) myclient.close() return Response({"count": offline + online, "online": online, "offline": offline, "device": new, "mtg_name": True}) class QxData(APIView): # 气象、墒情监测数据 def post(self, request): result = {} device_id = { "气象站": "864865060482180", "墒情站": "860181067701570" } myclient = get_table() db = myclient.smartfarming qxz_conf = db.sa_qxz_conf query = {'device_id': "864865060482180"} conf = qxz_conf.find_one(query, {"_id": 0, "uptime": 0, "device_id": 0, "id": 0}) conf = {k: v for k, v in conf.items() if v is not None and v != ""} qxz_data = db.sa_qxz_data query = {'device_id': "864865060482180"} field = conf.keys() fields = {i: 1 for i in field} fields.update({"_id": 0, "uptime": 1}) data = qxz_data.find(query, fields).sort("uptime", pymongo.DESCENDING).limit(1) data = data[0] tmp = {} print(conf) for k, v in data.items(): tp = conf.get(k) if tp: tp_m = tp.split("#") tmp[k] = v.split("#")[0] + tp_m[-1] sa_nd_qxz_status = db.sa_nd_qxz_status qxz_obj = sa_nd_qxz_status.find({"device_id": "860181067701570"}, {"_id": 0}).sort("upl_time", pymongo.DESCENDING).limit(1) qxz_obj = qxz_obj[0] if qxz_obj.get("depth"): depth = qxz_obj.get("depth") else: depth = "" len_ = len((qxz_obj.get("temp")).split(",")) for i in range(len_): if i != 0: depth += "," depth += str((i+1)*10) data = {"depth":depth,"csq":qxz_obj.get("csq"),"temp":qxz_obj.get("temp"),"swc":qxz_obj.get("swc"),"atm":qxz_obj.get("atm"),"at":qxz_obj.get("at"),"ats":qxz_obj.get("ats"),"uptime":qxz_obj.get("upl_time")} myclient.close() return Response({ "qxz":tmp, "qxz_conf": conf, "sqz": data, "mtg_name": True }) class QxWarning(APIView): # 气象预警数据 def post(self, request): myclient = get_table() db = myclient.smartfarming qxz_alarm = db.sa_qxz_alarm_log_new k = qxz_alarm.find_one(sort=[("id", -1)])["id"] + 1 query = {'device_id': "864865060482180"} data = qxz_alarm.find(query, {"_id":0, "warning_content": 1, "upl_time": 1}).sort("upl_time", pymongo.DESCENDING).limit(5) myclient.close() return Response({"warning": list(data), "mtg_name": True}) class CameraDetail(APIView): # 监控数据 def post(self, request): myclient = get_table() db = myclient.smartfarming sa_device_camera = db.sa_device_camera sa_device_camera_account = db.sa_device_camera_account sa_device = db.sa_device result = [] for device_id in ["L31671797-1", "L42185263-1"]: camera = sa_device_camera.find_one({"device_id": device_id}, {"device_info": 1, "account_id": 1, "_id": 0}) addr = camera.get("device_info") account_id = camera.get("account_id") camera_account = sa_device_camera_account.find_one({"id": account_id}, {"account_type": 1, "_id": 0}) if camera_account: account_type = camera_account.get("account_type") if account_type == 0: addr = addr.replace("http://", "https://") elif account_type == 1: pass else: addr = addr.replace("http://", "https://") device_info = sa_device.find_one({"device_id": device_id}, {"_id": 0, "device_name":1}) device_name = device_info.get("device_name") result.append({ "device_id": device_id, "device_name": device_name if device_name else device_id, "device_info": addr, "is_name": device_name, }) myclient.close() return Response({"camera": result, "mtg_name": True})