wxr
2021-07-01 43b0d5870d528f23ecd6aeceb6cfd4325188b46f
HDL_ON/DAL/DriverLayer/Control.cs
@@ -50,15 +50,15 @@
                return _msg_id++;
            }
        }
        /// <summary>
        /// 获取13位时间戳
        /// </summary>
        /// <returns></returns>
        public string Get_TimeStamp()
        {
            long t = DateTime.Now.Ticks / 10000;
            return t.ToString();
        }
        ///// <summary>
        ///// 获取13位时间戳
        ///// </summary>
        ///// <returns></returns>
        //public string Get_TimeStamp()
        //{
        //    long t = DateTime.Now.Ticks / 10000;
        //    return t.ToString();
        //}
        /// <summary>
        /// 是否搜索本地网关成功
@@ -229,7 +229,7 @@
        public void SearchLoaclGateway()
        {
            //2021-01-15 : 住宅没有绑定网关的时候不用搜索,并且不能链接mqtt
            if(DB_ResidenceData.Instance.HomeGateway == null)
            if(DB_ResidenceData.Instance.HomeGateway == null || string.IsNullOrEmpty(DB_ResidenceData.Instance.HomeGateway.gatewayId))
            {
                return;
            }
@@ -283,6 +283,30 @@
        /// </summary>
        public void ControlScene(Scene scene)
        {
            //体验模式
            if(MainPage.NoLoginMode)
            {
                foreach(var sceneFunction in scene.functions)
                {
                    var revString = "";
                    var upDataObj = new AlinkFunctionStatusObj();
                    upDataObj.id = "999";
                    upDataObj.objects = new List<AlinkStatusData>();
                    var asd = new AlinkStatusData() { deviceId = sceneFunction.localFunction.deviceId, sid = sceneFunction.sid };
                    var status1 = new List<AttributesStatus>();
                    foreach (var dic in sceneFunction.status)
                    {
                        status1.Add(new AttributesStatus() { key = dic.key, value = dic.value });
                    }
                    asd.status = status1;
                    upDataObj.objects.Add(asd);
                    revString = Newtonsoft.Json.JsonConvert.SerializeObject(upDataObj);
                    UpdataFunctionStatus(revString, null, true);
                }
                return;
            }
            //远程或者控制link网关场景
            if (!Ins.GatewayOnline_Local || DB_ResidenceData.Instance.GatewayType == 1)
            {
                new System.Threading.Thread(() =>
@@ -336,10 +360,31 @@
                }
            }
            MainPage.Log($"发送数据:{Newtonsoft.Json.JsonConvert.SerializeObject(commandDictionary)}");
            ///dome控制
            if (MainPage.NoLoginMode)
            {
                var revString = "";
                var upDataObj = new AlinkFunctionStatusObj();
                upDataObj.id = "999";
                upDataObj.objects = new List<AlinkStatusData>();
                var asd = new AlinkStatusData() { deviceId = function.deviceId, sid = function.sid };
                var status1 = new List<AttributesStatus>();
                foreach (var dic in commandDictionary)
                {
                    status1.Add(new AttributesStatus() { key = dic.Key, value = dic.Value });
                }
                asd.status = status1;
                upDataObj.objects.Add(asd);
                revString = Newtonsoft.Json.JsonConvert.SerializeObject(upDataObj);
                UpdataFunctionStatus(revString, null, true);
                return;
            }
            //MainPage.Log($"发送数据:{Newtonsoft.Json.JsonConvert.SerializeObject(commandDictionary)}");
            ///第三方涂鸦设备统一使用远程控制
            switch(function.spk)
            switch (function.spk)
            {
                case SPK.ElectricTuyaAirCleaner:
                case SPK.ElectricTuyaFan:
@@ -414,6 +459,23 @@
        /// </summary>
        public void SwtichFunctions(bool open,List<Function> functions)
        {
            //dome模式控制
            if(MainPage.NoLoginMode)
            {
                new System.Threading.Thread(() =>
                {
                    foreach (var temp in functions)
                    {
                        Dictionary<string, string> d1 = new Dictionary<string, string>();
                        d1.Add(FunctionAttributeKey.OnOff, open ? "on" : "off");
                        SendWriteCommand(temp, d1);
                        System.Threading.Thread.Sleep(100);
                    }
                })
                { IsBackground = true }.Start();
                return;
            }
            var count = 0;
            var logString = open ? "打开\r\n" : "关闭\r\n";
            List<ApiAlinkControlActionObj> actionObjs = new List<ApiAlinkControlActionObj>();
@@ -477,47 +539,55 @@
        /// 发送读取命令
        /// 自动判断是否为A协议设备
        /// </summary>
        public void SendReadCommand(Function function)
        public void SendReadCommand(Function function ,bool forceRemote = false)
        {
            function.refreshTime = DateTime.Now;
            if (Ins.GatewayOnline_Local)
            if (forceRemote)
            {
                if (DB_ResidenceData.Instance.GatewayType == 0)
                var pm = new DAL.Server.HttpServerRequest();
                var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId });
            }
            else
            {
                if (Ins.GatewayOnline_Local)
                {
                    try
                    if (DB_ResidenceData.Instance.GatewayType == 0)
                    {
                        new Control_Udp().ReadBusData(function);
                        try
                        {
                            new Control_Udp().ReadBusData(function);
                        }
                        catch (Exception ex)
                        {
                            MainPage.Log($"发送数据异常: {ex.Message}");
                        }
                    }
                    catch (Exception ex)
                    else
                    {
                        MainPage.Log($"发送数据异常: {ex.Message}");
                        var readKey = new Dictionary<string, string>();
                        readKey.Add("sid", function.sid);
                        var readDataObj = new AlinkReadFunctionStatusObj()
                        {
                            id = Ins.msg_id.ToString(),
                            objects = new List<Dictionary<string, string>>()
                        {
                            readKey
                        },
                            time_stamp = Utlis.GetTimestamp()
                        };
                        var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj);
                        var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ReadStatus, functionControlDataJson);
                        MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}");
                        new Control_Udp().SendLocalHdlLinkData(sendBytes, readDataObj.id);
                    }
                }
                else
                {
                    var readKey = new Dictionary<string, string>();
                    readKey.Add("sid", function.sid);
                    var readDataObj = new AlinkReadFunctionStatusObj()
                    {
                        id = Ins.msg_id.ToString(),
                        objects = new List<Dictionary<string, string>>()
                        {
                            readKey
                        },
                        time_stamp = Utlis.GetTimestamp()
                    };
                    var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj);
                    var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ReadStatus, functionControlDataJson);
                    MainPage.Log($"本地通讯 发送HDL-Link数据:{functionControlDataJson}");
                    new Control_Udp().SendLocalHdlLinkData(sendBytes, readDataObj.id);
                    var pm = new DAL.Server.HttpServerRequest();
                    var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId });
                }
            }
            else
            {
                var pm = new DAL.Server.HttpServerRequest();
                var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId });
            }
        }
@@ -551,7 +621,7 @@
            }
        }
        /// <summary>
        /// 转换通讯数据
        /// 转换发送数据
        /// </summary>
        public byte[] ConvertSendBodyData(string topic, string bodyDataString)
        {
@@ -561,7 +631,7 @@
            string sendDataString = topicString + lengthString + bodyDataString;
            byte[] sendDataBytes = Encoding.ASCII.GetBytes(sendDataString);
            //MainPage.Log($"转换HDL-Link数据\r\n{sendDataString}\r\n");
            MainPage.Log($"转换HDL-Link数据\r\n{sendDataString}\r\n");
            return sendDataBytes;
        }
@@ -602,8 +672,8 @@
                    }
                }
                MainPage.Log($"局域网信息: {receiveObj.Topic}");
                MainPage.Log($"内容: {res[1]}");
                MainPage.Log($"局域网信息: {receiveObj.Topic}  : 内容: {res[1]}");
                //验证有效数据长度
                //if (res[1].Length != receiveObj.Length)
@@ -620,8 +690,9 @@
                    {
                        return receiveObj;
                    }
                    var device = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceModule>(bodyJObj.objects.ToString());
                    if (device.device_mac == DB_ResidenceData.Instance.residenceGatewayMAC)
                    if (device.device_mac.ToUpper() == DB_ResidenceData.Instance.HomeGateway.mac.ToUpper())
                    {
                        MainPage.Log("本地搜索网关成功");
                        Ins.IsSearchLocalGatewaySuccessful = true;
@@ -634,7 +705,7 @@
                        {
                            Ins.GatewayId = device.device_mac;
                        }
                        reportIp = "239.0.168.188";// device.ip_address;
                        reportIp = "239.0.168.188";// device.ip_address;//主播地址也能控制设备
                    }
                }
                else if (receiveObj.Topic == CommunicationTopic.ct.ReadStatus + "_reply" ||
@@ -647,7 +718,7 @@
                else
                {
                    //一些特殊的主题处理(为了执行速度,尽可能的别加耗时的操作)
                    Stan.HdlCloudReceiveLogic.Current.CloudOverallMsgReceive(receiveObj.Topic, receiveObj.BodyDataString);
                    Stan.HdlCloudReceiveLogic.Current.CloudOverallMsgReceiveEx(receiveObj.Topic, receiveObj.BodyDataString);
                }
            }
            return receiveObj;
@@ -660,15 +731,6 @@
        /// <param name="updateBytes"></param>
        public void UpdataFunctionStatus(string revString, byte[] usefulBytes,bool isCloudData = false)
        {
            if (Ins.GatewayOnline_Local && isCloudData)//本地链接,除了涂鸦设备数据之外的云端数据不处理
            {
                if (FunctionList.List.GetDeviceFunctionList(SPK.BrandType.Tuya).Count == 0)
                {
                    //MainPage.Log($"A协议更新状态:本地链接,除了涂鸦设备数据之外的云端数据不处理...");
                    return;
                }
            }
            var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<AlinkFunctionStatusObj>(revString);
            if (temp != null)
            {
@@ -678,312 +740,192 @@
                {
                    try
                    {
                        var localFunction = allLocalFuntion.Find((obj) => obj.sid == updateTemp.sid);
                        if (Ins.GatewayOnline_Local && isCloudData)//本地链接,除了涂鸦设备数据之外的云端数据不处理
                        {
                            if(!SPK.Get3tySpk(SPK.BrandType.All3tyBrand).Contains(localFunction.spk))
                            if (FunctionList.List.OtherBrandFunction.Count != 0)
                            {
                                if (FunctionList.List.OtherBrandFunction.Find((obj) => obj.sid == updateTemp.sid) == null)
                                {
                                    //MainPage.Log($"A协议更新状态:本地链接,除了涂鸦设备数据之外的云端数据不处理...");
                                    return;
                                }
                            }
                        }
                        var localFunction = allLocalFuntion.Find((obj) => obj.sid == updateTemp.sid);
                        if (localFunction == null)
                        {
                            continue;
                        }
                        if (Ins.GatewayOnline_Local && isCloudData)//本地链接,除了涂鸦设备数据之外的云端数据不处理
                        {
                            if (!SPK.Get3tySpk(SPK.BrandType.All3tyBrand).Contains(localFunction.spk))
                            {
                                //MainPage.Log($"A协议更新状态:本地链接,除了涂鸦设备数据之外的云端数据不处理........");
                                return;
                            }
                        }
                        //MainPage.Log($"A协议更新状态:{revString}");
                        MainPage.Log($"A协议更新状态:{revString}");
                        foreach (var attr in updateTemp.status)
                        {
                            localFunction.SetAttrState(attr.key,attr.value);
                            localFunction.time_stamp = temp.time_stamp;
                            localFunction.SetAttrState(attr.key, attr.value);
                        }
                        if (localFunction != null)
                        //更新界面状态
                        Function localObj = null;
                        switch (localFunction.spk)
                        {
                            //更新界面状态
                            Function localObj = null;
                            switch (localFunction.spk)
                            {
                                case SPK.LightSwitch:
                                    var localSwitch = FunctionList.List.lights.Find((obj) => obj.sid == updateTemp.sid);
                                    if (localSwitch != null)
                            case SPK.ElectricEnergy:
                                EnergyMainPage.UpdataStatus(localFunction);
                                break;
                            case SPK.LightSwitch:
                                RelayPage.UpdataState(localFunction);
                                break;
                            case SPK.LightDimming:
                                localFunction.lastState = Language.StringByID(StringId.Brightness) + " : " +
                                                        localFunction.GetAttrState(FunctionAttributeKey.Brightness) + "%";
                                DimmerPage.UpdataStates(localFunction);
                                break;
                            case SPK.ElectricFan:
                                localFunction.lastState = Language.StringByID(StringId.Level) + " : " +
                                   localFunction.GetAttrState(FunctionAttributeKey.OpenLevel);
                                FanPage.UpdataState(localFunction);
                                break;
                            case SPK.LightRGB:
                                localFunction.lastState = Language.StringByID(StringId.Brightness) + " : " + localFunction.GetAttrState(FunctionAttributeKey.Brightness) + "%";
                                RGBPage.UpdataStates(localFunction);
                                break;
                            case SPK.LightRGBW:
                                break;
                            case SPK.LightCCT:
                                localFunction.lastState = Language.StringByID(StringId.Brightness) + " : " + localFunction.GetAttrState(FunctionAttributeKey.Brightness) + "%";
                                ColorTureLampPage.UpdataStatus(localFunction);
                                break;
                            case SPK.CurtainSwitch:
                                localFunction.lastState = localFunction.trait_on_off.curValue.ToString() == "on" ? Language.StringByID(StringId.Open) : Language.StringByID(StringId.Close);
                                CurtainModulePage.UpdataState(localFunction);
                                break;
                            case SPK.CurtainTrietex:
                                localFunction.lastState = Language.StringByID(StringId.Open) + localFunction.GetAttrState(FunctionAttributeKey.Percent) + "%";
                                MotorCurtainPage.UpdataState(localFunction);
                                break;
                            case SPK.CurtainRoller:
                                localFunction.lastState = Language.StringByID(StringId.Open) + localFunction.GetAttrState(FunctionAttributeKey.Percent) + "%";
                                RollingShutterPage.UpdataState(localFunction);
                                break;
                            case SPK.CurtainShades:
                                break;
                            case SPK.AcStandard:
                                Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status);
                                if (localFunction != null)
                                {
                                    localFunction.lastState = "";
                                    switch (localFunction.GetAttrState(FunctionAttributeKey.Mode))
                                    {
                                        localObj = localSwitch;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = localSwitch.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        RelayPage.UpdataState(localSwitch);
                                        case "cool":
                                            localFunction.lastState = Language.StringByID(StringId.Cool);
                                            break;
                                        case "heat":
                                            localFunction.lastState = Language.StringByID(StringId.Heat);
                                            break;
                                        case "dry":
                                            localFunction.lastState = Language.StringByID(StringId.Dry);
                                            break;
                                        case "auto":
                                            localFunction.lastState = Language.StringByID(StringId.Auto);
                                            break;
                                        case "fan":
                                            localFunction.lastState = Language.StringByID(StringId.AirSupply);
                                            break;
                                    }
                                    break;
                                case SPK.LightDimming:
                                    var dimming = FunctionList.List.lights.Find((obj) => obj.sid == updateTemp.sid);
                                    if (dimming != null)
                                    switch (localFunction.GetAttrState(FunctionAttributeKey.FanSpeed))
                                    {
                                        localObj = dimming;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = dimming.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        dimming.lastState = Language.StringByID(StringId.Brightness) + " : " + dimming.brightness + "%";
                                        DimmerPage.UpdataStates(dimming);
                                        case "high":
                                            localFunction.lastState += " " + Language.StringByID(StringId.HighWindSpeed);
                                            break;
                                        case "medium":
                                            localFunction.lastState += " " + Language.StringByID(StringId.MiddleWindSpeed);
                                            break;
                                        case "low":
                                            localFunction.lastState += " " + Language.StringByID(StringId.LowWindSpeed);
                                            break;
                                        case "auto":
                                            localFunction.lastState += " " + Language.StringByID(StringId.Auto);
                                            break;
                                    }
                                    break;
                                case SPK.ElectricFan:
                                    var fan = FunctionList.List.fans.Find((obj) => obj.sid == updateTemp.sid);
                                    if (fan != null)
                                    {
                                        localObj = fan;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = fan.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        fan.lastState = Language.StringByID(StringId.Level) + " : " + fan.openLevel;
                                        FanPage.UpdataState(fan);
                                    }
                                    break;
                                case SPK.LightRGB:
                                    var rgb = FunctionList.List.lights.Find((obj) => obj.sid == updateTemp.sid);
                                    if (rgb != null)
                                    {
                                        localObj = rgb;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = rgb.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        rgb.lastState = Language.StringByID(StringId.Brightness) + " : " + rgb.brightness + "%";
                                        RGBPage.UpdataStates(rgb);
                                    }
                                    break;
                                case SPK.LightRGBW:
                                    break;
                                case SPK.LightCCT:
                                    var lightCCT = FunctionList.List.lights.Find((obj) => obj.sid == updateTemp.sid);
                                    if (lightCCT != null)
                                    {
                                        localObj = lightCCT;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = lightCCT.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        lightCCT.lastState = Language.StringByID(StringId.Brightness) + " : " + lightCCT.brightness + "%";
                                        ColorTureLampPage.UpdataStates(lightCCT);
                                    }
                                    break;
                                case SPK.CurtainSwitch:
                                    var curtain = FunctionList.List.curtains.Find((obj) => obj.sid == updateTemp.sid);
                                    if (curtain != null)
                                    {
                                        localObj = curtain;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = curtain.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        curtain.lastState = curtain.trait_on_off.curValue.ToString() == "on" ? Language.StringByID(StringId.Open) : Language.StringByID(StringId.Close);
                                        CurtainModulePage.UpdataState(curtain);
                                    }
                                    break;
                                case SPK.CurtainTrietex:
                                    var trietex = FunctionList.List.curtains.Find((obj) => obj.sid == updateTemp.sid);
                                    if (trietex != null)
                                    {
                                        localObj = trietex;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = trietex.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        trietex.lastState = Language.StringByID(StringId.Open) + trietex.percent + "%";
                                        MotorCurtainPage.UpdataState(trietex);
                                    }
                                    break;
                                case SPK.CurtainRoller:
                                    var roller = FunctionList.List.curtains.Find((obj) => obj.sid == updateTemp.sid);
                                    if (roller != null)
                                    {
                                        localObj = roller;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = roller.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        roller.lastState = Language.StringByID(StringId.Open) + roller.percent + "%";
                                        RollingShutterPage.UpdataState(roller);
                                    }
                                    break;
                                case SPK.CurtainShades:
                                    break;
                                case SPK.AcStandard:
                                    var ac = FunctionList.List.aCs.Find((obj) => obj.sid == updateTemp.sid);
                                    if (ac != null)
                                    {
                                        localObj = ac;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = ac.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        ac.lastState = "";
                                        switch (ac.GetAttrState(FunctionAttributeKey.Mode))
                                        {
                                            case "cool":
                                                ac.lastState = Language.StringByID(StringId.Cool);
                                                break;
                                            case "heat":
                                                ac.lastState = Language.StringByID(StringId.Heat);
                                                break;
                                            case "dry":
                                                ac.lastState = Language.StringByID(StringId.Dry);
                                                break;
                                            case "auto":
                                                ac.lastState = Language.StringByID(StringId.Auto);
                                                break;
                                            case "fan":
                                                ac.lastState = Language.StringByID(StringId.AirSupply);
                                                break;
                                        }
                                        switch (ac.GetAttrState(FunctionAttributeKey.FanSpeed))
                                        {
                                            case "high":
                                                ac.lastState += " " + Language.StringByID(StringId.HighWindSpeed);
                                                break;
                                            case "medium":
                                                ac.lastState += " " + Language.StringByID(StringId.MiddleWindSpeed);
                                                break;
                                            case "low":
                                                ac.lastState += " " + Language.StringByID(StringId.LowWindSpeed);
                                                break;
                                            case "auto":
                                                ac.lastState += " " + Language.StringByID(StringId.Auto);
                                                break;
                                        }
                                        ac.lastState += " " + ac.GetAttrState(FunctionAttributeKey.SetTemp) + ac.tempUnitString;
                                        ACPage.UpdataStates(ac);
                                    }
                                    break;
                                case SPK.FloorHeatStandard:
                                    var fh = FunctionList.List.floorHeatings.Find((obj) => obj.sid == updateTemp.sid);
                                    if (fh != null)
                                    {
                                        localObj = fh;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = fh.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        switch (fh.trait_mode.curValue)
                                        {
                                            case "normal":
                                                fh.lastState = Language.StringByID(StringId.Normal);
                                                break;
                                            case "day":
                                                fh.lastState = Language.StringByID(StringId.Day);
                                                break;
                                            case "night":
                                                fh.lastState = Language.StringByID(StringId.Night);
                                                break;
                                            case "timer":
                                                fh.lastState = Language.StringByID(StringId.Auto);
                                                break;
                                            case "away":
                                                fh.lastState = Language.StringByID(StringId.Away);
                                                break;
                                        }
                                        fh.lastState += " " + fh.trait_temp.curValue + fh.tempUnitString;
                                        FloorHeatingPage.UpdataStates(fh);
                                    }
                                    break;
                                case SPK.SensorPm25:
                                case SPK.SensorCO2:
                                case SPK.SensorTVOC:
                                case SPK.SensorTemperature:
                                case SPK.SensorHumidity:
                                    var sensor = FunctionList.List.sensorsEnvironmentalScience.Find((obj) => obj.sid == updateTemp.sid);
                                    if (sensor != null)
                                    {
                                        localObj = sensor;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = sensor.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        EnvironmentalSciencePage.LoadEvent_UpdataStatus(sensor);
                                    }
                                    break;
                                case SPK.ElectricSocket:
                                    var es = FunctionList.List.switchSockets.Find((obj) => obj.sid == updateTemp.sid);
                                    if (es != null)
                                    {
                                        localObj = es;
                                        foreach (var attr in updateTemp.status)
                                        {
                                            var localAttr = es.attributes.Find((obj) => obj.key == attr.key);
                                            if (localAttr != null)
                                            {
                                                localAttr.curValue = attr.value;
                                            }
                                        }
                                        SocketPage.UpdataState(es);
                                    }
                                    break;
                                case SPK.ElectricTV:
                                    break;
                                case SPK.ElectricTuyaAirCleaner:
                                case SPK.ElectricTuyaFan:
                                case SPK.ElectricTuyaWeepRobot:
                                case SPK.ElectricTuyaWaterValve:
                                case SPK.SensorPir:
                                case SPK.SensorDoorWindow:
                                case SPK.SensorSmoke:
                                case SPK.SensorWater:
                                case SPK.ClothesHanger:
                                case SPK.IrAC:
                                    //设备状态推送
                                    Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid,updateTemp.status);
                                    break;
                            }
                            if (localObj != null)
                            {
                                HomePage.UpdataFunctionStates(localObj);
                                RoomPage.UpdataStates(localObj);
                                FunctionPage.UpdataStates(localObj);
                                ClassificationPage.UpdataInfo(localObj);
                            }
                                    localFunction.lastState += " " + localFunction.GetAttrState(FunctionAttributeKey.SetTemp) + new AC().GetTempUnitString(localFunction);
                                    ACPage.UpdataStates(localFunction);
                                }
                                break;
                            case SPK.FloorHeatStandard:
                                switch (localFunction.GetAttrState(FunctionAttributeKey.Mode))
                                {
                                    case "normal":
                                        localFunction.lastState = Language.StringByID(StringId.Normal);
                                        break;
                                    case "day":
                                        localFunction.lastState = Language.StringByID(StringId.Day);
                                        break;
                                    case "night":
                                        localFunction.lastState = Language.StringByID(StringId.Night);
                                        break;
                                    case "timer":
                                        localFunction.lastState = Language.StringByID(StringId.Auto);
                                        break;
                                    case "away":
                                        localFunction.lastState = Language.StringByID(StringId.Away);
                                        break;
                                }
                                localFunction.lastState += " " + localFunction.GetAttrState(FunctionAttributeKey.SetTemp) + new FloorHeating().GetTempUnitString(localFunction);
                                FloorHeatingPage.UpdataStates(localFunction);
                                break;
                            case SPK.SensorPm25:
                            case SPK.SensorCO2:
                            case SPK.SensorTVOC:
                            case SPK.SensorTemperature:
                            case SPK.SensorHumidity:
                                if(localFunction.spk == SPK.SensorTemperature)
                                {
                                    HomePage.LoadEvent_RefreshEnvirIndoorTemp();
                                }
                                else if (localFunction.spk == SPK.SensorHumidity)
                                {
                                    HomePage.LoadEvent_RefreshEnvirIndoorHumi();
                                }
                                EnvironmentalPage.LoadEvent_UpdataStatus(localFunction);
                                break;
                            case SPK.ElectricSocket:
                                SocketPage.UpdataState(localFunction);
                                break;
                            case SPK.ElectricTV:
                                break;
                            case SPK.ElectricTuyaAirCleaner:
                            case SPK.ElectricTuyaFan:
                            case SPK.ElectricTuyaWeepRobot:
                            case SPK.ElectricTuyaWaterValve:
                            case SPK.SensorPir:
                            case SPK.SensorDoorWindow:
                            case SPK.SensorSmoke:
                            case SPK.SensorWater:
                            case SPK.ClothesHanger:
                            case SPK.AcIr:
                            case SPK.SenesorMegahealth:
                                //设备状态推送
                                //状态更新
                                Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status);
                                break;
                        }
                        HomePage.UpdataFunctionStates(localFunction);
                        RoomPage.UpdataStates(localFunction);
                        FunctionPage.UpdataStates(localFunction);
                        ClassificationPage.UpdataInfo(localFunction);
                    }
                    catch (Exception ex)
                    {