HDL Home App 第二版本 旧平台金堂用 正在使用
hxb
2022-08-30 25429f085093d89d543a0b90e30d0d62d1b7dac9
ZigbeeApp/Shared/Phone/UserCenter/Residence/AddNewRoomForm.cs
@@ -60,15 +60,11 @@
            //加一个白色背景
            var frameBack1 = new FrameLayout();
            frameBack1.Height = Application.GetRealHeight(450);
            frameBack1.Height = Application.GetRealHeight(750);
            frameBack1.Y = Application.GetRealHeight(196);
            frameBack1.BackgroundColor = UserCenterColor.Current.White;
            frameBack1.SetCornerWithSameRadius(Application.GetRealHeight(58), HDLUtils.RectCornerTopLeft | HDLUtils.RectCornerTopRight);
            listBackControl.frameTable.AddChidren(frameBack1);
            //初始化信息桌布
            var tableContr = new InformationEditorControl();
            this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uInfoEditor), 1175);
            //房间图片底部阴影
            var btnShadow = new PicViewControl(853, 593);
@@ -100,14 +96,13 @@
                this.RoomPictrueSelect(btnPic);
            };
            //变更一下那个白色背景的Y轴,它到图片的中间位置
            frameBack1.Y = btnPic.Y + btnPic.Height / 2;
            this.newRoom = new Common.Room();
            newRoom.FloorId = this.floorKeys;
            newRoom.BackgroundImage = btnPic.ImagePath;
            newRoom.Humidity = -1000;
            newRoom.Temperatrue = -1000;
            //初始化信息桌布
            var tableContr = new InformationEditorControl();
            this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uInfoEditor), bodyFrameLayout.Height - btnShadow.Bottom, false);
            //添加全部菜单
            this.AddAllMenuRow(tableContr, btnPic);
@@ -125,6 +120,7 @@
            //【房间名称】
            var txtRoomName = new FrameCaptionInputControl(Language.StringByID(R.MyInternationalizationString.uRoomName), string.Empty, this.listview.rowSpace / 2);
            txtRoomName.txtInput.PlaceholderText = Language.StringByID(R.MyInternationalizationString.uPleaseInputRoomName);
            txtRoomName.txtInput.MaxByte = 48;//限制只能输入48个字节
            listview.AddChidren(txtRoomName);
            txtRoomName.InitControl();
            //底线
@@ -205,17 +201,9 @@
                }
                newRoom.FloorId = this.floorKeys;
                if (newRoom.Humidity == -1000)
                {
                    newRoom.Humidity = 0;
                }
                if (newRoom.Temperatrue == -1000)
                {
                    newRoom.Temperatrue = 0;
                }
                //添加房间,主页需要重新刷新
                UserView.UserPage.Instance.RefreshForm = true;
                UserView.UserPage.Instance.RefreshAllForm = true;
                HdlRoomLogic.Current.AddRoom(newRoom);
                this.FinishEditorEvent?.Invoke();
@@ -278,6 +266,11 @@
                {
                    listDevice.Add(device);
                }
                //PM2.5是温度和湿度合在同一个端点
                else if (device.Type == ZigBee.Device.DeviceType.PMSensor)
                {
                    listDevice.Add(device);
                }
            }
            var listSelect = new List<string>() { newRoom.TemperatrueDevice };
            var form = new SelectDeviceForm();
@@ -308,63 +301,81 @@
            {
                return;
            }
            if (newRoom.Temperatrue == -1000)
            {
                //没有获取得到过温度
                btnTemper.Text = Language.StringByID(R.MyInternationalizationString.Getting);
            }
            else
            {
                btnTemper.Text = this.newRoom.Temperatrue == 0 ? "0.0℃" : this.newRoom.Temperatrue.ToString() + "℃";
                btnTemper.Text += "  " + Language.StringByID(R.MyInternationalizationString.Getting);
            }
            //获取中
            btnTemper.Text = Language.StringByID(R.MyInternationalizationString.Getting);
            bool receiveData = false;
            HdlGatewayReceiveLogic.Current.RemoveEvent("TemperatrueDevice");
            HdlGatewayReceiveLogic.Current.AddAttributeEvent("TemperatrueDevice", ReceiveComandDiv.A设备属性上报, ((report) =>
            {
                string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(report);
                if (newRoom.TemperatrueDevice != mainKeys || btnTemper == null)
                if (newRoom.TemperatrueDevice != mainKeys || btnTemper == null
                || report.DeviceStatusReport.CluterID != 1026)
                {
                    return;
                }
                receiveData = true;
                foreach (var data in report.DeviceStatusReport.AttriBute)
                HdlThreadLogic.Current.RunMain(() =>
                {
                    if (data.AttributeId == (int)ZigBee.Device.AttriButeId.MeasuredValue)
                    decimal temperatrue = (decimal)device.GetType().InvokeMember("currentTemperature", System.Reflection.BindingFlags.GetField, null, device, null);
                    if (temperatrue == 0)
                    {
                        HdlThreadLogic.Current.RunMain(() =>
                        {
                            if (data.AttriButeData == 0)
                            {
                                //0℃
                                btnTemper.Text = "0.0℃";
                                this.newRoom.Temperatrue = 0;
                            }
                            else if (data.AttriButeData > 32767)
                            {
                                //负数(特殊处理)
                                string strValue = (data.AttriButeData - 65536).ToString();
                                //小数点需要一位
                                strValue = strValue.Substring(0, strValue.Length - 1);
                                //记录温度
                                this.newRoom.Temperatrue = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
                                btnTemper.Text = this.newRoom.Temperatrue.ToString() + "℃";
                            }
                            else
                            {
                                //小数点需要一位
                                string strValue = data.AttriButeData.ToString();
                                strValue = strValue.Substring(0, strValue.Length - 1);
                                //记录温度
                                this.newRoom.Temperatrue = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
                                btnTemper.Text = this.newRoom.Temperatrue.ToString() + "℃";
                            }
                        });
                        //0
                        btnTemper.Text = "0.0℃";
                    }
                }
                    else
                    {
                        btnTemper.Text = temperatrue + "℃";
                    }
                }, ShowErrorMode.NO);
            }));
            //发送获取温度的命令
            ((ZigBee.Device.TemperatureSensor)device).ReadTemperatureOrHumidity();
            device.ReadAttri(ZigBee.Device.Cluster_ID.TemperatureMeasurement, ZigBee.Device.AttriButeId.MeasuredValue);
            HdlThreadLogic.Current.RunThread(() =>
            {
                //去获取设备列表的信息
                System.Threading.Thread.Sleep(1500);
                var result = Common.LocalDevice.Current.ReadDeviceEpointDeviceInfo(device);
                if (result != null)
                {
                    device.AttributeStatus.Clear();
                    device.AttributeStatus.AddRange(result.AttributeStatus);
                    device.ReSave();
                }
                if (receiveData == true)
                {
                    //已经读取到数据
                    return;
                }
                foreach (var data in device.AttributeStatus)
                {
                    if (data.ClusterId == 1026
                       && data.AttributeId == (int)ZigBee.Device.AttriButeId.MeasuredValue)
                    {
                        //处理网关返回的温度值
                        decimal temperatrue = Common.LocalDevice.Current.AdjustTemperatrueValue(data.AttributeData);
                        device.GetType().InvokeMember("currentTemperature", System.Reflection.BindingFlags.SetField, null, device, new object[] { temperatrue });
                        device.ReSave();
                        //制作虚假的属性上报
                        var report = new ZigBee.Device.CommonDevice { DeviceAddr = device.DeviceAddr, DeviceEpoint = device.DeviceEpoint };
                        report.DeviceStatusReport.CluterID = 1026;
                        HdlGatewayReceiveLogic.Current.DeviceReportPush(report, ReceiveComandDiv.A设备属性上报);
                        HdlThreadLogic.Current.RunMain(() =>
                        {
                            btnTemper.Text = temperatrue == 0 ? "0.0℃" : temperatrue.ToString() + "℃";
                        });
                        break;
                    }
                }
            });
        }
        #endregion
@@ -382,6 +393,16 @@
            {
                //获取湿度传感器
                if (device is ZigBee.Device.TemperatureSensor && ((ZigBee.Device.TemperatureSensor)device).SensorDiv == 2)
                {
                    listDevice.Add(device);
                }
                //新风
                else if (device.Type == ZigBee.Device.DeviceType.FreshAirHumiditySensor)
                {
                    listDevice.Add(device);
                }
                //PM2.5是温度和湿度合在同一个端点
                else if (device.Type == ZigBee.Device.DeviceType.PMSensor)
                {
                    listDevice.Add(device);
                }
@@ -415,52 +436,80 @@
            {
                return;
            }
            if (newRoom.Humidity == -1000)
            {
                //没有获取得到过湿度
                btnHumi.Text = Language.StringByID(R.MyInternationalizationString.Getting);
            }
            else
            {
                btnHumi.Text = this.newRoom.Humidity == 0 ? "0.0%" : this.newRoom.Humidity.ToString() + "%";
                btnHumi.Text += "  " + Language.StringByID(R.MyInternationalizationString.Getting);
            }
            //获取中
            btnHumi.Text = Language.StringByID(R.MyInternationalizationString.Getting);
            bool receiveData = false;
            HdlGatewayReceiveLogic.Current.RemoveEvent("HumidityDevice");
            HdlGatewayReceiveLogic.Current.AddAttributeEvent("HumidityDevice", ReceiveComandDiv.A设备属性上报, (report) =>
            {
                string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(report);
                if (newRoom.HumidityDevice != mainKeys || btnHumi == null)
                if (newRoom.HumidityDevice != mainKeys || btnHumi == null
                || report.DeviceStatusReport.CluterID != 1029)
                {
                    return;
                }
                foreach (var data in report.DeviceStatusReport.AttriBute)
                receiveData = true;
                HdlThreadLogic.Current.RunMain(() =>
                {
                    if (data.AttributeId == (int)ZigBee.Device.AttriButeId.MeasuredValue)
                    decimal humidity = (decimal)device.GetType().InvokeMember("currentHumidity", System.Reflection.BindingFlags.GetField, null, device, null);
                    if (humidity == 0)
                    {
                        //0
                        btnHumi.Text = "0.0%";
                    }
                    else
                    {
                        btnHumi.Text = humidity.ToString() + "%";
                    }
                }, ShowErrorMode.NO);
            });
            //发送获取湿度的命令
            device.ReadAttri(ZigBee.Device.Cluster_ID.RelativeHumidityMeasurement, ZigBee.Device.AttriButeId.MeasuredValue);
            HdlThreadLogic.Current.RunThread(() =>
            {
                //去获取设备列表的信息
                System.Threading.Thread.Sleep(1500);
                var result = Common.LocalDevice.Current.ReadDeviceEpointDeviceInfo(device);
                if (result != null)
                {
                    device.AttributeStatus.Clear();
                    device.AttributeStatus.AddRange(result.AttributeStatus);
                    device.ReSave();
                }
                if (receiveData == true)
                {
                    //已经读取到数据
                    return;
                }
                //初始值,取缓存数据
                foreach (var data in device.AttributeStatus)
                {
                    if (data.ClusterId == 1029
                       && data.AttributeId == (int)ZigBee.Device.AttriButeId.MeasuredValue)
                    {
                        //处理网关返回的湿度值
                        decimal humidity = Common.LocalDevice.Current.AdjustHumidityValue(data.AttributeData);
                        device.GetType().InvokeMember("currentHumidity", System.Reflection.BindingFlags.SetField, null, device, new object[] { humidity });
                        device.ReSave();
                        //制作虚假的属性上报
                        var report = new ZigBee.Device.CommonDevice { DeviceAddr = device.DeviceAddr, DeviceEpoint = device.DeviceEpoint };
                        report.DeviceStatusReport.CluterID = 1029;
                        HdlGatewayReceiveLogic.Current.DeviceReportPush(report, ReceiveComandDiv.A设备属性上报);
                        HdlThreadLogic.Current.RunMain(() =>
                        {
                            if (data.AttriButeData == 0)
                            {
                                //0
                                btnHumi.Text = "0.0%";
                                this.newRoom.Humidity = 0;
                            }
                            else
                            {
                                //小数点需要一位(湿度没有负数)
                                string strValue = data.AttriButeData.ToString();
                                strValue = strValue.Substring(0, strValue.Length - 1);
                                //记录湿度
                                this.newRoom.Humidity = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
                                btnHumi.Text = this.newRoom.Humidity.ToString() + "%";
                            }
                            btnHumi.Text = humidity == 0 ? "0.0%" : humidity.ToString() + "%";
                        });
                        break;
                    }
                }
            });
            //发送获取湿度的命令
            ((ZigBee.Device.TemperatureSensor)device).ReadTemperatureOrHumidity();
        }
        #endregion