Prechádzať zdrojové kódy

删除网关设备下发消息

locky 2 rokov pred
rodič
commit
c8edbd6a52

+ 1 - 0
Ansjer/Config/gatewaySensorConfig.py

@@ -8,6 +8,7 @@
 # MQTT主题名
 SMART_SCENE_TOPIC = 'loocam/gateway_sensor/smart_scene/{}'
 GET_SCENE_TOPIC = 'loocam/gateway_sensor/get_scene/{}'
+SUB_DEVICE_TOPIC = 'loocam/gateway_sensor/sub_device/{}'
 
 # 智能场景事件
 SCENE_EVENT_CREATE = 1

+ 40 - 7
Controller/SensorGateway/GatewayDeviceController.py

@@ -14,7 +14,7 @@ from django.db import transaction
 from django.db.models import Q
 from django.views.generic.base import View
 
-from Ansjer.Config.gatewaySensorConfig import SMART_SCENE_TOPIC, SCENE_EVENT_DELETE
+from Ansjer.Config.gatewaySensorConfig import SMART_SCENE_TOPIC, SCENE_EVENT_DELETE, SUB_DEVICE_TOPIC
 from Ansjer.config import CONFIG_INFO, AWS_IOT_SES_ACCESS_CHINA_ID, AWS_IOT_SES_ACCESS_CHINA_SECRET, \
     AWS_IOT_SES_ACCESS_CHINA_REGION, AWS_IOT_SES_ACCESS_FOREIGN_ID, AWS_IOT_SES_ACCESS_FOREIGN_SECRET, \
     AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA
@@ -197,6 +197,22 @@ class GatewayDeviceView(View):
                             sub_id_list = gateway_qs.values_list('id', flat=True)
                             smart_scene_qs = SmartScene.objects.filter(
                                 Q(device_id=device_id) | Q(sub_device_id__in=sub_id_list))
+
+                            # 下发删除设备消息
+                            ieee_addr_list = gateway_qs.values_list('ieee_addr', flat=True)
+                            topic_name = SUB_DEVICE_TOPIC.format(serial_number)
+                            for ieee_addr in ieee_addr_list:
+                                msg = {
+                                    'zigbee': 'delete',
+                                    'ieee': ieee_addr
+                                }
+                                success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
+                                try:
+                                    assert success
+                                except AssertionError:
+                                    return response.json(10044)
+                                time.sleep(0.3)
+
                         else:
                             smart_scene_qs = SmartScene.objects.filter(device_id=device_id)
                         if smart_scene_qs.exists():
@@ -223,14 +239,31 @@ class GatewayDeviceView(View):
                     sub_id_list = list(map(int, sub_ids.split(',')))
                     FamilyRoomDevice.objects.filter(sub_device__in=sub_id_list).delete()
 
+                    # 查询网关序列号,确定MQTT主题
+                    sub_device_qs = GatewaySubDevice.objects.filter(id=sub_id_list[0]). \
+                        values('device__serial_number')
+                    assert sub_device_qs.exists()
+                    serial_number = sub_device_qs[0]['device__serial_number']
+
+                    # 下发删除设备消息
+                    gateway_sub_device_qs = GatewaySubDevice.objects.filter(id__in=sub_id_list)
+                    ieee_addr_list = gateway_sub_device_qs.values_list('ieee_addr', flat=True)
+                    topic_name = SUB_DEVICE_TOPIC.format(serial_number)
+                    for ieee_addr in ieee_addr_list:
+                        msg = {
+                            'zigbee': 'delete',
+                            'ieee': ieee_addr
+                        }
+                        success = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
+                        try:
+                            assert success
+                        except AssertionError:
+                            return response.json(10044)
+                        time.sleep(0.3)
+
                     # 删除场景,下发MQTT通知设备
                     smart_scene_qs = SmartScene.objects.filter(sub_device_id__in=sub_id_list)
                     if smart_scene_qs.exists():
-                        # 查询网关序列号,确定MQTT主题
-                        sub_device_qs = GatewaySubDevice.objects.filter(id=sub_id_list[0]).\
-                            values('device__serial_number')
-                        assert sub_device_qs.exists()
-                        serial_number = sub_device_qs[0]['device__serial_number']
                         topic_name = SMART_SCENE_TOPIC.format(serial_number)
 
                         smart_scene_info = smart_scene_qs.values('id')
@@ -248,7 +281,7 @@ class GatewayDeviceView(View):
                             time.sleep(0.3)
                         smart_scene_qs.delete()
 
-                    GatewaySubDevice.objects.filter(id__in=sub_id_list).delete()
+                    gateway_sub_device_qs.delete()
                     SceneLog.objects.filter(sub_device_id__in=sub_id_list).delete()
 
                 return response.json(0)