wei
2021-03-04 2ae36ddb40d28c62b64a2fdd4c3033e7d65d5cfb
HDL_ON/Entity/Function/Function.cs
old mode 100755 new mode 100644
@@ -23,6 +23,36 @@
        public string pageSize = "0";
    }
    /// <summary>
    /// 属性状态
    /// </summary>
    public class AttrState
    {
        /// <summary>
        /// 属性键名
        /// </summary>
        public string key;
        /// <summary>
        /// 属性的值列表
        /// </summary>
        public List<string> value = new List<string>();
        /// <summary>
        /// 最大值
        /// </summary>
        public int max = 100;
        /// <summary>
        /// 最小值
        /// </summary>
        public int min = 0;
        /// <summary>
        /// 数据类型
        /// </summary>
        public string data_type = "";
        /// <summary>
        /// 当前值
        /// </summary>
        public string curValue = "";
    }
    /// <summary>
    /// 功能类能满足数据使用要求,子类只是为了方便使用属性
@@ -33,29 +63,72 @@
        {
        }
        #region base info
        #region 优化区域 2021-02-25
        /// <summary>
        /// HDL统一协议格式:14bytes
        /// 举例: 来源   厂商代码 通讯方式  产品时间戳   产品类别 物模型类  通道号   大小类别
        ///       1byte   1byte   1byte     4byte       1byte   2byte   2byte   2byte
        /// 来源:00   默认原生态系统数据 、01   网关或者其他A设备、02   调试软件、03   APP应用程序、04   第三方网关或者平台
        /// 厂商代码:01   HDL
        /// 通讯方式:01   HDL Bus、02   Zigbee、03 KNX、04 Z-Wave
        /// 产品时间戳:4bytes   以2020年1月1日算出的时间戳0.1s为单位
        /// 产品类别:01   调光器、02 继电器、03   干接点模块、04   传感器、05 面板
        /// 物模型类型:
        ///     01   开关类:01 开关、02 插座、03
        ///     02   照明: 01 开关、02   调光、03   色温、04   LED
        ///     03   遮阳: 01   窗帘电机、02 百叶窗、03 开合帘、04 卷帘
        ///     04   恒温器:01 空调、02 地暖、03 毛细空调
        ///     05   新风
        ///     06   影音
        ///     07   音乐
        ///     08   能源
        ///     09   安防
        /// 大类别   1bytes   (预留)
        /// 小类别   1byte   (预留)
        /// 获取属性列表
        /// </summary>
        /// <returns></returns>
        public List<string> GetAttributes()
        {
            var attrs = new List<string>();
            foreach(var attr in  attributes)
            {
                attrs.Add(attr.key);
            }
            return attrs;
        }
        /// <summary>
        /// 获取制定属性
        /// </summary>
        /// <returns></returns>
        public FunctionAttributes GetAttribute(string key)
        {
            var attr = attributes.Find((a) => a.key == key);
            return attr;
        }
        /// <summary>
        /// 获取属性当前状态
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public string GetAttrState(string key)
        {
            var attrState = attributes.Find((s) => s.key == key.ToString());
            if(attrState == null)
            {
                return "0";
            }
            return attrState.state;
        }
        /// <summary>
        /// 设置属性状态
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns>修改结果</returns>
        public bool SetAttrState(string key, string value)
        {
            //var attrState = status.Find((s) => s.key == key.ToString());
            var attr = attributes.Find((s) => s.key == key);
            if (attr == null)
            {
                return false;
            }
            else
            {
                attr.state = value;
            }
            return true;
        }
        #endregion
        #region base info
        public string sid = "0301011234567801012301230123";
        /// <summary>
        /// 备注
@@ -70,39 +143,6 @@
        /// 设备spk
        /// </summary>
        public string spk = "";
        ///// <summary>
        ///// 功能类别
        ///// 如:空调类、灯光类、窗帘类
        ///// </summary>
        //public FunctionCategory Spk_Prefix
        //{
        //    get
        //    {
        //        try
        //        {
        //            var _functionCategoryString = sid.Substring(16, 2);
        //            var _functionCategory = Convert.ToInt32(_functionCategoryString, 16);
        //            return (FunctionCategory)Enum.ToObject(typeof(FunctionCategory), _functionCategory);
        //        }
        //        catch (Exception ex)
        //        {
        //            MainPage.Log($"get FunctionCategory error : {ex.Message}");
        //            return FunctionCategory.UnKown;
        //        }
        //    }
        //}
        ///// <summary>
        ///// 功能类型
        ///// </summary>
        //public FunctionType spk
        //{
        //    get
        //    {
        //        var _functionTypeString = sid.Substring(16, 4);
        //        return (FunctionType)Enum.ToObject(typeof(FunctionType), Convert.ToInt32(_functionTypeString, 16));
        //    }
        //}
        string spk_Prefix;
        /// <summary>
@@ -122,31 +162,6 @@
                return spk_Prefix;
            }
        }
        string spk_Suffix;
        ///// <summary>
        ///// spk后缀
        ///// 小类
        ///// 功能类型
        ///// </summary>
        //public string spk
        //{
        //    get
        //    {
        //        if (string.IsNullOrEmpty(spk_Suffix))
        //        {
        //            try
        //            {
        //                spk_Suffix = spk.Split(".")[1];
        //            }
        //            catch
        //            {
        //                spk_Suffix = "";
        //            }
        //        }
        //        return spk_Suffix;
        //    }
        //}
        /// <summary>
        /// A协议功能的特性
        /// 如:是AC功能:特性:on_off,mode,fan,temperature
@@ -181,12 +196,6 @@
        /// 云端数据修改的最后时间
        /// </summary>
        public string modifyTime = "";
        /// <summary>
        /// 删除标记
        /// 需要删除数据时,标记为:true
        /// 由云端删除成功之后,返回数据再清除本地数据
        /// </summary>
        public bool DeleteSign = false;
        #endregion
        /// <summary>
@@ -424,36 +433,6 @@
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 保存功能数据
        /// </summary>
        //public void SaveFunctionData(bool upSevser)
        //{
        //    if (upSevser)
        //    {
        //        new System.Threading.Thread(() =>
        //        {
        //            var pm = new HttpServerRequest();
        //            var pack = pm.UpdataDevcieInfo(this);
        //            if (pack.Code == StateCode.SUCCESS)
        //            {
        //                var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
        //                FileUtlis.Files.WriteFileByBytes(savePath, ssd);
        //            }
        //            else
        //            {
        //                IMessageCommon.Current.ShowErrorInfoAlter(pack.Code);
        //            }
        //        })
        //        { IsBackground = true }.Start();
        //    }
        //    else
        //    {
        //        var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
        //        FileUtlis.Files.WriteFileByBytes(savePath, ssd);
        //    }
        //}
        /// <summary>
        /// 转换成场景功能对象
@@ -516,11 +495,11 @@
            sendDataObj.time_stamp = Control.Ins.Get_TimeStamp();
            var acd = new AlinkControlData();
            var acd = new AlinkStatusData();
            acd.sid = sid;
            foreach (var dic in commandDictionary)
            {
                var aca = new AlinkControlAttributes();
                var aca = new AttributesStatus();
                aca.key = dic.Key;
                aca.value = dic.Value;
                acd.status.Add(aca);
@@ -542,7 +521,7 @@
            aaao.bus = this.bus;
            foreach (var kv in keyValues)
            {
                aaao.attributes.Add(new AlinkControlAttributes()
                aaao.attributes.Add(new AttributesStatus()
                {
                    key = kv.Key,
                    value = kv.Value,
@@ -568,7 +547,7 @@
        /// </summary>
        public string spk = "";
        public List<AlinkControlAttributes> attributes = new List<AlinkControlAttributes>();
        public List<AttributesStatus> attributes = new List<AttributesStatus>();
        //[Newtonsoft.Json.JsonIgnore]
        public BusData bus = new BusData();
    }
@@ -578,7 +557,7 @@
    /// </summary>
    public class AlinkFunctionStatusObj
    {
        public List<AlinkControlData> objects = new List<AlinkControlData>();
        public List<AlinkStatusData> objects = new List<AlinkStatusData>();
        public string time_stamp = "";
        public string id = "";
@@ -594,17 +573,29 @@
        public string time_stamp = "";
    }
    /// <summary>
    /// A协议控制数据
    /// A协议状态数据
    /// </summary>
    public class AlinkControlData
    public class AlinkStatusData
    {
        /*
         mqtt接收的状态数据没有deviceId
        接口反馈的数据有
         */
        /// <summary>
        ///
        /// </summary>
        public string sid = "";
        public List<AlinkControlAttributes> status = new List<AlinkControlAttributes>();
        /// <summary>
        /// 设备ID
        /// 云端负责生成
        /// </summary>
        public string deviceId = "0";
        public List<AttributesStatus> status = new List<AttributesStatus>();
    }
    /// <summary>
    /// a协议控制动作数据
    /// </summary>
    public class AlinkControlAttributes
    public class AttributesStatus
    {
        /// <summary>
        /// 属性名
@@ -646,28 +637,20 @@
        /// </summary>
        public string data_type = "";
        /// <summary>
        /// 当前状态
        /// </summary>
        public string state = "";
        /// <summary>
        /// 当前值
        /// </summary>
        public object curValue = new object();
        /// <summary>
        /// curValue的翻译值,最坏的结果也只会返回string.Empty
        /// </summary>
        public string realValue
        {
            get
            {
                var myValue = curValue.ToString();
                //沙雕定义的object类型
                if (myValue.Contains("{") == true) { return string.Empty; }
                return myValue;
            }
        }
    }
    /// <summary>
    /// 功能属性键名列表
    /// </summary>
    public static class FunctionAttributeKey
    {
        public const string _null = "";
        /// <summary>
        /// 开关
        /// </summary>
@@ -716,6 +699,82 @@
        /// value
        /// </summary>
        public const string Value = "value";
        /// <summary>
        /// 状态,传感器
        /// </summary>
        public const string Status = "status";
        /// <summary>
        /// 电量状态
        /// </summary>
        public const string BatteryState = "battery_state";
        /// <summary>
        /// 烘干
        /// </summary>
        public const string HotDry = "hot_dry";
        /// <summary>
        /// 风干
        /// </summary>
        public const string WindDry = "wind_dry";
        /// <summary>
        /// 消毒
        /// </summary>
        public const string Disinfect = "disinfect";
        /// <summary>
        /// 上升下降
        /// </summary>
        public const string Position = "position";
        /// <summary>
        /// 进度
        /// </summary>
        public const string PositionPercent = "position_percent";
        /// <summary>
        /// 烘干时间
        /// </summary>
        public const string HotDryTime = "hot_dry_time";
        /// <summary>
        /// 烘干剩余时间
        /// </summary>
        public const string HotDryTimeLeft = "hot_dry_time_surplus";
        /// <summary>
        /// 风干时间
        /// </summary>
        public const string WindDryTime = "wind_dry_time";
        /// <summary>
        /// 风干剩余时间
        /// </summary>
        public const string WindDryTimeLeft = "wind_dry_time_surplus";
        /// <summary>
        /// 消毒时间
        /// </summary>
        public const string DisinfectTime = "disinfect_time";
        /// <summary>
        /// 消毒剩余时间
        /// </summary>
        public const string DisinfectTimeLeft = "disinfect_time_surplus";
        /// <summary>
        /// 负离子
        /// </summary>
        public const string Anion = "anion";
        /// <summary>
        /// 负离子时间
        /// </summary>
        public const string AnionTime = "anion_time";
        /// <summary>
        /// 负离子剩余时间
        /// </summary>
        public const string AnionTimeLeft = "anion_time_surplus";
        #region tuya
        /// <summary>
        /// 涂鸦水阀开启时间
        /// </summary>
        public const string TuyaWaterTime = "countdown_1";
        #endregion
    }
    /// <summary>
    /// 设备功能oid
@@ -826,14 +885,6 @@
        /// </summary>
        public const string SensorTemperature = "sensor.temperature";
        /// <summary>
        /// (红外移动传感器)
        /// </summary>
        public const string SensorPir = "sensor.pir";
        /// <summary>
        /// (门窗传感器)
        /// </summary>
        public const string SensorDoorWindow = "sensor.doorwindow";
        /// <summary>
        /// (PM2.5传感器)
        /// </summary>
        public const string SensorPm25 = "sensor.pm25";
@@ -849,10 +900,44 @@
        /// 湿度传感器
        /// </summary>
        public const string SensorHumidity = "sensor.humidity";
        /// <summary>
        /// (红外移动传感器)
        /// </summary>
        public const string SensorPir = "sensor.pir";
        /// <summary>
        /// (门窗传感器)
        /// </summary>
        public const string SensorDoorWindow = "sensor.doorwindow";
        /// <summary>
        /// 烟雾传感器
        /// </summary>
        public const string SensorSmoke = "sensor.smoke";
        /// <summary>
        /// 水浸传感器
        /// </summary>
        public const string SensorWater = "sensor.water";
        /// <summary>
        /// 燃气传感器
        /// </summary>
        public const string SensorGas= "sensor.gas";
        /// <summary>
        /// 红外珊栏传感器
        /// </summary>
        public const string SensorShanLan = "sensor.shanlan";
        /// <summary>
        /// 红外对射传感器
        /// </summary>
        public const string SensorDuiShe = "sensor.duishe";
        /// <summary>
        /// 超声波传感器
        /// </summary>
        public const string SensoruUtrasonic = "sensor.ultrasonic";
        /// <summary>
        /// (干接点)
        /// </summary>
        public const string DryContact = "dryContact.standard";
        public const string SensorDryContact = "sensor.dryContact";
        /// <summary>
        /// 家电、插座
        /// </summary>
@@ -877,6 +962,59 @@
        /// 家电、涂鸦扫地机器人
        /// </summary>
        public const string ElectricTuyaWeepRobot = "electrical.ai6HtccKFIw3dxo3";
        /// <summary>
        /// 家电、涂鸦水阀
        /// </summary>
        public const string ElectricTuyaWaterValve = "electrical.koiGhMKwLf2ZP81g";
        /// <summary>
        /// 凉霸
        /// </summary>
        public const string ClothesHanger = "electrical.racks";
        /// <summary>
        /// 红外宝
        /// </summary>
        public const string IrModule = "ir.module";
        /// <summary>
        /// 红外空调
        /// </summary>
        public const string IrAC = "ir.ac";
        /// <summary>
        /// 获取第三方设备spk
        /// </summary>
        /// <returns></returns>
        public static List<string> Get3tySpk(BrandType brandType)
        {
            var list = new List<string>();
            switch (brandType)
            {
                case BrandType.All3tyBrand:
                case BrandType.Tuya:
                    list.Add(ElectricTuyaAirCleaner);
                    list.Add(ElectricTuyaFan);
                    list.Add(ElectricTuyaWaterValve);
                    list.Add(ElectricTuyaWeepRobot);
                    break;
            }
            return list;
        }
        /// <summary>
        /// 第三方品牌列表
        /// </summary>
        public enum BrandType
        {
            All = 0,
            Hdl = 1,
            Tuya = 2,
            All3tyBrand = 999,
        }
    }
@@ -923,6 +1061,8 @@
        public const string Electric = "electrical";
        //Music = 0x09,
    }