wei
2020-11-27 e53a1951d6aa07ad22aad9816da4703496fcbccd
HDL_ON/Entity/Function/Function.cs
@@ -1,337 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json.Linq;
using HDL_ON;
using Shared;
namespace HDL_ON.Entity
{
    /// <summary>
    /// 功能属性
    /// 属性字段解析:attri :属性内容,value 属性的值,max 最大值 min 最小值
    /// 功能类能满足数据使用要求,子类只是为了方便使用属性
    /// </summary>
    public class Trait
    {
        /// <summary>
        /// 属性名称
        /// </summary>
        public string name;
        public List<string> _value_key;
        /// <summary>
        /// 属性的值列表
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public List<string> value_key {
            get
            {
                return _value_key;
            }
            set
            {
                _value_key = value;
            }
        }
        /// <summary>
        /// 最大值
        /// </summary>
        public int max;
        /// <summary>
        /// 最小值
        /// </summary>
        public int min;
        /// <summary>
        /// 数据类型
        /// </summary>
        public string data_type = "";
        /// <summary>
        /// 当前值
        /// </summary>
        public object value = new object();
        //----app自定义
        /// <summary>
        /// 属性值单位
        /// </summary>
        public string _uintString;
        public string uintString {
            get
            {
                if(!string.IsNullOrEmpty( _uintString))
                {
                    return _uintString;
                }
                var us = "";
                switch(name)
                {
                    case "temperature":
                        us = "°C";
                        break;
                    case "percent":
                    case "brightness":
                        us = "%";
                        break;
                }
                return us;
            }
        }
        /// <summary>
        /// 属性名称显示文本
        /// 中英文显示
        /// </summary>
        public string name_text
        {
            get
            {
                string text = "";
                switch (name)
                {
                    case "on_off":
                        text = Language.StringByID(StringId.OnOff);
                        break;
                    case "brightness":
                        text = Language.StringByID(StringId.Brightness);
                        break;
                    case "color":
                        text = Language.StringByID(StringId.ColorValue);
                        break;
                    case "mode":
                        text = Language.StringByID(StringId.Mode);
                        break;
                    case "fan":
                        text = Language.StringByID(StringId.FanSpeed);
                        break;
                    case "temperature":
                        text = Language.StringByID(StringId.Temp);
                        break;
                    case "delay":
                        text = Language.StringByID(StringId.Delay);
                        break;
                    case "cct":
                        text = "CCT";
                        break;
                    //case "fade_time":
                    case "percent":
                        text = Language.StringByID(StringId.PercentAdjustment);
                        break;
                        //case "lock":
                        //case "ico":
                        //case "swing":
                        //case "set_ point":
                        //case "pm25":
                        //case "volume":
                        //case "vol_step":
                        //case "source":
                        //case "treble":
                        //case "bass":
                        //case "playlist":
                        //case "song_name":
                        //case "current_status":
                        //case "enable":
                        //case "lux":
                        //case "adjust_value":
                        //case "range":
                        //case "humidity":
                        //case "type":
                        //case "state":
                        //case "sensitivity":
                        //case "pm25value":
                }
                return text;
            }
        }
        /// <summary>
        /// 获取当前属性的显示文本
        /// 中英文显示
        /// </summary>
        public string GetCurValueText()
        {
            return GetValueText(value.ToString());
        }
        /// <summary>
        /// 获取指定属性的显示文本
        /// 中英文显示
        /// </summary>
        public string GetValueText(string value)
        {
            string text = "";
            value = value.Replace("{}", "");
            switch (name)
            {
                case "on_off":
                    text = value == "on" ? Language.StringByID(StringId.On) : Language.StringByID(StringId.OFF);
                    break;
                case "temperature":
                case "brightness":
                case "percent":
                    if (text == "")
                    {
                        this.value = this.min;
                        text = this.min.ToString();
                    }
                    else
                    {
                        text = value;
                    }
                    break;
                //case "color":
                case "mode":
                    switch (value)
                    {
                        //----空调
                        case "auto":
                            text = Language.StringByID(StringId.Auto);
                            break;
                        case "cool":
                            text = Language.StringByID(StringId.Cool);
                            break;
                        case "heat":
                            text = Language.StringByID(StringId.Heat);
                            break;
                        case "dry":
                            text = Language.StringByID(StringId.Dry);
                            break;
                        case "fan":
                            text = Language.StringByID(StringId.AirSupply);
                            break;
                        //-----地热
                        case "day":
                            text = Language.StringByID(StringId.Day);
                            break;
                        case "night":
                            text = Language.StringByID(StringId.Night);
                            break;
                        case "away":
                            text = Language.StringByID(StringId.Away);
                            break;
                        case "normal":
                            text = Language.StringByID(StringId.Normal);
                            break;
                        case "timer":
                            text = Language.StringByID(StringId.Timer);
                            break;
                        default:
                            if (this.value_key.Contains("cool"))
                            {
                                this.value = "cool";
                                text = Language.StringByID(StringId.Cool);
                            }
                            else if (this.value_key.Contains("day"))
                            {
                                this.value = "day";
                                text = Language.StringByID(StringId.Day);
                            }
                            else
                            {
                                foreach (var v in this.value_key)
                                {
                                    this.value = v;
                                    text = GetCurValueText();
                                }
                            }
                            break;
                    }
                    break;
                case "fan":
                    switch (value)
                    {
                        case "high":
                            text = Language.StringByID(StringId.HighWindSpeed);
                            break;
                        case "medium":
                            text = Language.StringByID(StringId.MiddleWindSpeed);
                            break;
                        case "low":
                            text = Language.StringByID(StringId.LowWindSpeed);
                            break;
                        case "auto":
                            text = Language.StringByID(StringId.Auto);
                            break;
                        default:
                            if (this.value_key.Contains("low"))
                            {
                                this.value = "low";
                                text = Language.StringByID(StringId.LowWindSpeed);
                            }
                            else
                            {
                                foreach (var v in this.value_key)
                                {
                                    this.value = v;
                                    text = GetCurValueText();
                                }
                            }
                            break;
                    }
                    break;
                //case "delay":
                //case "cct":
                //case "fade_time":
                //case "lock":
                //case "ico":
                //case "swing":
                //case "set_ point":
                //case "pm25":
                //case "volume":
                //case "vol_step":
                //case "source":
                //case "treble":
                //case "bass":
                //case "playlist":
                //case "song_name":
                //case "current_status":
                //case "enable":
                //case "lux":
                //case "adjust_value":
                //case "range":
                //case "humidity":
                //case "type":
                //case "state":
                //case "sensitivity":
                //case "pm25value":
                case "high":
                    text = Language.StringByID(StringId.HighWindSpeed);
                    break;
                case "medium":
                    text = Language.StringByID(StringId.MiddleWindSpeed);
                    break;
                case "low":
                    text = Language.StringByID(StringId.LowWindSpeed);
                    break;
                case "auto":
                    text = Language.StringByID(StringId.Auto);
                    break;
            }
            return text;
        }
    }
    /// <summary>
    /// 设备功能oid
    /// </summary>
    public class FunctionOid
    {
        public string oid;
        public string name;
        public string machine_id;
        public string net_id;
        public string dev_id;
        public string channels;
    }
    public class Function
    {
        public Function()
        {
        }
        /// <summary>
        /// 数据存储文件名
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string savePath
        {
            get
            {
                return "FunctionData_" + sid;
            }
        }
        #region base info
        /// <summary>
        /// HDL统一协议格式:14bytes
@@ -362,7 +54,7 @@
        /// 如:是AC功能:特性:on_off,mode,fan,temperature
        /// attri
        /// </summary>
        public List<Trait> function = new List<Trait>();
        public List<FunctionAttributes> function = new List<FunctionAttributes>();
        /// <summary>
        /// 房间ID列表
@@ -446,20 +138,6 @@
        /// 备注
        /// </summary>
        public string name;
        /// <summary>
        /// A协议厂商代码
        /// </summary>
        public string vendor_code
        {
            get
            {
                string vendorCode = "HDL";
                var code = sid.Substring(0, 4);
                if (code == "0001")
                    vendorCode = "HDL";
                return vendorCode;
            }
        }
        /// <summary>
        /// 最后控制的一次状态
@@ -467,27 +145,27 @@
        [Newtonsoft.Json.JsonIgnore]
        public string lastState = "";
        Trait _trait_on_off;
        FunctionAttributes _trait_on_off;
        [Newtonsoft.Json.JsonIgnore]
        public Trait trait_on_off
        public FunctionAttributes trait_on_off
        {
            get
            {
                if (_trait_on_off == null)
                {
                    _trait_on_off = function.Find((obj) => obj.name == "on_off");
                    _trait_on_off = function.Find((obj) => obj.key == "on_off");
                    //找不到属性需要声明一个,防止报错闪退
                    if (_trait_on_off == null)
                    {
                        _trait_on_off = new Trait()
                        _trait_on_off = new FunctionAttributes()
                        {
                            name = "on_off",
                            value_key = new List<string> { "on", "off" },
                            key = "on_off",
                            value = new List<string> { "on", "off" },
                            max = 1,
                            min = 0,
                        };
                    }
                    _trait_on_off.value = "on";
                    _trait_on_off.curValue = "on";
                }
                return _trait_on_off;
            }
@@ -495,18 +173,6 @@
            //{
            //    _trait_on_off = value;
            //}
        }
        /// <summary>
        /// 开关状态文本
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string on_off_text
        {
            get
            {
                return trait_on_off.value.ToString() == "on" ? Language.StringByID(StringId.On) : Language.StringByID(StringId.OFF);
            }
        }
        /// <summary>
@@ -532,19 +198,6 @@
        /// </summary>
        public int fixedSerialNumber = int.MaxValue;
        /// <summary>
        /// 获取A协议控制字符串
        /// </summary>
        /// <param name="command">控制命令:write,read</param>
        /// <returns></returns>
        public virtual JObject GetSendJObject(CommandType_A command)
        {
            var sendJob = new JObject { { "vendor_code", vendor_code }, { "Command", command.ToString() }, { "Type", "device" }, };
            var data = new JObject { { "sid", sid } };
            sendJob.Add("objects", data);
            return sendJob;
        }
        public string GetBusId ()
        {
            string busId = "";
@@ -566,8 +219,10 @@
            {
                var findRoom = DB_ResidenceData.rooms.Find(obj => obj.sid == roomId);
                if (findRoom == null)
                {
                    continue;
                if(roomNameList != "")
                }
                if (roomNameList != "")
                {
                    roomNameList += ",";
                }
@@ -593,5 +248,377 @@
        /// 更新时间
        /// </summary>
        public DateTime refreshTime = DateTime.MinValue;
        /// <summary>
        /// 获取控制发送数据
        /// </summary>
        public AprotocolControlObj GetControlSendData(Dictionary<string, string> commandDictionary)
        {
            var sendDataObj = new AprotocolControlObj();
            sendDataObj.from_oid = "";
            sendDataObj.to_oid = "";
            sendDataObj.time_stamp = "";
            sendDataObj.type = "device_sid";
            sendDataObj.command = "write";
            var acoList = new AprotocolControlData();
            acoList.sid = sid;
            var aco = new AprotocolControlAttribute();
            foreach(var dic in commandDictionary)
            {
                aco.name = dic.Key;
                aco.value = dic.Value;
                acoList.function.Add(aco);
            }
            sendDataObj.objects.Add(acoList);
            return sendDataObj;
        }
    }
    /// <summary>
    /// A协议控制数据的对象
    /// </summary>
    public class AprotocolControlObj
    {
        public List<AprotocolControlData> objects = new List<AprotocolControlData>();
        public string from_oid = "";
        public string to_oid = "";
        public string time_stamp = "";
        public string type = "";
        public string command = "";
    }
    /// <summary>
    /// A协议控制数据
    /// </summary>
    public class AprotocolControlData
    {
        public string sid = "";
        public List<AprotocolControlAttribute> function = new List<AprotocolControlAttribute>();
    }
    /// <summary>
    /// A协议控制属性对象
    /// </summary>
    public class AprotocolControlAttribute
    {
        public string name;
        public string value;
    }
    /// <summary>
    /// 功能属性
    /// 属性字段解析:attri :属性内容,value 属性的值,max 最大值 min 最小值
    /// </summary>
    public class FunctionAttributes
    {
        /// <summary>
        /// 属性键名
        /// </summary>
        public string key;
        /// <summary>
        /// 属性的值列表
        /// </summary>
        public List<string> value = new List<string>();
        /// <summary>
        /// 最大值
        /// </summary>
        public int max;
        /// <summary>
        /// 最小值
        /// </summary>
        public int min;
        /// <summary>
        /// 数据类型
        /// </summary>
        public string data_type = "";
        /// <summary>
        /// 当前值
        /// </summary>
        public object curValue = new object();
        //----app自定义
        /// <summary>
        /// 属性值单位
        /// </summary>
        string _uintString;
        [Newtonsoft.Json.JsonIgnore]
        public string uintString
        {
            get
            {
                if (!string.IsNullOrEmpty(_uintString))
                {
                    return _uintString;
                }
                var us = "";
                switch (key)
                {
                    case "temperature":
                    case "set_temperature":
                        us = "°C";
                        break;
                    case "percent":
                    case "brightness":
                        us = "%";
                        break;
                }
                return us;
            }
        }
        /// <summary>
        /// 属性名称显示文本
        /// 中英文显示
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string name_text
        {
            get
            {
                string text = "";
                switch (key)
                {
                    case "on_off":
                        text = Language.StringByID(StringId.OnOff);
                        break;
                    case "brightness":
                        text = Language.StringByID(StringId.Brightness);
                        break;
                    case "color":
                        text = Language.StringByID(StringId.ColorValue);
                        break;
                    case "mode":
                        text = Language.StringByID(StringId.Mode);
                        break;
                    case "fan":
                        text = Language.StringByID(StringId.FanSpeed);
                        break;
                    case "temperature":
                case "set_temperature":
                        text = Language.StringByID(StringId.Temp);
                        break;
                    case "delay":
                        text = Language.StringByID(StringId.Delay);
                        break;
                    case "cct":
                        text = "CCT";
                        break;
                    //case "fade_time":
                    case "percent":
                        text = Language.StringByID(StringId.PercentAdjustment);
                        break;
                        //case "lock":
                        //case "ico":
                        //case "swing":
                        //case "set_point":
                        //case "pm25":
                        //case "volume":
                        //case "vol_step":
                        //case "source":
                        //case "treble":
                        //case "bass":
                        //case "playlist":
                        //case "song_name":
                        //case "current_status":
                        //case "enable":
                        //case "lux":
                        //case "adjust_value":
                        //case "range":
                        //case "humidity":
                        //case "type":
                        //case "state":
                        //case "sensitivity":
                        //case "pm25value":
                }
                return text;
            }
        }
        /// <summary>
        /// 获取当前属性的显示文本
        /// 中英文显示
        /// </summary>
        public string GetCurValueText()
        {
            return GetValueText(curValue.ToString());
        }
        /// <summary>
        /// 获取指定属性的显示文本
        /// 中英文显示
        /// </summary>
        public string GetValueText(string value)
        {
            string text = "";
            value = value.Replace("{}", "");
            switch (key)
            {
                case "on_off":
                    text = value == "on" ? Language.StringByID(StringId.On) : Language.StringByID(StringId.OFF);
                    break;
                case "temperature":
                case "set_temperature":
                case "brightness":
                case "percent":
                    if (value == "")
                    {
                        this.curValue = this.min;
                        text = this.min.ToString();
                    }
                    else
                    {
                        text = value;
                    }
                    break;
                //case "color":
                case "mode":
                    switch (value)
                    {
                        //----空调
                        case "auto":
                            text = Language.StringByID(StringId.Auto);
                            break;
                        case "cool":
                            text = Language.StringByID(StringId.Cool);
                            break;
                        case "heat":
                            text = Language.StringByID(StringId.Heat);
                            break;
                        case "dry":
                            text = Language.StringByID(StringId.Dry);
                            break;
                        case "fan":
                            text = Language.StringByID(StringId.AirSupply);
                            break;
                        //-----地热
                        case "day":
                            text = Language.StringByID(StringId.Day);
                            break;
                        case "night":
                            text = Language.StringByID(StringId.Night);
                            break;
                        case "away":
                            text = Language.StringByID(StringId.Away);
                            break;
                        case "normal":
                            text = Language.StringByID(StringId.Normal);
                            break;
                        case "timer":
                            text = Language.StringByID(StringId.Timer);
                            break;
                        default:
                            if (this.value.Contains("cool"))
                            {
                                this.curValue = "cool";
                                text = Language.StringByID(StringId.Cool);
                            }
                            else if (this.value.Contains("day"))
                            {
                                this.curValue = "day";
                                text = Language.StringByID(StringId.Day);
                            }
                            else
                            {
                                foreach (var v in this.value)
                                {
                                    this.curValue = v;
                                    text = GetCurValueText();
                                }
                            }
                            break;
                    }
                    break;
                case "fan":
                    switch (value)
                    {
                        case "high":
                            text = Language.StringByID(StringId.HighWindSpeed);
                            break;
                        case "medium":
                            text = Language.StringByID(StringId.MiddleWindSpeed);
                            break;
                        case "low":
                            text = Language.StringByID(StringId.LowWindSpeed);
                            break;
                        case "auto":
                            text = Language.StringByID(StringId.Auto);
                            break;
                        default:
                            if (this.value.Contains("low"))
                            {
                                this.curValue = "low";
                                text = Language.StringByID(StringId.LowWindSpeed);
                            }
                            else
                            {
                                foreach (var v in this.value)
                                {
                                    this.curValue = v;
                                    text = GetCurValueText();
                                }
                            }
                            break;
                    }
                    break;
                //case "delay":
                //case "cct":
                //case "fade_time":
                //case "lock":
                //case "ico":
                //case "swing":
                //case "set_point":
                //case "pm25":
                //case "volume":
                //case "vol_step":
                //case "source":
                //case "treble":
                //case "bass":
                //case "playlist":
                //case "song_name":
                //case "current_status":
                //case "enable":
                //case "lux":
                //case "adjust_value":
                //case "range":
                //case "humidity":
                //case "type":
                //case "state":
                //case "sensitivity":
                //case "pm25value":
                case "high":
                    text = Language.StringByID(StringId.HighWindSpeed);
                    break;
                case "medium":
                    text = Language.StringByID(StringId.MiddleWindSpeed);
                    break;
                case "low":
                    text = Language.StringByID(StringId.LowWindSpeed);
                    break;
                case "auto":
                    text = Language.StringByID(StringId.Auto);
                    break;
            }
            return text;
        }
    }
    /// <summary>
    /// 设备功能oid
    /// </summary>
    public class FunctionOid
    {
        public string oid;
        public string name;
        public string machine_id;
        public string net_id;
        public string dev_id;
        public string channels;
    }
}