Sfoglia il codice sorgente

優化插座查詢;插座用電量新增下標字段

guanhailong 2 anni fa
parent
commit
aa82a0acd0

+ 78 - 73
Controller/SensorGateway/GatewayDeviceController.py

@@ -254,19 +254,40 @@ class GatewayDeviceView(View):
         device_id = request_dict.get('deviceId', None)
         if not device_id:
             return response.json(444)
-        device_info_qs = Device_Info.objects.filter(id=device_id).values('id', 'Type', 'NickName', 'UID',
-                                                                         'serial_number')
-        if not device_info_qs.exists():
+        device_qs = FamilyRoomDevice.objects.filter(device_id=device_id, sub_device=0)
+        if not device_qs.exists():
             return response.json(173)
-        device_info_qs = device_info_qs.first()
-        Type = device_info_qs['Type']
         try:
+            device_qs = device_qs.values('family_id', 'device_id', 'room_id', 'device__Type', 'device__NickName',
+                                         'device__UID',
+                                         'device__serial_number')
+            device_qs = device_qs.first()
+            room_id = device_qs['room_id']
+            family_id = device_qs['family_id']
+            gateway_room_name = ''
+            if room_id:
+                room_qs = FamilyRoom.objects.filter(id=room_id)
+                gateway_room_name = room_qs.first().name if room_qs.exists() else ''
+
+            iot_device_info_qs = iotdeviceInfoModel.objects.filter(
+                serial_number=device_qs['device__serial_number'][0:6])
+            iot_data = {}
+            if iot_device_info_qs.exists():
+                iot_device_Info = iot_device_info_qs.values('endpoint', 'token_iot_number')
+                iot_data = {
+                    'endpoint': iot_device_Info[0]['endpoint'],
+                    'token_iot_number': iot_device_Info[0]['token_iot_number']
+                }
             gateway = {
-                'deviceId': device_info_qs['id'],
-                'deviceType': device_info_qs['Type'],
-                'deviceNickName': device_info_qs['NickName'],
-                'UID': device_info_qs['UID'],
-                'serialNumber': device_info_qs['serial_number'][:6] if device_info_qs['serial_number'][:6] else '',
+                'deviceId': device_qs['device_id'],
+                'deviceType': device_qs['device__Type'],
+                'deviceNickName': device_qs['device__NickName'],
+                'UID': device_qs['device__UID'],
+                'serialNumber': device_qs['device__serial_number'],
+                'roomName': gateway_room_name,
+                'iot': iot_data,
+                'roomId': room_id,
+                'familyId': family_id,
                 'power': 0,
                 'electricity': 0,
                 'countDownTime': 0,
@@ -274,69 +295,16 @@ class GatewayDeviceView(View):
                 'online': False,
                 'accumulatedTime': 0,
                 'start': False,
-                'roomName': '',
-                'iot_data': {},
-                'roomId': '',
-                'familyId': ''
             }
-            # 判斷设备类型
-            if Type != 201:
-                device_qs = FamilyRoomDevice.objects.filter(device_id=device_id, sub_device=0)
-                if not device_qs.exists():
-                    return response.json(173)
-                device_qs = device_qs.values('family_id', 'device_id', 'room_id', 'device__Type', 'device__NickName',
-                                             'device__UID',
-                                             'device__serial_number')
-                device_qs = device_qs.first()
-                #  獲取房间Id家庭Id
-                gateway['roomId'] = device_qs['room_id']
-                gateway['familyId'] = device_qs['family_id']
-                if gateway['roomId']:
-                    room_qs = FamilyRoom.objects.filter(id=gateway['roomId'])
-                    gateway['roomName'] = room_qs.first().name if room_qs.exists() else ''
-
-                iot_device_info_qs = iotdeviceInfoModel.objects.filter(
-                    serial_number=device_qs['device__serial_number'][0:6])
-                if iot_device_info_qs.exists():
-                    iot_device_Info = iot_device_info_qs.values('endpoint', 'token_iot_number')
-                    gateway['iot_data'] = {
-                        'endpoint': iot_device_Info[0]['endpoint'],
-                        'token_iot_number': iot_device_Info[0]['token_iot_number']
-                    }
-            else:
-                socket_info_qs = SocketInfo.objects.filter(device_id=device_id).values('online', 'type_switch',
-                                                                                       'status',
-                                                                                       'count_down_time', 'start')
-                socket_power_qs = SocketPowerStatistics.objects.filter(device_id=device_id).values('accumulated_time',
-                                                                                                   'power',
-                                                                                                   'electricity')
-                if not socket_info_qs.exists():
-                    return response.json(173)
-                # 插座电量统计
-                gateway['power'] = socket_power_qs[0]['power'] if socket_power_qs.exists() else 0
-                gateway['electricity'] = socket_power_qs[0]['electricity'] if socket_power_qs.exists() else 0
-                gateway['accumulatedTime'] = socket_power_qs[0][
-                    'accumulated_time'] if socket_power_qs.exists() else 0
-                # 插座信息
-                gateway['start'] = socket_info_qs[0]['start'] if socket_info_qs.exists() else False
-                gateway['socketStatus'] = socket_info_qs[0]['status'] if socket_info_qs[0]['status'] else False
-                gateway['online'] = socket_info_qs[0]['online'] if socket_info_qs[0]['online'] else False
-                gateway['countDownTime'] = socket_info_qs[0]['count_down_time'] if socket_info_qs[0][
-                    'count_down_time'] else 0
-                # 查詢iot
-                iot_device_info_qs = iotdeviceInfoModel.objects.filter(
-                    serial_number=device_info_qs['serial_number'][0:6])
-                if iot_device_info_qs.exists():
-                    iot_device_Info = iot_device_info_qs.values('endpoint', 'token_iot_number')
-                    gateway['iot_data'] = {
-                        'endpoint': iot_device_Info[0]['endpoint'] if iot_device_Info[0]['endpoint'] else '',
-                        'token_iot_number': iot_device_Info[0]['token_iot_number'] if iot_device_Info[0][
-                            'token_iot_number'] else ''
-                    }
-                # 設備類型
-                res = {'gateway': gateway, 'sub_device': [], 'sub_device_count': 0,
-                       'scene_count': 0}
-                return response.json(0, res)
+            if device_qs['device__Type'] == 201:
+                socket_data = cls.smart_socket(device_id, response)
+                gateway['power'] = socket_data['power']
+                gateway['electricity'] = socket_data['electricity']
+                gateway['countDownTime'] = socket_data['countDownTime']
+                gateway['accumulatedTime'] = socket_data['accumulatedTime']
+                gateway['socketStatus'] = socket_data['socketStatus']
+                gateway['online'] = socket_data['online']
+                gateway['start'] = socket_data['start']
             family_device_qs = FamilyRoomDevice.objects.filter(device_id=device_id)
             family_device_qs = family_device_qs.filter(~Q(sub_device=0)).order_by('-created_time')
 
@@ -368,7 +336,7 @@ class GatewayDeviceView(View):
                         'roomName': gateway_room_name,
                         'roomId': room_qs.first().id if room_qs.exists() else 0,
                         'ieeeAddr': gateway_sub_qs['ieee_addr'],
-                        'familyId': gateway['familyId'],
+                        'familyId': family_id,
                     })
             scene_count = SmartScene.objects.filter(Q(device_id=device_id) | Q(sub_device_id__in=sub_id_list)).count()
             res = {'gateway': gateway, 'sub_device': sub_device, 'sub_device_count': len(sub_device),
@@ -379,6 +347,43 @@ class GatewayDeviceView(View):
             print(e.args)
             return response.json(500)
 
+    @classmethod
+    def smart_socket(cls, device_id, response):
+        """
+        查詢插座信息
+        """
+        data = {
+            'power': 0,
+            'electricity': 0,
+            'countDownTime': 0,
+            'accumulatedTime': 0,
+            'socketStatus': False,
+            'online': False,
+            'start': False,
+        }
+        # 插座信息
+        socket_info_qs = SocketInfo.objects.filter(device_id=device_id).values('online', 'type_switch',
+                                                                               'status',
+                                                                               'count_down_time', 'start')
+        if not socket_info_qs.exists():
+            return response.json(173)
+        # 插座信息
+        data['socketStatus'] = socket_info_qs[0]['status'] if socket_info_qs[0]['status'] else False
+        data['start'] = socket_info_qs[0]['start'] if socket_info_qs[0]['status'] else False
+        data['online'] = socket_info_qs[0]['online'] if socket_info_qs[0]['online'] else False
+        data['countDownTime'] = socket_info_qs[0]['count_down_time'] if socket_info_qs[0][
+            'count_down_time'] else 0
+        # 查詢插座電量
+        socket_power_qs = SocketPowerStatistics.objects.filter(device_id=device_id).values('accumulated_time',
+                                                                                           'power',
+                                                                                           'electricity')
+        if not socket_power_qs.exists():
+            return data
+        data['power'] = socket_power_qs[0]['power']
+        data['electricity'] = socket_power_qs[0]['electricity']
+        data['accumulatedTime'] = socket_power_qs[0]['accumulated_time']
+        return data
+
 #
 #                   ___====-_  _-====___
 #             _--^^^#####//      \\#####^^^--_

+ 111 - 52
Controller/SensorGateway/SmartSocketController.py

@@ -76,6 +76,8 @@ class SmartSocketView(View):
             return self.get_log(request_dict, response)
         elif operation == 'del-socket-schedule':  # 批量刪除排程
             return self.del_socket_schedule(request_dict, response, user_id)
+        elif operation == 'get-unit-scene':  # 查詢設備每日/月用電量
+            return self.get_unit_scene(request_dict, response)
         return response.json(404)
 
     @classmethod
@@ -379,7 +381,7 @@ class SmartSocketView(View):
 
     # 以下是查询智能插座接口
 
-    @classmethod
+    @staticmethod
     def get_all_scene(cls, request_dict, response):
         """
         统计智能插座电量
@@ -390,12 +392,9 @@ class SmartSocketView(View):
         @return: response
         """
         serial_number = request_dict.get('serialNumber', None)
-        unit = request_dict.get('unit', None)
         # 确定是否会传值
-        startTime = request_dict.get('startTime', None)
-        endTime = request_dict.get('endTime', None)
-        if not all([unit, serial_number, startTime, endTime]):
-            return response.json(444, {'error param': 'unit or serial_number or startTime or endTime'})
+        if not all([serial_number]):
+            return response.json(444, {'error param': 'serialNumber'})
         socket_power_qs = SocketPowerStatistics.objects.filter(serial_number=serial_number).values('electricity',
                                                                                                    'accumulated_time',
                                                                                                    'power',
@@ -406,15 +405,15 @@ class SmartSocketView(View):
             data = {}
             # 设备累计电量
             all_electricity = socket_power_qs.aggregate(total=Sum('electricity'))
-            data['electricityAll'] = all_electricity['total'] if all_electricity['total'] else 0.00
+            data['electricityAll'] = all_electricity['total'] if all_electricity['total'] else 0
             # 当天使用电量
             data['electricityToday'] = socket_power_qs[0]['electricity'] if socket_power_qs[0][
-                'electricity'] else 0.00
+                'electricity'] else 0
             # 当天累计时长
             data['accumulated_time'] = socket_power_qs[0]['accumulated_time'] if socket_power_qs[0][
-                'accumulated_time'] else '00:00:00'
+                'accumulated_time'] else 0
             # 功率
-            data['power'] = socket_power_qs[0]['power'] if socket_power_qs[0]['power'] else 0.00
+            data['power'] = socket_power_qs[0]['power'] if socket_power_qs[0]['power'] else 0
 
             # 本月电费
             nowTime = int(time.time())
@@ -428,7 +427,7 @@ class SmartSocketView(View):
             electricity = socket_power_qs.filter(created_time__gte=startTime_now,
                                                  created_time__lt=endTime_now).aggregate(
                 total=Sum('electricity'))
-            data['electricityMonth'] = electricity['total'] if electricity['total'] else 0.00
+            data['electricityMonth'] = electricity['total'] if electricity['total'] else 0
 
             # 昨天使用电量
             today = datetime.date.today()  # 获取今日日期
@@ -441,47 +440,6 @@ class SmartSocketView(View):
                                                created_time__lt=yesterday_end_time).values('electricity')
             data['electricityYesterday'] = socket_qs[0]['electricity'] if socket_qs.exists() else 0
 
-            #  时间和功耗
-            new_list = []
-            socket_qs = socket_power_qs.filter(created_time__gte=startTime, created_time__lt=endTime).aggregate(
-                electricity=Sum('electricity'), accumulatedTime=Sum('accumulated_time'))
-            data['electricityTimeAll'] = socket_qs['electricity'] if socket_qs['electricity'] else 0.0
-            data['accumulatedTimeAll'] = socket_qs['accumulatedTime'] if socket_qs['accumulatedTime'] else '0:00'
-
-            #  分割时间
-            diction = cls.splittings_time(startTime, endTime, unit)
-            if unit == 'year':
-                # 开始月
-                socket_qs = socket_power_qs.filter(created_time__gte=startTime,
-                                                   created_time__lt=diction['startMonth_time']).aggregate(
-                    electricity=Sum('electricity'), accumulatedTime=Sum('accumulated_time'))
-                electricity = socket_qs['electricity'] if socket_qs['electricity'] else 0.0
-                new_list.append({
-                    'startTime': int(startTime),
-                    'electricity': round(electricity, 1)
-                })
-            # 查询天月
-            for item in diction['time_list']:
-                socket_qs = socket_power_qs.filter(created_time__gte=item[0],
-                                                   created_time__lt=item[1]).aggregate(electricity=Sum('electricity'))
-                electricity = socket_qs['electricity'] if socket_qs['electricity'] else 0.0
-                new_list.append({
-                    'startTime': item[0],
-                    'electricity': round(electricity, 1)
-                })
-
-            if unit == 'year':
-                # 结束月
-                socket_qs = socket_power_qs.filter(created_time__gte=diction['endMonth_time'],
-                                                   created_time__lt=endTime).aggregate(
-                    electricity=Sum('electricity'))
-                electricity = socket_qs['electricity'] if socket_qs['electricity'] else 0.0
-                new_list.append({
-                    'startTime': int(endTime),
-                    'electricity': round(electricity, 1)
-                })
-
-            data['week_or_month_or_year'] = new_list
             return response.json(0, data)
         except Exception as e:
             return response.json(500, repr(e))
@@ -658,3 +616,104 @@ class SmartSocketView(View):
         except Exception as e:
             LOGGER.info('插座排程删除数据异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             return response.json(177)
+
+    @classmethod
+    def get_unit_scene(cls, request_dict, response):
+        """
+        查詢設備每日/月用電量
+        @param request_dict: 请求参数
+        @param response: 响应对象
+        @return: response
+        """
+        serial_number = request_dict.get('serialNumber', None)
+        unit = request_dict.get('unit', None)
+        # 确定是否会传值
+        startTime = request_dict.get('startTime', None)
+        endTime = request_dict.get('endTime', None)
+        if not all([unit, startTime, endTime]):
+            return response.json(500, {'errno': 'unit or startTime or endTime or serialNumber'})
+
+        try:
+            socket_power_qs = SocketPowerStatistics.objects.filter(serial_number=serial_number).values('electricity',
+                                                                                                       'accumulated_time',
+                                                                                                       'power',
+                                                                                                       'created_time')
+            #  时间和功耗
+            data = {}
+            new_list = []
+            socket_qs = socket_power_qs.filter(created_time__gte=startTime, created_time__lt=endTime).aggregate(
+                electricity=Sum('electricity'), accumulatedTime=Sum('accumulated_time'))
+
+            data['electricityTimeAll'] = socket_qs['electricity'] if socket_qs['electricity'] else 0
+            data['accumulatedTimeAll'] = socket_qs['accumulatedTime'] if socket_qs['accumulatedTime'] else 0
+
+            #  分割时间
+            diction = cls.splittings_time(startTime, endTime, unit)
+            if unit == 'year':
+                # 开始月
+                socket_qs = socket_power_qs.filter(created_time__gte=startTime,
+                                                   created_time__lt=diction['startMonth_time']).aggregate(
+                    electricity=Sum('electricity'), accumulatedTime=Sum('accumulated_time'))
+                electricity = socket_qs['electricity'] if socket_qs['electricity'] else 0
+                # 標記月日
+                subscript = cls.get_subscript(unit, startTime)
+                new_list.append({
+                    'subscript': subscript,
+                    'startTime': int(startTime),
+                    'electricity': round(electricity, 1)
+                })
+            # 查询天月
+            for item in diction['time_list']:
+                socket_qs = socket_power_qs.filter(created_time__gte=item[0],
+                                                   created_time__lt=item[1]).aggregate(electricity=Sum('electricity'))
+                electricity = socket_qs['electricity'] if socket_qs['electricity'] else 0
+                # 標記月日
+                subscript = cls.get_subscript(unit, item[0])
+                new_list.append({
+                    'subscript': subscript,
+                    'startTime': item[0],
+                    'electricity': round(electricity, 1)
+                })
+
+            if unit == 'year':
+                # 结束月
+                socket_qs = socket_power_qs.filter(created_time__gte=diction['endMonth_time'],
+                                                   created_time__lt=endTime).aggregate(
+                    electricity=Sum('electricity'))
+                electricity = socket_qs['electricity'] if socket_qs['electricity'] else 0
+                # 標記月日
+                subscript = cls.get_subscript(unit, startTime)
+                new_list.append({
+                    'subscript': subscript,
+                    'startTime': int(endTime),
+                    'electricity': round(electricity, 1)
+                })
+
+            data['week_or_month_or_year'] = new_list
+            return response.json(0, data)
+        except Exception as e:
+            return response.json(500, repr(e))
+
+    @classmethod
+    def get_subscript(cls, unit, startTime):
+        """標記月日"""
+        startTime = int(startTime)
+        # endTime = int(endTime)
+        time_tuple = time.localtime(startTime)  # 把时间戳转换成时间元祖
+        startTime = time.strftime('%Y-%m-%d-%w', time_tuple)  # 把时间元祖转换成格式化好的时间
+        if unit == 'week' or unit == 'year':
+            if unit == 'week':
+                subscript = int(str(startTime).split('-')[3])
+                return subscript
+            else:
+                startYear, startMonth, startDay = int(startTime.split('-')[0]), int(startTime.split('-')[1]), int(
+                    startTime.split('-')[2])
+                subscript = datetime.date(startYear, startMonth, startDay).month
+                subscript -= 1
+                return subscript
+        else:
+            startYear, startMonth, startDay = int(startTime.split('-')[0]), int(startTime.split('-')[1]), int(
+                startTime.split('-')[2])
+            subscript = datetime.date(startYear, startMonth, startDay).day
+            subscript -= 1
+            return subscript