| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- import datetime
- import time
- from smartfarming.models.device import MongoDevice, MongoSCDData, MongoDeviceType, MongoXYCBData
- from kedong.decoration import kedong_deco, PortError
- from smartfarming.utils import get_address_by_lntlat, get_weather_info
- from smartfarming.models.user import MongoOperateLogs
- def operation_log(uid,content,target_id,operation_type,ip):
- """
- uid 必传 操作者id
- content 必传 操作内容
- target_id 必传 被操作者id
- operation_type 必传 对设备操作0 对用户操作传1
- """
- if not (uid or content or target_id or operation_type or ip):
- raise PortError('log',"日志记录参数缺失")
- try:
- MongoOperateLogs(addtime=int(time.time()), uid=uid, content=content, target_id=target_id,operation_type=operation_type,ip=ip).save()
- except Exception as e:
- print("操作日志存储失败", e)
- @kedong_deco(login_required=False)
- def weathers(request):
- """
- 天气接口
- 参数
- lat 必传(str) 纬度
- lng 必传(str) 经度
- 返回值:
- "data": [
- {
- "id": 1201,
- "province": "新疆维吾尔自治区", 省
- "city": "克孜勒苏柯尔克孜自治州", 市
- "district": "阿克陶县", 县
- "lng": "75.945159", 经度
- "lat": "39.147079", 纬度
- "at": "31", 温度
- "ah": "14", 湿度
- "upl_time": "2021-10-25 14:39:48", 时间
- "win": "东风", 风向
- "win_speed": "1级", 风速
- "win_meter": "5km/h", 风力
- "wea": "多云", 天气
- "visibility": "30km", 能见度
- "pressure": "863", 压力
- "air": "40", 空气
- "air_pm25": "19", 空气PM2.5
- "air_level": "优", 空气等级
- "air_tips": "空气很好,可以外出活动,呼吸新鲜空气,拥抱大自然!" 空气说明
- }
- ],
- "params": {
- "lat": "039.1850853",
- "lng": "075.8749465"
- }
- }
- """
- lat = request.POST.get('lat', '')
- lng = request.POST.get('lng', '')
- device_id = request.POST.get('device_id')
- if not lat and not lng:
- raise PortError('', '未传经纬度')
- province, city, district = "", "", ""
- if device_id:
- try:
- instance = MongoDevice.objects.get(device_id=device_id)
- province, city, district = instance.province, instance.city, instance.district
- if (not city) and district:
- city = district
- except Exception as e:
- pass
- if not (province and city):
- province, city, district = get_address_by_lntlat(lng, lat)
- result = []
- weather_info = get_weather_info(lng, lat)
- try:
- upl_time = weather_info.get('upl_time')
- upl_time = datetime.datetime.fromtimestamp(int(upl_time)).strftime("%Y-%m-%d %H:%M:%S")
- except Exception as e:
- upl_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
- result.append({
- "province": province,
- "city": city,
- "district": district,
- "lng": lng,
- "lat": lat,
- "at": weather_info.get('tem', ''),
- "ah": weather_info.get('humidity', '%'),
- "upl_time": upl_time,
- "win": weather_info.get('win', ''),
- "win_speed": weather_info.get('win_speed', ''),
- "win_meter": weather_info.get('win_meter', ''),
- "wea": weather_info.get('wea', ''),
- "visibility": weather_info.get('visibility', ''),
- "pressure": weather_info.get('pressure', ''),
- "air": weather_info.get('air', ''),
- "air_pm25": weather_info.get('air_pm25', ''),
- "air_level": weather_info.get('air_level', ''),
- "air_tips": weather_info.get('air_tips', ''),
- })
- return result
- @kedong_deco(login_required=True)
- def scd_gis_info(request):
- """
- 杀虫灯GIS展示信息
- 参数
- device_id 必传(str) 设备ID
- 返回值:
- "data": {
- "address": "河南省新乡市原阳县", 设备地址
- "uptime": "2022-01-02 12:12:12", 最新上传时间
- "device_name": "xxxxxx", 设备名称
- "device_id":"xxxxxxxxxxx", 设备ID
- 'device_status': "在线", 设备状态
- "at": "30", 温度
- "ah": "50", 湿度
- "ws_status": "待机", 工作状态
- "rps_status": "正常", 雨控状态
- "tt": "4", 定时时长
- "ct": "0", 电击次数
- "csq": "0" 信号强度
- }
- """
- device_id = request.POST.get('device_id')
- try:
- device_info = MongoDevice.objects.get(device_id=device_id)
- except Exception as e:
- raise PortError("device_id", "设备id参数异常")
- device_name = device_info.device_name
- if not device_name:
- device_name = MongoDeviceType.objects.get(id=4).type_name
- up_date = datetime.datetime.utcfromtimestamp(device_info.uptime)
- try:
- queryset = MongoSCDData.objects.filter(device_id=device_info.id).order_by('-id')[0]
- data_info = eval(queryset.device_data)
- except Exception as e:
- data_info = {}
- ws = data_info.get('ws', '0')
- ws_status = "待机"
- if ws == "1":
- ws_status = "工作"
- elif ws == "2":
- ws_status = "充电"
- tt = data_info.get('tt', '0')
- if tt == '0':
- tt = '常亮'
- rps_status = "正常" if data_info.get("rps", "0") == "0" else "保护"
- data = {
- "address": f"{device_info.province}{device_info.city}{device_info.district}",
- "uptime": up_date.strftime("%Y-%m-%d %H:%M:%S"),
- "device_name": device_name,
- "device_id": device_info.device_id,
- 'device_status': "在线" if device_info.device_status == 1 else "离线",
- "ws_status": ws_status,
- "rps_status": rps_status,
- "tt": tt,
- "at": data_info.get('at', ''),
- "ah": data_info.get('ah', ''),
- "ct": data_info.get('ct', '0'),
- "csq": data_info.get('csq', '0')
- }
- return data
- @kedong_deco(login_required=True)
- def xycb_gis_info(request):
- """
- 性诱测报GIS展示信息
- 参数
- device_id 必传(str) 设备ID
- 返回值:
- "data": {
- "address": "河南省新乡市原阳县", 设备地址
- "uptime": "2022-01-02 12:12:12", 最新上传时间
- "device_name": "xxxxxx", 设备名称
- "device_id":"xxxxxxxxxxx", 设备ID
- 'device_status': "在线", 设备状态
- "at": "30", 温度
- "ah": "50", 湿度
- "ws_status": "待机", 工作状态
- "cs_status": "非充电", 充电状态
- "bs_status": "正常", 电池状态
- "infr_ct": "0", 击虫次数
- "csq": "0" 信号强度
- }
- """
- device_id = request.POST.get('device_id')
- try:
- device_info = MongoDevice.objects.get(device_id=device_id)
- except Exception as e:
- raise PortError("device_id", "设备id参数异常")
- device_name = device_info.device_name
- if not device_name:
- device_name = MongoDeviceType.objects.get(id=4).type_name
- up_date = datetime.datetime.utcfromtimestamp(device_info.uptime)
- try:
- queryset = MongoXYCBData.objects.filter(device_id=device_info.id).order_by('-id')[0]
- data_info = eval(queryset.device_data)
- except Exception as e:
- data_info = {}
- ws = data_info.get('ws', '0')
- ws_status = "待机"
- if ws == "1":
- ws_status = "工作"
- elif ws == "2":
- ws_status = "充电"
- bs = data_info.get('bs', '0')
- bs_status = '正常'
- if bs == '1':
- bs_status = '欠压'
- elif bs == '2':
- bs_status = '过压'
- cs_status = '非充电' if data_info.get('cs', '0') == '0' else '充电'
- data = {
- "address": f"{device_info.province}{device_info.city}{device_info.district}",
- "uptime": up_date.strftime("%Y-%m-%d %H:%M:%S"),
- "device_name": device_name,
- "device_id": device_info.device_id,
- 'device_status': "在线" if device_info.device_status == 1 else "离线",
- "at": data_info.get('at', ''),
- "ah": data_info.get('ah', ''),
- "ws_status": ws_status,
- "cs_status": cs_status,
- "bs_status": bs_status,
- "infr_ct": data_info.get('infr_ct', '0'),
- "csq": data_info.get('csq')
- }
- return data
- @kedong_deco(login_required=True)
- def get_spore_time(request):
- """
- 获取孢子仪载玻片/培养夜时间
- 获取性诱设备优芯
- 参数:
- device_type_id 必传 设备类型 7孢子仪 4性诱设备
- d_id 必传 设备自增id
- 返回:
- glass_slide_time 载玻片更换时间
- cultivate_time 培养液更换时间
- """
- post_info = request.POST
- device_type_id = post_info.get("device_type_id", '')
- d_id = post_info.get("d_id", '')
- if not d_id:
- raise PortError('d_id', "参数缺失")
- if not device_type_id:
- raise PortError('device_type_id',"参数缺失")
- devices = MongoDevice.objects.get(id=d_id, device_type_id=device_type_id)
- if int(device_type_id) == 7:
- glass_slide_time = devices.glass_slide_time
- cultivate_time = devices.cultivate_time
- if glass_slide_time == 0 or cultivate_time == 0:
- glass_slide_time = ""
- cultivate_time = ""
- return {
- "glass_slide_time":glass_slide_time,
- "cultivate_time":cultivate_time,
- }
- elif int(device_type_id) == 4:
- decoy = devices.decoy
- return {
- "decoy":decoy
- }
-
- @kedong_deco(login_required=True)
- def updata_spore_time(request):
- """
- 更新孢子仪载玻片/培养夜时间
- 更新性诱设备诱芯
- 参数:
- device_type_id 必传 设备类型 7孢子仪 4性诱设备
- d_id 必传 设备自增id
- glass_slide_time 必传 载玻片更换时间
- cultivate_time 必传 培养液更换时间
- decoy 必传 性诱设备诱芯
- """
- myuid = request.myuser.uid
- user_type = request.user_type
- post_info = request.POST
- device_type_id = post_info.get("device_type_id", '')
- d_id = post_info.get("d_id", '')
- glass_slide_time = post_info.get("glass_slide_time", '')
- cultivate_time = post_info.get("cultivate_time", '')
- decoy = post_info.get("decoy", '')
- if not d_id:
- raise PortError('d_id', "参数缺失")
- if not device_type_id:
- raise PortError('device_type_id',"参数缺失")
- try:
- devices = MongoDevice.objects.get(id=d_id)
- except:
- raise PortError('',"未找到此设备")
- if int(device_type_id) == 7:
- devices.glass_slide_time = glass_slide_time
- devices.cultivate_time = cultivate_time
- devices.save()
- content = "更新孢子仪,载玻片时间:%s,培养夜时间:%s"
- operation_log(myuid, content % (glass_slide_time, cultivate_time), devices.device_id, 0, request.ip)
- elif int(device_type_id) == 4:
- if not decoy:
- raise PortError('decoy',"参数缺失")
- devices.decoy = decoy
- devices.save()
- content = "更新性诱设备诱芯:%s"
- operation_log(myuid, content % decoy, devices.device_id, 0, request.ip)
- return True
|