HDL Home App 第二版本 旧平台金堂用 正在使用
ZigbeeApp/Shared/Common/Device.cs
@@ -1,25 +1,25 @@
using Shared.Phone.UserCenter;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using ZigBee.Device;
namespace Shared.Common
using Shared.Phone.UserCenter;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using ZigBee.Device;
namespace Shared.Common
{
  /// <summary>
  /// 本地设备
  /// </summary>
  /// <summary>
  /// 本地设备
  /// </summary>
  public class LocalDevice
  {
    #region ■ 变量声明___________________________
    #region ■ 变量声明___________________________
    /// <summary>
    /// 本地设备
    /// <summary>
    /// 本地设备
    /// </summary>
    private static LocalDevice m_Current = null;
    /// <summary>
    /// 本地设备
    /// <summary>
    /// 本地设备
    /// </summary>
    public static LocalDevice Current
    {
@@ -36,9 +36,9 @@
        m_Current = value;
      }
    }
    /// <summary>
    /// 本地所有设备的缓存
    /// </summary>
    /// <summary>
    /// 本地所有设备的缓存
    /// </summary>
    public List<CommonDevice> listAllDevice
    {
      get
@@ -57,38 +57,34 @@
      }
    }
    /// <summary>
    /// 设备的模块ID的枚举 keys:模块ID (Axxx代表是第三方设备)
    /// </summary>
    /// <summary>
    /// 设备的模块ID的枚举 keys:模块ID (Axxx代表是第三方设备)
    /// </summary>
    private Dictionary<string, DeviceNameContent> dicDeviceModelIdEnum = null;
    /// <summary>
    /// 需要转换的设备的模块ID(keys:旧模块ID,value:新模块ID)
    /// </summary>
    /// <summary>
    /// 需要转换的设备的模块ID(keys:旧模块ID,value:新模块ID)
    /// </summary>
    private Dictionary<string, string> dicDeviceModelIdChanged = null;
    /// <summary>
    /// 图片共有(keys:指定设备的具体类型 value:指定共有对象的具体类型)
    /// </summary>
    /// <summary>
    /// 图片共有(keys:指定设备的具体类型 value:指定共有对象的具体类型)
    /// </summary>
    private Dictionary<string, string> dicPictrueShard = null;
    /// <summary>
    /// 本地所有设备的缓存(非公开)
    /// </summary>
    /// <summary>
    /// 本地所有设备的缓存(非公开)
    /// </summary>
    private Dictionary<string, CommonDevice> dicAllDevice = new Dictionary<string, CommonDevice>();
    /// <summary>
    /// 本地所有的顶点升级设备(非公开,主键是MAC+200端口)
    /// </summary>
    /// <summary>
    /// 本地所有的顶点升级设备(非公开,主键是MAC+200端口)
    /// </summary>
    private Dictionary<string, OTADevice> dicOTADevice = new Dictionary<string, OTADevice>();
    /// <summary>
    /// 设备的总回路(keys:Mac地址  value:全部端口号)
    /// </summary>
    /// <summary>
    /// 设备的总回路(keys:Mac地址  value:全部端口号)
    /// </summary>
    private Dictionary<string, HashSet<int>> dicDeviceEpoint = new Dictionary<string, HashSet<int>>();
    /// <summary>
    /// 物理设备属于哪个房间的记录
    /// </summary>
    private Dictionary<string, string> dicDeviceRoomId = null;
    #endregion
    #endregion
    #region ■ 刷新设备___________________________
    #region ■ 刷新设备___________________________
    /// <summary>
    /// 刷新本地设备信息
@@ -196,20 +192,20 @@
      //成员身份的时候,删除掉非法的网关文件
      this.DeleteGatewayFileByMemberModel();
      //初始化物理设备所属房间的记录
      this.InitRealDeviceRoomId();
      HdlRoomLogic.Current.InitRealDeviceRoomId();
#if DEBUG
#if DEBUG
      if (UserCenterResourse.HideOption.CenterHideMenu == 1)
      {
        //检测一些代码配置(debug)
        this.CheckOhtherSettion();
      }
#endif
#endif
    }
    /// <summary>
    /// 成员身份的时候,删除掉非法的网关文件
    /// </summary>
    /// <summary>
    /// 成员身份的时候,删除掉非法的网关文件
    /// </summary>
    private void DeleteGatewayFileByMemberModel()
    {
      if (UserCenterResourse.UserInfo.AuthorityNo != 3)
@@ -240,9 +236,9 @@
      }
    }
    /// <summary>
    /// 检测一些代码配置(debug)
    /// </summary>
    /// <summary>
    /// 检测一些代码配置(debug)
    /// </summary>
    private void CheckOhtherSettion()
    {
      foreach (var item in Enum.GetValues(typeof(DeviceType)))
@@ -272,16 +268,16 @@
      }
    }
    #endregion
    #endregion
    #region ■ 添加设备___________________________
    #region ■ 添加设备___________________________
    /// <summary>
    /// <para>将指定网关的设备存入缓存中(从新获取镜像)</para>
    /// <para>-1:异常 1:正常 2:设备信息缺损</para>
    /// </summary>
    /// <param name="gatewayId">网关Id</param>
    /// <param name="useLocalConnect">是否强制使用本地连接发送</param>
    /// <summary>
    /// <para>将指定网关的设备存入缓存中(从新获取镜像)</para>
    /// <para>-1:异常 1:正常 2:设备信息缺损</para>
    /// </summary>
    /// <param name="gatewayId">网关Id</param>
    /// <param name="useLocalConnect">是否强制使用本地连接发送</param>
    public int SetDeviceToMemmoryByGateway(string gatewayId, bool useLocalConnect)
    {
      //从网关获取全部的设备
@@ -371,16 +367,16 @@
      if (listDeleteMac.Count > 0)
      {
        //将真实物理设备从房间中移除
        this.DeleteRealDeviceFromRoom(listDeleteMac);
        HdlRoomLogic.Current.DeleteRealDeviceFromRoom(listDeleteMac);
      }
      return statu;
    }
    /// <summary>
    /// 添加设备到缓存,存在时覆盖
    /// </summary>
    /// <param name="device">设备对象(这个东西有可能会被更改)</param>
    /// <summary>
    /// 添加设备到缓存,存在时覆盖
    /// </summary>
    /// <param name="device">设备对象(这个东西有可能会被更改)</param>
    public void AddDeviceToMemory(ref CommonDevice device)
    {
      string mainKeys = this.GetDeviceMainKeys(device);
@@ -458,10 +454,10 @@
      }
    }
    /// <summary>
    /// 添加虚拟设备到缓存
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <summary>
    /// 添加虚拟设备到缓存
    /// </summary>
    /// <param name="device">设备对象</param>
    public void AddVirtualDeviceToMemory(CommonDevice device)
    {
      string mainKeys = this.GetDeviceMainKeys(device);
@@ -493,16 +489,16 @@
      device.ReSave();
    }
    #endregion
    #endregion
    #region ■ 修改设备___________________________
    #region ■ 修改设备___________________________
    /// <summary>
    /// 更改端点名字并且刷新缓存(修改失败时,会显示信息)
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="newName">新名字</param>
    /// <param name="mode">是否显示错误</param>
    /// <summary>
    /// 更改端点名字并且刷新缓存(修改失败时,会显示信息)
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="newName">新名字</param>
    /// <param name="mode">是否显示错误</param>
    public bool ReName(CommonDevice device, string newName, ShowErrorMode mode = ShowErrorMode.YES)
    {
      //先别管那么多,更改名字后,刷新设备缓存
@@ -542,12 +538,12 @@
      return true;
    }
    /// <summary>
    /// 更改Mac名字并且刷新缓存(修改失败时,会显示信息)
    /// </summary>
    /// <param name="listDevice">设备对象</param>
    /// <param name="newMacName">新名字</param>
    /// <param name="mode">是否显示错误</param>
    /// <summary>
    /// 更改Mac名字并且刷新缓存(修改失败时,会显示信息)
    /// </summary>
    /// <param name="listDevice">设备对象</param>
    /// <param name="newMacName">新名字</param>
    /// <param name="mode">是否显示错误</param>
    public bool ReMacName(List<CommonDevice> listDevice, string newMacName, ShowErrorMode mode = ShowErrorMode.YES)
    {
      if (listDevice.Count == 0)
@@ -617,10 +613,10 @@
      return true;
    }
    /// <summary>
    /// 设置虚拟设备的默认名字
    /// </summary>
    /// <param name="listDriveDevice">虚拟设备列表</param>
    /// <summary>
    /// 设置虚拟设备的默认名字
    /// </summary>
    /// <param name="listDriveDevice">虚拟设备列表</param>
    private void SetDriveDeviceDefultName(List<CommonDevice> listDriveDevice)
    {
      if (listDriveDevice.Count == 0)
@@ -653,10 +649,10 @@
      });
    }
    ///<summary >
    /// 修改设备mac名称
    /// <para>macName:设备名称</para>
    /// </summary>
    ///<summary >
    /// 修改设备mac名称
    /// <para>macName:设备名称</para>
    /// </summary>
    private CommonDevice.RenameDeviceMacNameAllData RenameDeviceMacNameAsync(CommonDevice device, string macName)
    {
      //如果当前是虚拟住宅
@@ -679,12 +675,12 @@
      return new CommonDevice.RenameDeviceMacNameAllData { renameDeviceMacNameData = tempData };
    }
    /// <summary>
    /// 修改设备端口(按键)名称
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="deviceName">设备端点名字</param>
    /// <returns></returns>
    /// <summary>
    /// 修改设备端口(按键)名称
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="deviceName">设备端点名字</param>
    /// <returns></returns>
    private CommonDevice.DeviceRenameAllData RenameDeviceNameAsync(CommonDevice device, string deviceName)
    {
      //如果当前是虚拟住宅
@@ -706,13 +702,13 @@
      return new CommonDevice.DeviceRenameAllData { deviceRenameData = tempData };
    }
    /// <summary>
    /// 获取编辑设备Mac名字的命令字符
    /// </summary>
    /// <param name="deviceAddr"></param>
    /// <param name="deviceEpoint"></param>
    /// <param name="deviceName"></param>
    /// <returns></returns>
    /// <summary>
    /// 获取编辑设备Mac名字的命令字符
    /// </summary>
    /// <param name="deviceAddr"></param>
    /// <param name="deviceEpoint"></param>
    /// <param name="deviceName"></param>
    /// <returns></returns>
    public string GetReDeviceMacNameCommandText(string deviceAddr, int deviceEpoint, string deviceName)
    {
      var bytes = new byte[64];
@@ -726,13 +722,13 @@
      return jObject.ToString();
    }
    /// <summary>
    /// 获取编辑设备端点名字的命令字符
    /// </summary>
    /// <param name="deviceAddr"></param>
    /// <param name="deviceEpoint"></param>
    /// <param name="deviceName"></param>
    /// <returns></returns>
    /// <summary>
    /// 获取编辑设备端点名字的命令字符
    /// </summary>
    /// <param name="deviceAddr"></param>
    /// <param name="deviceEpoint"></param>
    /// <param name="deviceName"></param>
    /// <returns></returns>
    public string GetReDeviceEpointNameCommandText(string deviceAddr, int deviceEpoint, string deviceName)
    {
      var bytes = new byte[64];
@@ -747,10 +743,10 @@
      return jObject.ToString();
    }
    /// <summary>
    /// 更改名字后,刷新设备缓存
    /// </summary>
    /// <param name="device"></param>
    /// <summary>
    /// 更改名字后,刷新设备缓存
    /// </summary>
    /// <param name="device"></param>
    private void BackupDeviceAfterReName(CommonDevice device)
    {
      lock (dicAllDevice)
@@ -778,14 +774,14 @@
      }
    }
    #endregion
    #endregion
    #region ■ 删除设备___________________________
    #region ■ 删除设备___________________________
    /// <summary>
    /// 删除设备并且刷新缓存(删除失败时,会显示信息)
    /// </summary>
    /// <param name="listdevice">设备对象(MAC地址必须要相同)</param>
    /// <summary>
    /// 删除设备并且刷新缓存(删除失败时,会显示信息)
    /// </summary>
    /// <param name="listdevice">设备对象(MAC地址必须要相同)</param>
    public async Task<bool> DeleteDevice(List<CommonDevice> listdevice)
    {
      //虚拟住宅的话,不需要删除网关的设备
@@ -817,21 +813,17 @@
      {
        this.DeleteMemmoryDevice(device);
      }
      //移除真实设备的房间索引
      HdlRoomLogic.Current.DeleteRealDeviceFromRoom(listdevice[0]);
      if (this.dicDeviceRoomId.ContainsKey(listdevice[0].DeviceAddr) == true)
      {
        //移除真实设备的房间索引
        this.dicDeviceRoomId.Remove(listdevice[0].DeviceAddr);
        this.SaveRealDeviceRoomId(null, null);
      }
      return true;
    }
    /// <summary>
    /// 删除缓存的一般设备
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="deleteRoom">是否从房间删除</param>
    /// <summary>
    /// 删除缓存的一般设备
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="deleteRoom">是否从房间删除</param>
    public void DeleteMemmoryDevice(CommonDevice device, bool deleteRoom = true)
    {
      //删除缓存设备的话,主页需要重新刷新
@@ -881,11 +873,11 @@
      }
    }
    /// <summary>
    /// 删除缓存的Ota设备
    /// </summary>
    /// <param name="macAdrr"></param>
    /// <param name="ePoint"></param>
    /// <summary>
    /// 删除缓存的Ota设备
    /// </summary>
    /// <param name="macAdrr"></param>
    /// <param name="ePoint"></param>
    public void DeleteMemmoryOtaDevice(string macAdrr, int ePoint = 200)
    {
      //删除200端口文件
@@ -912,13 +904,13 @@
      }
    }
    #endregion
    #endregion
    #region ■ 同步设备___________________________
    /// <summary>
    ///  同步设备并且刷新缓存(同步失败时,会显示信息)
    /// </summary>
    /// <param name="litdevice">设备对象(MAC地址必须要相同)</param>
    #region ■ 同步设备___________________________
    /// <summary>
    ///  同步设备并且刷新缓存(同步失败时,会显示信息)
    /// </summary>
    /// <param name="litdevice">设备对象(MAC地址必须要相同)</param>
    public async Task<bool> SynchronizationDevice(List<CommonDevice> listdevice)
    {
      //虚拟住宅的话,不需要删除网关的设备
@@ -939,15 +931,15 @@
      }
      return true;
    }
    #endregion
    #endregion
    #region ■ 测试设备___________________________
    #region ■ 测试设备___________________________
    /// <summary>
    /// 发送定位指令到设备
    /// </summary>
    /// <param name="device">设备回路</param>
    /// <param name="isRealDevice">是否是定位真实设备</param>
    /// <summary>
    /// 发送定位指令到设备
    /// </summary>
    /// <param name="device">设备回路</param>
    /// <param name="isRealDevice">是否是定位真实设备</param>
    public void SetFixedPositionCommand(CommonDevice device, bool isRealDevice = false)
    {
      //如果当前住宅不是虚拟住宅
@@ -968,11 +960,11 @@
      }
    }
    /// <summary>
    /// 检测设备是否拥有定位的功能
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    /// <summary>
    /// 检测设备是否拥有定位的功能
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    public bool DeviceIsCanFixedPosition(CommonDevice device)
    {
      if (device.Type == DeviceType.DoorLock || device.Type == DeviceType.Airer || device.Type == DeviceType.PMSensor)
@@ -1012,11 +1004,11 @@
      return false;
    }
    /// <summary>
    /// 检测设备是否拥有一键同步功能
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    /// <summary>
    /// 检测设备是否拥有一键同步功能
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    public bool DeviceIsCanSynchronization(CommonDevice device)
    {
      //获取设备类型的
@@ -1028,11 +1020,11 @@
      return false;
    }
    /// <summary>
    /// 检测设备是否拥有开关的功能(输出簇)
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    /// <summary>
    /// 检测设备是否拥有开关的功能(输出簇)
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    public bool OutDeviceIsCanOnOff(CommonDevice device)
    {
      foreach (var data in device.OutClusterList)
@@ -1046,11 +1038,11 @@
      return false;
    }
    /// <summary>
    /// 检测设备是否拥有开关的功能(输入簇)
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    /// <summary>
    /// 检测设备是否拥有开关的功能(输入簇)
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    public bool InDeviceIsCanOnOff(CommonDevice device)
    {
      foreach (var data in device.InClusterList)
@@ -1064,15 +1056,15 @@
      return false;
    }
    #endregion
    #endregion
    #region ■ 获取设备___________________________
    #region ■ 获取设备___________________________
    /// <summary>
    /// 根据网关ID获取所有的设备
    /// </summary>
    /// <param name="gwId">网关ID</param>>
    /// <returns></returns>
    /// <summary>
    /// 根据网关ID获取所有的设备
    /// </summary>
    /// <param name="gwId">网关ID</param>>
    /// <returns></returns>
    public List<CommonDevice> GetDeviceByGatewayID(string gwId)
    {
      lock (dicAllDevice)
@@ -1090,11 +1082,11 @@
      }
    }
    /// <summary>
    /// 获取指定设备(主键是:Mac地址+端口号),不存在时,返回null
    /// </summary>
    /// <param name="mainKeys">Mac地址+端口号</param>
    /// <returns></returns>
    /// <summary>
    /// 获取指定设备(主键是:Mac地址+端口号),不存在时,返回null
    /// </summary>
    /// <param name="mainKeys">Mac地址+端口号</param>
    /// <returns></returns>
    public CommonDevice GetDevice(string mainKeys)
    {
      lock (dicAllDevice)
@@ -1107,24 +1099,24 @@
      return null;
    }
    /// <summary>
    /// 获取指定设备,不存在时,返回null
    /// </summary>
    /// <param name="DeviceAddr">Mac地址</param>
    /// <param name="DeviceEpoint">端口号</param>
    /// <returns></returns>
    /// <summary>
    /// 获取指定设备,不存在时,返回null
    /// </summary>
    /// <param name="DeviceAddr">Mac地址</param>
    /// <param name="DeviceEpoint">端口号</param>
    /// <returns></returns>
    public CommonDevice GetDevice(string DeviceAddr, int DeviceEpoint)
    {
      string mainkeys = this.GetDeviceMainKeys(DeviceAddr, DeviceEpoint);
      return this.GetDevice(mainkeys);
    }
    /// <summary>
    /// 根据MAC地址,获取全部回路的设备对象
    /// </summary>
    /// <param name="DeviceAddr">Mac地址</param>
    /// <param name="sort">是否排序</param>
    /// <returns></returns>
    /// <summary>
    /// 根据MAC地址,获取全部回路的设备对象
    /// </summary>
    /// <param name="DeviceAddr">Mac地址</param>
    /// <param name="sort">是否排序</param>
    /// <returns></returns>
    public List<CommonDevice> GetDevicesByMac(string DeviceAddr, bool sort = true)
    {
      var list = new List<CommonDevice>();
@@ -1157,11 +1149,11 @@
      return list;
    }
    /// <summary>
    /// 根据MAC地址,获取简约面板全部回路的设备对象
    /// </summary>
    /// <param name="listDevice"></param>
    /// <returns></returns>
    /// <summary>
    /// 根据MAC地址,获取简约面板全部回路的设备对象
    /// </summary>
    /// <param name="listDevice"></param>
    /// <returns></returns>
    public List<CommonDevice> GetMutilfunctionPanelByMac(List<CommonDevice> listDevice, bool sort = true)
    {
      //和彪哥、设备和产品部同事确认:
@@ -1205,11 +1197,11 @@
      return list;
    }
    /// <summary>
    /// 根据MAC地址,获取新风、简约环境面板全部回路的设备对象
    /// </summary>
    /// <param name="listDevice"></param>
    /// <returns></returns>
    /// <summary>
    /// 根据MAC地址,获取新风、简约环境面板全部回路的设备对象
    /// </summary>
    /// <param name="listDevice"></param>
    /// <returns></returns>
    public List<CommonDevice> GetPanelMatchEpointByMac(List<CommonDevice> listDevice, bool sort = true)
    {
      var list = new List<CommonDevice>();
@@ -1240,11 +1232,11 @@
      return list;
    }
    /// <summary>
    /// 根据MAC地址,获取全部回路的设备对象(强制排序)
    /// </summary>
    /// <param name="DeviceAddr">Mac地址</param>
    /// <returns></returns>
    /// <summary>
    /// 根据MAC地址,获取全部回路的设备对象(强制排序)
    /// </summary>
    /// <param name="DeviceAddr">Mac地址</param>
    /// <returns></returns>
    public List<CommonDevice> GetDevicesByMac(List<string> listMacAddr)
    {
      //先排序
@@ -1273,11 +1265,11 @@
      return list;
    }
    /// <summary>
    /// 根据MAC地址,获取全部回路的数量
    /// </summary>
    /// <param name="DeviceAddr">Mac地址</param>
    /// <returns></returns>
    /// <summary>
    /// 根据MAC地址,获取全部回路的数量
    /// </summary>
    /// <param name="DeviceAddr">Mac地址</param>
    /// <returns></returns>
    public int GetDevicesCountByMac(string DeviceAddr)
    {
      if (dicDeviceEpoint.ContainsKey(DeviceAddr) == false)
@@ -1287,10 +1279,10 @@
      return dicDeviceEpoint[DeviceAddr].Count;
    }
    /// <summary>
    /// 获取本地全部的设备文件
    /// </summary>
    /// <returns></returns>
    /// <summary>
    /// 获取本地全部的设备文件
    /// </summary>
    /// <returns></returns>
    public List<string> GetAllDeviceFile()
    {
      List<string> listDeviceFile = new List<string>();
@@ -1308,12 +1300,12 @@
      return listDeviceFile;
    }
    /// <summary>
    /// 获取OTA设备(200端口的)
    /// </summary>
    /// <param name="macAdrr"></param>
    /// <param name="ePoint"></param>
    /// <returns></returns>
    /// <summary>
    /// 获取OTA设备(200端口的)
    /// </summary>
    /// <param name="macAdrr"></param>
    /// <param name="ePoint"></param>
    /// <returns></returns>
    public OTADevice GetOTADevice(string macAdrr, int ePoint = 200)
    {
      string mainkeys = this.GetDeviceMainKeys(macAdrr, ePoint);
@@ -1324,11 +1316,11 @@
      return this.dicOTADevice[mainkeys];
    }
    /// <summary>
    /// 获取特殊的,没有其他回路,单纯只有200端点的OTA设备
    /// </summary>
    /// <param name="gwId">网关ID</param>
    /// <returns></returns>
    /// <summary>
    /// 获取特殊的,没有其他回路,单纯只有200端点的OTA设备
    /// </summary>
    /// <param name="gwId">网关ID</param>
    /// <returns></returns>
    public List<OTADevice> GetSpecialOtaDevice(string gwId)
    {
      var list = new List<OTADevice>();
@@ -1353,15 +1345,15 @@
      return list;
    }
    #endregion
    #endregion
    #region ■ 获取设备信息_______________________
    #region ■ 获取设备信息_______________________
    /// <summary>
    /// 从网关读取单个端点回路设备信息
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    /// <summary>
    /// 从网关读取单个端点回路设备信息
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    public CommonDevice.DeviceInfoData ReadDeviceEpointDeviceInfo(CommonDevice device)
    {
      var jObject = new Newtonsoft.Json.Linq.JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", device.DeviceEpoint }, { "Cluster_ID", 0 }, { "Command", 80 } };
@@ -1374,15 +1366,15 @@
      return info;
    }
    /// <summary>
    /// 从网关读取指定Mac下的设备列表(返回的是网关回复的设备Json,调用ConvertJObjectToDevice方法转为Device对象)
    /// </summary>
    /// <param name="realGateway">真实网关对象</param>
    /// <param name="i_deviceMac">设备Mac</param>
    /// <param name="useLocalConnect">是否使用本地连接发送</param>
    /// <param name="listFucDevice">需要变更功能类型的回路</param>
    /// <param name="statu">状态-> -1:异常,会返回null, 1:没有异常, 2:数据接收不全</param>
    /// <returns></returns>
    /// <summary>
    /// 从网关读取指定Mac下的设备列表(返回的是网关回复的设备Json,调用ConvertJObjectToDevice方法转为Device对象)
    /// </summary>
    /// <param name="realGateway">真实网关对象</param>
    /// <param name="i_deviceMac">设备Mac</param>
    /// <param name="useLocalConnect">是否使用本地连接发送</param>
    /// <param name="listFucDevice">需要变更功能类型的回路</param>
    /// <param name="statu">状态-> -1:异常,会返回null, 1:没有异常, 2:数据接收不全</param>
    /// <returns></returns>
    public List<Newtonsoft.Json.Linq.JObject> ReadDeviceListByMacFromGateway(string gatewayId, string i_deviceMac, bool useLocalConnect, ref int statu)
    {
      //是否达成中断的时机
@@ -1451,13 +1443,13 @@
      return listDeviceJson;
    }
    /// <summary>
    /// 将设备的Json转换为设备对象
    /// </summary>
    /// <param name="listIObjects">设备Json</param>
    /// <param name="gwId">网关id</param>
    /// <param name="listFucDevice">需要变更功能类型的回路</param>
    /// <returns></returns>
    /// <summary>
    /// 将设备的Json转换为设备对象
    /// </summary>
    /// <param name="listIObjects">设备Json</param>
    /// <param name="gwId">网关id</param>
    /// <param name="listFucDevice">需要变更功能类型的回路</param>
    /// <returns></returns>
    public List<CommonDevice> ConvertJObjectToDevice(List<Newtonsoft.Json.Linq.JObject> listIObjects, string gwId, ref List<CommonDevice> listFucDevice)
    {
      //设备列表
@@ -1513,16 +1505,16 @@
      return listDevice;
    }
    #endregion
    #endregion
    #region ■ 设置设备功能类型___________________
    #region ■ 设置设备功能类型___________________
    /// <summary>
    /// 设置设备功能类型到网关
    /// </summary>
    /// <param name="device">设备回路</param>
    /// <param name="functionType">功能类型</param>
    /// <returns></returns>
    /// <summary>
    /// 设置设备功能类型到网关
    /// </summary>
    /// <param name="device">设备回路</param>
    /// <param name="functionType">功能类型</param>
    /// <returns></returns>
    public bool SendDeviceFunctionTypeToGateway(CommonDevice device, DeviceFunctionType functionType)
    {
      //如果是虚拟住宅
@@ -1547,12 +1539,12 @@
      return false;
    }
    /// <summary>
    /// 获取更改设备功能类型的命令文本
    /// </summary>
    /// <param name="device"></param>
    /// <param name="functionType"></param>
    /// <returns></returns>
    /// <summary>
    /// 获取更改设备功能类型的命令文本
    /// </summary>
    /// <param name="device"></param>
    /// <param name="functionType"></param>
    /// <returns></returns>
    public string GetDeviceFunctionTypeCommandText(CommonDevice device, DeviceFunctionType functionType)
    {
      var jObject = new Newtonsoft.Json.Linq.JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", device.DeviceEpoint }, { "Cluster_ID", 0 }, { "Command", 110 } };
@@ -1561,15 +1553,15 @@
      return jObject.ToString();
    }
    #endregion
    #endregion
    #region ■ 获取设备名称_______________________
    #region ■ 获取设备名称_______________________
    /// <summary>
    /// 获取设备端点的名称(有特效)
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    /// <summary>
    /// 获取设备端点的名称(有特效)
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    public string GetDeviceEpointName(CommonDevice device)
    {
      string dName = this.GetSimpleEpointName(device);
@@ -1656,6 +1648,12 @@
          //面板的温度探头叫  面板名字+温度
          return deviceInfoType.DeviceDefultName + Language.StringByID(R.MyInternationalizationString.uTemperature);
        }
        else if (deviceInfoType.BeloneType == DeviceBeloneType.A空气质量)
        {
          //空气质量传感器的温度探头叫空气质量传感器+温度
          return deviceInfoType.DeviceDefultName + Language.StringByID(R.MyInternationalizationString.TemperatureSensor);
        }
        else if (((TemperatureSensor)device).SensorDiv == 1)
        {
          //温度传感器
@@ -1671,11 +1669,11 @@
      return deviceInfoType.DeviceDefultName + epointNo;
    }
    /// <summary>
    /// 获取设备MAC名称
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    /// <summary>
    /// 获取设备MAC名称
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    public string GetDeviceMacName(CommonDevice device)
    {
      string dName = this.GetSimpleMacName(device);
@@ -1694,57 +1692,57 @@
      return deviceInfoType.DeviceDefultName;
    }
    /// <summary>
    /// 非公开,设置设备的Mac名字(此方法只是单存的变更缓存)
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="macName">Mac名字</param>
    /// <returns></returns>
    /// <summary>
    /// 非公开,设置设备的Mac名字(此方法只是单存的变更缓存)
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="macName">Mac名字</param>
    /// <returns></returns>
    public void SetMacName(CommonDevice device, string macName)
    {
      device.DeviceName = macName;
    }
    /// <summary>
    /// 非公开,设置设备的端点名字(此方法只是单存的变更缓存)
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="epointName">端点名字</param>
    /// <returns></returns>
    /// <summary>
    /// 非公开,设置设备的端点名字(此方法只是单存的变更缓存)
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="epointName">端点名字</param>
    /// <returns></returns>
    public void SetEpointName(CommonDevice device, string epointName)
    {
      device.DeviceEpointName = epointName;
    }
    /// <summary>
    /// 单纯获取设备的Mac名字
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    /// <summary>
    /// 单纯获取设备的Mac名字
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    public string GetSimpleMacName(CommonDevice device)
    {
      return device.DeviceName;
    }
    /// <summary>
    /// 单纯获取设备的端点名字
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    /// <summary>
    /// 单纯获取设备的端点名字
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    public string GetSimpleEpointName(CommonDevice device)
    {
      return device.DeviceEpointName;
    }
    #endregion
    #endregion
    #region ■ 设置图标___________________________
    #region ■ 设置图标___________________________
    /// <summary>
    /// 变更设备的图标
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="unSelPath">图片地址(非选择)</param>
    /// <summary>
    /// 变更设备的图标
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="unSelPath">图片地址(非选择)</param>
    public void ChangedDeviceIcon(CommonDevice device, string unSelPath)
    {
      if (unSelPath == string.Empty)
@@ -1758,12 +1756,12 @@
      HdlAutoBackupLogic.AddOrEditorFile(device.FilePath);
    }
    /// <summary>
    /// 设置设备【图标】到指定的控件
    /// </summary>
    /// <param name="btnIcon">控件对象</param>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    /// <summary>
    /// 设置设备【图标】到指定的控件
    /// </summary>
    /// <param name="btnIcon">控件对象</param>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    public void SetDeviceIconToControl(Button btnIcon, CommonDevice device)
    {
      if (device == null)
@@ -1786,12 +1784,12 @@
      }
    }
    /// <summary>
    /// 设置设备【图标】到指定的控件(注意,此函数设置的选择状态的图片是白色的)
    /// </summary>
    /// <param name="btnIcon">控件对象</param>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    /// <summary>
    /// 设置设备【图标】到指定的控件(注意,此函数设置的选择状态的图片是白色的)
    /// </summary>
    /// <param name="btnIcon">控件对象</param>
    /// <param name="device">设备对象</param>
    /// <returns></returns>
    public void SetDeviceIconToControl2(Button btnIcon, CommonDevice device)
    {
      if (device == null)
@@ -1813,13 +1811,13 @@
      }
    }
    /// <summary>
    /// 获取设备【图标】
    /// </summary>
    /// <param name="listdevice">设备对象</param>
    /// <param name="unSelectPath">图片地址</param>
    /// <param name="selectPath">图片地址</param>
    /// <returns></returns>
    /// <summary>
    /// 获取设备【图标】
    /// </summary>
    /// <param name="listdevice">设备对象</param>
    /// <param name="unSelectPath">图片地址</param>
    /// <param name="selectPath">图片地址</param>
    /// <returns></returns>
    public void GetDeviceIcon(CommonDevice device, ref string unSelectPath, ref string selectPath)
    {
      if (string.IsNullOrEmpty(device.IconPath) == true)
@@ -1835,11 +1833,11 @@
      }
    }
    /// <summary>
    /// 设置设备的真实图片到指定的控件
    /// </summary>
    /// <param name="btnIcon">控件对象</param>
    /// <param name="listdevice">设备对象</param>
    /// <summary>
    /// 设置设备的真实图片到指定的控件
    /// </summary>
    /// <param name="btnIcon">控件对象</param>
    /// <param name="listdevice">设备对象</param>
    public void SetRealDeviceIconToControl(Button btnIcon, List<CommonDevice> listdevice)
    {
      //获取设备的真实图片
@@ -1847,10 +1845,10 @@
      btnIcon.UnSelectedImagePath = imagePath;
    }
    /// <summary>
    /// 获取设备的真实图片
    /// </summary>
    /// <param name="listdevice">设备对象</param>
    /// <summary>
    /// 获取设备的真实图片
    /// </summary>
    /// <param name="listdevice">设备对象</param>
    public string GetRealDeviceIcon(List<CommonDevice> listdevice)
    {
      //获取它属于什么类型的设备
@@ -1886,12 +1884,12 @@
      return imageFilePath;
    }
    /// <summary>
    /// 设置【设备类型】的图标到指定的控件(此方法不能用在设备功能类型菜单的图标)
    /// </summary>
    /// <param name="btnIcon">控件对象</param>
    /// <param name="listdevice">设备对象</param>
    /// <returns></returns>
    /// <summary>
    /// 设置【设备类型】的图标到指定的控件(此方法不能用在设备功能类型菜单的图标)
    /// </summary>
    /// <param name="btnIcon">控件对象</param>
    /// <param name="listdevice">设备对象</param>
    /// <returns></returns>
    public void SetDeviceObjectIconToControl(Button btnIcon, List<CommonDevice> listdevice)
    {
      //获取自定义设备类型
@@ -1908,13 +1906,13 @@
      btnIcon.SelectedImagePath = imageSelectFilePath;
    }
    /// <summary>
    /// 获取【设备类型】的图标(此方法不能用在设备功能类型菜单的图标)
    /// </summary>
    /// <param name="listdevice">设备对象</param>
    /// <param name="unSelectPath">图片地址</param>
    /// <param name="selectPath">图片地址</param>
    /// <returns></returns>
    /// <summary>
    /// 获取【设备类型】的图标(此方法不能用在设备功能类型菜单的图标)
    /// </summary>
    /// <param name="listdevice">设备对象</param>
    /// <param name="unSelectPath">图片地址</param>
    /// <param name="selectPath">图片地址</param>
    /// <returns></returns>
    public void GetDeviceObjectIcon(List<CommonDevice> listdevice, ref string unSelectPath, ref string selectPath)
    {
      //获取自定义设备类型
@@ -1924,13 +1922,13 @@
      this.GetDeviceObjectIcon(myDeviceType.ConcreteType, ref unSelectPath, ref selectPath);
    }
    /// <summary>
    /// 获取【设备功能类型】的菜单图标
    /// </summary>
    /// <param name="deviceEnumInfo">自定义设备类型</param>
    /// <param name="unSelectPath">图片地址</param>
    /// <param name="selectPath">图片地址</param>
    /// <returns></returns>
    /// <summary>
    /// 获取【设备功能类型】的菜单图标
    /// </summary>
    /// <param name="deviceEnumInfo">自定义设备类型</param>
    /// <param name="unSelectPath">图片地址</param>
    /// <param name="selectPath">图片地址</param>
    /// <returns></returns>
    public void GetDeviceFunctionTypeMenuIcon(DeviceEnumInfo deviceEnumInfo, ref string unSelectPath, ref string selectPath)
    {
      //新风小模块
@@ -1959,13 +1957,13 @@
      this.GetDeviceObjectIcon(deviceEnumInfo.ConcreteType, ref unSelectPath, ref selectPath);
    }
    /// <summary>
    /// 获取【设备类型】的图标 2020.05.13:次函数不再公开
    /// </summary>
    /// <param name="specificType">自定义设备类型</param>
    /// <param name="unSelectPath">图片地址</param>
    /// <param name="selectPath">图片地址</param>
    /// <returns></returns>
    /// <summary>
    /// 获取【设备类型】的图标 2020.05.13:次函数不再公开
    /// </summary>
    /// <param name="specificType">自定义设备类型</param>
    /// <param name="unSelectPath">图片地址</param>
    /// <param name="selectPath">图片地址</param>
    /// <returns></returns>
    private void GetDeviceObjectIcon(DeviceConcreteType specificType, ref string unSelectPath, ref string selectPath)
    {
      //将具体类型转字符串
@@ -2004,15 +2002,15 @@
      selectPath = imageSelectFilePath;
    }
    #endregion
    #endregion
    #region ■ 获取自定义的设备类型_______________
    #region ■ 获取自定义的设备类型_______________
    /// <summary>
    /// 获取【自定义的设备类型】,两种类型都设置了
    /// </summary>
    /// <param name="listdevice">设备对象</param>
    /// <returns></returns>
    /// <summary>
    /// 获取【自定义的设备类型】,两种类型都设置了
    /// </summary>
    /// <param name="listdevice">设备对象</param>
    /// <returns></returns>
    public DeviceEnumInfo GetMyDeviceEnumInfo(List<CommonDevice> listdevice)
    {
      CommonDevice checkDevice = listdevice[0];
@@ -2039,12 +2037,12 @@
      return info;
    }
    /// <summary>
    /// 获取设备的【设备类型】的翻译文本(优先镜像)
    /// </summary>
    /// <param name="listDevice"></param>
    /// <param name="ApendFalge">第三方或者虚拟设备的时候,是否添加标识</param>
    /// <returns></returns>
    /// <summary>
    /// 获取设备的【设备类型】的翻译文本(优先镜像)
    /// </summary>
    /// <param name="listDevice"></param>
    /// <param name="ApendFalge">第三方或者虚拟设备的时候,是否添加标识</param>
    /// <returns></returns>
    public string GetDeviceObjectText(List<CommonDevice> listDevice, bool ApendFalge = true)
    {
      CommonDevice checkDevice = listDevice[0];
@@ -2093,15 +2091,15 @@
      return strName;
    }
    #endregion
    #endregion
    #region ■ 获取河东设备的设备类型_____________
    #region ■ 获取河东设备的设备类型_____________
    /// <summary>
    /// 获取Hdl设备的【自定义的设备类型】
    /// </summary>
    /// <param name="device">随便某一回路</param>
    /// <returns></returns>
    /// <summary>
    /// 获取Hdl设备的【自定义的设备类型】
    /// </summary>
    /// <param name="device">随便某一回路</param>
    /// <returns></returns>
    private DeviceEnumInfo GetHdlMyDeviceEnumInfo(CommonDevice device)
    {
      //设备具体类型
@@ -2144,15 +2142,15 @@
      return info;
    }
    #endregion
    #endregion
    #region ■ 获取第三方设备的设备类型___________
    #region ■ 获取第三方设备的设备类型___________
    /// <summary>
    /// 获取设备的【所属类型信息】,此方法会把所有的传感器都归为【传感器】(包括温湿度传感器)
    /// </summary>
    /// <param name="device">设备回路</param>
    /// <returns></returns>
    /// <summary>
    /// 获取设备的【所属类型信息】,此方法会把所有的传感器都归为【传感器】(包括温湿度传感器)
    /// </summary>
    /// <param name="device">设备回路</param>
    /// <returns></returns>
    public DeviceEnumInfo GetDeviceBelongEnumInfo(CommonDevice device)
    {
      var info = this.GetNotHdlMyDeviceEnumInfo(new List<CommonDevice>() { device });
@@ -2181,11 +2179,11 @@
      return info;
    }
    /// <summary>
    /// 获取第三方设备的【设备类型】(不建议使用)
    /// </summary>
    /// <param name="listdevice">Mac都一样的设备列表</param>
    /// <returns></returns>
    /// <summary>
    /// 获取第三方设备的【设备类型】(不建议使用)
    /// </summary>
    /// <param name="listdevice">Mac都一样的设备列表</param>
    /// <returns></returns>
    public DeviceEnumInfo GetNotHdlMyDeviceEnumInfo(List<CommonDevice> listdevice)
    {
      var dicType = new Dictionary<DeviceType, CommonDevice>();
@@ -2342,12 +2340,18 @@
      {
        bool temperatrue = false;
        bool humidity = false;
        bool airQualitySensor = false;
        //获取全部的回路
        var listTemp = this.GetDevicesByMac(listdevice[0].DeviceAddr, false);
        foreach (var device in listTemp)
        {
          if (device is TemperatureSensor)
          {
            //空气质量传感器
            if (device.isAirQualitySensor(device))
            {
              airQualitySensor = true;
            }
            //温度传感器
            if (((TemperatureSensor)device).SensorDiv == 1)
            {
@@ -2382,6 +2386,15 @@
          info.ConcreteType = DeviceConcreteType.Sensor_Humidity;
        }
        info.ObjectTypeName = this.dicDeviceModelIdEnum["A411"].A类型名字;//传感器
        //空气质量传感器
        if (airQualitySensor == true)
        {
          info.ConcreteText = this.dicDeviceModelIdEnum["A422"].A官方名字;
          info.BeloneType = DeviceBeloneType.A空气质量;
          info.ConcreteType = DeviceConcreteType.AirQualitySensor;
          info.ObjectTypeName = this.dicDeviceModelIdEnum["A422"].A类型名字;
        }
      }
      //14新风设备
      else if (dicType.ContainsKey(DeviceType.FreshAir) == true)
@@ -2415,14 +2428,6 @@
        info.ConcreteType = DeviceConcreteType.Airer;
        info.ObjectTypeName = this.dicDeviceModelIdEnum["A421"].A类型名字;
      }
      //18空气质量传感器
      else if (dicType.ContainsKey(DeviceType.AirQualitySensor) == true)
      {
        info.ConcreteText = this.dicDeviceModelIdEnum["A422"].A官方名字;
        info.BeloneType = DeviceBeloneType.A空气质量;
        info.ConcreteType = DeviceConcreteType.AirQualitySensor;
        info.ObjectTypeName = this.dicDeviceModelIdEnum["A422"].A类型名字;
      }
      //设备所属类型的翻译名字
      info.BeloneText = info.ConcreteText;
@@ -2431,15 +2436,15 @@
      return info;
    }
    #endregion
    #endregion
    #region ■ 传感器具体的类型___________________
    #region ■ 传感器具体的类型___________________
    /// <summary>
    /// 设置传感器具体的类型
    /// </summary>
    /// <param name="info">自定义设备枚举信息</param>
    /// <param name="listdevice">设备对象</param>
    /// <summary>
    /// 设置传感器具体的类型
    /// </summary>
    /// <param name="info">自定义设备枚举信息</param>
    /// <param name="listdevice">设备对象</param>
    private void SetSensorDeviceSpecificType(ref DeviceEnumInfo info, List<CommonDevice> listdevice)
    {
      //如果这个设备拥有多个回路的话,我也不知道怎么命名,只能给个默认名字
@@ -2492,185 +2497,15 @@
      }
    }
    #endregion
    #endregion
    #region ■ 物理设备所属房间___________________
    #region ■ 设备排序___________________________
    /// <summary>
    /// 初始化物理设备所属房间的记录
    /// </summary>
    private void InitRealDeviceRoomId()
    {
      this.dicDeviceRoomId = new Dictionary<string, string>();
      string fullName = DirNameResourse.DeviceRoomIdFile;
      var strData = HdlFileLogic.Current.ReadFileTextContent(fullName);
      if (strData != null)
      {
        this.dicDeviceRoomId = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(strData);
      }
    }
    /// <summary>
    /// 获取全部物理设备所属房间的记录
    /// </summary>
    /// <returns></returns>
    public Dictionary<string, string> GetAllRealDeviceRoomData()
    {
      return this.dicDeviceRoomId;
    }
    /// <summary>
    /// 保存物理设备所属房间的记录
    /// </summary>
    /// <param name="listDevice">需要保存的设备对象</param>
    /// <param name="roomId">需要保存的哪个设备的房间ID</param>
    /// <param name="saveRoadDevice">如果只有一个回路,是否把回路的房间一起修改</param>
    public void SaveRealDeviceRoomId(List<CommonDevice> listDevice, string roomId, bool saveRoadDevice = true)
    {
      if (listDevice == null || listDevice.Count == 0)
      {
        return;
      }
      //如果设备只有一个回路,如果改变了真实设备区域,则它的回路的区域也一起改了
      if (saveRoadDevice == true && listDevice.Count == 1)
      {
        if ((listDevice[0] is OTADevice) == false)
        {
          //ota设备不需要处理
          HdlRoomLogic.Current.ChangedRoom(listDevice[0], roomId, false);
        }
      }
      bool save = false;
      if (roomId == string.Empty)
      {
        //选择的是未分配
        this.dicDeviceRoomId.Remove(listDevice[0].DeviceAddr);
        save = true;
      }
      else
      {
        if (this.dicDeviceRoomId.ContainsKey(listDevice[0].DeviceAddr) == false)
        {
          this.dicDeviceRoomId[listDevice[0].DeviceAddr] = roomId;
          save = true;
        }
        else
        {
          //2020.05.18追加:如果记录的房间ID是不存在的话,则重新覆盖
          var room = HdlRoomLogic.Current.GetRoomById(this.dicDeviceRoomId[listDevice[0].DeviceAddr]);
          if (room == null || this.dicDeviceRoomId[listDevice[0].DeviceAddr] != roomId)
          {
            this.dicDeviceRoomId[listDevice[0].DeviceAddr] = roomId;
            save = true;
          }
        }
      }
      if (save == true)
      {
        //保存记录
        HdlFileLogic.Current.SaveFileContent(DirNameResourse.DeviceRoomIdFile, this.dicDeviceRoomId);
        //添加自动备份
        HdlAutoBackupLogic.AddOrEditorFile(DirNameResourse.DeviceRoomIdFile);
      }
    }
    /// <summary>
    /// 获取真实物理设备的房间名字
    /// </summary>
    /// <param name="device">设备的某一个回路</param>
    /// <returns></returns>
    public string GeteRealDeviceRoomName(CommonDevice device)
    {
      if (this.dicDeviceRoomId.ContainsKey(device.DeviceAddr) == false)
      {
        //未分配区域
        return Language.StringByID(R.MyInternationalizationString.uDeviceNotAssignedRoom);
      }
      var room = HdlRoomLogic.Current.GetRoomById(this.dicDeviceRoomId[device.DeviceAddr]);
      return HdlRoomLogic.Current.GetRoomName(room);
    }
    /// <summary>
    /// 获取真实物理设备属于哪个房间
    /// </summary>
    /// <param name="device">设备的某一个回路</param>
    /// <returns></returns>
    public Room GeteRealDeviceRoom(CommonDevice device)
    {
      if (this.dicDeviceRoomId.ContainsKey(device.DeviceAddr) == false)
      {
        return null;
      }
      return HdlRoomLogic.Current.GetRoomById(this.dicDeviceRoomId[device.DeviceAddr]);
    }
    /// <summary>
    /// 将真实物理设备从房间中移除
    /// </summary>
    /// <param name="device">随便一个回路</param>
    public void DeleteRealDeviceFromRoom(CommonDevice device)
    {
      //将真实物理设备从房间中移除
      this.DeleteRealDeviceFromRoom(new List<string>() { device.DeviceAddr });
    }
    /// <summary>
    /// 将真实物理设备从房间中移除
    /// </summary>
    /// <param name="listMac">设备Mac地址</param>
    public void DeleteRealDeviceFromRoom(List<string> listMac)
    {
      bool save = false;
      foreach (var deviceMacAddr in listMac)
      {
        if (this.dicDeviceRoomId.ContainsKey(deviceMacAddr) == true)
        {
          this.dicDeviceRoomId.Remove(deviceMacAddr);
          save = true;
        }
      }
      if (save == false)
      {
        //没有改变,不需要保存
        return;
      }
      //保存记录
      HdlFileLogic.Current.SaveFileContent(DirNameResourse.DeviceRoomIdFile, this.dicDeviceRoomId);
      //添加自动备份
      HdlAutoBackupLogic.AddOrEditorFile(DirNameResourse.DeviceRoomIdFile);
    }
    /// <summary>
    /// 根据房间ID,移除指定的真实物理设备的所属房间记录
    /// </summary>
    /// <param name="i_RoomId"></param>
    public void DeleteRealDeviceByRoomId(string i_RoomId)
    {
      var listDeleteKey = new List<string>();
      foreach (var deviceAddr in this.dicDeviceRoomId.Keys)
      {
        if (this.dicDeviceRoomId[deviceAddr] == i_RoomId
            && listDeleteKey.Contains(deviceAddr) == false)
        {
          listDeleteKey.Add(deviceAddr);
        }
      }
      //将真实物理设备从房间中移除
      this.DeleteRealDeviceFromRoom(listDeleteKey);
    }
    #endregion
    #region ■ 设备排序___________________________
    /// <summary>
    /// 设备排序
    /// </summary>
    /// <param name="i_listDevice">请确保这个东西已经按mac和端点排序了</param>
    /// <returns></returns>
    /// <summary>
    /// 设备排序
    /// </summary>
    /// <param name="i_listDevice">请确保这个东西已经按mac和端点排序了</param>
    /// <returns></returns>
    public List<CommonDevice> SortDeviceByBelongType(List<CommonDevice> i_listDevice)
    {
      //获取排序规则
@@ -2709,10 +2544,10 @@
      return listSort;
    }
    /// <summary>
    /// 获取设备所属类型的的排序规则
    /// </summary>
    /// <returns></returns>
    /// <summary>
    /// 获取设备所属类型的的排序规则
    /// </summary>
    /// <returns></returns>
    public HashSet<DeviceBeloneType> GetBelongTypeSortRule()
    {
      //谁在前面,谁就优先显示
@@ -2737,222 +2572,14 @@
      return list;
    }
    #endregion
    #endregion
    #region ■ 一般方法___________________________
    /// <summary>
    /// 从缓存变量检测设备是否在线
    /// </summary>
    /// <param name="i_device"></param>
    /// <param name="checkAll">是否检测全部回路</param>
    /// <returns></returns>
    public bool CheckDeviceIsOnline(CommonDevice i_device, bool checkAll = true)
    {
      if (checkAll == false)
      {
        //不检测全部回路
        return i_device.IsOnline == 1 || i_device.IsOnline == 2;
      }
      var listDevice = this.GetDevicesByMac(i_device.DeviceAddr, false);
      foreach (var device in listDevice)
      {
        //0:离线 1:在线 2:正在刷新状态
        bool statu = i_device.IsOnline == 1 || i_device.IsOnline == 2;
        if (statu == true)
        {
          //有一个回路在线,即在线
          return true;
        }
      }
      return false;
    }
    /// <summary>
    /// 判断该设备是否可以显示在主页
    /// </summary>
    /// <param name="i_device"></param>
    /// <returns></returns>
    public bool CanShowInHomeHomeMainPage(CommonDevice i_device)
    {
      if (i_device == null || i_device.Type == DeviceType.OnOffSwitch)//干接点
      {
        //这个设备不见了
        return false;
      }
      if (i_device.Type == DeviceType.OnOffOutput || i_device.Type == DeviceType.AirSwitch)
      {
        //2020.03.23追加式样:未指定类型的继电器,不显示
        if (i_device.DfunctionType == DeviceFunctionType.A未定义
            || i_device.DfunctionType == DeviceFunctionType.A不指定)
        {
          return false;
        }
      }
      //2020.03.30追加式样:如果是面板的温度探头,不显示
      else if (i_device.Type == DeviceType.TemperatureSensor && ((TemperatureSensor)i_device).SensorDiv == 1)
      {
        var myInfoType = LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice>() { i_device });
        if (myInfoType.BeloneType == DeviceBeloneType.A按键面板)
        {
          return false;
        }
      }
      else if (i_device.Type == DeviceType.FreshAirHumiditySensor)
      {
        //新风的湿度传感器不显示
        return false;
      }
      if (((int)i_device.Type).ToString() == i_device.Type.ToString())
      {
        //此设备id在DeviceType里面还没有注册,则不能显示出来
        return false;
      }
      //如果是新风面板或环境面板,则都不显示任何回路
      var myInfoTypeTemp = LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice>() { i_device });
      if (myInfoTypeTemp.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueFreshAir || myInfoTypeTemp.ConcreteType == DeviceConcreteType.ButtonPanel_SimpleEnvironment)
      {
        return false;
      }
      else if (myInfoTypeTemp.ConcreteType == DeviceConcreteType.ButtonPanel_SimpleMultifunction)
      {
        if (i_device.Type != DeviceType.OnOffOutput)
        {
          return false;
        }
      }
      return true;
    }
    /// <summary>
    /// 判断是不是河东的设备
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    public bool IsHdlDevice(CommonDevice device)
    {
      return device.ManufacturerName == "HDL";
    }
    /// <summary>
    /// 是否是Mini夜灯
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    public bool IsMiniLight(CommonDevice device)
    {
      return device.DriveCode != 0 && device.Type == DeviceType.ColorTemperatureLight;
    }
    /// <summary>
    /// 获取设备的唯一主键
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    public string GetDeviceMainKeys(CommonDevice device)
    {
      return this.GetDeviceMainKeys(device.DeviceAddr, device.DeviceEpoint);
    }
    /// <summary>
    /// 获取设备的唯一主键
    /// </summary>
    /// <param name="DeviceAddr">MAC地址</param>
    /// <param name="DeviceEpoint">端口号</param>
    /// <returns></returns>
    public string GetDeviceMainKeys(string DeviceAddr, int DeviceEpoint)
    {
      return DeviceAddr + "_" + DeviceEpoint;
    }
    /// <summary>
    /// 交换设备的模块ID
    /// </summary>
    /// <param name="modeId">模块ID</param>
    /// <returns></returns>
    public bool ChangedDeviceModeId(ref string modeId)
    {
      if (this.dicDeviceModelIdChanged.ContainsKey(modeId) == false)
      {
        return false;
      }
      modeId = this.dicDeviceModelIdChanged[modeId];
      return true;
    }
    /// <summary>
    /// 获取模块ID所指向的各种名字信息
    /// </summary>
    /// <param name="strKey"></param>
    /// <returns></returns>
    public DeviceNameContent GetDeviceModelIdNameInfo(string strKey)
    {
      if (this.dicDeviceModelIdEnum.ContainsKey(strKey) == false)
      {
        return new DeviceNameContent();
      }
      return this.dicDeviceModelIdEnum[strKey];
    }
    /// <summary>
    /// 附加设备的版本代号(返回Ver.XXX)
    /// </summary>
    /// <param name="versionValue">版本号</param>
    /// <returns></returns>
    public string AppendVersion(int versionValue)
    {
      //10101 3个byte  显示为:ver.1.01.01
      //中间那个byte为奇数时,代表是测试版本,在显示最新版本时,不需要显示,但是在历史版本那里可以显示
      //中间那个byte为偶数时, 代表是正式版本
      //直接是10进制
      string txt10 = Convert.ToString(versionValue).PadLeft(6, '0');
      //这个是第一位
      int value1 = Convert.ToInt32(txt10.Substring(0, 2));
      //这个是第二位
      string value2 = txt10.Substring(2, 2);
      //这个是第三位
      string value3 = txt10.Substring(4, 2);
      //Ver.
      string ver = Language.StringByID(R.MyInternationalizationString.uVersionAbbreviation);
      return ver + value1 + "." + value2 + "." + value3;
    }
    /// <summary>
    /// 显示错误信息窗口
    /// </summary>
    /// <param name="msg"></param>
    private void ShowErrorMsg(string msg)
    {
      HdlThreadLogic.Current.RunMain(() =>
      {
        var contr = new ShowMsgControl(Phone.ShowMsgType.Error, msg);
        contr.Show();
      });
    }
    /// <summary>
    /// 显示Tip信息窗口
    /// </summary>
    /// <param name="msg"></param>
    private void ShowTipMsg(string msg)
    {
      HdlThreadLogic.Current.RunMain(() =>
      {
        var contr = new ShowMsgControl(Phone.ShowMsgType.Tip, msg);
        contr.Show();
      });
    }
    #region ■ 晾衣架设备时间配置___________________________
    /// <summary>
    ///  设置晾衣架风干,烘干和消毒时间(设置失败时,会显示信息)
    ///  time:设置的分钟
    /// </summary>
    /// <param name="litdevice">设备对象(MAC地址必须要相同)</param>
    #region ■ 晾衣架设备时间配置___________________________
    /// <summary>
    ///  设置晾衣架风干,烘干和消毒时间(设置失败时,会显示信息)
    ///  time:设置的分钟
    /// </summary>
    /// <param name="litdevice">设备对象(MAC地址必须要相同)</param>
    public async Task<bool> SetAirerTimeDevice(List<CommonDevice> listdevice, Airer airer, int time, int controlEpoint)
    {
      //虚拟住宅的话,不需要
@@ -3015,21 +2642,230 @@
      }
      return true;
    }
    #endregion
    #endregion
    #endregion
    #region ■ 一般方法___________________________
    /// <summary>
    /// 从缓存变量检测设备是否在线
    /// </summary>
    /// <param name="i_device"></param>
    /// <param name="checkAll">是否检测全部回路</param>
    /// <returns></returns>
    public bool CheckDeviceIsOnline(CommonDevice i_device, bool checkAll = true)
    {
      if (checkAll == false)
      {
        //不检测全部回路
        return i_device.IsOnline == 1 || i_device.IsOnline == 2;
      }
      var listDevice = this.GetDevicesByMac(i_device.DeviceAddr, false);
      foreach (var device in listDevice)
      {
        //0:离线 1:在线 2:正在刷新状态
        bool statu = i_device.IsOnline == 1 || i_device.IsOnline == 2;
        if (statu == true)
        {
          //有一个回路在线,即在线
          return true;
        }
      }
      return false;
    }
    /// <summary>
    /// 判断该设备是否可以显示在主页
    /// </summary>
    /// <param name="i_device"></param>
    /// <returns></returns>
    public bool CanShowInHomeHomeMainPage(CommonDevice i_device)
    {
      if (i_device == null || i_device.Type == DeviceType.OnOffSwitch)//干接点
      {
        //这个设备不见了
        return false;
      }
      if (i_device.Type == DeviceType.OnOffOutput || i_device.Type == DeviceType.AirSwitch)
      {
        //2020.03.23追加式样:未指定类型的继电器,不显示
        if (i_device.DfunctionType == DeviceFunctionType.A未定义
            || i_device.DfunctionType == DeviceFunctionType.A不指定)
        {
          return false;
        }
      }
      //2020.03.30追加式样:如果是面板的温度探头,不显示
      else if (i_device.Type == DeviceType.TemperatureSensor && ((TemperatureSensor)i_device).SensorDiv == 1)
      {
        var myInfoType = LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice>() { i_device });
        if (myInfoType.BeloneType == DeviceBeloneType.A按键面板)
        {
          return false;
        }
      }
      else if (i_device.Type == DeviceType.FreshAirHumiditySensor)
      {
        //新风的湿度传感器不显示
        return false;
      }
      if (((int)i_device.Type).ToString() == i_device.Type.ToString())
      {
        //此设备id在DeviceType里面还没有注册,则不能显示出来
        return false;
      }
      //如果是新风面板或环境面板,则都不显示任何回路
      var myInfoTypeTemp = LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice>() { i_device });
      if (myInfoTypeTemp.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueFreshAir || myInfoTypeTemp.ConcreteType == DeviceConcreteType.ButtonPanel_SimpleEnvironment)
      {
        return false;
      }
      else if (myInfoTypeTemp.ConcreteType == DeviceConcreteType.ButtonPanel_SimpleMultifunction)
      {
        if (i_device.Type != DeviceType.OnOffOutput)
        {
          return false;
        }
      }
      return true;
    }
    /// <summary>
    /// 判断是不是河东的设备
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    public bool IsHdlDevice(CommonDevice device)
    {
      return device.ManufacturerName == "HDL";
    }
    /// <summary>
    /// 是否是Mini夜灯
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    public bool IsMiniLight(CommonDevice device)
    {
      return device.DriveCode != 0 && device.Type == DeviceType.ColorTemperatureLight;
    }
    /// <summary>
    /// 获取设备的唯一主键
    /// </summary>
    /// <param name="device"></param>
    /// <returns></returns>
    public string GetDeviceMainKeys(CommonDevice device)
    {
      return this.GetDeviceMainKeys(device.DeviceAddr, device.DeviceEpoint);
    }
    /// <summary>
    /// 获取设备的唯一主键
    /// </summary>
    /// <param name="DeviceAddr">MAC地址</param>
    /// <param name="DeviceEpoint">端口号</param>
    /// <returns></returns>
    public string GetDeviceMainKeys(string DeviceAddr, int DeviceEpoint)
    {
      return DeviceAddr + "_" + DeviceEpoint;
    }
    /// <summary>
    /// 交换设备的模块ID
    /// </summary>
    /// <param name="modeId">模块ID</param>
    /// <returns></returns>
    public bool ChangedDeviceModeId(ref string modeId)
    {
      if (this.dicDeviceModelIdChanged.ContainsKey(modeId) == false)
      {
        return false;
      }
      modeId = this.dicDeviceModelIdChanged[modeId];
      return true;
    }
    /// <summary>
    /// 获取模块ID所指向的各种名字信息
    /// </summary>
    /// <param name="strKey"></param>
    /// <returns></returns>
    public DeviceNameContent GetDeviceModelIdNameInfo(string strKey)
    {
      if (this.dicDeviceModelIdEnum.ContainsKey(strKey) == false)
      {
        return new DeviceNameContent();
      }
      return this.dicDeviceModelIdEnum[strKey];
    }
    /// <summary>
    /// 附加设备的版本代号(返回Ver.XXX)
    /// </summary>
    /// <param name="versionValue">版本号</param>
    /// <returns></returns>
    public string AppendVersion(int versionValue)
    {
      //10101 3个byte  显示为:ver.1.01.01
      //中间那个byte为奇数时,代表是测试版本,在显示最新版本时,不需要显示,但是在历史版本那里可以显示
      //中间那个byte为偶数时, 代表是正式版本
      //直接是10进制
      string txt10 = Convert.ToString(versionValue).PadLeft(6, '0');
      //这个是第一位
      int value1 = Convert.ToInt32(txt10.Substring(0, 2));
      //这个是第二位
      string value2 = txt10.Substring(2, 2);
      //这个是第三位
      string value3 = txt10.Substring(4, 2);
      //Ver.
      string ver = Language.StringByID(R.MyInternationalizationString.uVersionAbbreviation);
      return ver + value1 + "." + value2 + "." + value3;
    }
    /// <summary>
    /// 显示错误信息窗口
    /// </summary>
    /// <param name="msg"></param>
    private void ShowErrorMsg(string msg)
    {
      HdlThreadLogic.Current.RunMain(() =>
      {
        var contr = new ShowMsgControl(Phone.ShowMsgType.Error, msg);
        contr.Show();
      });
    }
    /// <summary>
    /// 显示Tip信息窗口
    /// </summary>
    /// <param name="msg"></param>
    private void ShowTipMsg(string msg)
    {
      HdlThreadLogic.Current.RunMain(() =>
      {
        var contr = new ShowMsgControl(Phone.ShowMsgType.Tip, msg);
        contr.Show();
      });
    }
    #endregion
    //----------------------------------分割线(自定义接口)---------------------------------------------
    #region ■ 获取设备列表的接口_________________
    #region ■ 获取设备列表的接口_________________
    /// <summary>
    /// <para>从网关重新获取设备列表(返回的设备为虚拟出来的),一次性全部获取</para>
    /// <para>statu状态 -1:异常,会返回null, 1:没有异常, 2:数据接收不全</para>
    /// </summary>
    /// <param name="gatewayId">网关id</param>
    /// <param name="statu">状态-> -1:异常,会返回null, 1:没有异常, 2:数据接收不全</param>
    /// <param name="useLocalConnect">是否使用本地连接发送</param>
    /// <param name="mode">是否显示错误</param>
    /// <summary>
    /// <para>从网关重新获取设备列表(返回的设备为虚拟出来的),一次性全部获取</para>
    /// <para>statu状态 -1:异常,会返回null, 1:没有异常, 2:数据接收不全</para>
    /// </summary>
    /// <param name="gatewayId">网关id</param>
    /// <param name="statu">状态-> -1:异常,会返回null, 1:没有异常, 2:数据接收不全</param>
    /// <param name="useLocalConnect">是否使用本地连接发送</param>
    /// <param name="mode">是否显示错误</param>
    /// <returns></returns>
    public List<CommonDevice> GetDeviceListFromGateway(string gatewayId, ref int statu, bool useLocalConnect, ShowErrorMode mode = ShowErrorMode.YES)
    {
@@ -3048,7 +2884,7 @@
      var listDevice = new List<CommonDevice>();
      //网关里面有可能会有重复的回路
      var listCheck = new HashSet<string>();
      ///Mac的端点总数
      ///Mac的端点总数
      var dicMacPointCount = new Dictionary<string, int>();
      HdlGatewayReceiveLogic.Current.AddGatewayReceiveEvent(gatewayId, (topic, message) =>
@@ -3196,15 +3032,15 @@
      return listDevice;
    }
    /// <summary>
    /// 根据序号获取设备列表信息(只有在设备缺损的时候才调用这个函数) 1:正常 2:设备缺损
    /// </summary>
    /// <param name="gatewayId">网关id</param>
    /// <param name="listDevice">存储的设备对象集合</param>
    /// <param name="listFucDevice">需要变更功能类型的回路</param>
    /// <param name="dicNowPointCount">当前已经获取的Mac的端点总数</param>
    /// <param name="useLocalConnect">是否使用本地连接发送</param>
    /// <returns></returns>
    /// <summary>
    /// 根据序号获取设备列表信息(只有在设备缺损的时候才调用这个函数) 1:正常 2:设备缺损
    /// </summary>
    /// <param name="gatewayId">网关id</param>
    /// <param name="listDevice">存储的设备对象集合</param>
    /// <param name="listFucDevice">需要变更功能类型的回路</param>
    /// <param name="dicNowPointCount">当前已经获取的Mac的端点总数</param>
    /// <param name="useLocalConnect">是否使用本地连接发送</param>
    /// <returns></returns>
    public int GetDeviceListFromGatewayByMac(string gatewayId, ref List<CommonDevice> listDevice, ref List<CommonDevice> listFucDevice, Dictionary<string, int> dicNowPointCount, bool useLocalConnect)
    {
      //首先先获取设备的mac列表
@@ -3250,11 +3086,11 @@
      return statu == 1 ? 1 : 2;
    }
    /// <summary>
    /// 在设备Type变更时,重新New这个设备对象(仅限在刷新设备列表使用,并且本地需要存在)
    /// </summary>
    /// <param name="oldLocalDevice">原来的本地对象</param>
    /// <param name="newDeviceType">新的设备Type</param>
    /// <summary>
    /// 在设备Type变更时,重新New这个设备对象(仅限在刷新设备列表使用,并且本地需要存在)
    /// </summary>
    /// <param name="oldLocalDevice">原来的本地对象</param>
    /// <param name="newDeviceType">新的设备Type</param>
    private bool ReNewDeviceOnTypeIsChanged(CommonDevice oldLocalDevice, DeviceType newDeviceType)
    {
      //先获取本地这个旧设备对象的json
@@ -3289,47 +3125,47 @@
      return true;
    }
    /// <summary>
    /// 接收设备Mac列表的类
    /// </summary>
    /// <summary>
    /// 接收设备Mac列表的类
    /// </summary>
    private class ReceiptMacResult
    {
      /// <summary>
      /// mac总数
      /// </summary>
      /// <summary>
      /// mac总数
      /// </summary>
      public int MACDeviceTotalNum = 0;
      /// <summary>
      /// 设备mac列表
      /// </summary>
      /// <summary>
      /// 设备mac列表
      /// </summary>
      public List<MacResult> MACDeviceList = new List<MacResult>();
    }
    /// <summary>
    /// 设备Mac的内容
    /// </summary>
    /// <summary>
    /// 设备Mac的内容
    /// </summary>
    private class MacResult
    {
      /// <summary>
      /// 设备Mac
      /// </summary>
      /// <summary>
      /// 设备Mac
      /// </summary>
      public string MacAddr = string.Empty;
      /// <summary>
      /// mac端点的总数
      /// </summary>
      /// <summary>
      /// mac端点的总数
      /// </summary>
      public int EPTotalNum = 0;
    }
    #endregion
    #endregion
    #region ■ 创建新设备对象相关_________________
    #region ■ 创建新设备对象相关_________________
    /// <summary>
    /// 根据设备类型创建设备对象的实例(数据在DeviceInfo中)
    /// </summary>
    /// <param name="deviceType">设备类型</param>
    /// <param name="jobject">主题Data</param>
    /// <param name="gwid">网关id</param>
    /// <returns></returns>
    /// <summary>
    /// 根据设备类型创建设备对象的实例(数据在DeviceInfo中)
    /// </summary>
    /// <param name="deviceType">设备类型</param>
    /// <param name="jobject">主题Data</param>
    /// <param name="gwid">网关id</param>
    /// <returns></returns>
    private CommonDevice NewDeviceObjectByDeviceId(DeviceType deviceType, Newtonsoft.Json.Linq.JObject jobject, string gwid)
    {
      //根据设备类型创建设备对象的实例
@@ -3353,11 +3189,11 @@
      return device;
    }
    /// <summary>
    /// 将DeviceInfo的属性设置到主属性中
    /// </summary>
    /// <param name="mainDevice">主设备对象</param>
    /// <param name="device">设置源设备对象</param>
    /// <summary>
    /// 将DeviceInfo的属性设置到主属性中
    /// </summary>
    /// <param name="mainDevice">主设备对象</param>
    /// <param name="device">设置源设备对象</param>
    public void SetDeviceInfoToMain(CommonDevice mainDevice, CommonDevice device)
    {
      mainDevice.DeviceName = device.DeviceInfo.MacName;
@@ -3416,12 +3252,12 @@
      }
    }
    /// <summary>
    /// 根据设备Type创建对应的设备对象
    /// </summary>
    /// <param name="deviceType">设备Type</param>
    /// <param name="DeviceEpoint">设备端点(没有什么特殊需求的话,填0即可)</param>
    /// <returns></returns>
    /// <summary>
    /// 根据设备Type创建对应的设备对象
    /// </summary>
    /// <param name="deviceType">设备Type</param>
    /// <param name="DeviceEpoint">设备端点(没有什么特殊需求的话,填0即可)</param>
    /// <returns></returns>
    public CommonDevice NewDeviceObjectByDeviceId(DeviceType deviceType, int DeviceEpoint)
    {
      //根据设备类型创建设备对象的实例
@@ -3437,11 +3273,11 @@
      return device;
    }
    /// <summary>
    /// 给新设备设置主键属性
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="jobject">主题Data</param>
    /// <summary>
    /// 给新设备设置主键属性
    /// </summary>
    /// <param name="device">设备对象</param>
    /// <param name="jobject">主题Data</param>
    public void SetNewDeviceMainKeys(CommonDevice device, Newtonsoft.Json.Linq.JObject jobject)
    {
      //设置设备主键类
@@ -3450,16 +3286,16 @@
      device.DeviceEpoint = jobject.Value<int>("Epoint");
    }
    #endregion
    #endregion
    #region ■ 刷新设备功能类型___________________
    #region ■ 刷新设备功能类型___________________
    /// <summary>
    /// 刷新设备的功能类型,如果返回true,代表需要另外调用【SendDeviceFunctionTypeToGateway】函数,sendFucType为true时自动调用
    /// </summary>
    /// <param name="mainDevice">主设备对象</param>
    /// <param name="device">设置源设备对象</param>
    /// <param name="sendFucType">当需要变更时,是否发送功能类型到网关(此变量给获取设备列表有特殊含义)</param>
    /// <summary>
    /// 刷新设备的功能类型,如果返回true,代表需要另外调用【SendDeviceFunctionTypeToGateway】函数,sendFucType为true时自动调用
    /// </summary>
    /// <param name="mainDevice">主设备对象</param>
    /// <param name="device">设置源设备对象</param>
    /// <param name="sendFucType">当需要变更时,是否发送功能类型到网关(此变量给获取设备列表有特殊含义)</param>
    public bool RefreshDeviceFunctionType(CommonDevice mainDevice, CommonDevice device, bool sendFucType)
    {
      //如果是调光器
@@ -3559,10 +3395,10 @@
      return false;
    }
    /// <summary>
    /// 根据功能类型,重新设置设备回路图标
    /// </summary>
    /// <param name="device"></param>
    /// <summary>
    /// 根据功能类型,重新设置设备回路图标
    /// </summary>
    /// <param name="device"></param>
    private void ResetIconPathByDeviceFunctionType(CommonDevice device)
    {
      if (device.IsCustomizeImage == true)
@@ -3583,15 +3419,15 @@
      }
    }
    #endregion
    #endregion
    //----------------------------------分割线(设备模块ID)---------------------------------------------
    #region ■ 自定义设备模块ID___________________
    #region ■ 自定义设备模块ID___________________
    /// <summary>
    /// 初始化设备的模块ID的枚举
    /// </summary>
    /// <summary>
    /// 初始化设备的模块ID的枚举
    /// </summary>
    private void InitDeviceModelIdEnum()
    {
      //*********************************************************************
@@ -3666,27 +3502,27 @@
      this.dicPictrueShard["ButtonPanel_FourButtonScene"] = "ButtonPanel_Four";//简约4按键场景面板 沿用 4按键面板的图标
    }
    /// <summary>
    /// 获取设备名字文件的内容
    /// </summary>
    /// <returns></returns>
    /// <summary>
    /// 获取设备名字文件的内容
    /// </summary>
    /// <returns></returns>
    private List<string> GetDeviceNameFileContent()
    {
      System.IO.StreamReader streamReader = null;
      var listText = new List<string>();
      try
      {
#if iOS
                string textFile = Foundation.NSBundle.MainBundle.PathForResource("DeviceName.ini", null);
                streamReader = new System.IO.StreamReader(textFile, Encoding.UTF8);
                string text;
                while ((text = streamReader.ReadLine()) != null)
                {
                    listText.Add(text.Trim());
                }
                return listText;
#endif
#if Android
#if iOS
                string textFile = Foundation.NSBundle.MainBundle.PathForResource("DeviceName.ini", null);
                streamReader = new System.IO.StreamReader(textFile, Encoding.UTF8);
                string text;
                while ((text = streamReader.ReadLine()) != null)
                {
                    listText.Add(text.Trim());
                }
                return listText;
#endif
#if Android
        var stream = Application.Activity.Assets.Open("DeviceName.ini");
        streamReader = new System.IO.StreamReader(stream, Encoding.UTF8);
        string text;
@@ -3696,7 +3532,7 @@
        }
        stream.Close();
        return listText;
#endif
#endif
      }
      catch
      {
@@ -3714,439 +3550,439 @@
      }
    }
    #endregion
    #endregion
  }
  #region ■ 自定义设备类型_________________________
  #region ■ 自定义设备类型_________________________
  /// <summary>
  /// <para>设备的具体【设备类型】,变量名可以作为【设备类型】图片,这个值是瞎写的,没什么特殊意义</para>
  /// </summary>
  /// <summary>
  /// <para>设备的具体【设备类型】,变量名可以作为【设备类型】图片,这个值是瞎写的,没什么特殊意义</para>
  /// </summary>
  public enum DeviceConcreteType
  {
    /// <summary>
    /// 未知设备
    /// </summary>
    /// <summary>
    /// 未知设备
    /// </summary>
    UnKownDevice = -1,
    //=========★★窗帘类(100-199)★★=========
    /// <summary>
    /// 窗帘
    /// </summary>
    /// <summary>
    /// 窗帘
    /// </summary>
    Curtain = -100,
    /// <summary>
    /// 智能开合帘电机 镜像id:100
    /// </summary>
    /// <summary>
    /// 智能开合帘电机 镜像id:100
    /// </summary>
    Curtain_AutoOpen = 100,
    /// <summary>
    /// 智能管状电机 镜像id:101
    /// </summary>
    /// <summary>
    /// 智能管状电机 镜像id:101
    /// </summary>
    Curtain_Siphonate = 101,
    //=========★★按键面板类(200-1199)★★=========
    /// <summary>
    /// 按键面板
    /// </summary>
    /// <summary>
    /// 按键面板
    /// </summary>
    ButtonPanel = -200,
    /// <summary>
    /// 4按键多功能触摸面板(带4路继电器底座) 镜像id:200
    /// </summary>
    /// <summary>
    /// 4按键多功能触摸面板(带4路继电器底座) 镜像id:200
    /// </summary>
    ButtonPanel_Four = 200,
    /// <summary>
    /// 3按键多功能触摸面板(带3路继电器底座) 镜像id:201
    /// </summary>
    /// <summary>
    /// 3按键多功能触摸面板(带3路继电器底座) 镜像id:201
    /// </summary>
    ButtonPanel_Three = 201,
    /// <summary>
    /// 2按键多功能触摸面板(带2路继电器底座) 镜像id:202
    /// </summary>
    /// <summary>
    /// 2按键多功能触摸面板(带2路继电器底座) 镜像id:202
    /// </summary>
    ButtonPanel_Two = 202,
    /// <summary>
    /// 12按键多功能触摸面板(带1路继电器底座) 镜像id:203
    /// </summary>
    /// <summary>
    /// 12按键多功能触摸面板(带1路继电器底座) 镜像id:203
    /// </summary>
    ButtonPanel_Twelve = 203,
    /// <summary>
    /// 4按键多功能触摸面板(只带电源底座) 镜像id:210
    /// </summary>
    /// <summary>
    /// 4按键多功能触摸面板(只带电源底座) 镜像id:210
    /// </summary>
    ButtonPanel_FourNotPower = 210,
    /// <summary>
    /// 简约4按键面板 镜像id:220
    /// </summary>
    /// <summary>
    /// 简约4按键面板 镜像id:220
    /// </summary>
    ButtonPanel_SimpleFour = 220,
    /// <summary>
    /// 简约3按键面板 镜像id:221
    /// </summary>
    /// <summary>
    /// 简约3按键面板 镜像id:221
    /// </summary>
    ButtonPanel_SimpleThree = 221,
    /// <summary>
    /// 简约2按键面板 镜像id:222
    /// </summary>
    /// <summary>
    /// 简约2按键面板 镜像id:222
    /// </summary>
    ButtonPanel_SimpleTwo = 222,
    /// <summary>
    /// 简约4按键场景面板 镜像id:224
    /// </summary>
    /// <summary>
    /// 简约4按键场景面板 镜像id:224
    /// </summary>
    ButtonPanel_FourButtonScene = 224,
    /// <summary>
    /// 简约2路窗帘面板 镜像id:226
    /// </summary>
    /// <summary>
    /// 简约2路窗帘面板 镜像id:226
    /// </summary>
    ButtonPanel_TwoButtonCurtain = 226,
    /// <summary>
    /// 方悦2按键轻触式面板 镜像id:240
    /// </summary>
    /// <summary>
    /// 方悦2按键轻触式面板 镜像id:240
    /// </summary>
    ButtonPanel_FangyueTwo = 240,
    /// <summary>
    /// 方悦4按键轻触式面板 镜像id:241
    /// </summary>
    /// <summary>
    /// 方悦4按键轻触式面板 镜像id:241
    /// </summary>
    ButtonPanel_FangyueFour = 241,
    /// <summary>
    /// 方悦8按键轻触式面板 镜像id:242
    /// </summary>
    /// <summary>
    /// 方悦8按键轻触式面板 镜像id:242
    /// </summary>
    ButtonPanel_FangyueEight = 242,
    /// <summary>
    /// 方悦新风面板 镜像id:250
    /// </summary>
    /// <summary>
    /// 方悦新风面板 镜像id:250
    /// </summary>
    ButtonPanel_FangyueFreshAir = 250,
    /// <summary>
    /// 方悦环境面板 镜像id:253
    /// </summary>
    /// <summary>
    /// 方悦环境面板 镜像id:253
    /// </summary>
    ButtonPanel_FangyueEnvironment = 253,
    /// <summary>
    /// 窗帘面板 镜像id:256
    /// </summary>
    /// <summary>
    /// 窗帘面板 镜像id:256
    /// </summary>
    ButtonPanel_Curtain = 256,
    /// <summary>
    /// 简约多功能面板 镜像ID:212
    /// </summary>
    /// <summary>
    /// 简约多功能面板 镜像ID:212
    /// </summary>
    ButtonPanel_SimpleMultifunction = 212,
    /// <summary>
    /// 简约环境面板
    /// </summary>
    /// <summary>
    /// 简约环境面板
    /// </summary>
    ButtonPanel_SimpleEnvironment = 230,
    //=========★★PIR传感器类(1200-1299)★★=========
    /// <summary>
    /// 传感器
    /// </summary>
    /// <summary>
    /// 传感器
    /// </summary>
    Sensor = -1200,
    /// <summary>
    /// pir传感器220 镜像id:1200
    /// </summary>
    /// <summary>
    /// pir传感器220 镜像id:1200
    /// </summary>
    Sensor_Pir = 1200,
    /// <summary>
    /// 球形移动传感器 镜像id:1205
    /// </summary>
    /// <summary>
    /// 球形移动传感器 镜像id:1205
    /// </summary>
    Sensor_SphericalMotion = 1205,
    //=========★★安防类传感器类(1300-2299)★★=========
    /// <summary>
    /// 燃气传感器
    /// </summary>
    /// <summary>
    /// 燃气传感器
    /// </summary>
    Sensor_CarbonMonoxide = 1300,
    /// <summary>
    /// 门窗传感器
    /// </summary>
    /// <summary>
    /// 门窗传感器
    /// </summary>
    Sensor_DoorWindow = 1301,
    /// <summary>
    /// 烟雾传感器
    /// </summary>
    /// <summary>
    /// 烟雾传感器
    /// </summary>
    Sensor_Fire = 1302,
    /// <summary>
    /// 红外传感器
    /// </summary>
    /// <summary>
    /// 红外传感器
    /// </summary>
    Sensor_Infrared = 1303,
    /// <summary>
    /// 水侵传感器
    /// </summary>
    /// <summary>
    /// 水侵传感器
    /// </summary>
    Sensor_Water = 1304,
    /// <summary>
    /// 紧急按钮
    /// </summary>
    /// <summary>
    /// 紧急按钮
    /// </summary>
    Sensor_EmergencyButton = 1305,
    /// <summary>
    /// 吸顶燃气传感器
    /// </summary>
    /// <summary>
    /// 吸顶燃气传感器
    /// </summary>
    Sensor_CeilingGas = 1306,
    /// <summary>
    /// PM2.5空气质量传感器
    /// </summary>
    /// <summary>
    /// PM2.5空气质量传感器
    /// </summary>
    Sensor_PMTwoPointFive = 1307,
    /// <summary>
    /// 温湿度传感器(这个单词拼错了,但是错了就错了呗,就这样了)
    /// </summary>
    /// <summary>
    /// 温湿度传感器(这个单词拼错了,但是错了就错了呗,就这样了)
    /// </summary>
    Sensor_TemperatureHumidity = 1308,
    /// <summary>
    /// 运动传感器
    /// </summary>
    /// <summary>
    /// 运动传感器
    /// </summary>
    Sensor_Motion = -1306,
    /// <summary>
    /// 钥匙扣
    /// </summary>
    /// <summary>
    /// 钥匙扣
    /// </summary>
    Sensor_Keyfob = -1307,
    /// <summary>
    /// 温度传感器(这个单词拼错了,但是错了就错了呗,就这样了)
    /// </summary>
    /// <summary>
    /// 温度传感器(这个单词拼错了,但是错了就错了呗,就这样了)
    /// </summary>
    Sensor_Temperature = -1309,
    /// <summary>
    /// 湿度传感器
    /// </summary>
    /// <summary>
    /// 湿度传感器
    /// </summary>
    Sensor_Humidity = -1310,
    //=========★★继电器类(2300-2499)★★=========
    /// <summary>
    /// 继电器
    /// </summary>
    /// <summary>
    /// 继电器
    /// </summary>
    Relay = -2300,
    /// <summary>
    /// 三路继电器 镜像id:2300
    /// </summary>
    /// <summary>
    /// 三路继电器 镜像id:2300
    /// </summary>
    Relay_ThreeLoad = 2300,
    /// <summary>
    /// 方悦新风小模块 镜像id:2310
    /// </summary>
    /// <summary>
    /// 方悦新风小模块 镜像id:2310
    /// </summary>
    Relay_FangyueFreshAirModul = 2310,
    /// <summary>
    /// 国标3路10A继电器小模块 镜像id:2301
    /// </summary>
    /// <summary>
    /// 国标3路10A继电器小模块 镜像id:2301
    /// </summary>
    Relay_NationalThreeLoadTenA = 2301,
    /// <summary>
    /// 欧标2路5A继电器小模块 镜像id:2315
    /// </summary>
    /// <summary>
    /// 欧标2路5A继电器小模块 镜像id:2315
    /// </summary>
    Relay_EuropeanTwoLoadFiveA = 2315,
    /// <summary>
    /// 7路干接点输入输出模块 镜像id:2320
    /// </summary>
    /// <summary>
    /// 7路干接点输入输出模块 镜像id:2320
    /// </summary>
    Relay_SevenLoadInOutPutDryContact = 2320,
    //=========★★调光器类(2500-2799)★★=========
    /// <summary>
    /// 调光器
    /// </summary>
    /// <summary>
    /// 调光器
    /// </summary>
    DimmableLight = -2500,
    /// <summary>
    /// 1路调光器小模块
    /// </summary>
    /// <summary>
    /// 1路调光器小模块
    /// </summary>
    DimmableLight_OneLoad = 2500,
    //=========★★智能门锁类(2800-????)★★=========
    /// <summary>
    /// 智能门锁
    /// </summary>
    /// <summary>
    /// 智能门锁
    /// </summary>
    IntelligentLocks = -2800,
    /// <summary>
    /// H06C
    /// </summary>
    /// <summary>
    /// H06C
    /// </summary>
    IntelligentLocks_H06C = 2800,
    /// <summary>
    /// S-One Pro
    /// </summary>
    /// <summary>
    /// S-One Pro
    /// </summary>
    IntelligentLocks_Sone = 2802,
    /// <summary>
    /// AT-1TF
    /// </summary>
    /// <summary>
    /// AT-1TF
    /// </summary>
    IntelligentLocks_AT1TF = 2803,
    /// <summary>
    /// AT-1F
    /// </summary>
    /// <summary>
    /// AT-1F
    /// </summary>
    IntelligentLocks_AT1F = 2804,
    /// <summary>
    /// AT-1T
    /// </summary>
    /// <summary>
    /// AT-1T
    /// </summary>
    IntelligentLocks_AT1T = 2805,
    /// <summary>
    /// HAT-1B
    /// </summary>
    /// <summary>
    /// HAT-1B
    /// </summary>
    IntelligentLocks_HAT1B = 2806,
    /// <summary>
    /// HAT-1T
    /// </summary>
    /// <summary>
    /// HAT-1T
    /// </summary>
    IntelligentLocks_HAT1T = 2807,
    /// <summary>
    /// AT-FT
    /// </summary>
    /// <summary>
    /// AT-FT
    /// </summary>
    IntelligentLocks_ATFT = 2808,
    //=========★★彩灯类(????-????)★★=========
    /// <summary>
    /// 彩灯
    /// </summary>
    /// <summary>
    /// 彩灯
    /// </summary>
    ColorLight = -10,
    /// <summary>
    /// 色温灯(它的镜像ID未定,暂定20000)
    /// </summary>
    /// <summary>
    /// 色温灯(它的镜像ID未定,暂定20000)
    /// </summary>
    ColorLight_Temperature = 20000,
    //=========★★空调(3600-3899)★★=========
    /// <summary>
    /// 空调
    /// </summary>
    /// <summary>
    /// 空调
    /// </summary>
    AirConditioner = -3600,
    /// <summary>
    /// zigbee空调网关模块
    /// </summary>
    /// <summary>
    /// zigbee空调网关模块
    /// </summary>
    AirConditioner_ZbGateway = 3600,
    //=========★★中继器(3900-3999)★★=========
    /// <summary>
    /// 中继器
    /// </summary>
    /// <summary>
    /// 中继器
    /// </summary>
    Repeater = -3900,
    /// <summary>
    /// zigbee中继器 镜像id:3900
    /// </summary>
    /// <summary>
    /// zigbee中继器 镜像id:3900
    /// </summary>
    Repeater_Zigbee = 3900,
    //=========★★空气开关类(4100-????)★★=========
    /// <summary>
    /// 智能空开
    /// </summary>
    /// <summary>
    /// 智能空开
    /// </summary>
    AirSwitch = -4100,
    /// <summary>
    /// 智能空开 镜像id:4100
    /// </summary>
    /// <summary>
    /// 智能空开 镜像id:4100
    /// </summary>
    AirSwitch_CloudContr = 4100,
    //=========★★转换器类(4200-4699)★★=========
    /// <summary>
    /// 转换器
    /// </summary>
    /// <summary>
    /// 转换器
    /// </summary>
    Converter = -4200,
    /// <summary>
    /// zigbee转485协议转换器
    /// </summary>
    /// <summary>
    /// zigbee转485协议转换器
    /// </summary>
    Converter_Zb485 = 4200,
    /// <summary>
    /// zigbee转buspro协议转换器
    /// </summary>
    /// <summary>
    /// zigbee转buspro协议转换器
    /// </summary>
    Converter_ZbBuspro = 4201,
    //=========★★晾衣架类(5000-5199)★★=========
    /// <summary>
    /// 晾衣架
    /// </summary>
    /// <summary>
    /// 晾衣架
    /// </summary>
    Airer = 5000,
    //=========★★空气质量传感器类(5200-5399)★★=========
    /// <summary>
    /// 空气质量传感器
    /// </summary>
    /// <summary>
    /// 空气质量传感器
    /// </summary>
    AirQualitySensor = 5200,
    //=========★★其他类(????-????)★★=========
    /// <summary>
    /// 干接点(注意,它属于其他类,不是设备类型)
    /// </summary>
    /// <summary>
    /// 干接点(注意,它属于其他类,不是设备类型)
    /// </summary>
    DryContact = -10000,
    /// <summary>
    /// 灯光(注意,它属于其他类,不是设备类型)
    /// </summary>
    /// <summary>
    /// 灯光(注意,它属于其他类,不是设备类型)
    /// </summary>
    Light = -10001,
    /// <summary>
    /// 插座(注意,它属于其他类,不是设备类型)
    /// </summary>
    /// <summary>
    /// 插座(注意,它属于其他类,不是设备类型)
    /// </summary>
    Socket1 = -10002,
    /// <summary>
    /// 开关(注意,它属于其他类,不是设备类型)
    /// </summary>
    /// <summary>
    /// 开关(注意,它属于其他类,不是设备类型)
    /// </summary>
    Switch = -10003,
  }
  /// <summary>
  /// <para>设备所属枚举,这个值是瞎写的,没什么特殊意义</para>
  /// </summary>
  /// <summary>
  /// <para>设备所属枚举,这个值是瞎写的,没什么特殊意义</para>
  /// </summary>
  public enum DeviceBeloneType
  {
    /// <summary>
    /// 未知设备
    /// </summary>
    /// <summary>
    /// 未知设备
    /// </summary>
    A未知设备 = 0,
    /// <summary>
    /// 窗帘(100-199)
    /// </summary>
    /// <summary>
    /// 窗帘(100-199)
    /// </summary>
    A窗帘 = 100,
    /// <summary>
    /// 按键面板(200-1199)
    /// </summary>
    /// <summary>
    /// 按键面板(200-1199)
    /// </summary>
    A按键面板 = 200,
    /// <summary>
    /// 传感器(1200-2299)
    /// </summary>
    /// <summary>
    /// 传感器(1200-2299)
    /// </summary>
    A传感器 = 1200,
    /// <summary>
    /// PM2.5空气质量传感器
    /// </summary>
    /// <summary>
    /// PM2.5空气质量传感器
    /// </summary>
    APM2点5空气质量传感器 = 1307,
    /// <summary>
    /// 继电器(2300-2499)
    /// </summary>
    /// <summary>
    /// 继电器(2300-2499)
    /// </summary>
    A继电器 = 2300,
    /// <summary>
    /// 新风
    /// </summary>
    /// <summary>
    /// 新风
    /// </summary>
    A新风 = 2310,
    /// <summary>
    /// 调光器(2500-2799)
    /// </summary>
    /// <summary>
    /// 调光器(2500-2799)
    /// </summary>
    A调光器 = 2500,
    /// <summary>
    /// 智能门锁(2800-????)
    /// </summary>
    /// <summary>
    /// 智能门锁(2800-????)
    /// </summary>
    A智能门锁 = 2800,
    /// <summary>
    /// 空调(3600-3899)
    /// </summary>
    /// <summary>
    /// 空调(3600-3899)
    /// </summary>
    A空调 = 3600,
    /// <summary>
    /// 中继器(3900-3999)
    /// </summary>
    /// <summary>
    /// 中继器(3900-3999)
    /// </summary>
    A中继器 = 3900,
    /// <summary>
    /// 智能空开(4100-4199)
    /// </summary>
    /// <summary>
    /// 智能空开(4100-4199)
    /// </summary>
    A智能空开 = 4100,
    /// <summary>
    /// 转换器(4200-4699)
    /// </summary>
    /// <summary>
    /// 转换器(4200-4699)
    /// </summary>
    A转换器 = 4200,
    /// <summary>
    /// 晾衣架(4200-4699)
    /// </summary>
    /// <summary>
    /// 晾衣架(4200-4699)
    /// </summary>
    A晾衣架 = 5000,
    /// <summary>
    /// 空气质量传感器(5200-5399)
    /// </summary>
    /// <summary>
    /// 空气质量传感器(5200-5399)
    /// </summary>
    A空气质量 = 5200,
    /// <summary>
    /// 彩灯
    /// </summary>
    /// <summary>
    /// 彩灯
    /// </summary>
    A彩灯 = 9,
    /// <summary>
    /// 温湿度传感器
    /// </summary>
    /// <summary>
    /// 温湿度传感器
    /// </summary>
    A温湿度传感器 = 10,
    /// <summary>
    /// 温度传感器
    /// </summary>
    /// <summary>
    /// 温度传感器
    /// </summary>
    A温度传感器 = 11,
    /// <summary>
    /// 湿度传感器
    /// </summary>
    /// <summary>
    /// 湿度传感器
    /// </summary>
    A湿度传感器 = 12,
    /// <summary>
    /// 开关
    /// </summary>
    /// <summary>
    /// 开关
    /// </summary>
    A开关 = 13,
    /// <summary>
    /// 插座
    /// </summary>
    /// <summary>
    /// 插座
    /// </summary>
    A插座 = 14,
    /// <summary>
    /// 灯光
    /// </summary>
    /// <summary>
    /// 灯光
    /// </summary>
    A灯光 = 15,
    /// <summary>
    /// 干接点
    /// </summary>
    /// <summary>
    /// 干接点
    /// </summary>
    A干接点 = 16,
  }
  #endregion
}
  #endregion
}