wxr
2022-06-13 da1a17600b9ca8c8980ba64447688ee0a6718756
Merge branch 'Dev-Branch' into wxr0114
7个文件已添加
43个文件已修改
6131 ■■■■ 已修改文件
HDL-ON_Android/Assets/Language.ini 1202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/FloorHeating/EconomicIcon.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/FunctionIcon/FloorHeating/EconomicIconGray.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/MusicIcon/order.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/MusicIcon/single.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Phone/MusicIcon/single_cycle.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/HDL-ON_Android.csproj 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Properties/AndroidManifest.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/HDL-ON_iOS.csproj 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Info.plist 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Language.ini 1201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/MusicIcon/order.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/MusicIcon/single.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_iOS/Resources/Phone/MusicIcon/single_cycle.png 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Common/ApiUtlis.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Common/R.cs 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/DriverLayer/Control.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/DriverLayer/Control_Udp.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/DriverLayer/Packet.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Mqtt/MqttClient.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Server/NewAPI.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/Function/FloorHeating.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/Function/Function.cs 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/2-Classification/FunctionControlZoneBLL.cs 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/AddInputType.cs 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/ConditionDeviceFunList.cs 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/FunTpye.cs 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/LogicMethod.cs 1756 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/LogicView/SwitchView.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/PublicInterface.cs 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/Send.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Scene/SceneEditPage.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/PirDevice/PirMethod.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/4-PersonalCenter/PirDevice/PirSend.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/AcControlPage.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/CacControlPage.cs 663 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/FhControlPage.cs 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/AC/ACPage.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/ChooseRoomPageBLL.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/DoorLock/DoorLockPage.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPageBLL.cs 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPageBLL.cs 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/Light/RelayPageBLL.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/Music/A31MusicModel.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/Music/A31PlayMusicPage.cs 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/Music/MusicMain.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/Music/SendMethod.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/Music/View/MyListView.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Assets/Language.ini
@@ -518,6 +518,17 @@
530=In order to prevent the wrong touch and click of opening and closing the door and ensure family safety, please enter your door lock password.
531=Password free unlocking within five minutes
532=The device is offline and cannot be operated temporarily
533=Statistical Chart
534=Data
535=Dew point temperature
536=Temperature statistics
537=Humidity statistics
538=Uint
539=Smart panel
540=In Alarm
541=Monitoring
542=Wandering alarm
543=Get more
1000=Room Humidity
@@ -727,7 +738,7 @@
5015=Bluetooth
5016=Line input
5017=Revise the name
5018=Single
5018=Single loop
5019=Random play
5020=List
5021=Has shifted to
@@ -757,6 +768,9 @@
5045=General volume
5046=Adjust volume
5047="QQ music" has not installed in your cell phone, please proceed in App center.
5048= Progressive cycle
5049=Single play
 
6000=normal
6001=Device status
@@ -1030,6 +1044,13 @@
7152=Leave or arrive at a place
7153=Leave
7154=Arrive
7155=Distress/Normal
7156=Distress
7157=whether to unlock
7158=is
@@ -1659,8 +1680,18 @@
530=为防止开关门的误触点击,保证家庭安全,请输入您的门锁开门密码。
531=五分钟内免密码开锁
532=设备离线中,暂时无法操作
533=访客管理
533=24小时统计图
534=数据
535=露点温度
536=温度统计图
537=湿度统计图
538=单位
539=智能面板
540=报警中
541=监控中
542=徘徊报警
543=获取更多
1000=室内湿度
1001=童锁
1002=负离子
@@ -1870,7 +1901,7 @@
5015=蓝牙
5016=线路输入
5017=修改名称
5018=单曲播放
5018=单曲循环播放
5019=随机播放
5020=列表播放
5021=已切换到
@@ -1900,6 +1931,8 @@
5045=总音量
5046=调节音量
5047=你手机暂未安装"QQ音乐"{\r\n}请前往手机商场安装
5048=循序循环
5049=单曲播放
 
 
6000=正常
@@ -2154,7 +2187,10 @@
7152=离开或到达某地
7153=离开
7154=到达
7155=求救/正常
7156=求救
7157=是否开锁时
7158=是
 
@@ -2782,7 +2818,17 @@
530=In order to prevent the wrong touch and click of opening and closing the door and ensure family safety, please enter your door lock password.
531=Password free unlocking within five minutes
532=The device is offline and cannot be operated temporarily
533=Statistical Chart
534=Data
535=Dew point temperature
536=Temperature statistics
537=Humidity statistics
538=Uint
539=Smart panel
540=Нормальный
541=Monitoring
542=Wandering alarm
543=Get more
1000=Влажность в Помещении
@@ -3404,3 +3450,1147 @@
10031=Устройство не должно быть пустым.
10032=У пользователя нет разрешения.
10033=Устройство не существует.
[Spanish]
1=Ingresar
2=Número de teléfono
3=Luz
4=Correo
5=Por favor ingrese numero de cuenta
6=Contraseña
7=Olvidar
8=Registrarse
9=Iniciar sesión
10=Espere…
11=Cerrar
12=Código de verificación
13=Contraseña de acceso
14=Registrarse
15=Número de teléfono
16=Ingrese la contraseña
17=Ingrese la contraseña nuevamente
18=Código de verificación
19=Número de teléfono incorrecto, ingrese nuevamente
20=L a contraseña y la confirmación no coinciden. Ingrese la contraseña nuevamente
21=El formato de la contraseña no cumple con los requisitos. Ingrese la contraseña nuevamente
22=El usuario ya existe. Puede ingresar directamete
23=Código de verificación incorrecto, vuelva a ingresarlo.
24=Número de cuenta incorrrecta, por favor ingrese el correo correcto
25=Correo
26=Residencia
27=Miembro
28=Desarmar
29=Armar
30=Copia de seguridad
31=Función auxiliar
32=Añadir funciones
33=Modo noche
34=Configuración general
35=Soporte
36=Casa
37=Categoría
38=Inteligente
39=Individual
40=Inicio de sesión fallido, número de cuenta o contraseña incorrectos
41=Error al enviar el codigo de verificación
42=Error de red
43=Error en el registo, inténtelo de nuevo
44=Confirmar reinicio
45=El numero de cuenta no existe, por favor asegúrese de estar registrado
46=Inicio de sesion inválido, iniciar sesion nuevamente
47=Centro Personal
48=Nombre
49=Código QR
50=Teléfono
51=Correo
52=No enlazado
53=Autorización de terceros
54=Cambiar contraseña
55=Configuración de desbloqueo
56=Establecer contraseña, gesto, huella digital o identificación facil para proteger su provacidad
57=Salir
58=Habitación
59=Equipo
60=Función
61=Brillo
62=Configuración
63=Locación
64=Compartir
65=Añadir acceso directo al escritorio
66=Cambiar nombre
67=Cancelar
68=Confirmar
69=Todo
70=Cortina
71=Nombre
72=Address
73=Gestión de plantas
74=Gestión de habitaciones
75=Migración de administrador
76=Migración de privilegios
77=Priviligio de depuración
78=El administrador migra a otro usuario
79=Toda los datos de la residencia migran al nuevo usuario
80=Permitir que el personal visite su casa de forma remota
81=Piso
82=Añadir piso
83=Cambiar nombre de piso
84=Error al añadir, el piso ya existe
85=Escena
86=Borrar
87=Inmediata
88=Eliminar el piso o no?
89=Añadir habitación
90=Cmabiar la informacion de la habitación
91=Información de la habitanción
92=Nombre
93=Piso
94=Gestión funcionamiento
95=Guardar
96=Eliminar la habitación
97=Galeria por defecto
98=Camara
99=Seleccionar de la galeria
100=No asignado
101=Asignado
102=No asignado
103=Eliminar la habitación o no?
104=Tiempo de transición
105=Temperatura interna
106=AC
107=Videoportero
108=Sensor
109=Monitor de seguridad
110=Panel Inteligente
111=Musica
112=Aire fresco
113=Ambiental
114=Monitoreo de energía
115=Electrodomésticos
116=Bloqueo inteligente
117=Calefacción
118=Abrir
119=Refrigeración
120=Calefacción
121=Deshumidificar
122=Auto
123=Suministro de aire
124=Alto
125=Medio
126=Bajo
127=Modo
128=Velocidad del ventilador
129=Estas seguro de apagar todas las funciones de la habitación?
130=Abierta
131=Añadido a favoritos
132=Felicitaciones! Registro exitoso
133=Inicio de sesion automático pronto….
134=El numero de no esta registrado, por favor registrese e ingrese nuevamente
135=Por favor, obtener codigo de verificación
136=La contraseña ha sido cambiada
137=La direccion rsidencial no puede estar en blanco
138=El nombre de la residencia no puede estar en blanco
139=El nombre de la habitación no puede estar en blanco
140=El nombre del piso no puede estar en blanco
141=No se pudo revisar, el piso ya existe
142=El nombre del equipo no puede estar en blanco
143=El nombre del usuario no puede estar en blanco
144=Nombre de usuario
145=Seleccione la página para bloquear
146=Puede seleccionar varias paginas que le gustaria mantener
147=Error en codigo de verificación
148=No protegido
149=Cuando empieza
150=Armar/Desarmar
151=Desbloquear remotamente
152=No se necesita contraseña/gesto al iniciar el software
153=Iniciar sesión 5 minutos despues de salir de la página, se requiere el método de desbloqueo correspondiente.
154=Centro de miembros - utiliza para debloquear la función de seguridad como armar/desarmar
155=Usado para desbloquear la cerradura inteligente
156=Configuración de desbloqueo
157=Solo valido para host
158=Desbloquear con contraseña
159=Desbloquear con gesto
160=Desbloquear con huella
161=Desbloquear con identificación facial
162=Configuración de contraseña numérica
163=Configuración exitosa
164=Configuración de gestos
165=Por favor dibuja tu patron de desbloqueo
166=Requiere al menos una conexión de 4 puntos, dibuje nuevamente
167=El patron y la corfirmacion que dibujaste no coincide, dibuje nuevamente
168=Por favor dibuje su patrón nuevamente
169=Desbloquear con huella o no?
170=Desbloquar con identificacion facial o no?
171=Verificar la contraseña numérica
172=Verificar el gesto
173=Por favor ingrese el gesto original
174=Por favor ingrese la contraseña numérica original
175=Verificación fallida, error en la contraseña
176=Cambiar la contraseña numérica
177=Cambiar el gesto
178=Cerrar la configuración de desbloqueo o no?
179=Por favor verifique la huella
180=Verificación fallida, error en el gesto
181=General
182=Dia
183=Noche
184=Abandonar
185=Por favor enlace el piso
186=Ajuste de la velocidad del ventilador
187=Ventilador
188=Enchufe
189=Nivel
190=Chl
191=Vol
192=TV
193=La habitanción existe, error al cambiar
194=Medio Ambiente
195=Contaminación fuerte
196=Contaminación leve
197=Bueno
198=Excelente
199=Frio helado
200=Frio
201=Frio
202=Confort
203=Tibio
204=Caliente
205=Extremadamente caliente
206=Hasta el estandar
207=Contaminación leve
208=Contaminación media
209=Contaminación fuerte
210=Fresco
211=Turbidez
212=Hipoxia
213=Hipoxia severa
214=Húmedo
215=Húmedo
216=Seco
217=Temperatura
218=Humedad
219=Rango
220=Nivel
221=Valor de color
222=PM1.0
223=PM2.5
224=Ruido
225=Fuerza del viento
226=CO2
227=TV02
228=Dia
229=Semana
230=Mes
231=Otra región
232=Administración de miembros
233=Apodo
234=Autoridad Administrativa
235=Crear una escena
236=Apodo no puede quedar en blanco
237=Editar apodo
238=La región utilizada
239=Añadir miembro
240=Por favor ingrese el número de cuenta del miembro
241=Escanear codigo QR
242=Confirmar la invitación
243=Error en número de cuenta, por favor chequear
244=Agregue correctamente al miembro
245=Error de datos, por favor intente de nuevo
246=Error al añadir, el numero de cuenta del miembro no esta registrada
247=No puedes agregarte a ti mismo.
248=El usuario no existe en esta residencia
249=Se ha agregado el número de cuenta del miembro, por lo que no se puede volver a agregar.
250=Error de operación
251=Error al agregar, autoridad no valida
252=Guardado correctamente
253=Guardando…espere un momento.
254=Adopo editado
255=Eliminar este miembro
256=Sin favoritos
257=Introduzca el contenido
258=Bienvenido al nuevo miembro
259=Esta seguro de elimianr este miembro?
260=Introduzca la contraseña de inicio de sesión
261=Cambio de residencia exitoso
262=Seleccionar todo
263=Compartir la selección funcional
264=Confirmar uso compartido
265=Compartir en
266=Error de uso compartido funcional
267=Uso compartido funcional exitoso
268=Correo
269=Cambiar el enlace
270=Eliminar el enlace
271=Correo
272=Cambiar la dirección de correo
273=Cambiar el método de verificación
274=El código de verificación ha sido enviado, por favor ingrese
275=Reenviar
276=Verificación correcta
277=Correo
278=Por favor ingrese el nuevo correo
279=Enlazar correctamente su correo electrónico a su cuenta
280=No vincular su correo electrónica a su cuenta
281=Eliminar el enlace de correo electrónico
282=Eliminación correcta de enlace
283=Número de telefono
284=Número de telefono
285=Número de telefono
286=Vincular correctamente su numero de teléfono a su cuenta
287=No puede vincular su numero de teléfono a su cuenta
288=Cambiar el enlace
289=Quitar el enlace
290=No se puede obtener el historial
291=Sin favoritos
292=Acerca de ON+
293=Miembro
294=Administrador
295=Cambiar la contraseña
296=Antes de cambiar la contraseña iniciar sesion
297=Por favor verifique ID
298=Verificación telefonica
299=Verificación de correo electronico
300=No se ha enlazado a la dirección de correo electronico, no puede verificar
301=No se ha enlazado a un numero telefonico, no se puede verificar
302=Proceder al enlace
303=Eliminado correctamente el enlace a su numero de telefono
304=El codigo de verificación se ha enviado a:
305=Telefono
306=Correo
307=Recibió nuevos datos, esta seguro de anularlos?
308=Automatización
309=Crear una escena
310=Añadir escena
311=Configuración basica
312=Nombre
313=Region
314=Completo
315=Vista completa de la residencia
316=Sleccionar
317=Ya añadido
318=Conmutador
319=Velocidad del ventilador
320=Modo
321=Encendido
322=Apagado
323=Escena
324=Retardo de escena
325=Configuración de retardo
326=Retardo
327=Capturar la escena
328=Escena de pelicula
329=General
330=Modo automático
331=Potencia calentamiento suelo
332=Refrigeración suelo
333=Potencia de refrigeración del suelo
334=Ajustar el porcentaje
335=Sin retardo
336=No hay escena disponible. Añade uno!
337=Editar la escena
338=El nombre de la escena no puede estar en blanco
339=El nombre de la escena ya existe, por favor revise
340=El nombre de la habitación ya existe, por favor revise
341=Eliminar esta escena o no?
342=La puerta de enlace esta fuera de linea, falla de conexión remota
343=Error MAC, error de conexión remota.
344=Error de conexión remota.
345=Telefono
346=Correo
347=Ingrese el nuevo numero de telefono ceular
348=Ya se ha utilizado el numero de telefono celular
349=Ya se ha utilizado la direccion de correo electronico
350=La dirección de correo electrónico es la misma que la actual, sin necesidad de cambiar.
351=El número de teléfono es la mismo que la actual, sin necesidad de cambiar.
352=Asignación de piso
353=Separar
354=Cerrar
355=Acerca de
356=Numero de version
357=Esta funcion no esta disponible!
358=Telefono
359=Correo
360=Escena de panel
361=No añadido
362=Seleccionar todo
363=No se puede comunicar con el servidor, no se puede editar la información del dispositivo
364=No se puede comunicar con el servidor, no se puede editar la información de la habitación
365=No se puede comunicar con el servidor, no se puede editar la información de la escena
366=No se puede comunicar con el servidor, no se puede eliminar la escena
367=No se puede comunicar con el servidor, no se puede eliminar el piso
368=Bienvenido a disfrutar de ON+
369=Añadir residencia
370=Conviértete en miembro de la familia
371=No se puede utilizar la funcion, por favor verifique su conexión
372=No se puede crear una escena, por favro verifique su conexión
373=Error al agregar un piso
374=Los datos residenciales se han eliminado, APP cambiará automáticamente a otra residencia.
375=El gateway no esta conectado al servidor, no se puede crear la escena
376=No se puede introducir un carácter especial
377=Toda la residencia
378=Tiempo de transición
379=Velocidad de transicion
380=Esta funcion no esta disponible!
381=Recargar
400=Bienvenido a casa
401=Codigo de barras no válido, intentelo de nuevo
402=Inténtelo de nuevo
403=Temperatura de color
404=Ajuste rápido
405=Acogedor
406=Reunión
407=Lectura
408=Añadir
409=Marca de función
410=No ha agregado ningun dispositov de pataforma en la actualidad
411=Otros dispositivos de plataforma son compatibles con proveedores de serviciso externos
412=Añadir
413=Controlador no activado
414=Controlador activado
415=Alguien
416=Registro
417=Fuga de agua
418=En alarma
419=Normal
420=Seco caliente
421=Secado al aire
422=Desinfectar
423=Iluminación
424=Tiempo
425=Tiempo seco caliente
426=Tiempo de secado al aire
427=Tiempo de desinfección
428=Tiempo Anión
429=H
430=Min
431=Actualmente esta agregando cualquier dispositivos de plataforma a
432=Otros dispositivos de plataforma son compatibles con proveedores de serviciso externos
433=Valvula de agua
434=Interruptor de tiempo
435=Control remoto
436=Dispositivos añadido
437=Lista de dispositivos
438=humedad:{0}% aire:viento {1}:{2}
439=Tiempo real: {0} kw
440=Siguiente paso
441=Seleccione todas las áreas de estado de captura
442=Generar escena
443=Implementación personalizada
444=Centro de seguridad
445=Defensa de la casa
446=Defensa en casa
447=Defensa de vacaciones
448=Implementación fija
449=*Deshacer defensa no afecta
450=Defensa contra desastres
451=Defensa de 24 horas
452=Alarma antirrobo
453=Silenciar alarma
454=Información de implementación
455=El nombre no puede estar en blanco
456=Lienzo
457=Consumo de energía
458=Fecha
459=Consumo de energía en tiempo real
460=Consumo energético de este mes
461=Exterior/Interior
462=Aun no has añadido ningun dispositivo
463=Introduzca el código SN del dispositivo
464=Puede empezar a usar la onda milimétrica Zhaoguan
465=Eliminar dispositivo
466=STB
467=Proyector
468=Alguien cayó
469=Alguien está en
470=Bajo protección
471=Sensor de onda milimétrica
472=Exterior
473=Columpio
474=Oscilación hacia arriba y hacia abajo
475=Gira a izquierda y derecha
476=Añadir residencia
477=Columpio
478=Patrón
479=Velocidad
480=Sensor ambiental
481=Puede empezar a usar el sensor ambiental
482=Sensor de gas
483=Introduzca el código MAC del dispositivo
484=Abierto
485=Comprobar/Modificar
486=Función de defensa/Estado de alarma
487=Objetivo de alarma despues de la activación
488=Paso de rostro
489=Aplicar identificación facil a:
490=Control de acceso a la comunidad
491=Acerda de identificacion facil y privacidad
492=Borrar datos
493=Resetear identificación facial
494=Establecer identificación facial
495=Configuración paso de rostro
496=No hay ningun estado de implementacion de tareas asociado
497=Personalizado
498=Implementación retrasada
499=Agregar función de defensa
500=Agregar destino de alarma
501=Alarma de seguridad: se activa en {0}
502=Borrar la alarma de seguridad?
503=Exceso de estandar
504=Bueno
505=Excelente
506=Indentificacion facil ingresada correctamente
507=Ingreso identificación facil fallida
508=Formaldehído
509=Introduzca el nombre de seguridad
510=Seleccione el destino de implementación
511=Atenuación combinada
512=Mensajes no estan habilitados, vaya a configuración
513=Introduzca el codigo de emparejamiento
514=La información de la ubicación del gateway no está configurada
515=Agregar seguridad
516=Withdrawal
------
517=Instantaneous value
518=Cumulative power consumption
519=Voltage (V)
520=Electric Current (A)
521=Power (W)
522=Refresh
523=Delay alarm
524=Bypass
525=Enable
526=Cancel account
527=Homekit support notes
528=Firmware update
529=
530=In order to prevent the wrong touch and click of opening and closing the door and ensure family safety, please enter your door lock password.
531=Password free unlocking within five minutes
532=The device is offline and cannot be operated temporarily
533=Statistical Chart
534=Data
535=Dew point temperature
536=Temperature statistics
537=Humidity statistics
538=Uint
539=Smart panel
540=En alarma
541=Monitoring
542=Wandering alarm
543=Get more
1000=Humedad de ambiente
1001=V-chip
1002=Anión
1003=Estirilización
1004=Humidificar
1005=Restablecimiento del elemento de filtro
1006=Iluminación
1007=Automático
1008=Manual
1009=Fuerte
1010=Dormir
1011=Tiempo
1012=Velocidad del viento
1013=Engranaje
1014=Confirme si el elemento filtrante se ha restablecido y opere el equipo de acuerdo con el manual de instrucciones para que la vida útil del elemento filtrante se vuelva a cronometrar
1015=Marcha baja
1016=Engranaje medio
1017=Marcha alta
1018=Configuración de temportización
1019=Hora
1020=Tiempo del elemento de filtro:
1021=Filtro de aire
1022=Velocidad actual del viento
1023=Cancelar tiempo
1024=Robot de barrido de pisos
1025=Succión
1026=1° Marcha
1027=2° Marcha
1028=3° Marcha
1029=Carga
1030=Voz
1031=Silenciar
1032=Modo de limpieza
1033=Gestion de consumibles
1034=Historia
1035=Automático
1036=Aleatorio
1037=Muro
1038=Espiral
1039=Área total limpia
1040=Tiempo total de limpieza
1041=Vida útil restante del cepillo lateral
1042=Vida útil residual del cepillo de rodillos
1043=Vida útil restante de la pantalla de filtro
1044=Restablecer pincel de bordes
1045=Restablecer cepillo de rollo
1046=Restablecer pantalla
1047=Confirmar para restablecer el pincel de bordes?
1048=Confirmar para restablecer el cepillo de rollo?
1049=Confirmar para restablecer la pantalla?
1050=Agregar dispositivo
1051=Mini control remoto inteligente
1052=Agregar control remoto por infrarrojos
1053=Presione el botón del control remoto infrarrojo{0} durante 3 segundos y la luz indicadora{0} se enciende en azul rápidamente
1054=Asegúrese de que su Bluetooth{0} esté activado y se pueda buscar
1055=Siguiente paso
1056=Buscando dispositivo…
1057=No se ha encontrado ningún mando a distancia por infrarrojos
1058=1.Compruebe si el dispositivo está{0} encendido normalmente{0}2.Compruebe si la función Bluetooth{0} está activada normalmente{0}3.Compruebe si el indicador{0} luz parpadea en azul
1059=Buscar de nuevo
1060=Conectar WiFi
1061=En la actualidad, solo es compatible con la red WiFi 2.4G{0} y no admite nombres WiFi{0} con caracteres chinos
1062=Contraseña
1063=Conectando…
1064=Haga que el control remoto por infrarrojos{0} lo más cerca posible del enrutador WiFi
1065=Enlace de red
1066=Subir a nube
1067=Conectado con éxito
1068=1.Compruebe si el dispositivo está{0} encendido normalmente{0}2.Active la función Bluetooth{0}3.Presione el botón durante 10 s y el indicador{0} luz estará encendida
1069=Error al agregar
1070=Agregado con éxito
1071=¡Puedes empezar a usar el control infrarrojo{0}remote!
1072=Empezar a usar
1073=Por favor encender Bluethooth
1074=Información de ubicación (GBS) no disponible
1075=Red no disponible
1076=Seleccione el mando a distancia por infrarrojos
1077=Aire fresco
1078=Pantalla de filtro residual
1079=Energia
1080=Ventilado
;别
1081=1° Marcha
1082=2° Marcha
1083=3° Marcha
1084=1° Marcha
1085=2° Marcha
1086=3° Marcha
1087=Desbloquear
1088=Temp. Contraseña
1089=Conectado
1090=Desconectado
1091=Generar
1092=Tiempo efectivo
1093=Tiempo de caducidad
1094=Seleccionar hora
1095=Seleccionar fecha
1096=Generar
1097=Se ha copiado la contraseña actual
1098=Borrar contraseña?
1099=El tiempo de caducidad debe ser posterior al tiempo efectivo
1100=Método de desbloqueo
1101=Se sincronizará con el bloqueo real, ¿confirmar para eliminar?
1102=Borrar
1103=Comentar
1104=El comentario no puede estar en blanco
1105=Asignar a:
1106=Escena de destino no existe
1107=Seleccionar escena
1108=Desbloquear
1109=Siempre encendido
1110=Configuración
1111=Automatización
1112=Activar el modo "Siempre encendido"
1113=Desactivar el modo "Siempre encendido"
1114=Editar
1115=Siempre Encendido estará apagado {0}
1116=Condición
1117=Movimiento
1118=Siempre encendido
1119=Bloquear
1120=Usuario
1121=Método de desbloqueo
1122=Huella digital
1123=Tarjeta
1124=Clave
1125=Información
1126=Desbloquear
1127=Alarma
1128=Sin conexión
1129=Para el primer usuario, introduzca la contraseña.
1130=Introduzca la contraseña de administrador
1131=Enlace correcto
1132=Saltar a la contraseña personal para desbloquear
1133=Saltar
1134=Por favor, dibuja tu patrón
1135=El bloqueo estará siempre encendido después de la configuración, confirme para continuar
1136=Confirmar
1137=Caducar
1138=Siempre Encendido caducará despues de {0} horas
1139=Introduzca el tiempo de caducidad
1140=El tiempo de caducidad no debe ser superior a 72 horas
1141=El tiempo de caducidad no debe ser inferior a 1 hora
1142=Error al establecer conexión, intentelo de nuevo
1143=No se puede verificar el ID de administrador, vuelva a iniciar sesión en la cuenta
1144=Su residencia está siendo migrada a otro HDL
1145=Nota:
1. Todos sus datos de residencia se migrarán a un nuevo usuario. {0} 2. Después de la migración, el miembro original será{0}automáticamente desvinculado de esta residencia. {0} 3. La nueva cuenta es una HDL válida. {0} 4. La cuenta del receptor no puede ser la misma{0} que la del lado de la migración.
1147=Confirmar
1148=Cuenta del receptor de entrada
1149=Perfil
1150=Confirmar migración de administrador de {0} a {1}
1151=La cuenta no existe
1152=No transferir la propiedad a usted mismo
1153=Terminar
1154=Transferir al usuario, por favor espere...
1155={0} se ha convertido en administrador residencial
1156=Los datos de residencia se eliminarán de su cuenta
1157=No se puede migrar
1158=Inténtelo de nuevo
1159=Migración de la autoridad de administración
1160=Su autoridad de administración se está migrando a otros miembros
1161=1.Sus datos (datos en la nube) de la residencia serán{0}migrabados al nuevo administrador{0}2.Sus datos se intercambiarán con el miembro objetivo{0}y su permiso se cambiará al miembro objetivo{0}
1162=Confirmar
1163=No hay miembros para elegir
1164=Confirmar la migración de la autoridad de administración de {0} a {1}
1165=Migrar correctamente
1166=No se puede migrar
1167=Migrar correctamente, y sus permisos se convertirán en miembros normales
4000=Videoportero
4001=Registro de llamadas
4002=*Los registros en la nube solo se conservan durante 30 días
4003=Llamada telefónica a domicilio
4004=Contestado
4005=Desbloqueado
4006=Año
4007=De
4008=Llamada
4009=Desbloqueado
4010=Perdido
4011=Rechazado
4012=¡Los parámetros de configuración son anormales!
4013=Código QR de control de acceso
4014=Contraseña temporal
5000=Musica
5001=Grupo
5002=Configuracion
5003=Información general
5004=Reproductor multimedia
5005=Bluetooth
5006=Region
5007=Lista de canciones
5008=Mis favoritos
5009=Mi lista
5010=Seleccionar fuente
5011=Local
5012=USB
5013=Radio en linea
5014=QQ musica
5015=Bluetooth
5016=Entrada de linea
5017=Revisar el nombre
5018=Individual
5019=Juego aleatorio
5020=Lista
5021=Ha cambiado a:
5022=Cancelar
5023=Borrar
5024=Editar
5025=El nombre de la lista es el mismo
5026=El nombre de la lista esta en blanco
5027=Introduzca el nombre de la lista
5028=Agregar nueva lista
5029=Preguntar
5030=Eliminar la carpeta o no?
5031=Confirmar
5032=El nombre está en blanco
5033=Añadido a la lista de canciones
5034=Radio
5035=Seleccionar grupo
5036=Play
5037=Seleccione al menos mas de 2 reproductores multimedia
5038=No se pueden seleccionar 2 o más de 2 reproductores multimedia principales para convertirse en un grupo
5039=No ha seleccionado el reproductor multimedia
5040=Seleccione esta opción para quitar el reproductor multimedia
5041=No se ha seleccionado quitar el reproductor multimedia
5042=Configurando
5043=Borrando…
5044=Volumen
5045=Volumen general
5046=Ajustar volumen
5047="QQ music" no se ha instalado en su teléfono celular, proceda en el Centro de aplicaciones.
6000=Normal
6001=Estado del dispositivo
6002=piezas
6003=Dispositivo de control IR actual
6004=Se ha añadido el mando a distancia
6005=AC
6006=TV
6007=Ventilador
6008=Decodificador
6009=DVD
6010=Proyector
6011=Personalizado
6012=IR Control
6013=Administración de dispositivos
6014=Agregar mando de distancia
6015=En linea
6016=Sin conexión
6017=Número de version
6018=Introduzca el nombre de mando a distancia
6019=Recordatorio: Después de crear el mando a distancia, se puede encontrar y utilizar en Function-Electrical Category{\r\n}
6020=Boton recomendado
6021=Introduzca el nombre del botón
6022=Siguiente
6023=Potencia
6024=Volumen+
6025=Volumen-
6026=Channel+
6027=Channel-
6028=Subir
6029=Bajar
6030=Izquierda
6031=Derecha
6032=Silenciar
6034=Confirmar
6035=Reproducir
6037=Salir
6038=Menu
6039=Pausar
6040=Volver
6041=Detener
6042=Pagina de inicio
6043=Avance rápido
6044=Rebobinar
6045=Tiempo
6046=Copiar funcion de control remoto
6047=Apunta al centro del mando a distancia y pulsa el mismo botón
6048=Mando a distancia inteligente
6049=Agregar botón
6050=*Pulsación larga para la clasificación personalizada
6051=Hecho
6052=Agregado correctmente
6053=Se puede clasificar -funcion-operación electrica y uso
6054=Clasificación
6055=Nombre del mando a distancia
6056=Región
6057=Continuar agregando
6058=Eléctrico
6059=Error al agregar
6060=Reintentar
6061=Hacer coincidir el mando a distancia
6062=Haga clic en el botón de abajo
6063=Confirmar si el dispositivo esta respondiendo
6064=Error de control
6065=Control exitoso
6066=Encendido
6067=Modo de enfriamiento
6068=
6069=Temperatura 26°
6070=Eliminar dispositivo
6071=Modificar nombre
6072=Confirmar eliminación
6073=Cancelar
6074=El mando a distancia no puede superar los 10 puntos
6075=El área donde pertenece el control remoto:
6076=Editar información
6077=Actualización de la versión
6078=El sistema está en mantenimiento ~ Inténtelo de nuevo más tarde ~
6079=Error al obtener datos
6080=Esta funcion no se admite temporalmente
6081=Seleccionar banda IR
6082=
6083=Baja velocidad
6084=Interruptor de velocidad del viento
6085=Alta velocidad
6086=Auto
6087=Temperatura+
6088=Temperatura-
6089=Purificador de aire
6090=Calentador de agua
6091=Producto no existe
6092=El dispositivo no existe
6093=El dispositivo no esta en linea
6094=El dispositivo de puerta de enlace no existe
6095=Mas de 30 botondes de adición
6000=Renombrar
6001=Introduzca el nombre
6002=Xiaodu
6003=aispeech
6004=El sistema está en mantenimiento ~ Inténtelo de nuevo más tarde ~
6005=Desvinculado
6006=Altavoz inteligente
6007=Controlar contenido
6008=Error al cagar datos
6009=Error al configurar datos
6010="Todavía no hay altavoz", "Vaya a la aplicación de terceros para vincular el altavoz inteligente".
6011=La modificación de los comentarios no tiene éxito
6012=Quieres desvincularte?
6013=Desvinculación
6014=transferir a app de terceros
6015=Añadir altavoces
7000=Crear automatización
7001=Etidar automatización
7002=Si
7003=Cuando cumple las siguientes condiciones al mismo tiempo
7004=Cundo cumple una de las condiciones siguintes
7005=Continuar con la ejecución
7006=L asiguiente acción
7007=Método de reciclaje
7008=Ejecutar una vez
7009=Todos los días
7010=Cada semana
7011=Cada mes
7012=Guardar
7013=Mensaje push
7014=Enviar notificación
7015=Seleccionar la condición
7016=Momento
7017=Seleccione la condición de tiempo
7018=Hora
7019=Intervalo de tiempo
7020=Hora
7021=Minuto
7022=Segundo
7023=Cancelar
7024=Seguro
7025=*Debe ejecutar la automatización que establezca una vez durante el intervalo de tiempo establecido.
7026=Hora de inicio
7027=Hora de finalización
7028=Función
7029=Seleccionar condición funcional
7030=Toda la región
7031=Toda la función
7032=Encendido
7033=Apagado
7034=Conmutador
7035=Completo
7036=Agregar ejecución
7037=Lunes
7038=Martes
7039=Miércoles
7040=Jueves
7041=Viernes
7042=Sábado
7043=Domingo
7044=Cumplir con la condición
7045=Configuración
7046=Nombre
7047=Cambiar el nombre
7048=El nombre de la automatización ya existe
7049=Eliminar automatización o no?
7050=Agregar escena
7051=Retraso
7052=No se puede guardar, inténtelo de nuevo
7053=No se puede eliminar, inténtelo de nuevo
7054=Pausar
7055=Brillo
7056=Porcentaje
7057=Modo
7058=Enfriamiento
7059=Calefacción
7060=Automático
7061=Deshumidificar
7062=Temperatura
7063=Velocidad de ventilador
7064=Día
7065=Noche
7066=Abandonar
7067=General
7068=Tiempo
7069=No ha configurado la automatización, procesa a configurar
7070=Nada está aquí
7071=No se ha establecido la hora de inicio, por favor configurar
7072=La hora de finalización no se ha establecido, por favor estableza
7073=La hora de inicio y la hora de finalizacion no deben ser las mismas
7074=La hora de inicio no debe ser mayor a la hora de finalización
7075=La condicion no debe estar en blanco
7076=Target no debe estar en blanco
7077=La hora no se ha establecido, por favor establezca
7078=L a condición o el objetivo no deben estar en blanco
7079=L a puerta de enlace esta fuera de línea
7080=Salida/Puesta de sol/Mediodía
7081=Amanecer
7082=Puesta de sol
7083=Mediodía
7084=A tiempo
7085=Avance
7086=Minutos
7087=Cambio exterior
7088=Seleccionar condicion de cambio al aire libre
7089=Temperatura exterior, humedad, cambio de PM2.5
7090=Cambio de clima (clima urbano)
7091=Cambio en el entorno exterior
7092=Temperatura superior a
7093=Temperatura inferior
7094=Humedad superior a
7095=Humedad por debajo
7096=PM2.5 supeior a
7097=PM2.5 por debajo
7098=Día soleado
7099=Nublado
7100=
7101=*Establezca el valor en este rango (1 ~ 100).
7102=Sin valor establecido
7103=Excelente: 0 ~ 35ug/m3
7104=Bueno: 36 ~ 75ug/m3
7105=Contaminación lumínica: 76 ~ 115ug/m3
7106=Contaminación moderada: 116 ~ 150ug/m3
7107=Contaminación intensa: > 150ug/m3
7108=Fuga/Sin fuga
7109=Fuga
7110=Sin fuga
7111=Fuga de agua/sin fugas de agua
7112=Fuga de agua
7113=Sin fuga de agua
7114=Alguien/Nadie
7115=Alguien
7116=Nadie
7117=Abierto/Cerrado
7118=Activado
7119=Cerrar
7120=Función anti-desmantelamiento
7121=En linea
7122=Fuera de linea
7123=Calidad del aire
7124=Excelente
7125=Bueno
7126=Pobre
7127=Enviar notificación
7128=Contenido de la notificación
7129=(dentro de los 100 caracteres)
7130=Selección de cuenta
7131=Aplicación push
7132=Automatización
7133=Ejecutado
7134=Estado de destino
7135=Caída
7136=Temperatura
7137=Humedad
7138=PM2.5
7139=CO2
7140=TVOC
7141=Exceder
7142=Grave
7143=Alto
7144=Excelencia
7145=Seguridad
7146=Añadir seguridad
7147=Armado
7148=Desarmado
7149=Manualmente
7150=Inteligente
7151=Bueno
7152=Dejar o Arrivar a un lugar
7153=Salir
7154=Llegar
9000=Inicio sesión con un nuevo número de teléfono celular
9001=Inicie sesión con una nueva dirección de correo eléctrónico
9002=Nuevo numero de celular revisado
9003=Nuevo numero de celular enlazado
9004=Nueva dirección de correo electrónico revisado
9005=Nueva dirección de correo electrónico enlazado
9006=El código de verificación puede enviarse más tarde, espere.
9007=Por favor, espere
9008=Volver
9009=El usuario no desea ser nombrado
9010=Nueva contraseña
9011=Introduzca la nueva contraseña nuevamente
9012=De acuerdo
9013=Acuerdo de servicio
9014=Normativa de protección de la información del usuario
9015=y
9016=Lea y acepte el Acuerdo de servicio del usuario y las regulaciones de protección de la información del usuario.
9017=Esta seguro de cerrar sesión?
9018=Seleccione pais/región
9019=Actualizar ahora
9020=Ahora no
9021=País/región
9022=Información del servidor
9023=Servidor actual
9024=*El servidor hace referencia a la base de datos para la nube, sin necesidad alguna, no se recomienda realizar migración de datos.
9025=Si es necesaria la migración de datos, marque
9026=Introducción a la función
9027=Quejas
9028=Actualización de la versión
9029=(por favor indique "quejas" en el título, luego procesaremos en prioridad.)
9030=Copia realizada
9031=No hay nada aquí
9032=Obtener nueva versión
9033=Última versión
9034=Que puedo hacer por ti?
9035=Problema de función
9036=Problema de escena
9037=Soporte de aplicaciones
9038=(Preguntas frecuentes)
9039=Compartir y función
9040=Alertas
9041=Información del sistema
9042=Centro de información
9043=Tenga en cuenta que su número de cuenta ha iniciado sesión en otro lugar. Si no lo hace usted mismo, cambie la contraseña de inmediato.
9044=Cargado correctamente
9045=No se puede cargar
9046=Revisado correctamente
9047=La contraseña que ha revisado ha entrado en vigor, vuelva a iniciar sesión.
9048=Iniciar sesion con la contraseña del numero de cuenta
9049=Contraseña incorrecta para muchas veces, ¡el número de cuenta está bloqueado!
9050=Verificar la identificación facial
9051=Error al guardar la identificación facial del usuario
9052=La notificación push de registro esta disponible
9053=La notificación push de registro es anormal
9054=Verificación numerica de contraseña
9055=Verificación de gestos
9056=Año
9057=Sin función regional
9058=Guardar o no?
9059=No compartir ahora
9060=Usos-permiso
9061=Encuentra tu contraseña haciendo clic en "Olvidé mi contraseña", o inténtalo de nuevo en {0} minuto.
9062=Comprobar
9063=Todavía tienes {0} veces.
9064=Altavoz inteligente
9065=Gestión de datos
9066=Comentarios
9067=Los comentarios no pueden estar en blanco
9068=Desea desvincularse?
9069=Aviso de propiedad
10000=Contrasela no válida, vuelva a iniciar sesión
10001=Error al solicitar el servidor, inténtelo de nuevo más tarde.
10002=Mantenimiento del sistema, inténtalo de nuevo mas tarde
10003=No puede iniciar sesión, agregue la residencia al principio.
10004=El número de cuenta ya existe
10005=Envías el código de verificación con demasiada frecuencia, inténtalo de nuevo más tarde.
10006=Error de firma
10007=Sistema ocupado, intentelo de nuevo mas tarde!
10008=Contrasea no válida para iniciar sesión
10009=El usuario ha sido deshabilitado
10010=Error de contraseña original
10011=El número de subcuenta ya existe
10012=El npumero de subcuenta no existe
10013=No esta permitido agregarse como miembro
10014=La residencia actual no pertenece al este número de cuenta
10015=El nombre de la residencia ya existe
10016=La residencia no existe
10017=Error de solicitud, parámetro anormal!
10018=El número que enlazaste es duplicado
10019=Enlazar el gateway primero
10020=El gateway no existe
10021=El gateway esta fuera de línea
10022=El dispositivo está fuera de línea
10023=Error de control
10024=La escena ya existe
10025=La automatización ya existe
10026=Spk no admite esta función
10027=Spk no admite este valor funcional
10028=No tienes permiso
10029=El destino del dispositivo está duplicado
10030=No tiene permiso para el control remoto
10031=El dispositivo no debe estar en blanco
10032=El usuario no  tiene permiso
10033=El dispositivo no existe
HDL-ON_Android/Assets/Phone/FunctionIcon/FloorHeating/EconomicIcon.png
HDL-ON_Android/Assets/Phone/FunctionIcon/FloorHeating/EconomicIconGray.png
HDL-ON_Android/Assets/Phone/MusicIcon/order.png
HDL-ON_Android/Assets/Phone/MusicIcon/single.png

HDL-ON_Android/Assets/Phone/MusicIcon/single_cycle.png
HDL-ON_Android/HDL-ON_Android.csproj
@@ -181,6 +181,9 @@
    <Reference Include="ScanSdk">
      <HintPath>..\DLL\Scan\ScanSdk.dll</HintPath>
    </Reference>
    <Reference Include="Shared.Droid.HDLLinphone">
      <HintPath>..\DLL\Linphone\Android\Shared.Droid.HDLLinphone.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="MainActivity.cs" />
@@ -224,6 +227,26 @@
    <AndroidAsset Include="Assets\Phone\FunctionIcon\EnvironmentalScience\HistoryOpionBg3.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\EnvironmentalScience\HistoryOpionBg4.png" />
    <AndroidAsset Include="Assets\Phone\Collection\FunctionOfflineBg.png" />
    <AndroidAsset Include="Assets\Phone\Public\MsgIcon\CallIcon.png" />
    <AndroidAsset Include="Assets\Phone\Public\MsgIcon\AnswerIcon.png" />
    <AndroidAsset Include="Assets\Phone\Public\MsgIcon\HangUpIcon.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\CAC\DataIcon.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\CAC\JinMaoIcon.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\Icon\hvaccac.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\Icon\HomeIcon\hvaccac_blue.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\Icon\HomeIcon\hvaccac_white.png" />
    <AndroidAsset Include="Assets\Phone\Public\dialogBg2.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\Icon\sensorhelp.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\Icon\HomeIcon\sensorhelp_blue.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\Icon\HomeIcon\sensorhelp_white.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\Panel\PanelHelpAlarmBgIcon.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\Panel\PanelHelpNormalBgIcon.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\Icon\screenpanel.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\Panel\PanelEnviBg.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\FloorHeating\EconomicIcon.png" />
    <AndroidAsset Include="Assets\Phone\FunctionIcon\FloorHeating\EconomicIconGray.png" />
    <AndroidAsset Include="Assets\Phone\MusicIcon\order.png" />
    <AndroidAsset Include="Assets\Phone\MusicIcon\single_cycle.png" />
  </ItemGroup>
  <ItemGroup>
    <AndroidResource Include="Resources\values\colors.xml" />
@@ -1430,12 +1453,8 @@
  <ItemGroup>
    <Folder Include="libs\arm64-v8a\" />
    <Folder Include="Zxing\" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\..\HDLLinphoneSDK_AndroidNew\Shared.Droid.HDLLinphone\Shared.Droid.HDLLinphone\Shared.Droid.HDLLinphone.csproj">
      <Project>{703D29ED-674F-44A8-8AAD-863035899D4B}</Project>
      <Name>Shared.Droid.HDLLinphone</Name>
    </ProjectReference>
    <Folder Include="Assets\Phone\FunctionIcon\CAC\" />
    <Folder Include="Assets\Phone\FunctionIcon\Panel\" />
  </ItemGroup>
  <Import Project="..\HDL_ON\HDL_ON.projitems" Label="Shared" Condition="Exists('..\HDL_ON\HDL_ON.projitems')" />
  <Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
HDL-ON_Android/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.5.6" package="com.hdl.onpro" xmlns:tools="http://schemas.android.com/tools" android:versionCode="202205241">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.5.6" package="com.hdl.onpro" xmlns:tools="http://schemas.android.com/tools" android:versionCode="202206082">
    <uses-sdk android:minSdkVersion="26" android:targetSdkVersion="29" />
    <!--友盟-->
    <!--<uses-sdk android:minSdkVersion="8"></uses-sdk>-->
HDL-ON_iOS/HDL-ON_iOS.csproj
@@ -105,14 +105,11 @@
        <Reference Include="Shared.IOS.LCVideoOnSDK">
          <HintPath>..\DLL\LC\IOS\Shared.IOS.LCVideoOnSDK.dll</HintPath>
        </Reference>
        <Reference Include="Shared.IOS.HDLSceneSiri">
          <HintPath>..\DLL\IOS\Shared.IOS.HDLSceneSiri.dll</HintPath>
        </Reference>
        <Reference Include="Shared.IOS.HDLLinphoneSDK">
          <HintPath>..\DLL\Linphone\iOS\Shared.IOS.HDLLinphoneSDK.dll</HintPath>
        </Reference>
        <Reference Include="Shared.IOS.HDLFVSDK">
          <HintPath>..\DLL\IOS\Shared.IOS.HDLFVSDK.dll</HintPath>
        <Reference Include="Shared.IOS.HDLSceneSiri">
          <HintPath>..\DLL\IOS\Shared.IOS.HDLSceneSiri.dll</HintPath>
        </Reference>
    </ItemGroup>
    <ItemGroup>
@@ -488,6 +485,8 @@
        <Folder Include="Resources\Phone\PersonalCenter\FacePassage\" />
        <Folder Include="Resources\Phone\FunctionIcon\Electrical\AirSwitch\" />
        <Folder Include="Base.lproj\" />
        <Folder Include="Resources\Phone\FunctionIcon\CAC\" />
        <Folder Include="Resources\Phone\FunctionIcon\Panel\" />
    </ItemGroup>
    <ItemGroup>
        <InterfaceDefinition Include="LaunchScreen.storyboard" />
@@ -1389,6 +1388,24 @@
      <BundleResource Include="Resources\Phone\FunctionIcon\EnvironmentalScience\HistoryOpionBg3.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\EnvironmentalScience\HistoryOpionBg4.png" />
      <BundleResource Include="Resources\Phone\Collection\FunctionOfflineBg.png" />
      <BundleResource Include="Resources\Phone\Public\MsgIcon\CallIcon.png" />
      <BundleResource Include="Resources\Phone\Public\MsgIcon\AnswerIcon.png" />
      <BundleResource Include="Resources\Phone\Public\MsgIcon\HangUpIcon.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\CAC\DataIcon.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\CAC\JinMaoIcon.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\Icon\hvaccac.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\Icon\HomeIcon\hvaccac_blue.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\Icon\HomeIcon\hvaccac_white.png" />
      <BundleResource Include="Resources\Phone\Public\dialogBg2.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\Icon\sensorhelp.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\Icon\HomeIcon\sensorhelp_blue.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\Icon\HomeIcon\sensorhelp_white.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\Panel\PanelHelpAlarmBgIcon.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\Panel\PanelHelpNormalBgIcon.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\Icon\screenpanel.png" />
      <BundleResource Include="Resources\Phone\FunctionIcon\Panel\PanelEnviBg.png" />
      <BundleResource Include="Resources\Phone\MusicIcon\order.png" />
      <BundleResource Include="Resources\Phone\MusicIcon\single_cycle.png" />
    </ItemGroup>
    <ItemGroup>
      <ITunesArtwork Include="iTunesArtwork" />
HDL-ON_iOS/Info.plist
@@ -100,9 +100,9 @@
    <key>UIStatusBarStyle</key>
    <string>UIStatusBarStyleLightContent</string>
    <key>CFBundleShortVersionString</key>
    <string>1.5.502205201</string>
    <string>1.5.502205241</string>
    <key>CFBundleVersion</key>
    <string>1.5.505201</string>
    <string>1.5.505241</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Use geographic location to provide services such as weather</string>
    <key>NSAppleMusicUsageDescription</key>
HDL-ON_iOS/Resources/Language.ini
@@ -518,6 +518,17 @@
530=In order to prevent the wrong touch and click of opening and closing the door and ensure family safety, please enter your door lock password.
531=Password free unlocking within five minutes
532=The device is offline and cannot be operated temporarily
533=Statistical Chart
534=Data
535=Dew point temperature
536=Temperature statistics
537=Humidity statistics
538=Uint
539=Smart panel
540=In Alarm
541=Monitoring
542=Wandering alarm
543=Get more
1000=Room Humidity
@@ -727,7 +738,7 @@
5015=Bluetooth
5016=Line input
5017=Revise the name
5018=Single
5018=Single loop
5019=Random play
5020=List
5021=Has shifted to
@@ -757,6 +768,8 @@
5045=General volume
5046=Adjust volume
5047="QQ music" has not installed in your cell phone, please proceed in App center.
5048= Progressive cycle
5049=Single play
 
6000=normal
6001=Device status
@@ -1030,6 +1043,12 @@
7152=Leave or arrive at a place
7153=Leave
7154=Arrive
7155=Distress/Normal
7156=Distress
7157=whether to unlock
7158=is
@@ -1659,9 +1678,18 @@
530=为防止开关门的误触点击,保证家庭安全,请输入您的门锁开门密码。
531=五分钟内免密码开锁
532=设备离线中,暂时无法操作
533=访客管理
533=24小时统计图
534=数据
535=露点温度
536=温度统计图
537=湿度统计图
538=单位
539=智能面板
540=报警中
541=监控中
542=徘徊报警
543=获取更多
1000=室内湿度
1001=童锁
1002=负离子
@@ -1871,7 +1899,7 @@
5015=蓝牙
5016=线路输入
5017=修改名称
5018=单曲播放
5018=单曲循环播放
5019=随机播放
5020=列表播放
5021=已切换到
@@ -1901,6 +1929,8 @@
5045=总音量
5046=调节音量
5047=你手机暂未安装"QQ音乐"{\r\n}请前往手机商场安装
5048=循序循环
5049=单曲循环
 
 
6000=正常
@@ -2155,7 +2185,10 @@
7152=离开或到达某地
7153=离开
7154=到达
7155=求救/正常
7156=求救
7157=是否开锁时
7158=是
 
@@ -2783,7 +2816,17 @@
530=In order to prevent the wrong touch and click of opening and closing the door and ensure family safety, please enter your door lock password.
531=Password free unlocking within five minutes
532=The device is offline and cannot be operated temporarily
533=Statistical Chart
534=Data
535=Dew point temperature
536=Temperature statistics
537=Humidity statistics
538=Uint
539=Smart panel
540=Нормальный
541=Monitoring
542=Wandering alarm
543=Get more
1000=Влажность в Помещении
@@ -3405,3 +3448,1147 @@
10031=Устройство не должно быть пустым.
10032=У пользователя нет разрешения.
10033=Устройство не существует.
[Spanish]
1=Ingresar
2=Número de teléfono
3=Luz
4=Correo
5=Por favor ingrese numero de cuenta
6=Contraseña
7=Olvidar
8=Registrarse
9=Iniciar sesión
10=Espere…
11=Cerrar
12=Código de verificación
13=Contraseña de acceso
14=Registrarse
15=Número de teléfono
16=Ingrese la contraseña
17=Ingrese la contraseña nuevamente
18=Código de verificación
19=Número de teléfono incorrecto, ingrese nuevamente
20=L a contraseña y la confirmación no coinciden. Ingrese la contraseña nuevamente
21=El formato de la contraseña no cumple con los requisitos. Ingrese la contraseña nuevamente
22=El usuario ya existe. Puede ingresar directamete
23=Código de verificación incorrecto, vuelva a ingresarlo.
24=Número de cuenta incorrrecta, por favor ingrese el correo correcto
25=Correo
26=Residencia
27=Miembro
28=Desarmar
29=Armar
30=Copia de seguridad
31=Función auxiliar
32=Añadir funciones
33=Modo noche
34=Configuración general
35=Soporte
36=Casa
37=Categoría
38=Inteligente
39=Individual
40=Inicio de sesión fallido, número de cuenta o contraseña incorrectos
41=Error al enviar el codigo de verificación
42=Error de red
43=Error en el registo, inténtelo de nuevo
44=Confirmar reinicio
45=El numero de cuenta no existe, por favor asegúrese de estar registrado
46=Inicio de sesion inválido, iniciar sesion nuevamente
47=Centro Personal
48=Nombre
49=Código QR
50=Teléfono
51=Correo
52=No enlazado
53=Autorización de terceros
54=Cambiar contraseña
55=Configuración de desbloqueo
56=Establecer contraseña, gesto, huella digital o identificación facil para proteger su provacidad
57=Salir
58=Habitación
59=Equipo
60=Función
61=Brillo
62=Configuración
63=Locación
64=Compartir
65=Añadir acceso directo al escritorio
66=Cambiar nombre
67=Cancelar
68=Confirmar
69=Todo
70=Cortina
71=Nombre
72=Address
73=Gestión de plantas
74=Gestión de habitaciones
75=Migración de administrador
76=Migración de privilegios
77=Priviligio de depuración
78=El administrador migra a otro usuario
79=Toda los datos de la residencia migran al nuevo usuario
80=Permitir que el personal visite su casa de forma remota
81=Piso
82=Añadir piso
83=Cambiar nombre de piso
84=Error al añadir, el piso ya existe
85=Escena
86=Borrar
87=Inmediata
88=Eliminar el piso o no?
89=Añadir habitación
90=Cmabiar la informacion de la habitación
91=Información de la habitanción
92=Nombre
93=Piso
94=Gestión funcionamiento
95=Guardar
96=Eliminar la habitación
97=Galeria por defecto
98=Camara
99=Seleccionar de la galeria
100=No asignado
101=Asignado
102=No asignado
103=Eliminar la habitación o no?
104=Tiempo de transición
105=Temperatura interna
106=AC
107=Videoportero
108=Sensor
109=Monitor de seguridad
110=Panel Inteligente
111=Musica
112=Aire fresco
113=Ambiental
114=Monitoreo de energía
115=Electrodomésticos
116=Bloqueo inteligente
117=Calefacción
118=Abrir
119=Refrigeración
120=Calefacción
121=Deshumidificar
122=Auto
123=Suministro de aire
124=Alto
125=Medio
126=Bajo
127=Modo
128=Velocidad del ventilador
129=Estas seguro de apagar todas las funciones de la habitación?
130=Abierta
131=Añadido a favoritos
132=Felicitaciones! Registro exitoso
133=Inicio de sesion automático pronto….
134=El numero de no esta registrado, por favor registrese e ingrese nuevamente
135=Por favor, obtener codigo de verificación
136=La contraseña ha sido cambiada
137=La direccion rsidencial no puede estar en blanco
138=El nombre de la residencia no puede estar en blanco
139=El nombre de la habitación no puede estar en blanco
140=El nombre del piso no puede estar en blanco
141=No se pudo revisar, el piso ya existe
142=El nombre del equipo no puede estar en blanco
143=El nombre del usuario no puede estar en blanco
144=Nombre de usuario
145=Seleccione la página para bloquear
146=Puede seleccionar varias paginas que le gustaria mantener
147=Error en codigo de verificación
148=No protegido
149=Cuando empieza
150=Armar/Desarmar
151=Desbloquear remotamente
152=No se necesita contraseña/gesto al iniciar el software
153=Iniciar sesión 5 minutos despues de salir de la página, se requiere el método de desbloqueo correspondiente.
154=Centro de miembros - utiliza para debloquear la función de seguridad como armar/desarmar
155=Usado para desbloquear la cerradura inteligente
156=Configuración de desbloqueo
157=Solo valido para host
158=Desbloquear con contraseña
159=Desbloquear con gesto
160=Desbloquear con huella
161=Desbloquear con identificación facial
162=Configuración de contraseña numérica
163=Configuración exitosa
164=Configuración de gestos
165=Por favor dibuja tu patron de desbloqueo
166=Requiere al menos una conexión de 4 puntos, dibuje nuevamente
167=El patron y la corfirmacion que dibujaste no coincide, dibuje nuevamente
168=Por favor dibuje su patrón nuevamente
169=Desbloquear con huella o no?
170=Desbloquar con identificacion facial o no?
171=Verificar la contraseña numérica
172=Verificar el gesto
173=Por favor ingrese el gesto original
174=Por favor ingrese la contraseña numérica original
175=Verificación fallida, error en la contraseña
176=Cambiar la contraseña numérica
177=Cambiar el gesto
178=Cerrar la configuración de desbloqueo o no?
179=Por favor verifique la huella
180=Verificación fallida, error en el gesto
181=General
182=Dia
183=Noche
184=Abandonar
185=Por favor enlace el piso
186=Ajuste de la velocidad del ventilador
187=Ventilador
188=Enchufe
189=Nivel
190=Chl
191=Vol
192=TV
193=La habitanción existe, error al cambiar
194=Medio Ambiente
195=Contaminación fuerte
196=Contaminación leve
197=Bueno
198=Excelente
199=Frio helado
200=Frio
201=Frio
202=Confort
203=Tibio
204=Caliente
205=Extremadamente caliente
206=Hasta el estandar
207=Contaminación leve
208=Contaminación media
209=Contaminación fuerte
210=Fresco
211=Turbidez
212=Hipoxia
213=Hipoxia severa
214=Húmedo
215=Húmedo
216=Seco
217=Temperatura
218=Humedad
219=Rango
220=Nivel
221=Valor de color
222=PM1.0
223=PM2.5
224=Ruido
225=Fuerza del viento
226=CO2
227=TV02
228=Dia
229=Semana
230=Mes
231=Otra región
232=Administración de miembros
233=Apodo
234=Autoridad Administrativa
235=Crear una escena
236=Apodo no puede quedar en blanco
237=Editar apodo
238=La región utilizada
239=Añadir miembro
240=Por favor ingrese el número de cuenta del miembro
241=Escanear codigo QR
242=Confirmar la invitación
243=Error en número de cuenta, por favor chequear
244=Agregue correctamente al miembro
245=Error de datos, por favor intente de nuevo
246=Error al añadir, el numero de cuenta del miembro no esta registrada
247=No puedes agregarte a ti mismo.
248=El usuario no existe en esta residencia
249=Se ha agregado el número de cuenta del miembro, por lo que no se puede volver a agregar.
250=Error de operación
251=Error al agregar, autoridad no valida
252=Guardado correctamente
253=Guardando…espere un momento.
254=Adopo editado
255=Eliminar este miembro
256=Sin favoritos
257=Introduzca el contenido
258=Bienvenido al nuevo miembro
259=Esta seguro de elimianr este miembro?
260=Introduzca la contraseña de inicio de sesión
261=Cambio de residencia exitoso
262=Seleccionar todo
263=Compartir la selección funcional
264=Confirmar uso compartido
265=Compartir en
266=Error de uso compartido funcional
267=Uso compartido funcional exitoso
268=Correo
269=Cambiar el enlace
270=Eliminar el enlace
271=Correo
272=Cambiar la dirección de correo
273=Cambiar el método de verificación
274=El código de verificación ha sido enviado, por favor ingrese
275=Reenviar
276=Verificación correcta
277=Correo
278=Por favor ingrese el nuevo correo
279=Enlazar correctamente su correo electrónico a su cuenta
280=No vincular su correo electrónica a su cuenta
281=Eliminar el enlace de correo electrónico
282=Eliminación correcta de enlace
283=Número de telefono
284=Número de telefono
285=Número de telefono
286=Vincular correctamente su numero de teléfono a su cuenta
287=No puede vincular su numero de teléfono a su cuenta
288=Cambiar el enlace
289=Quitar el enlace
290=No se puede obtener el historial
291=Sin favoritos
292=Acerca de ON+
293=Miembro
294=Administrador
295=Cambiar la contraseña
296=Antes de cambiar la contraseña iniciar sesion
297=Por favor verifique ID
298=Verificación telefonica
299=Verificación de correo electronico
300=No se ha enlazado a la dirección de correo electronico, no puede verificar
301=No se ha enlazado a un numero telefonico, no se puede verificar
302=Proceder al enlace
303=Eliminado correctamente el enlace a su numero de telefono
304=El codigo de verificación se ha enviado a:
305=Telefono
306=Correo
307=Recibió nuevos datos, esta seguro de anularlos?
308=Automatización
309=Crear una escena
310=Añadir escena
311=Configuración basica
312=Nombre
313=Region
314=Completo
315=Vista completa de la residencia
316=Sleccionar
317=Ya añadido
318=Conmutador
319=Velocidad del ventilador
320=Modo
321=Encendido
322=Apagado
323=Escena
324=Retardo de escena
325=Configuración de retardo
326=Retardo
327=Capturar la escena
328=Escena de pelicula
329=General
330=Modo automático
331=Potencia calentamiento suelo
332=Refrigeración suelo
333=Potencia de refrigeración del suelo
334=Ajustar el porcentaje
335=Sin retardo
336=No hay escena disponible. Añade uno!
337=Editar la escena
338=El nombre de la escena no puede estar en blanco
339=El nombre de la escena ya existe, por favor revise
340=El nombre de la habitación ya existe, por favor revise
341=Eliminar esta escena o no?
342=La puerta de enlace esta fuera de linea, falla de conexión remota
343=Error MAC, error de conexión remota.
344=Error de conexión remota.
345=Telefono
346=Correo
347=Ingrese el nuevo numero de telefono ceular
348=Ya se ha utilizado el numero de telefono celular
349=Ya se ha utilizado la direccion de correo electronico
350=La dirección de correo electrónico es la misma que la actual, sin necesidad de cambiar.
351=El número de teléfono es la mismo que la actual, sin necesidad de cambiar.
352=Asignación de piso
353=Separar
354=Cerrar
355=Acerca de
356=Numero de version
357=Esta funcion no esta disponible!
358=Telefono
359=Correo
360=Escena de panel
361=No añadido
362=Seleccionar todo
363=No se puede comunicar con el servidor, no se puede editar la información del dispositivo
364=No se puede comunicar con el servidor, no se puede editar la información de la habitación
365=No se puede comunicar con el servidor, no se puede editar la información de la escena
366=No se puede comunicar con el servidor, no se puede eliminar la escena
367=No se puede comunicar con el servidor, no se puede eliminar el piso
368=Bienvenido a disfrutar de ON+
369=Añadir residencia
370=Conviértete en miembro de la familia
371=No se puede utilizar la funcion, por favor verifique su conexión
372=No se puede crear una escena, por favro verifique su conexión
373=Error al agregar un piso
374=Los datos residenciales se han eliminado, APP cambiará automáticamente a otra residencia.
375=El gateway no esta conectado al servidor, no se puede crear la escena
376=No se puede introducir un carácter especial
377=Toda la residencia
378=Tiempo de transición
379=Velocidad de transicion
380=Esta funcion no esta disponible!
381=Recargar
400=Bienvenido a casa
401=Codigo de barras no válido, intentelo de nuevo
402=Inténtelo de nuevo
403=Temperatura de color
404=Ajuste rápido
405=Acogedor
406=Reunión
407=Lectura
408=Añadir
409=Marca de función
410=No ha agregado ningun dispositov de pataforma en la actualidad
411=Otros dispositivos de plataforma son compatibles con proveedores de serviciso externos
412=Añadir
413=Controlador no activado
414=Controlador activado
415=Alguien
416=Registro
417=Fuga de agua
418=En alarma
419=Normal
420=Seco caliente
421=Secado al aire
422=Desinfectar
423=Iluminación
424=Tiempo
425=Tiempo seco caliente
426=Tiempo de secado al aire
427=Tiempo de desinfección
428=Tiempo Anión
429=H
430=Min
431=Actualmente esta agregando cualquier dispositivos de plataforma a
432=Otros dispositivos de plataforma son compatibles con proveedores de serviciso externos
433=Valvula de agua
434=Interruptor de tiempo
435=Control remoto
436=Dispositivos añadido
437=Lista de dispositivos
438=humedad:{0}% aire:viento {1}:{2}
439=Tiempo real: {0} kw
440=Siguiente paso
441=Seleccione todas las áreas de estado de captura
442=Generar escena
443=Implementación personalizada
444=Centro de seguridad
445=Defensa de la casa
446=Defensa en casa
447=Defensa de vacaciones
448=Implementación fija
449=*Deshacer defensa no afecta
450=Defensa contra desastres
451=Defensa de 24 horas
452=Alarma antirrobo
453=Silenciar alarma
454=Información de implementación
455=El nombre no puede estar en blanco
456=Lienzo
457=Consumo de energía
458=Fecha
459=Consumo de energía en tiempo real
460=Consumo energético de este mes
461=Exterior/Interior
462=Aun no has añadido ningun dispositivo
463=Introduzca el código SN del dispositivo
464=Puede empezar a usar la onda milimétrica Zhaoguan
465=Eliminar dispositivo
466=STB
467=Proyector
468=Alguien cayó
469=Alguien está en
470=Bajo protección
471=Sensor de onda milimétrica
472=Exterior
473=Columpio
474=Oscilación hacia arriba y hacia abajo
475=Gira a izquierda y derecha
476=Añadir residencia
477=Columpio
478=Patrón
479=Velocidad
480=Sensor ambiental
481=Puede empezar a usar el sensor ambiental
482=Sensor de gas
483=Introduzca el código MAC del dispositivo
484=Abierto
485=Comprobar/Modificar
486=Función de defensa/Estado de alarma
487=Objetivo de alarma despues de la activación
488=Paso de rostro
489=Aplicar identificación facil a:
490=Control de acceso a la comunidad
491=Acerda de identificacion facil y privacidad
492=Borrar datos
493=Resetear identificación facial
494=Establecer identificación facial
495=Configuración paso de rostro
496=No hay ningun estado de implementacion de tareas asociado
497=Personalizado
498=Implementación retrasada
499=Agregar función de defensa
500=Agregar destino de alarma
501=Alarma de seguridad: se activa en {0}
502=Borrar la alarma de seguridad?
503=Exceso de estandar
504=Bueno
505=Excelente
506=Indentificacion facil ingresada correctamente
507=Ingreso identificación facil fallida
508=Formaldehído
509=Introduzca el nombre de seguridad
510=Seleccione el destino de implementación
511=Atenuación combinada
512=Mensajes no estan habilitados, vaya a configuración
513=Introduzca el codigo de emparejamiento
514=La información de la ubicación del gateway no está configurada
515=Agregar seguridad
516=Withdrawal
------
517=Instantaneous value
518=Cumulative power consumption
519=Voltage (V)
520=Electric Current (A)
521=Power (W)
522=Refresh
523=Delay alarm
524=Bypass
525=Enable
526=Cancel account
527=Homekit support notes
528=Firmware update
529=
530=In order to prevent the wrong touch and click of opening and closing the door and ensure family safety, please enter your door lock password.
531=Password free unlocking within five minutes
532=The device is offline and cannot be operated temporarily
533=Statistical Chart
534=Data
535=Dew point temperature
536=Temperature statistics
537=Humidity statistics
538=Uint
539=Smart panel
540=En alarma
541=Monitoring
542=Wandering alarm
543=Get more
1000=Humedad de ambiente
1001=V-chip
1002=Anión
1003=Estirilización
1004=Humidificar
1005=Restablecimiento del elemento de filtro
1006=Iluminación
1007=Automático
1008=Manual
1009=Fuerte
1010=Dormir
1011=Tiempo
1012=Velocidad del viento
1013=Engranaje
1014=Confirme si el elemento filtrante se ha restablecido y opere el equipo de acuerdo con el manual de instrucciones para que la vida útil del elemento filtrante se vuelva a cronometrar
1015=Marcha baja
1016=Engranaje medio
1017=Marcha alta
1018=Configuración de temportización
1019=Hora
1020=Tiempo del elemento de filtro:
1021=Filtro de aire
1022=Velocidad actual del viento
1023=Cancelar tiempo
1024=Robot de barrido de pisos
1025=Succión
1026=1° Marcha
1027=2° Marcha
1028=3° Marcha
1029=Carga
1030=Voz
1031=Silenciar
1032=Modo de limpieza
1033=Gestion de consumibles
1034=Historia
1035=Automático
1036=Aleatorio
1037=Muro
1038=Espiral
1039=Área total limpia
1040=Tiempo total de limpieza
1041=Vida útil restante del cepillo lateral
1042=Vida útil residual del cepillo de rodillos
1043=Vida útil restante de la pantalla de filtro
1044=Restablecer pincel de bordes
1045=Restablecer cepillo de rollo
1046=Restablecer pantalla
1047=Confirmar para restablecer el pincel de bordes?
1048=Confirmar para restablecer el cepillo de rollo?
1049=Confirmar para restablecer la pantalla?
1050=Agregar dispositivo
1051=Mini control remoto inteligente
1052=Agregar control remoto por infrarrojos
1053=Presione el botón del control remoto infrarrojo{0} durante 3 segundos y la luz indicadora{0} se enciende en azul rápidamente
1054=Asegúrese de que su Bluetooth{0} esté activado y se pueda buscar
1055=Siguiente paso
1056=Buscando dispositivo…
1057=No se ha encontrado ningún mando a distancia por infrarrojos
1058=1.Compruebe si el dispositivo está{0} encendido normalmente{0}2.Compruebe si la función Bluetooth{0} está activada normalmente{0}3.Compruebe si el indicador{0} luz parpadea en azul
1059=Buscar de nuevo
1060=Conectar WiFi
1061=En la actualidad, solo es compatible con la red WiFi 2.4G{0} y no admite nombres WiFi{0} con caracteres chinos
1062=Contraseña
1063=Conectando…
1064=Haga que el control remoto por infrarrojos{0} lo más cerca posible del enrutador WiFi
1065=Enlace de red
1066=Subir a nube
1067=Conectado con éxito
1068=1.Compruebe si el dispositivo está{0} encendido normalmente{0}2.Active la función Bluetooth{0}3.Presione el botón durante 10 s y el indicador{0} luz estará encendida
1069=Error al agregar
1070=Agregado con éxito
1071=¡Puedes empezar a usar el control infrarrojo{0}remote!
1072=Empezar a usar
1073=Por favor encender Bluethooth
1074=Información de ubicación (GBS) no disponible
1075=Red no disponible
1076=Seleccione el mando a distancia por infrarrojos
1077=Aire fresco
1078=Pantalla de filtro residual
1079=Energia
1080=Ventilado
;别
1081=1° Marcha
1082=2° Marcha
1083=3° Marcha
1084=1° Marcha
1085=2° Marcha
1086=3° Marcha
1087=Desbloquear
1088=Temp. Contraseña
1089=Conectado
1090=Desconectado
1091=Generar
1092=Tiempo efectivo
1093=Tiempo de caducidad
1094=Seleccionar hora
1095=Seleccionar fecha
1096=Generar
1097=Se ha copiado la contraseña actual
1098=Borrar contraseña?
1099=El tiempo de caducidad debe ser posterior al tiempo efectivo
1100=Método de desbloqueo
1101=Se sincronizará con el bloqueo real, ¿confirmar para eliminar?
1102=Borrar
1103=Comentar
1104=El comentario no puede estar en blanco
1105=Asignar a:
1106=Escena de destino no existe
1107=Seleccionar escena
1108=Desbloquear
1109=Siempre encendido
1110=Configuración
1111=Automatización
1112=Activar el modo "Siempre encendido"
1113=Desactivar el modo "Siempre encendido"
1114=Editar
1115=Siempre Encendido estará apagado {0}
1116=Condición
1117=Movimiento
1118=Siempre encendido
1119=Bloquear
1120=Usuario
1121=Método de desbloqueo
1122=Huella digital
1123=Tarjeta
1124=Clave
1125=Información
1126=Desbloquear
1127=Alarma
1128=Sin conexión
1129=Para el primer usuario, introduzca la contraseña.
1130=Introduzca la contraseña de administrador
1131=Enlace correcto
1132=Saltar a la contraseña personal para desbloquear
1133=Saltar
1134=Por favor, dibuja tu patrón
1135=El bloqueo estará siempre encendido después de la configuración, confirme para continuar
1136=Confirmar
1137=Caducar
1138=Siempre Encendido caducará despues de {0} horas
1139=Introduzca el tiempo de caducidad
1140=El tiempo de caducidad no debe ser superior a 72 horas
1141=El tiempo de caducidad no debe ser inferior a 1 hora
1142=Error al establecer conexión, intentelo de nuevo
1143=No se puede verificar el ID de administrador, vuelva a iniciar sesión en la cuenta
1144=Su residencia está siendo migrada a otro HDL
1145=Nota:
1. Todos sus datos de residencia se migrarán a un nuevo usuario. {0} 2. Después de la migración, el miembro original será{0}automáticamente desvinculado de esta residencia. {0} 3. La nueva cuenta es una HDL válida. {0} 4. La cuenta del receptor no puede ser la misma{0} que la del lado de la migración.
1147=Confirmar
1148=Cuenta del receptor de entrada
1149=Perfil
1150=Confirmar migración de administrador de {0} a {1}
1151=La cuenta no existe
1152=No transferir la propiedad a usted mismo
1153=Terminar
1154=Transferir al usuario, por favor espere...
1155={0} se ha convertido en administrador residencial
1156=Los datos de residencia se eliminarán de su cuenta
1157=No se puede migrar
1158=Inténtelo de nuevo
1159=Migración de la autoridad de administración
1160=Su autoridad de administración se está migrando a otros miembros
1161=1.Sus datos (datos en la nube) de la residencia serán{0}migrabados al nuevo administrador{0}2.Sus datos se intercambiarán con el miembro objetivo{0}y su permiso se cambiará al miembro objetivo{0}
1162=Confirmar
1163=No hay miembros para elegir
1164=Confirmar la migración de la autoridad de administración de {0} a {1}
1165=Migrar correctamente
1166=No se puede migrar
1167=Migrar correctamente, y sus permisos se convertirán en miembros normales
4000=Videoportero
4001=Registro de llamadas
4002=*Los registros en la nube solo se conservan durante 30 días
4003=Llamada telefónica a domicilio
4004=Contestado
4005=Desbloqueado
4006=Año
4007=De
4008=Llamada
4009=Desbloqueado
4010=Perdido
4011=Rechazado
4012=¡Los parámetros de configuración son anormales!
4013=Código QR de control de acceso
4014=Contraseña temporal
5000=Musica
5001=Grupo
5002=Configuracion
5003=Información general
5004=Reproductor multimedia
5005=Bluetooth
5006=Region
5007=Lista de canciones
5008=Mis favoritos
5009=Mi lista
5010=Seleccionar fuente
5011=Local
5012=USB
5013=Radio en linea
5014=QQ musica
5015=Bluetooth
5016=Entrada de linea
5017=Revisar el nombre
5018=Individual
5019=Juego aleatorio
5020=Lista
5021=Ha cambiado a:
5022=Cancelar
5023=Borrar
5024=Editar
5025=El nombre de la lista es el mismo
5026=El nombre de la lista esta en blanco
5027=Introduzca el nombre de la lista
5028=Agregar nueva lista
5029=Preguntar
5030=Eliminar la carpeta o no?
5031=Confirmar
5032=El nombre está en blanco
5033=Añadido a la lista de canciones
5034=Radio
5035=Seleccionar grupo
5036=Play
5037=Seleccione al menos mas de 2 reproductores multimedia
5038=No se pueden seleccionar 2 o más de 2 reproductores multimedia principales para convertirse en un grupo
5039=No ha seleccionado el reproductor multimedia
5040=Seleccione esta opción para quitar el reproductor multimedia
5041=No se ha seleccionado quitar el reproductor multimedia
5042=Configurando
5043=Borrando…
5044=Volumen
5045=Volumen general
5046=Ajustar volumen
5047="QQ music" no se ha instalado en su teléfono celular, proceda en el Centro de aplicaciones.
6000=Normal
6001=Estado del dispositivo
6002=piezas
6003=Dispositivo de control IR actual
6004=Se ha añadido el mando a distancia
6005=AC
6006=TV
6007=Ventilador
6008=Decodificador
6009=DVD
6010=Proyector
6011=Personalizado
6012=IR Control
6013=Administración de dispositivos
6014=Agregar mando de distancia
6015=En linea
6016=Sin conexión
6017=Número de version
6018=Introduzca el nombre de mando a distancia
6019=Recordatorio: Después de crear el mando a distancia, se puede encontrar y utilizar en Function-Electrical Category{\r\n}
6020=Boton recomendado
6021=Introduzca el nombre del botón
6022=Siguiente
6023=Potencia
6024=Volumen+
6025=Volumen-
6026=Channel+
6027=Channel-
6028=Subir
6029=Bajar
6030=Izquierda
6031=Derecha
6032=Silenciar
6034=Confirmar
6035=Reproducir
6037=Salir
6038=Menu
6039=Pausar
6040=Volver
6041=Detener
6042=Pagina de inicio
6043=Avance rápido
6044=Rebobinar
6045=Tiempo
6046=Copiar funcion de control remoto
6047=Apunta al centro del mando a distancia y pulsa el mismo botón
6048=Mando a distancia inteligente
6049=Agregar botón
6050=*Pulsación larga para la clasificación personalizada
6051=Hecho
6052=Agregado correctmente
6053=Se puede clasificar -funcion-operación electrica y uso
6054=Clasificación
6055=Nombre del mando a distancia
6056=Región
6057=Continuar agregando
6058=Eléctrico
6059=Error al agregar
6060=Reintentar
6061=Hacer coincidir el mando a distancia
6062=Haga clic en el botón de abajo
6063=Confirmar si el dispositivo esta respondiendo
6064=Error de control
6065=Control exitoso
6066=Encendido
6067=Modo de enfriamiento
6068=
6069=Temperatura 26°
6070=Eliminar dispositivo
6071=Modificar nombre
6072=Confirmar eliminación
6073=Cancelar
6074=El mando a distancia no puede superar los 10 puntos
6075=El área donde pertenece el control remoto:
6076=Editar información
6077=Actualización de la versión
6078=El sistema está en mantenimiento ~ Inténtelo de nuevo más tarde ~
6079=Error al obtener datos
6080=Esta funcion no se admite temporalmente
6081=Seleccionar banda IR
6082=
6083=Baja velocidad
6084=Interruptor de velocidad del viento
6085=Alta velocidad
6086=Auto
6087=Temperatura+
6088=Temperatura-
6089=Purificador de aire
6090=Calentador de agua
6091=Producto no existe
6092=El dispositivo no existe
6093=El dispositivo no esta en linea
6094=El dispositivo de puerta de enlace no existe
6095=Mas de 30 botondes de adición
6000=Renombrar
6001=Introduzca el nombre
6002=Xiaodu
6003=aispeech
6004=El sistema está en mantenimiento ~ Inténtelo de nuevo más tarde ~
6005=Desvinculado
6006=Altavoz inteligente
6007=Controlar contenido
6008=Error al cagar datos
6009=Error al configurar datos
6010="Todavía no hay altavoz", "Vaya a la aplicación de terceros para vincular el altavoz inteligente".
6011=La modificación de los comentarios no tiene éxito
6012=Quieres desvincularte?
6013=Desvinculación
6014=transferir a app de terceros
6015=Añadir altavoces
7000=Crear automatización
7001=Etidar automatización
7002=Si
7003=Cuando cumple las siguientes condiciones al mismo tiempo
7004=Cundo cumple una de las condiciones siguintes
7005=Continuar con la ejecución
7006=L asiguiente acción
7007=Método de reciclaje
7008=Ejecutar una vez
7009=Todos los días
7010=Cada semana
7011=Cada mes
7012=Guardar
7013=Mensaje push
7014=Enviar notificación
7015=Seleccionar la condición
7016=Momento
7017=Seleccione la condición de tiempo
7018=Hora
7019=Intervalo de tiempo
7020=Hora
7021=Minuto
7022=Segundo
7023=Cancelar
7024=Seguro
7025=*Debe ejecutar la automatización que establezca una vez durante el intervalo de tiempo establecido.
7026=Hora de inicio
7027=Hora de finalización
7028=Función
7029=Seleccionar condición funcional
7030=Toda la región
7031=Toda la función
7032=Encendido
7033=Apagado
7034=Conmutador
7035=Completo
7036=Agregar ejecución
7037=Lunes
7038=Martes
7039=Miércoles
7040=Jueves
7041=Viernes
7042=Sábado
7043=Domingo
7044=Cumplir con la condición
7045=Configuración
7046=Nombre
7047=Cambiar el nombre
7048=El nombre de la automatización ya existe
7049=Eliminar automatización o no?
7050=Agregar escena
7051=Retraso
7052=No se puede guardar, inténtelo de nuevo
7053=No se puede eliminar, inténtelo de nuevo
7054=Pausar
7055=Brillo
7056=Porcentaje
7057=Modo
7058=Enfriamiento
7059=Calefacción
7060=Automático
7061=Deshumidificar
7062=Temperatura
7063=Velocidad de ventilador
7064=Día
7065=Noche
7066=Abandonar
7067=General
7068=Tiempo
7069=No ha configurado la automatización, procesa a configurar
7070=Nada está aquí
7071=No se ha establecido la hora de inicio, por favor configurar
7072=La hora de finalización no se ha establecido, por favor estableza
7073=La hora de inicio y la hora de finalizacion no deben ser las mismas
7074=La hora de inicio no debe ser mayor a la hora de finalización
7075=La condicion no debe estar en blanco
7076=Target no debe estar en blanco
7077=La hora no se ha establecido, por favor establezca
7078=L a condición o el objetivo no deben estar en blanco
7079=L a puerta de enlace esta fuera de línea
7080=Salida/Puesta de sol/Mediodía
7081=Amanecer
7082=Puesta de sol
7083=Mediodía
7084=A tiempo
7085=Avance
7086=Minutos
7087=Cambio exterior
7088=Seleccionar condicion de cambio al aire libre
7089=Temperatura exterior, humedad, cambio de PM2.5
7090=Cambio de clima (clima urbano)
7091=Cambio en el entorno exterior
7092=Temperatura superior a
7093=Temperatura inferior
7094=Humedad superior a
7095=Humedad por debajo
7096=PM2.5 supeior a
7097=PM2.5 por debajo
7098=Día soleado
7099=Nublado
7100=
7101=*Establezca el valor en este rango (1 ~ 100).
7102=Sin valor establecido
7103=Excelente: 0 ~ 35ug/m3
7104=Bueno: 36 ~ 75ug/m3
7105=Contaminación lumínica: 76 ~ 115ug/m3
7106=Contaminación moderada: 116 ~ 150ug/m3
7107=Contaminación intensa: > 150ug/m3
7108=Fuga/Sin fuga
7109=Fuga
7110=Sin fuga
7111=Fuga de agua/sin fugas de agua
7112=Fuga de agua
7113=Sin fuga de agua
7114=Alguien/Nadie
7115=Alguien
7116=Nadie
7117=Abierto/Cerrado
7118=Activado
7119=Cerrar
7120=Función anti-desmantelamiento
7121=En linea
7122=Fuera de linea
7123=Calidad del aire
7124=Excelente
7125=Bueno
7126=Pobre
7127=Enviar notificación
7128=Contenido de la notificación
7129=(dentro de los 100 caracteres)
7130=Selección de cuenta
7131=Aplicación push
7132=Automatización
7133=Ejecutado
7134=Estado de destino
7135=Caída
7136=Temperatura
7137=Humedad
7138=PM2.5
7139=CO2
7140=TVOC
7141=Exceder
7142=Grave
7143=Alto
7144=Excelencia
7145=Seguridad
7146=Añadir seguridad
7147=Armado
7148=Desarmado
7149=Manualmente
7150=Inteligente
7151=Bueno
7152=Dejar o Arrivar a un lugar
7153=Salir
7154=Llegar
9000=Inicio sesión con un nuevo número de teléfono celular
9001=Inicie sesión con una nueva dirección de correo eléctrónico
9002=Nuevo numero de celular revisado
9003=Nuevo numero de celular enlazado
9004=Nueva dirección de correo electrónico revisado
9005=Nueva dirección de correo electrónico enlazado
9006=El código de verificación puede enviarse más tarde, espere.
9007=Por favor, espere
9008=Volver
9009=El usuario no desea ser nombrado
9010=Nueva contraseña
9011=Introduzca la nueva contraseña nuevamente
9012=De acuerdo
9013=Acuerdo de servicio
9014=Normativa de protección de la información del usuario
9015=y
9016=Lea y acepte el Acuerdo de servicio del usuario y las regulaciones de protección de la información del usuario.
9017=Esta seguro de cerrar sesión?
9018=Seleccione pais/región
9019=Actualizar ahora
9020=Ahora no
9021=País/región
9022=Información del servidor
9023=Servidor actual
9024=*El servidor hace referencia a la base de datos para la nube, sin necesidad alguna, no se recomienda realizar migración de datos.
9025=Si es necesaria la migración de datos, marque
9026=Introducción a la función
9027=Quejas
9028=Actualización de la versión
9029=(por favor indique "quejas" en el título, luego procesaremos en prioridad.)
9030=Copia realizada
9031=No hay nada aquí
9032=Obtener nueva versión
9033=Última versión
9034=Que puedo hacer por ti?
9035=Problema de función
9036=Problema de escena
9037=Soporte de aplicaciones
9038=(Preguntas frecuentes)
9039=Compartir y función
9040=Alertas
9041=Información del sistema
9042=Centro de información
9043=Tenga en cuenta que su número de cuenta ha iniciado sesión en otro lugar. Si no lo hace usted mismo, cambie la contraseña de inmediato.
9044=Cargado correctamente
9045=No se puede cargar
9046=Revisado correctamente
9047=La contraseña que ha revisado ha entrado en vigor, vuelva a iniciar sesión.
9048=Iniciar sesion con la contraseña del numero de cuenta
9049=Contraseña incorrecta para muchas veces, ¡el número de cuenta está bloqueado!
9050=Verificar la identificación facial
9051=Error al guardar la identificación facial del usuario
9052=La notificación push de registro esta disponible
9053=La notificación push de registro es anormal
9054=Verificación numerica de contraseña
9055=Verificación de gestos
9056=Año
9057=Sin función regional
9058=Guardar o no?
9059=No compartir ahora
9060=Usos-permiso
9061=Encuentra tu contraseña haciendo clic en "Olvidé mi contraseña", o inténtalo de nuevo en {0} minuto.
9062=Comprobar
9063=Todavía tienes {0} veces.
9064=Altavoz inteligente
9065=Gestión de datos
9066=Comentarios
9067=Los comentarios no pueden estar en blanco
9068=Desea desvincularse?
9069=Aviso de propiedad
10000=Contrasela no válida, vuelva a iniciar sesión
10001=Error al solicitar el servidor, inténtelo de nuevo más tarde.
10002=Mantenimiento del sistema, inténtalo de nuevo mas tarde
10003=No puede iniciar sesión, agregue la residencia al principio.
10004=El número de cuenta ya existe
10005=Envías el código de verificación con demasiada frecuencia, inténtalo de nuevo más tarde.
10006=Error de firma
10007=Sistema ocupado, intentelo de nuevo mas tarde!
10008=Contrasea no válida para iniciar sesión
10009=El usuario ha sido deshabilitado
10010=Error de contraseña original
10011=El número de subcuenta ya existe
10012=El npumero de subcuenta no existe
10013=No esta permitido agregarse como miembro
10014=La residencia actual no pertenece al este número de cuenta
10015=El nombre de la residencia ya existe
10016=La residencia no existe
10017=Error de solicitud, parámetro anormal!
10018=El número que enlazaste es duplicado
10019=Enlazar el gateway primero
10020=El gateway no existe
10021=El gateway esta fuera de línea
10022=El dispositivo está fuera de línea
10023=Error de control
10024=La escena ya existe
10025=La automatización ya existe
10026=Spk no admite esta función
10027=Spk no admite este valor funcional
10028=No tienes permiso
10029=El destino del dispositivo está duplicado
10030=No tiene permiso para el control remoto
10031=El dispositivo no debe estar en blanco
10032=El usuario no  tiene permiso
10033=El dispositivo no existe
HDL-ON_iOS/Resources/Phone/MusicIcon/order.png
HDL-ON_iOS/Resources/Phone/MusicIcon/single.png

HDL-ON_iOS/Resources/Phone/MusicIcon/single_cycle.png
HDL_ON/Common/ApiUtlis.cs
@@ -159,7 +159,8 @@
                        endTime = DateTime.Now.AddSeconds(5);
                        MainPage.Log($"读取设备信息成功");
                        var deviceList = JsonConvert.DeserializeObject<DevcieApiPack>(deviceResult.Data.ToString());
                        MainPage.Log($"sid列表获取===="+ deviceResult.Data.ToString());
                        var deviceList = Newtonsoft.Json.JsonConvert.DeserializeObject<DevcieApiPack>(deviceResult.Data.ToString());
                        if (deviceList == null)
                        {
                            deviceList = new DevcieApiPack();
@@ -171,7 +172,7 @@
                                var deviceResult2 = Ins.HttpRequest.GetDeviceList("30", Convert.ToInt32(deviceList.pageNo) + 1 + "");
                                if (deviceResult2.Code == StateCode.SUCCESS)
                                {
                                    var deviceList2 = JsonConvert.DeserializeObject<DevcieApiPack>(deviceResult.Data.ToString());
                                    var deviceList2 = Newtonsoft.Json.JsonConvert.DeserializeObject<DevcieApiPack>(deviceResult.Data.ToString());
                                    deviceList.pageNo = deviceList2.pageNo;
                                    deviceList.list.AddRange(deviceList2.list);
                                }
HDL_ON/Common/R.cs
@@ -4,10 +4,52 @@
{
    public static class StringId
    {
        /// <summary>
        /// 访客管理
        /// 获取更多
        /// </summary>
        public const int VisitorManage = 533;
        public const int GetMore = 543;
        /// <summary>
        /// 徘徊报警
        /// </summary>
        public const int WanderingAlarm = 542;
        /// <summary>
        /// 监控中
        /// </summary>
        public const int Monitoring = 541;
        /// <summary>
        /// 报警中
        /// </summary>
        public const int InAlarming = 540;
        /// <summary>
        /// 智能面板
        /// </summary>
        public const int SmartPanel = 539;
        /// <summary>
        /// 单位
        /// </summary>
        public const int Uint = 538;
        /// <summary>
        /// 湿度统计图
        /// </summary>
        public const int HumidityStatistics = 537;
        /// <summary>
        /// 温度统计图
        /// </summary>
        public const int TemperatureStatistics = 536;
        /// <summary>
        /// 露点温度
        /// </summary>
        public const int DewPointTemp = 535;
        /// <summary>
        /// 数据
        /// </summary>
        public const int Data = 534;
        /// <summary>
        /// 24小时统计图
        /// </summary>
        public const int StatisticalChart24Hour = 533;
        /// <summary>
        /// 设备离线中,暂时无法操作
        /// </summary>
@@ -1590,9 +1632,9 @@
        /// </summary>
        public const int modifyName = 5017;
        /// <summary>
        /// 单曲播放
        /// 单曲循环播放
        /// </summary>
        public const int singleMode = 5018;
        public const int singleCycleMode = 5018;
        /// <summary>
        /// 随机播放
        /// </summary>
@@ -1709,6 +1751,16 @@
        /// 你手机暂未安装"QQ音乐"{\r\n}请前往手机商场安装
        /// </summary>
        public const int qqMsuicTip = 5047;
        /// <summary>
        /// 循序循环
        /// </summary>
        public const int orderMode =5048;
        /// <summary>
        /// 单曲播放
        /// </summary>
        public const int single =5049;
        /// <summary>
        /// 正常
@@ -2707,6 +2759,22 @@
        /// 到达
        /// </summary>
        public const int daoda = 7154;
        /// <summary>
        /// 求救/正常
        /// </summary>
        public const int qiujiuandzhengchang = 7155;
        /// <summary>
        /// 求救
        /// </summary>
        public const int qiujiu = 7156;
        /// <summary>
        /// 是否开锁时
        /// </summary>
        public const int shifoukaisuoshi = 7157;
        /// <summary>
        /// 是
        /// </summary>
        public const int shi = 7158;
HDL_ON/DAL/DriverLayer/Control.cs
@@ -280,7 +280,8 @@
                        }
                        if (DB_ResidenceData.Instance.GatewayType == 0)
                        {
                            new Control_Udp().ControlBytesSend(Command.ReadGateway, 255, 255, new byte[] { (byte)new Random().Next(255), (byte)new Random().Next(255) });
                            new Control_Udp().ControlBytesSend(Command.ReadGateway, 255, 255,
                                new byte[] { (byte)new Random().Next(255), (byte)new Random().Next(255) });
                        }
                        else if (DB_ResidenceData.Instance.GatewayType == 1)
                        {
@@ -1049,9 +1050,6 @@
                                }
                            }
                        }
                        var localFunction = allLocalFuntion.Find((obj) => obj.sid == updateTemp.sid);
                        if (localFunction == null)
HDL_ON/DAL/DriverLayer/Control_Udp.cs
@@ -162,7 +162,6 @@
        /// <summary>
        /// 控制bus场景
        /// todo
        /// </summary>
        public void ControlBusScenes(Scene scene)
        {
HDL_ON/DAL/DriverLayer/Packet.cs
@@ -111,7 +111,6 @@
        /// <summary>
        /// 数据包处理
        /// ps:由commonpage转移过来,还需要转移合适的位置管理
        /// </summary>
        /// <param name="subnetID"></param>
        /// <param name="deviceID"></param>
HDL_ON/DAL/Mqtt/MqttClient.cs
@@ -357,20 +357,20 @@
                                {
                                    try
                                    {
                                        var mMes = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
                                        Newtonsoft.Json.Linq.JObject pairs = Newtonsoft.Json.Linq.JObject.Parse(mMes);
                                        var pairSid = pairs.GetValue("sid").ToString();
                                        var pairOnline = pairs.GetValue("online");
                                        if (!string.IsNullOrEmpty(pairSid.ToString()))
                                        {
                                            var function_online = FunctionList.List.Functions.Find((obj) => obj.sid == pairSid);
                                            if (function_online != null){
                                                function_online.online = (bool)pairOnline;
                                                HomePage.LoadEvent_RefreshDevcieOnline(function_online);
                                                FunctionPage.UpdataOnline(function_online);
                                                RoomPage.UpdataOnline(function_online);
                                            }
                                        }
                                        //var mMes = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
                                        //Newtonsoft.Json.Linq.JObject pairs = Newtonsoft.Json.Linq.JObject.Parse(mMes);
                                        //var pairSid = pairs.GetValue("sid").ToString();
                                        //var pairOnline = pairs.GetValue("online");
                                        //if (!string.IsNullOrEmpty(pairSid.ToString()))
                                        //{
                                        //    var function_online = FunctionList.List.Functions.Find((obj) => obj.sid == pairSid);
                                        //    if (function_online != null){
                                        //        function_online.online = (bool)pairOnline;
                                        //        HomePage.LoadEvent_RefreshDevcieOnline(function_online);
                                        //        FunctionPage.UpdataOnline(function_online);
                                        //        RoomPage.UpdataOnline(function_online);
                                        //    }
                                        //}
                                    }
                                    catch(Exception ex)
@@ -483,7 +483,8 @@
                                    {
                                        try
                                        {
                                            var securityBytes = Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload, DB_ResidenceData.Instance.HomeGateway.aesKey);
                                            var securityBytes = Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload,
                                                DB_ResidenceData.Instance.HomeGateway.aesKey);
                                            var securityString = Encoding.UTF8.GetString(securityBytes);
                                            var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<SecurityStatusObj>(securityString);
                                            MainPage.Log($"安防状态变化:{securityString}");
@@ -511,12 +512,14 @@
                                }
                                #endregion
                                //A网关设备状态-包含涂鸦设备
                                //Tag 网络状态解析
                                else if (topic == $"/user/{DB_ResidenceData.Instance.CurrentRegion.id}/app/thing/property/send")
                                {
                                    var bytes = Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload, tuyaEncryptKey);
                                    var revString = Encoding.UTF8.GetString(bytes);
                                    MainPage.Log($"mqtt 状态更新:{revString}");
                                    Control.Ins.UpdataFunctionStatus(revString, null, true);
                                    //Control.Ins.MsgInfoList.Add($"mqtt 状态更新:{revString}");
                                    //Control.Ins.MsgInfoList.Add(revString + "\r\n");
                                }
                                //一端口数据解析
@@ -529,7 +532,8 @@
                                    if (!string.IsNullOrEmpty(DB_ResidenceData.Instance.HomeGateway.aesKey))
                                    {
                                        packet.Bytes = Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload, DB_ResidenceData.Instance.HomeGateway.aesKey);
                                        packet.Bytes = Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload,
                                            DB_ResidenceData.Instance.HomeGateway.aesKey);
                                    }
                                    else
                                    {
HDL_ON/DAL/Server/NewAPI.cs
@@ -602,7 +602,7 @@
        /// <summary>
        /// 红外宝下的遥控器列表
        /// </summary>
        public const string API_POST_Ir_List = ":/home-wisdom/app/device/ir/list";
        public const string API_POST_Ir_List = "/home-wisdom/app/device/ir/list";
        /// <summary>
        /// 遥控器红外码学习
        /// </summary>
HDL_ON/Entity/Function/FloorHeating.cs
@@ -150,6 +150,26 @@
        /// </summary>
        public byte timeFlag = 0;
        public string GetWrokModeIconPath(string value, bool lighting = true)
        {
            var imagePath = "FunctionIcon/AC/HeatingIcon.png";
            switch (value)
            {
                case "heat":
                    imagePath = lighting ? "FunctionIcon/AC/HeatingIcon.png" : "FunctionIcon/AC/HeatingIconGray.png";
                    break;
                case "cool":
                    imagePath = lighting ? "FunctionIcon/AC/CoolIcon.png" : "FunctionIcon/AC/CoolIconGray.png";
                    break;
                case "economic":
                    imagePath = lighting ? "FunctionIcon/FloorHeating/EconomicIcon.png" : "FunctionIcon/FloorHeating/EconomicIconGray.png";
                    break;
            }
            return imagePath;
        }
        /// <summary>
        /// 获取模式的icon路径
        /// <param name="lightingIcon">获取的图标类型,默认是点亮</param>
HDL_ON/Entity/Function/Function.cs
@@ -88,7 +88,7 @@
        {
            var attrs = new List<string>();
            foreach(var attr in  attributes)
            foreach (var attr in attributes)
            {
                attrs.Add(attr.key);
            }
@@ -111,12 +111,34 @@
        /// <returns></returns>
        public string GetAttrState(string key)
        {
            //一级查询keyValue值
            var attrState = attributes.Find((s) => s.key == key.ToString());
            if (attrState == null || string.IsNullOrEmpty(attrState.state))
            if (attrState == null)
            {
                return "0";
            }
            if (string.IsNullOrEmpty(attrState.state))
            {
                //二级查询keyValue值
                return GetOriginalState(key);
            }
            return attrState.state;
        }
        /// <summary>
        /// 获取初始状态
        /// 默认值:0
        /// </summary>
        /// <param name="key">语雀定义的属性值</param>
        /// <returns></returns>
        public string GetOriginalState(string key)
        {
            var originalState = status.Find((s) => s.key == key.ToString());
            if (originalState == null || string.IsNullOrEmpty(originalState.value))
            {
                return "0";
            }
            return originalState.value;
        }
        /// <summary>
        /// 设置属性状态
@@ -327,6 +349,26 @@
        public List<string> roomIds = new List<string>();
        /// <summary>
        /// 存储属性配置
        /// 环境传感器的等级
        /// </summary>
        public List<AttrKeyConfig> attrKeyConfigs = new List<AttrKeyConfig>();
        public List<AttrKeyConfig> GetAttrKeyConfigs(string key)
        {
            if (attrKeyConfigs.Count == 0)
            {
                switch (key)
                {
                    case "pm2.5":
                        //
                        break;
                }
            }
            return attrKeyConfigs;
        }
        /// <summary>
        /// bus协议数据格式
        /// 使用A协议控制时,改属性为空
        /// </summary>
@@ -339,6 +381,11 @@
        /// 是否在线
        /// </summary>
        public bool online = true;
        /// <summary>
        /// 环境面板 绑定的 设备目标sid列表
        /// </summary>
        public List<string> targetSids = new List<string>();
        /// <summary>
        /// 云端数据创建的时间
        /// </summary>
@@ -381,7 +428,7 @@
                        _trait_on_off.curValue = "off";
                    }
                }
                if(_trait_on_off.curValue.ToString() != "on"&& _trait_on_off.curValue.ToString() != "off" && _trait_on_off.curValue.ToString() != "stop")
                if (_trait_on_off.curValue.ToString() != "on" && _trait_on_off.curValue.ToString() != "off" && _trait_on_off.curValue.ToString() != "stop")
                {
                    _trait_on_off.curValue = "off";
                }
@@ -448,7 +495,7 @@
                        collect = !collect;
                        IMessageCommon.Current.ShowErrorInfoAlter(result);
                    });
                }else
                } else
                {
                    Application.RunOnMainThread(() =>
                    {
@@ -473,7 +520,7 @@
                }
                else
                {
                    result = ApiUtlis.Ins.HttpRequest.UnbindDeviceToRoom(deviceId,roomId);
                    result = ApiUtlis.Ins.HttpRequest.UnbindDeviceToRoom(deviceId, roomId);
                }
                //提示错误
                if (result != StateCode.SUCCESS)
@@ -516,9 +563,9 @@
                {
                    roomNameList += ",";
                }
                roomNameList += findRoom.floorName +"-"+ findRoom.roomName;
                roomNameList += findRoom.floorName + "-" + findRoom.roomName;
            }
            if (roomNameList == "" )
            if (roomNameList == "")
            {
                roomNameList = Language.StringByID(StringId.WholeZone);
            }
@@ -631,14 +678,14 @@
                    case FunctionAttributeKey.Percent:
                    case FunctionAttributeKey.CCT:
                    case FunctionAttributeKey.RGB:
                    //case FunctionAttributeKey.FadeTime:
                        //case FunctionAttributeKey.FadeTime:
                        if (attr.curValue.ToString() == "{}")
                        {
                            if (attr.key == FunctionAttributeKey.OnOff)
                            {
                                attr.curValue = "off";
                            }
                            else if (attr.key == FunctionAttributeKey.Mode )
                            else if (attr.key == FunctionAttributeKey.Mode)
                            {
                                if (DB_ResidenceData.Instance.GatewayType == 0)
                                {
@@ -656,7 +703,7 @@
                                    }
                                }
                            }
                            else
                            else
                            {
                                attr.curValue = "0";
                            }
@@ -709,7 +756,7 @@
            return sendDataObj;
        }
        public AlinkDoorlockObj GetGatewayAlinkDoorlockData(string userId,string extStr)
        public AlinkDoorlockObj GetGatewayAlinkDoorlockData(string userId, string extStr)
        {
            var sendDataObj = new AlinkDoorlockObj();
            sendDataObj.id = Control.Ins.msg_id.ToString();
@@ -1140,7 +1187,7 @@
                try
                {
                    return Convert.ToByte(loopId, 16);
                }catch
                } catch
                {
                    return 0;
                }
@@ -1244,11 +1291,15 @@
        /// <summary>
        /// (红外空调)
        /// </summary>
        public const string AcIr= "ir.ac";
        public const string AcIr = "ir.ac";
        /// <summary>
        /// 空调
        /// </summary>
        public const string HvacAC = "hvac.ac";
        /// <summary>
        /// 毛细管空调
        /// </summary>
        public const string HvacCac = "hvac.cac";
        /// <summary>
        /// 空调spk列表
@@ -1260,6 +1311,7 @@
            spkList.Add(AcStandard);
            spkList.Add(HvacAC);
            spkList.Add(AcIr);
            spkList.Add(HvacCac);
            return spkList;
        }
        #endregion
@@ -1415,6 +1467,10 @@
        public const string SenesorMegahealth = "sensor.megahealth";
        public const string SenesorMegahealth2 = "sensor.megahealth.zg";
        /// <summary>
        /// 紧急呼叫
        /// </summary>
        public const string SensorHelp = "sensor.help";
        /// <summary>
        /// 安防传感器spk列表
        /// </summary>
        /// <returns></returns>
@@ -1437,6 +1493,19 @@
            return spkList;
        }
        #endregion
        public const string PanelEnvironment = "screen.panel";
        /// <summary>
        /// 面板spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> PanelSpkList()
        {
            var spkList = new List<string>();
            spkList.Add(SensorHelp);
            spkList.Add(PanelEnvironment);
            return spkList;
        }
        #region 环境传感器
        /// <summary>
@@ -1797,9 +1866,49 @@
    //}
public class VersionInfo
{
    public string module = "";
    public string version = "";
}
    public class VersionInfo
    {
        public string module = "";
        public string version = "";
    }
    /// <summary>
    /// 功能属性相关配置信息
    /// 环境传感器等级使用
    /// </summary>
    public class AttrKeyConfig
    {
        public string key = string.Empty;
        /// <summary>
        /// 配置类型
        /// interval 区间
        /// 目前只支持:interval
        /// </summary>
        public string type = string.Empty;
        public string unit = string.Empty;
        public List<AttrKeyInfo> configs = new List<AttrKeyInfo>();
    }
    public class AttrKeyInfo
    {
        /// <summary>
        ///
        /// </summary>
        public string start = string.Empty;
        /// <summary>
        ///
        /// </summary>
        public string end = string.Empty;
        /// <summary>
        ///
        /// </summary>
        public string color = string.Empty;
        /// <summary>
        /// 描述
        /// </summary>
        public string desc = string.Empty;
    }
}
HDL_ON/UI/UI2/2-Classification/FunctionControlZoneBLL.cs
@@ -159,32 +159,32 @@
                };
                dimmerControlBar.OnProgressChangedEvent = (sender, e) => {
                    dimmerControlBar.ProgressBarColor = CSS.CSS_Color.AuxiliaryColor1;
                    //light.brightness = e;
                    //light.trait_on_off.curValue = e > 0 ? "on" : "off";
                    function.SetAttrState(FunctionAttributeKey.Brightness, e);
                    function.trait_on_off.curValue = e > 0 ? "on" : "off";
                    //if (e == 0 || e == 100)
                    //{
                    //    //Control.Send(CommandType_A.write, light);
                    //    System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                    //    d.Add("brightness", light.brightness.ToString());
                    //    Control.Ins.SendWriteCommand(light, d);
                    //}
                    //else
                    //{
                    //    var tm = (DateTime.Now - light.refreshTime).TotalMilliseconds;
                    //    Console.WriteLine("skip time "+tm);
                    //    if (300 < tm)
                    //    {
                    //        light.refreshTime = DateTime.Now;
                    //        new System.Threading.Thread(() =>
                    //        {
                    //            System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                    //            d.Add("brightness", light.brightness.ToString());
                    //            Control.Ins.SendWriteCommand(light, d);
                    //        })
                    //        { IsBackground = true }.Start();
                    //    }
                    //}
                    if (e == 0 || e == 100)
                    {
                        //Control.Send(CommandType_A.write, light);
                        System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                        d.Add("brightness", e.ToString());
                        Control.Ins.SendWriteCommand(function, d);
                    }
                    else
                    {
                        var tm = (DateTime.Now - function.refreshTime).TotalMilliseconds;
                        Console.WriteLine("skip time " + tm);
                        if (500 < tm)
                        {
                            function.refreshTime = DateTime.Now;
                            new System.Threading.Thread(() =>
                            {
                                System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                                d.Add("brightness", e.ToString());
                                Control.Ins.SendWriteCommand(function, d);
                            })
                            { IsBackground = true }.Start();
                        }
                    }
                };
            }
HDL_ON/UI/UI2/3-Intelligence/Automation/AddInputType.cs
@@ -9,7 +9,6 @@
        {
            Tag = "Logic";
        }
        public void Show()
        {
            LogicView.TopView topView = new LogicView.TopView();
@@ -62,28 +61,30 @@
            likiadaodaView.frameLayout.Y = shiwaiView.frameLayout.Bottom;
            likiadaodaView.btnText.TextID = StringId.likiadaoda;
            likiadaodaView.btnIcon.UnSelectedImagePath = "LogicIcon/location.png";
            int count = 0;//输入类型个数
            if (MainView.IsGatewayType)
            {
                count = 4;
                viewLayout.AddChidren(likiadaodaView.FLayoutView());
            }
            int count = 3;//输入类型个数
            //2022年05月24日15:08:22 隐藏掉地理围栏
            //if (MainView.IsGatewayType)
            //{
            //    count = 4;
            //    viewLayout.AddChidren(likiadaodaView.FLayoutView());
            //}
            ////功能
            ///产品经理君焕要求,设备功能移到这里。<2022-3-7>
            new FunTpye(LogicMethod.condition_if).FunTypeView(viewLayout, likiadaodaView.frameLayout.Bottom, count);
            new FunTpye(LogicMethod.condition_if).FunTypeView(viewLayout, shiwaiView.frameLayout.Bottom, count);
            #endregion
            #region  所有点击事件
            //时间
            timeView.btnClick.MouseUpEventHandler += (sen, e) =>
      {
             {
          TimeTpye timeTpye = new TimeTpye();
          MainPage.BasePageView.AddChidren(timeTpye);
          timeTpye.Show();
          MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
      };
             };
            
            //场景点击事件
            sceneView.btnClick.MouseUpEventHandler += (sen, e) =>
HDL_ON/UI/UI2/3-Intelligence/Automation/ConditionDeviceFunList.cs
@@ -360,6 +360,7 @@
                //tvoc
                case SPK.SensorTVOC:
                    {
                        ///tvoc
                        LogicView.FunTypeView tvocView = new LogicView.FunTypeView();
                        tvocView.btnText.TextID = StringId.tvoc;
@@ -386,6 +387,23 @@
                            PmCo2TvocAction(this, device, "hcho", StringId.Formaldehyde, index, edit);
                        };
                    }
                    break;
                //门锁
                case SPK.DoorLock:
                    {
                        LogicView.FunTypeView view = new LogicView.FunTypeView();
                        view.btnText.TextID = StringId.shifoukaisuoshi;
                        fLayout.AddChidren(view.FLayoutView());
                        view.btnClick.MouseUpEventHandler += (sender, e) =>
                        {
                            DeviceView(device, view.btnState, StringId.shi, StringId.offLogic,1);
                        };
                        if (edit)
                        {
                            GetEditState(device, index, view.btnState, null, null, null);
                        }
                    }
                    break;
            }
@@ -465,12 +483,13 @@
        /// <param name="button">选中状态显示文本Btn控件</param>
        /// <param name="btnText1">属性状态值文本1</param>
        /// <param name="btnText2">属性状态值文本2</param>
        private void DeviceView(Entity.Function device, Button button, int btnText1, int btnText2)
        /// <param name="viewCount">view数量</param>
        private void DeviceView(Entity.Function device, Button button, int btnText1, int btnText2,int viewCount=2)
        {
            FrameLayout frame = new FrameLayout { BackgroundColor = CSS.CSS_Color.viewTrans60lucence };
            this.AddChidren(frame);
            LogicView.SwitchView switchView = new LogicView.SwitchView();
            switchView.FLayoutView(frame, btnText1, btnText2, button.Text, (intValue) =>
            switchView.FLayoutView(frame, btnText1, btnText2, button.Text, viewCount,(intValue) =>
            {
                //设备属性值,云雀上定义好的;
                string keyVlaue = "on_off";
@@ -522,6 +541,11 @@
                            }
                        }
                        break;
                    case SPK.DoorLock:
                        {
                            keyVlaue = "door_status";
                        }
                        break;
                }
                switch (intValue)
@@ -565,6 +589,7 @@
                            }
                        }
                        break;
                    case StringId.shi:
                    case StringId.kaiqi:
                        {
                            value = "open";
@@ -589,6 +614,8 @@
                        {
                            value = "fall";
                        }; break;
                }
                //显示文本
                button.TextID = intValue;
@@ -665,7 +692,7 @@
        /// <param name="stateValue">编辑之前的状态值,默认为""</param>
        public void PmCo2TvocAction(FrameLayout frame, Entity.Function device, string key, int title, int index, bool edit, string stateValue = "")
        {
            if (edit)
            if (edit)
            {
                ///
                this.function = device;
@@ -679,12 +706,14 @@
                }
            }
            PublicInterface view = new PublicInterface();
            var listStr = view.GetViewList(key);
            view.SingleSelectionShow(frame, listStr, Language.StringByID(title), view.GetString(key, stateValue)
            //var listStr = view.GetViewList(key);
            var listStr = view.GetSensorLevelList(device);//2022年05月25日10:01:33 产品经理君煌要求改成动态
            view.SingleSelectionShow(frame, listStr, Language.StringByID(title), view.GetSensorLevelText(device, stateValue,true)
               , (text) =>
               {
                  
                   var value = view.GetValue(key, text);
                   //var value = view.GetValue(key, text);
                   var values = view.GetSensorLevelText(device,text,false);
                   selectedState = device.spk + "_" + key;
                   switch (device.spk)
                   {
@@ -702,7 +731,7 @@
                           }
                           break;
                   }
                   AddDictionary(key, value, "integer", "in");
                   AddDictionary(key, values, "integer", "in");
                   Save(device, index, edit);
               });
        }
HDL_ON/UI/UI2/3-Intelligence/Automation/FunTpye.cs
@@ -9,13 +9,13 @@
    {
        public FunTpye(string str)
        {
            if_type = str;
            if_Type = str;
        }
        /// <summary>
        /// 表示是(条件/目标)
        /// </summary>
        private string if_type;
        private string if_Type;
        Loading loading = new Loading();
        /// <summary>
        /// 设备功能ui
        /// </summary>
@@ -23,6 +23,7 @@
        /// <param name="bottm"></param>
        /// <param name="funCount">支持功能类型个数<表示上面所占高度></param>
        public void FunTypeView(FrameLayout viewLayout,int bottm,int funCount) {
            viewLayout.AddChidren(loading);
            LogicView.FunAllAreaView funAllAreaView = new LogicView.FunAllAreaView();
            funAllAreaView.frameLayout.Y = bottm + Application.GetRealHeight(8);
            viewLayout.AddChidren(funAllAreaView.FLayoutView());
@@ -120,9 +121,9 @@
                        ///切换房间默认:全部功能
                        UserInfo.Current.logicselectedFunction = Language.StringByID(StringId.allFun);
                        ///获取显示设备列表
                        var list = LogicMethod.CurrLogicMethod.GetFunctionDeviceList(areaView.btnClick.Tag as Entity.Room, if_type);
                        var list = LogicMethod.CurrLogicMethod.GetFunctionDeviceList(areaView.btnClick.Tag as Entity.Room, if_Type);
                        DeviceListView(vv, list);
                        this.LoadingDeviceListView(vv, list);
                    };
                    if (roomList.Count - 1 == i)
                    {
@@ -138,7 +139,7 @@
            {
                //获取最终显示列表
                var functionList = LogicMethod.CurrLogicMethod.GetFunctionDeviceList(UserInfo.Current.logicselectedRoom, if_type);
                var functionList = LogicMethod.CurrLogicMethod.GetFunctionDeviceList(UserInfo.Current.logicselectedRoom, if_Type);
                //获取设备列表的类型(例如:灯光类,窗帘类。。。)
                var deviceTypeList = LogicMethod.CurrLogicMethod.GetDeviceTypeList(functionList);
                if (deviceTypeList.Count == 0)
@@ -218,13 +219,14 @@
                    areaView.btnClick.MouseUpEventHandler += (sender, e2) =>
                    {
                        fLayout.RemoveFromParent();
                        funAllAreaView.btnText2.Text = areaView.btnClick.Tag.ToString();
                        UserInfo.Current.logicselectedFunction = areaView.btnClick.Tag.ToString();
                        ///获取单个类型(例如:灯光类。。)设备FunctionType列表<简称:spk列表>
                        var typeFunctionList2 = LogicMethod.CurrLogicMethod.GetDeviceTypeFunctionList(UserInfo.Current.logicselectedFunction);
                        ///获取单个灯光类型(例如:灯光1,灯光2。。)设备列表
                        string clickText = areaView.btnClick.Tag.ToString();
                        funAllAreaView.btnText2.Text = clickText;
                        UserInfo.Current.logicselectedFunction = clickText;
                        ///获取设备单个大类spk列表(例如:灯光类,空调类...)
                        var typeFunctionList2 = LogicMethod.CurrLogicMethod.GetDeviceTypeFunctionList(clickText);
                        ///获取设备单个小类列表(例如:灯光1,灯光2...)
                        var lists2 = LogicMethod.CurrLogicMethod.GetShowDeviceList(typeFunctionList2, functionList);
                        DeviceListView(vv, lists2);
                       this.LoadingDeviceListView(vv, lists2);
                    };
                    if (deviceTypeList.Count - 1 == i)
@@ -237,58 +239,67 @@
            funAllAreaView.btnText2.MouseUpEventHandler += funClick;
            funAllAreaView.btnIcon2.MouseUpEventHandler += funClick;
            ///获取房间支持的设备列表
            var deviceList = LogicMethod.CurrLogicMethod.GetFunctionDeviceList(UserInfo.Current.logicselectedRoom, if_type);
            ///获取单个类型(例如:灯光类。。)设备FunctionType列表<简称:spk列表>
            var deviceList = LogicMethod.CurrLogicMethod.GetFunctionDeviceList(UserInfo.Current.logicselectedRoom, if_Type);
            ///获取设备单个大类spk列表(例如:灯光类,空调类...)
            var typeFunctionList = LogicMethod.CurrLogicMethod.GetDeviceTypeFunctionList(UserInfo.Current.logicselectedFunction);
            ///获取单个灯光类型(例如:灯光1,灯光2。。)设备列表
            ///获取设备单个小类列表(例如:灯光1,灯光2...)
            var lists = LogicMethod.CurrLogicMethod.GetShowDeviceList(typeFunctionList, deviceList);
            ///房间名称
            funAllAreaView.btnText1.Text = UserInfo.Current.logicselectedRoom.roomName;
            ///功能类型名称<灯光类。。。。。>
            ///设备大类名称<灯光类。。。。。>
            funAllAreaView.btnText2.Text = UserInfo.Current.logicselectedFunction;
            DeviceListView(vv, lists);
            this.LoadingDeviceListView(vv, lists);
        }
        /// <summary>
        /// 显示设备的View
        /// </summary>
        /// <param name="verticalScrolView">上下滑动</param>
        /// <param name="deviceList"></param>
        public void DeviceListView(VerticalScrolViewLayout verticalScrolView, List<HDL_ON.Entity.Function> deviceList)
        private void LoadingDeviceListView(VerticalScrolViewLayout verticalScrolView, List<HDL_ON.Entity.Function> deviceList)
        {
            verticalScrolView.RemoveAll();
            foreach (var dev in deviceList)
            loading.Start();
            System.Threading.Tasks.Task.Run(() =>
            {
                LogicView.SelectTypeView funView = new LogicView.SelectTypeView();
                funView.btnText.Visible = false;
                funView.btnDeviceName.Visible = true;
                funView.btnRoomName.Visible = true;
                funView.btnLine.X = Application.GetRealWidth(16);
                funView.btnLine.Width = Application.GetRealWidth(343);
                verticalScrolView.AddChidren(funView.FLayoutView());
                funView.btnIcon.UnSelectedImagePath = LogicMethod.CurrLogicMethod.GetIconPath(dev.spk);
                funView.btnDeviceName.Text = dev.name;
                funView.btnRoomName.Text = dev.GetRoomListName();
                funView.btnClick.MouseUpEventHandler += (sen, e) => {
                    if (if_type == LogicMethod.condition_if)
                Application.RunOnMainThread(() =>
                {
                    loading.Hide();
                    verticalScrolView.RemoveAll();
                    foreach (var dev in deviceList)
                    {
                        ConditionDeviceFunList conditionDeviceFunList = new ConditionDeviceFunList();
                        MainPage.BasePageView.AddChidren(conditionDeviceFunList);
                        conditionDeviceFunList.Show(dev, 0, false);
                        MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                    }
                    else
                    {
                        TargetDeviceFunList targetDeviceFunList = new TargetDeviceFunList();
                        MainPage.BasePageView.AddChidren(targetDeviceFunList);
                        targetDeviceFunList.Show(dev, 0, false);
                        MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                    }
                        LogicView.SelectTypeView funView = new LogicView.SelectTypeView();
                        funView.btnText.Visible = false;
                        funView.btnDeviceName.Visible = true;
                        funView.btnRoomName.Visible = true;
                        funView.btnLine.X = Application.GetRealWidth(16);
                        funView.btnLine.Width = Application.GetRealWidth(343);
                        verticalScrolView.AddChidren(funView.FLayoutView());
                        funView.btnIcon.UnSelectedImagePath = LogicMethod.CurrLogicMethod.GetIconPath(dev.spk);
                        funView.btnDeviceName.Text = dev.name;
                        funView.btnRoomName.Text = dev.GetRoomListName();
                        funView.btnClick.MouseUpEventHandler += (sen, e) =>
                        {
                            if (if_Type == LogicMethod.condition_if)
                            {
                                ConditionDeviceFunList conditionDeviceFunList = new ConditionDeviceFunList();
                                MainPage.BasePageView.AddChidren(conditionDeviceFunList);
                                conditionDeviceFunList.Show(dev, 0, false);
                                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                            }
                            else
                            {
                                TargetDeviceFunList targetDeviceFunList = new TargetDeviceFunList();
                                MainPage.BasePageView.AddChidren(targetDeviceFunList);
                                targetDeviceFunList.Show(dev, 0, false);
                                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                            }
                };
            }
                        };
                    }
                });
            });
        }
    }
HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs
@@ -403,31 +403,31 @@
                                    }
                                    break;
                                case SPK.SensorCO2:
                                    {
                                        string str = new InpOrOutLogicMethod { }.GetText(dicList, "co2");
                                        inputView.btnState.Text = str;
                                    }
                                    break;
                                case SPK.SensorPm25:
                                    {
                                        string str = new InpOrOutLogicMethod { }.GetText(dicList, "pm25");
                                        inputView.btnState.Text = str;
                                    }
                                    break;
                                case SPK.SensorTVOC:
                                    {
                                        string str = new InpOrOutLogicMethod { }.GetText(dicList, "tvoc");
                                        inputView.btnState.Text = str;
                                    }
                                    break;
                                case SPK.SensorHcho:
                                    {
                                        string str = new InpOrOutLogicMethod { }.GetText(dicList, "hcho");
                                        string strvalue = "";
                                        foreach (var dic in dicList)
                                        {
                                            strvalue = dic["value"];
                                            break;
                                        }
                                        string str = new PublicInterface().GetSensorLevelText(device, strvalue, true);
                                        inputView.btnState.Text = str;
                                    }
                                    break;
                                case SPK.DoorLock:
                                    {
                                        foreach (var dic in dicList)
                                        {
                                            string value = dic["value"];
                                            if (value == "open")
                                            {
                                                inputView.btnState.Text = Language.StringByID(StringId.kaiqi);
                                            }
                                        }
                                    }
                                    break;
                            }
@@ -1886,6 +1886,19 @@
                        }
                    }
                    break;
                case SPK.DoorLock:
                    {
                        foreach (var dic in dicList)
                        {
                            string value = dic["value"];
                            if (value == "open")
                            {
                                button1.Text = Language.StringByID(StringId.shi);
                            }
                        }
                    }
                    break;
            }
        }
        /// <summary>
HDL_ON/UI/UI2/3-Intelligence/Automation/LogicMethod.cs
@@ -6,494 +6,510 @@
namespace HDL_ON.UI.UI2.Intelligence.Automation
{
  public class LogicMethod
  {
    /// <summary>
    /// 定义一个静态对象
    /// </summary>
    private static LogicMethod logicMethod = null;
    /// <summary>
    /// 获取静态对象
    /// </summary>
    public static LogicMethod CurrLogicMethod
    public class LogicMethod
    {
      get
      {
        if (logicMethod == null)
        /// <summary>
        /// 定义一个静态对象
        /// </summary>
        private static LogicMethod logicMethod = null;
        /// <summary>
        /// 获取静态对象
        /// </summary>
        public static LogicMethod CurrLogicMethod
        {
          return new LogicMethod();
            get
            {
                if (logicMethod == null)
                {
                    return new LogicMethod();
                }
                return logicMethod;
            }
        }
        return logicMethod;
      }
    }
        /// <summary>
        /// 表示是条件
        /// </summary>
        public const string condition_if = "条件";
        /// <summary>
        /// 表示是目标
        /// </summary>
        public const string target_if = "目标";
        /// <summary>
        /// 移除所有"Logic"界面
        /// </summary>
        public void RemoveAllView()
        {
            MainPage.BasePageView.RemoveViewByTag("Logic");
        }
    /// <summary>
    /// 表示是条件
    /// </summary>
    public const string condition_if = "条件";
    /// <summary>
    /// 表示是目标
    /// </summary>
    public const string target_if = "目标";
    /// <summary>
    /// 移除所有"Logic"界面
    /// </summary>
    public void RemoveAllView()
    {
      MainPage.BasePageView.RemoveViewByTag("Logic");
    }
        /// <summary> Converts an array of bytes into a formatted string of hex digits (ex: E4 CA B2)</summary>
        /// <param name="data"> The array of bytes to be translated into a string of hex digits. </param>
        /// <returns> Returns a well formatted string of hex digits with spacing. </returns>
        public string byteArrayToHexString(byte[] data)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            foreach (byte b in data)
            {
                sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
            }
    /// <summary> Converts an array of bytes into a formatted string of hex digits (ex: E4 CA B2)</summary>
    /// <param name="data"> The array of bytes to be translated into a string of hex digits. </param>
    /// <returns> Returns a well formatted string of hex digits with spacing. </returns>
    public string byteArrayToHexString(byte[] data)
    {
      System.Text.StringBuilder sb = new System.Text.StringBuilder();
      foreach (byte b in data)
      {
        sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
      }
            return sb.ToString().ToUpper();
        }
      return sb.ToString().ToUpper();
    }
    /**
* int转byte[]
* 该方法将一个int类型的数据转换为byte[]形式,因为int为32bit,而byte为8bit所以在进行类型转换时,知会获取低8位,
* 丢弃高24位。通过位移的方式,将32bit的数据转换成4个8bit的数据。注意 &0xff,在这当中,&0xff简单理解为一把剪刀,
* 将想要获取的8位数据截取出来。
* @param i 一个int数字
* @return byte[]
        /**
    * int转byte[]
    * 该方法将一个int类型的数据转换为byte[]形式,因为int为32bit,而byte为8bit所以在进行类型转换时,知会获取低8位,
    * 丢弃高24位。通过位移的方式,将32bit的数据转换成4个8bit的数据。注意 &0xff,在这当中,&0xff简单理解为一把剪刀,
    * 将想要获取的8位数据截取出来。
    * @param i 一个int数字
    * @return byte[]
*/
    public byte[] int2ByteArray(int i)
    {
      byte[] result = new byte[4];
      result[0] = (byte)((i >> 24) & 0xFF);
      result[1] = (byte)((i >> 16) & 0xFF);
      result[2] = (byte)((i >> 8) & 0xFF);
      result[3] = (byte)(i & 0xFF);
      return result;
    }
    /// <summary>
    /// 获取时间戳
    /// </summary>
    /// <returns></returns>
    public int getTimeStamp()
    {
      TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
      return (int)ts.TotalSeconds;
    }
    /// <summary>
    /// 生成逻辑sid方法
    /// </summary>
    public string NewSid()
    {
      string logicId = "";
      try
      {
        string sOidBeginsWith = "000101";//厂商 + 通讯方式
        DateTime dt = DateTime.Now;
        DateTime startTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(2020, 1, 1));
        long m = (long)((dt - startTime).TotalMilliseconds / 10);
        string sTimeSpan = byteArrayToHexString(int2ByteArray(getTimeStamp()));
        logicId = sOidBeginsWith + sTimeSpan;
        logicId += "15";
        logicId += "1501";
        //1501 物模型为逻辑, 0001 表示 1 号逻辑功能
        int maxId = 1;
        for (int i = 0; i < Logic.LogicList.Count; i++)
        public byte[] int2ByteArray(int i)
        {
          string s = Logic.LogicList[i].sid.Substring(20, 4);
          int iThisSceneId = Convert.ToInt16(s, 16);
          if (iThisSceneId > maxId)
            maxId = iThisSceneId;
            byte[] result = new byte[4];
            result[0] = (byte)((i >> 24) & 0xFF);
            result[1] = (byte)((i >> 16) & 0xFF);
            result[2] = (byte)((i >> 8) & 0xFF);
            result[3] = (byte)(i & 0xFF);
            return result;
        }
        /// <summary>
        /// 获取时间戳
        /// </summary>
        /// <returns></returns>
        public int getTimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return (int)ts.TotalSeconds;
        }
        /// <summary>
        /// 生成逻辑sid方法
        /// </summary>
        public string NewSid()
        {
            string logicId = "";
            try
            {
                string sOidBeginsWith = "000101";//厂商 + 通讯方式
                DateTime dt = DateTime.Now;
                DateTime startTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(2020, 1, 1));
                long m = (long)((dt - startTime).TotalMilliseconds / 10);
                string sTimeSpan = byteArrayToHexString(int2ByteArray(getTimeStamp()));
                logicId = sOidBeginsWith + sTimeSpan;
                logicId += "15";
                logicId += "1501";
                //1501 物模型为逻辑, 0001 表示 1 号逻辑功能
                int maxId = 1;
                for (int i = 0; i < Logic.LogicList.Count; i++)
                {
                    string s = Logic.LogicList[i].sid.Substring(20, 4);
                    int iThisSceneId = Convert.ToInt16(s, 16);
                    if (iThisSceneId > maxId)
                        maxId = iThisSceneId;
                }
                logicId += (maxId + 1).ToString("X4");//逻辑号 两个byte
                logicId += "0000";
            }
            catch
            {
                return logicId;
            }
            return logicId;
        }
        /// <summary>
        /// 封装Dictionary对象
        /// </summary>
        /// <param name="dic">Dictionary类</param>
        /// <param name="key">健</param>
        /// <param name="value">值</param>
        public void dictionary(Dictionary<string, string> dic, string key, string value)
        {
            if (dic.ContainsKey(key)) //判断是否存在键值
            {
                //键存在移除
                dic.Remove(key);
            }
            //添加键值
            dic.Add(key, value);
        }
        /// <summary>
        /// 获取网关房间列表
        /// </summary>
        /// <returns></returns>
        public List<HDL_ON.Entity.Room> GetGatewayRoomList()
        {
            return HDL_ON.Entity.SpatialInfo.CurrentSpatial.RoomList;
        }
        /// <summary>
        /// 获取网关房间列表
        /// </summary>
        /// <returns></returns>
        public List<HDL_ON.Entity.Room> GetGatewayRoomList(string name)
        {
            List<Entity.Room> roomList = new List<Entity.Room>();
            Entity.Room room1 = new Entity.Room();
            room1.roomName = name;//自定义默认一个房间名为:6688
            room1.roomId = "6688";//自定义默认id用识别该房间
            roomList.Add(room1);//默认添加到房间列表里
            var roomLists = GetGatewayRoomList();
            for (int i = 0; i < roomLists.Count; i++)
            {
                var room = roomLists[i];
                var devlist = GetRoomDevice(room);
                if (devlist.Count == 0)
                {
                    //过滤掉没有设备的房间;
                    continue;
                }
                roomList.Add(room);
            }
            return roomList;
        }
        /// <summary>
        /// 获取网关设备列表
        /// </summary>
        /// <returns></returns>
        public List<HDL_ON.Entity.Function> GetGatewayDeviceList()
        {
            return Entity.FunctionList.List.GetDeviceFunctionList();
        }
        /// <summary>
        /// 获取场景列表
        /// </summary>
        /// <returns></returns>
        public List<HDL_ON.Entity.Scene> GetSceneList()
        {
            return HDL_ON.Entity.FunctionList.List.scenes;
        }
        logicId += (maxId + 1).ToString("X4");//逻辑号 两个byte
        logicId += "0000";
      }
      catch
      {
        return logicId;
      }
      return logicId;
    }
    /// <summary>
    /// 封装Dictionary对象
    /// </summary>
    /// <param name="dic">Dictionary类</param>
    /// <param name="key">健</param>
    /// <param name="value">值</param>
    public void dictionary(Dictionary<string, string> dic, string key, string value)
    {
      if (dic.ContainsKey(key)) //判断是否存在键值
      {
        //键存在移除
        dic.Remove(key);
      }
      //添加键值
      dic.Add(key, value);
    }
    /// <summary>
    /// 获取网关房间列表
    /// </summary>
    /// <returns></returns>
    public List<HDL_ON.Entity.Room> GetGatewayRoomList()
    {
      return HDL_ON.Entity.SpatialInfo.CurrentSpatial.RoomList;
    }
    /// <summary>
    /// 获取网关房间列表
    /// </summary>
    /// <returns></returns>
    public List<HDL_ON.Entity.Room> GetGatewayRoomList(string name)
    {
      List<Entity.Room> roomList = new List<Entity.Room>();
      Entity.Room room1 = new Entity.Room();
      room1.roomName = name;//自定义默认一个房间名为:6688
      room1.roomId = "6688";//自定义默认id用识别该房间
      roomList.Add(room1);//默认添加到房间列表里
      var roomLists = GetGatewayRoomList();
      for (int i = 0; i < roomLists.Count; i++)
      {
        var room = roomLists[i];
        var devlist = GetRoomDevice(room);
        if (devlist.Count == 0)
        /// <summary>
        /// 获取安防列表
        /// </summary>
        /// <returns></returns>
        public List<HDL_ON.Entity.SecurityAlarm> GetSecurityList()
        {
          //过滤掉没有设备的房间;
          continue;
            return FunctionList.List.securities;
        }
        roomList.Add(room);
      }
      return roomList;
    }
    /// <summary>
    /// 获取网关设备列表
    /// </summary>
    /// <returns></returns>
    public List<HDL_ON.Entity.Function> GetGatewayDeviceList()
    {
      return Entity.FunctionList.List.GetDeviceFunctionList();
    }
    /// <summary>
    /// 获取场景列表
    /// </summary>
    /// <returns></returns>
    public List<HDL_ON.Entity.Scene> GetSceneList()
    {
      return HDL_ON.Entity.FunctionList.List.scenes;
    }
    /// <summary>
    /// 获取安防列表
    /// </summary>
    /// <returns></returns>
    public List<HDL_ON.Entity.SecurityAlarm> GetSecurityList()
    {
      return FunctionList.List.securities;
    }
    /// <summary>
    /// 获取房间的设备列表
    /// </summary>
    /// <param name="room">当前房间</param>
    /// <returns></returns>
    public List<HDL_ON.Entity.Function> GetRoomDevice(HDL_ON.Entity.Room room)
    {
      List<HDL_ON.Entity.Function> deviceLists = new List<Entity.Function>();
      List<HDL_ON.Entity.Function> lists = GetGatewayDeviceList();
      if (room.roomId == "6688")
      {
        //默认一个房间名:6688
        //显示网关全部设备
        deviceLists = lists;
      }
      else
      {
        for (int i = 0; i < lists.Count; i++)
        /// <summary>
        /// 获取房间的设备列表
        /// </summary>
        /// <param name="room">当前房间</param>
        /// <returns></returns>
        public List<HDL_ON.Entity.Function> GetRoomDevice(HDL_ON.Entity.Room room)
        {
          var dev = lists[i];
          if (dev.roomIds.Find((id) => id == room.roomId) != null)
          {
            //添加属于这个房间的设备;
            deviceLists.Add(dev);
          }
            List<HDL_ON.Entity.Function> deviceLists = new List<Entity.Function>();
            List<HDL_ON.Entity.Function> lists = GetGatewayDeviceList();
            if (room.roomId == "6688")
            {
                //默认一个房间名:6688
                //显示网关全部设备
                deviceLists = lists;
            }
            else
            {
                for (int i = 0; i < lists.Count; i++)
                {
                    var dev = lists[i];
                    if (dev.roomIds.Find((id) => id == room.roomId) != null)
                    {
                        //添加属于这个房间的设备;
                        deviceLists.Add(dev);
                    }
                }
            }
            return deviceLists;
        }
        /// <summary>
        /// 获取设备(功能)对象
        /// </summary>
        /// <param name="sid">设备唯一标识</param>
        /// <returns></returns>
        public HDL_ON.Entity.Function GetDevice(string sid)
        {
            HDL_ON.Entity.Function device = new Entity.Function() { name = "Unknown" };
            List<HDL_ON.Entity.Function> deviceLists = GetGatewayDeviceList();
            for (int i = 0; i < deviceLists.Count; i++)
            {
                var dev = deviceLists[i];
                if (dev.sid == sid)
                {
                    device = dev;
                    break;
                }
            }
            return device;
        }
        /// <summary>
        /// 获取场景对象
        /// </summary>
        /// <param name="sid">场景唯一标识</param>
        /// <returns></returns>
        public HDL_ON.Entity.Scene GetSecne(string sid)
        {
            HDL_ON.Entity.Scene scene = new Entity.Scene() { name = "Unknown" };
            List<HDL_ON.Entity.Scene> sceneLists = GetSceneList();
            for (int i = 0; i < sceneLists.Count; i++)
            {
                var sce = sceneLists[i];
                if (sce.sid == sid)
                {
                    scene = sce;
                    break;
                }
            }
            return scene;
        }
        /// <summary>
        /// 获取安防对象
        /// </summary>
        /// <param name="sid">安防唯一标识</param>
        /// <returns></returns>
        public HDL_ON.Entity.SecurityAlarm GetSecurity(string sid)
        {
            HDL_ON.Entity.SecurityAlarm security = new Entity.SecurityAlarm() { name = "Unknown" };
            List<HDL_ON.Entity.SecurityAlarm> SecurityLists = GetSecurityList();
            for (int i = 0; i < SecurityLists.Count; i++)
            {
                var sce = SecurityLists[i];
                if (sce.sid == sid)
                {
                    security = sce;
                    break;
                }
            }
            return security;
        }
        /// <summary>
        /// 获取房间名(即是=区域名称)
        /// </summary>
        /// <param name="device">设备</param>
        /// <returns></returns>
        public string GetGetRoomName(HDL_ON.Entity.Function device)
        {
            string roomName = "";
            List<HDL_ON.Entity.Room> roomLists = GetGatewayRoomList();
            for (int i = 0; i < device.roomIds.Count; i++)
            {
                var dev = device.roomIds[i];
                var room = roomLists.Find((c) => c.roomId == dev);
                if (room != null)
                {
                    roomName += room.floorName + "." + room.roomName + ",";
                }
            }
            return roomName.TrimEnd(',');
        }
        #region   动一改四
        /// <summary>
        /// 获取设备类型图标
        /// </summary>
        /// <param name="functionType">设备类型</param>
        /// <returns></returns>
        public string GetIconPath(string functionType)
        {
            string strPath = "";
            switch (functionType)
            {
                case SPK.AirSwitch:
                    {
                        strPath = "FunctionIcon/Icon/electricalbreaker.png";
                    }
                    break;
                case SPK.PanelSocket:
                case SPK.ElectricSocket:
                    {
                        strPath = "FunctionIcon/Icon/electricalsocket.png";
                    }
                    break;
                case SPK.LightSwitch:
                case SPK.LightRGB:
                case SPK.LightRGBW:
                case SPK.LightCCT:
                case SPK.LightDimming:
                    {
                        strPath = "LogicIcon/lightloguc.png";
                    }
                    break;
                case SPK.CurtainSwitch:
                case SPK.CurtainRoller:
                case SPK.CurtainTrietex:
                    {
                        strPath = "LogicIcon/curtainlogic.png";
                    }
                    break;
                case SPK.AcStandard:
                case SPK.HvacAC:
                    {
                        strPath = "LogicIcon/airconditionerlogic.png";
                    }
                    break;
                case SPK.HvacCac:
                    strPath = "FunctionIcon/Icon/hvaccac.png";
                    break;
                case SPK.FloorHeatStandard:
                case SPK.HvacFloorHeat:
                    {
                        strPath = "LogicIcon/heatlogic.png";
                    }
                    break;
                case SPK.AirFreshStandard:
                case SPK.HvacAirFresh:
                    {
                        strPath = "LogicIcon/heatlogic.png";
                    }
                    break;
                case SPK.SensorSmoke:
                case SPK.SensorWater:
                case SPK.SensorGas:
                case SPK.SensorDryContact:
                case SPK.SensorDryContact2:
                case SPK.SensorShanLan:
                case SPK.SensorDuiShe:
                case SPK.SensorPir:
                case SPK.SensorDoorWindow:
                case SPK.SensorUtrasonic:
                case SPK.SenesorMegahealth:
                case SPK.SenesorMegahealth2:
                case SPK.SensorEnvironment:
                case SPK.SensorEnvironment2:
                case SPK.SensorEnvironment3:
                case SPK.SensorTemperature:
                case SPK.SensorHumidity:
                case SPK.SensorCO2:
                case SPK.SensorPm25:
                case SPK.SensorTVOC:
                case SPK.SensorHcho:
                case SPK.SensorHelp:
                    {
                        strPath = "LogicIcon/sensor.png";
                    }
                    break;
                case SPK.DoorLock:
                    {
                        strPath = "FunctionIcon/DoorLock/DoorLock.png";
                    }
                    break;
            }
            return strPath;
        }
        /// <summary>
        /// 设备类型的列表(灯光类,窗帘类。。。)
        /// </summary>
        /// <param name="deviceList">设备列表</param>
        /// <returns></returns>
        public List<string> GetDeviceTypeList(List<HDL_ON.Entity.Function> deviceList)
        {
            List<string> deviceStrTypeList = new List<string>();
            deviceStrTypeList.Clear();
            ///灯光类
            var lightjosn = deviceList.Find((device) =>
            device.spk == SPK.LightSwitch
            || device.spk == SPK.LightDimming
            || device.spk == SPK.LightCCT
            || device.spk == SPK.LightRGB
            || device.spk == SPK.LightRGBW
            );
            if (lightjosn != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.Lights));
            }
            ///窗帘类
            var curtainjosn = deviceList.Find((device) =>
            device.spk == SPK.CurtainSwitch
            || device.spk == SPK.CurtainTrietex
            || device.spk == SPK.CurtainRoller);
            if (curtainjosn != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.Curtain));
            }
            ///空调类
            var ac = deviceList.Find((device) => device.spk == SPK.AcStandard || device.spk == SPK.HvacAC);
            if (ac != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.AC));
            }
            ///地暖类
            var floorHeating = deviceList.Find((device) => device.spk == SPK.FloorHeatStandard || device.spk == SPK.HvacFloorHeat);
            if (floorHeating != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.FloorHeating));
            }
            ///新风类
            var airFresh = deviceList.Find((device) => device.spk == SPK.AirFreshStandard || device.spk == SPK.HvacAirFresh);
            if (airFresh != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.AirFresh));
            }
            ///传感器类
            var sensor = deviceList.Find((device) =>
            device.spk == SPK.SensorWater
            || device.spk == SPK.SensorGas
            || device.spk == SPK.SensorSmoke
            || device.spk == SPK.SensorDryContact || device.spk == SPK.SensorDryContact2
            || device.spk == SPK.SensorShanLan
            || device.spk == SPK.SensorDuiShe
            || device.spk == SPK.SensorPir
            || device.spk == SPK.SensorDoorWindow
            || device.spk == SPK.SensorUtrasonic
            || device.spk == SPK.SenesorMegahealth
            || device.spk == SPK.SenesorMegahealth2
            || device.spk == SPK.SensorEnvironment
             || device.spk == SPK.SensorEnvironment2
              || device.spk == SPK.SensorEnvironment3
                || device.spk == SPK.SensorTemperature
                  || device.spk == SPK.SensorHumidity
                    || device.spk == SPK.SensorCO2
                      || device.spk == SPK.SensorPm25
                        || device.spk == SPK.SensorTVOC
                          || device.spk == SPK.SensorHcho
                          || device.spk == SPK.SensorHelp
            );
            if (sensor != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.Sensor));
            }
            ///家电类
            var electric = deviceList.Find((device) =>
            device.spk == SPK.AirSwitch
            || device.spk == SPK.PanelSocket
            || device.spk == SPK.ElectricSocket
            );
            if (electric != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.Electric));
            }
            ///门锁类
            var doorlock = deviceList.Find((device) => device.spk == SPK.DoorLock);
            if (doorlock != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.DoorLock));
            }
            return deviceStrTypeList;
        }
      }
      return deviceLists;
    }
    /// <summary>
    /// 获取设备(功能)对象
    /// </summary>
    /// <param name="sid">设备唯一标识</param>
    /// <returns></returns>
    public HDL_ON.Entity.Function GetDevice(string sid)
    {
      HDL_ON.Entity.Function device = new Entity.Function() { name = "Unknown" };
      List<HDL_ON.Entity.Function> deviceLists = GetGatewayDeviceList();
      for (int i = 0; i < deviceLists.Count; i++)
      {
        var dev = deviceLists[i];
        if (dev.sid == sid)
        /// <summary>
        /// 设备类型FunctionType列表
        /// </summary>
        /// <param name="deviceType">设备类型(灯光类,窗帘类。)</param>
        /// <returns></returns>
        public List<string> GetDeviceTypeFunctionList(string deviceType)
        {
          device = dev;
          break;
        }
      }
      return device;
    }
    /// <summary>
    /// 获取场景对象
    /// </summary>
    /// <param name="sid">场景唯一标识</param>
    /// <returns></returns>
    public HDL_ON.Entity.Scene GetSecne(string sid)
    {
      HDL_ON.Entity.Scene scene = new Entity.Scene() { name = "Unknown" };
      List<HDL_ON.Entity.Scene> sceneLists = GetSceneList();
      for (int i = 0; i < sceneLists.Count; i++)
      {
        var sce = sceneLists[i];
        if (sce.sid == sid)
        {
          scene = sce;
          break;
        }
      }
      return scene;
    }
    /// <summary>
    /// 获取安防对象
    /// </summary>
    /// <param name="sid">安防唯一标识</param>
    /// <returns></returns>
    public HDL_ON.Entity.SecurityAlarm GetSecurity(string sid)
    {
      HDL_ON.Entity.SecurityAlarm security = new Entity.SecurityAlarm() { name = "Unknown" };
      List<HDL_ON.Entity.SecurityAlarm> SecurityLists = GetSecurityList();
      for (int i = 0; i < SecurityLists.Count; i++)
      {
        var sce = SecurityLists[i];
        if (sce.sid == sid)
        {
          security = sce;
          break;
        }
      }
      return security;
    }
    /// <summary>
    /// 获取房间名(即是=区域名称)
    /// </summary>
    /// <param name="device">设备</param>
    /// <returns></returns>
    public string GetGetRoomName(HDL_ON.Entity.Function device)
    {
      string roomName = "";
      List<HDL_ON.Entity.Room> roomLists = GetGatewayRoomList();
      for (int i = 0; i < device.roomIds.Count; i++)
      {
        var dev = device.roomIds[i];
        var room = roomLists.Find((c) => c.roomId == dev);
        if (room != null)
        {
          roomName += room.floorName + "." + room.roomName + ",";
        }
      }
      return roomName.TrimEnd(',');
    }
    #region   动一改四
    /// <summary>
    /// 获取设备类型图标
    /// </summary>
    /// <param name="functionType">设备类型</param>
    /// <returns></returns>
    public string GetIconPath(string functionType)
    {
      string strPath = "";
      switch (functionType)
      {
        case SPK.AirSwitch:
          {
            strPath = "FunctionIcon/Icon/electricalbreaker.png";
          }
          break;
        case SPK.PanelSocket:
        case SPK.ElectricSocket:
          {
            strPath = "FunctionIcon/Icon/electricalsocket.png";
          }
          break;
        case SPK.LightSwitch:
        case SPK.LightRGB:
        case SPK.LightRGBW:
        case SPK.LightCCT:
        case SPK.LightDimming:
          {
            strPath = "LogicIcon/lightloguc.png";
          }
          break;
        case SPK.CurtainSwitch:
        case SPK.CurtainRoller:
        case SPK.CurtainTrietex:
          {
            strPath = "LogicIcon/curtainlogic.png";
          }
          break;
        case SPK.AcStandard:
        case SPK.HvacAC:
          {
            strPath = "LogicIcon/airconditionerlogic.png";
          }
          break;
        case SPK.FloorHeatStandard:
        case SPK.HvacFloorHeat:
          {
            strPath = "LogicIcon/heatlogic.png";
          }
          break;
        case SPK.AirFreshStandard:
        case SPK.HvacAirFresh:
          {
            strPath = "LogicIcon/heatlogic.png";
          }
          break;
        case SPK.SensorSmoke:
        case SPK.SensorWater:
        case SPK.SensorGas:
        case SPK.SensorDryContact:
        case SPK.SensorDryContact2:
        case SPK.SensorShanLan:
        case SPK.SensorDuiShe:
        case SPK.SensorPir:
        case SPK.SensorDoorWindow:
        case SPK.SensorUtrasonic:
        case SPK.SenesorMegahealth:
        case SPK.SenesorMegahealth2:
        case SPK.SensorEnvironment:
        case SPK.SensorEnvironment2:
        case SPK.SensorEnvironment3:
        case SPK.SensorTemperature:
        case SPK.SensorHumidity:
        case SPK.SensorCO2:
        case SPK.SensorPm25:
        case SPK.SensorTVOC:
        case SPK.SensorHcho:
          {
            strPath = "LogicIcon/sensor.png";
          }
          break;
      }
      return strPath;
    }
    /// <summary>
    /// 设备类型的列表(灯光类,窗帘类。。。)
    /// </summary>
    /// <param name="deviceList">设备列表</param>
    /// <returns></returns>
    public List<string> GetDeviceTypeList(List<HDL_ON.Entity.Function> deviceList)
    {
      List<string> deviceStrTypeList = new List<string>();
      deviceStrTypeList.Clear();
      ///灯光类
      var lightjosn = deviceList.Find((device) =>
      device.spk == SPK.LightSwitch
      || device.spk == SPK.LightDimming
      || device.spk == SPK.LightCCT
      || device.spk == SPK.LightRGB
      || device.spk == SPK.LightRGBW
      );
      if (lightjosn != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.Lights));
      }
      ///窗帘类
      var curtainjosn = deviceList.Find((device) =>
      device.spk == SPK.CurtainSwitch
      || device.spk == SPK.CurtainTrietex
      || device.spk == SPK.CurtainRoller);
      if (curtainjosn != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.Curtain));
      }
      ///空调类
      var ac = deviceList.Find((device) => device.spk == SPK.AcStandard || device.spk == SPK.HvacAC);
      if (ac != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.AC));
      }
      ///地暖类
      var floorHeating = deviceList.Find((device) => device.spk == SPK.FloorHeatStandard || device.spk == SPK.HvacFloorHeat);
      if (floorHeating != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.FloorHeating));
      }
      ///新风类
      var airFresh = deviceList.Find((device) => device.spk == SPK.AirFreshStandard || device.spk == SPK.HvacAirFresh);
      if (airFresh != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.AirFresh));
      }
      ///传感器类
      var sensor = deviceList.Find((device) =>
      device.spk == SPK.SensorWater
      || device.spk == SPK.SensorGas
      || device.spk == SPK.SensorSmoke
      || device.spk == SPK.SensorDryContact || device.spk == SPK.SensorDryContact2
      || device.spk == SPK.SensorShanLan
      || device.spk == SPK.SensorDuiShe
      || device.spk == SPK.SensorPir
      || device.spk == SPK.SensorDoorWindow
      || device.spk == SPK.SensorUtrasonic
      || device.spk == SPK.SenesorMegahealth
      || device.spk == SPK.SenesorMegahealth2
      || device.spk == SPK.SensorEnvironment
       || device.spk == SPK.SensorEnvironment2
        || device.spk == SPK.SensorEnvironment3
          || device.spk == SPK.SensorTemperature
            || device.spk == SPK.SensorHumidity
              || device.spk == SPK.SensorCO2
                || device.spk == SPK.SensorPm25
                  || device.spk == SPK.SensorTVOC
                    || device.spk == SPK.SensorHcho
      );
      if (sensor != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.Sensor));
      }
      ///家电类
      var electric = deviceList.Find((device) =>
      device.spk == SPK.AirSwitch
      || device.spk == SPK.PanelSocket
      || device.spk == SPK.ElectricSocket
      );
      if (electric != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.Electric));
      }
      return deviceStrTypeList;
    }
    /// <summary>
    /// 设备类型FunctionType列表
    /// </summary>
    /// <param name="deviceType">设备类型(灯光类,窗帘类。)</param>
    /// <returns></returns>
    public List<string> GetDeviceTypeFunctionList(string deviceType)
    {
      List<string> functionTypeList = new List<string>();
            List<string> functionTypeList = new List<string>();
            ///灯光类
            if (deviceType == Language.StringByID(StringId.Lights))
            {
@@ -518,6 +534,7 @@
            {
                functionTypeList.Add(SPK.AcStandard);
                functionTypeList.Add(SPK.HvacAC);
                functionTypeList.Add(SPK.HvacCac);
            }
            ///地暖类
            else if (deviceType == Language.StringByID(StringId.FloorHeating))
@@ -552,6 +569,7 @@
                functionTypeList.Add(SPK.SensorPm25);
                functionTypeList.Add(SPK.SensorTVOC);
                functionTypeList.Add(SPK.SensorHcho);
                functionTypeList.Add(SPK.SensorHelp);
            }
@@ -562,7 +580,13 @@
                functionTypeList.Add(SPK.PanelSocket);
                functionTypeList.Add(SPK.ElectricSocket);
            }
            else {
            ///门锁类
            else if (deviceType == Language.StringByID(StringId.DoorLock))
            {
                functionTypeList.Add(SPK.DoorLock);
            }
            else
            {
                functionTypeList.Add(SPK.LightSwitch);
                functionTypeList.Add(SPK.LightDimming);
                functionTypeList.Add(SPK.LightRGB);
@@ -604,410 +628,414 @@
                functionTypeList.Add(SPK.AirSwitch);
                functionTypeList.Add(SPK.PanelSocket);
                functionTypeList.Add(SPK.ElectricSocket);
                functionTypeList.Add(SPK.HvacCac);
                functionTypeList.Add(SPK.SensorHelp);
                functionTypeList.Add(SPK.DoorLock);
            }
      return functionTypeList;
            return functionTypeList;
    }
    /// <summary>
    /// 条件/目标支持设备
    /// </summary>
    /// <returns></returns>
    public List<string> GetSupportEquipment(string if_type)
    {
      List<string> deviceTypeList = new List<string>();
      switch (if_type)
      {
        case condition_if:
          {
            deviceTypeList.Add(SPK.LightSwitch);
            deviceTypeList.Add(SPK.LightRGB);
            deviceTypeList.Add(SPK.LightRGBW);
            deviceTypeList.Add(SPK.LightDimming);
            deviceTypeList.Add(SPK.LightCCT);
            deviceTypeList.Add(SPK.CurtainSwitch);
            deviceTypeList.Add(SPK.CurtainRoller);
            deviceTypeList.Add(SPK.CurtainTrietex);
            deviceTypeList.Add(SPK.AcStandard); deviceTypeList.Add(SPK.HvacAC);
            deviceTypeList.Add(SPK.AirFreshStandard); deviceTypeList.Add(SPK.HvacAirFresh);
            deviceTypeList.Add(SPK.FloorHeatStandard); deviceTypeList.Add(SPK.HvacFloorHeat);
            deviceTypeList.Add(SPK.SensorSmoke);
            deviceTypeList.Add(SPK.SensorWater);
            deviceTypeList.Add(SPK.SensorGas);
            deviceTypeList.Add(SPK.SensorDryContact); deviceTypeList.Add(SPK.SensorDryContact2);
            deviceTypeList.Add(SPK.SensorShanLan);
            deviceTypeList.Add(SPK.SensorDuiShe);
            deviceTypeList.Add(SPK.SensorPir);
            deviceTypeList.Add(SPK.SensorDoorWindow);
            deviceTypeList.Add(SPK.SensorUtrasonic);
            deviceTypeList.Add(SPK.SenesorMegahealth);
            deviceTypeList.Add(SPK.SenesorMegahealth2);
            deviceTypeList.Add(SPK.SensorEnvironment);
            deviceTypeList.Add(SPK.SensorEnvironment2);
            deviceTypeList.Add(SPK.SensorEnvironment3);
            deviceTypeList.Add(SPK.SensorTemperature);
            deviceTypeList.Add(SPK.SensorHumidity);
            deviceTypeList.Add(SPK.SensorCO2);
            deviceTypeList.Add(SPK.SensorPm25);
            deviceTypeList.Add(SPK.SensorTVOC);
            deviceTypeList.Add(SPK.SensorHcho);
            deviceTypeList.Add(SPK.AirSwitch);
            deviceTypeList.Add(SPK.PanelSocket);
            deviceTypeList.Add(SPK.ElectricSocket);
          }
          break;
        case target_if:
          {
            deviceTypeList.Add(SPK.LightSwitch);
            deviceTypeList.Add(SPK.LightRGB);
            deviceTypeList.Add(SPK.LightRGBW);
            deviceTypeList.Add(SPK.LightDimming);
            deviceTypeList.Add(SPK.LightCCT);
            deviceTypeList.Add(SPK.CurtainSwitch);
            deviceTypeList.Add(SPK.CurtainRoller);
            deviceTypeList.Add(SPK.CurtainTrietex);
            deviceTypeList.Add(SPK.AcStandard); deviceTypeList.Add(SPK.HvacAC);
            deviceTypeList.Add(SPK.FloorHeatStandard); deviceTypeList.Add(SPK.HvacFloorHeat);
            deviceTypeList.Add(SPK.AirFreshStandard); deviceTypeList.Add(SPK.HvacAirFresh);
            deviceTypeList.Add(SPK.AirSwitch);
            deviceTypeList.Add(SPK.PanelSocket);
            deviceTypeList.Add(SPK.ElectricSocket);
          }
          break;
      }
      return deviceTypeList;
    }
    #endregion
    /// <summary>
    /// 显示的设备列表
    /// </summary>
    /// <param name="functionType">源数据列表1</param>
    /// <param name="deviceList">源数据列表2</param>
    /// <returns></returns>
    public List<Entity.Function> GetShowDeviceList(List<string> functionType, List<HDL_ON.Entity.Function> deviceList)
    {
      List<HDL_ON.Entity.Function> devList = new List<Entity.Function>();
      for (int i = 0; i < deviceList.Count; i++)
      {
        var dev = deviceList[i];
        //过滤掉不需要显示的设备
        if (functionType.Contains(dev.spk))
        {
          devList.Add(dev);
        }
      }
      return devList;
    }
    /// <summary>
    /// 返回最终支持显示出来的设备列表
    /// </summary>
    /// <param name="room">当前房间</param>
    /// <param name="str">判断符(表示=输入设备和输出设备)</param>
    /// <returns></returns>
    public List<Entity.Function> GetFunctionDeviceList(Entity.Room room, string str)
    {
      List<string> functionTypeList = GetSupportEquipment(str);
      //返回房间设备列表
      var roomDeviceList = GetRoomDevice(room);
      //返回最终支持显示出来的设备列表
      var list = GetShowDeviceList(functionTypeList, roomDeviceList);
      return list;
    }
    /// <summary>
    /// 网关ID(获取嘉乐网关ID)
    /// </summary>
    public string GatewayId
    {
      get
      {
        if (Entity.DB_ResidenceData.Instance.HomeGateway == null)
        /// <summary>
        /// 条件/目标支持设备
        /// </summary>
        /// <returns></returns>
        public List<string> GetSupportEquipment(string if_type)
        {
          return DriverLayer.Control.Ins.GatewayId;
        }
        return Entity.DB_ResidenceData.Instance.HomeGateway.gatewayId;
      }
    }
    /// <summary>
    /// 住宅ID
    /// </summary>
    public string HomeId
    {
      get
      {
        return Entity.DB_ResidenceData.Instance.CurrentRegion.id;
      }
    }
    /// <summary>
    /// 是否为其他主用户分享过来的住宅
    /// </summary>
    public bool IsOthreShare
    {
      get
      {
        return Entity.DB_ResidenceData.Instance.CurrentRegion.isOtherShare;
      }
    }
    #region 高德坐标转WGS84坐标
    /// <summary>
    /// 高德坐标转WGS84坐标
    /// </summary>
    /// <param name="in_lng"></param>
    /// <param name="in_lat"></param>
    /// <param name="out_lng"></param>
    /// <param name="out_lat"></param>
    public void GCJ02_to_WGS84(double in_lng, double in_lat, out double out_lng, out double out_lat)
    {
      if (OutOfChina(in_lat, in_lng))
      {
        out_lng = in_lng;
        out_lat = in_lat;
        return;
      }
      CalculateDev(in_lng, in_lat, out out_lng, out out_lat);
      out_lng = in_lng - out_lng;
      out_lat = in_lat - out_lat;
    }
    #endregion
    #region WGS84坐标转高德坐标
    /// <summary>
    /// WGS84坐标转高德坐标
    /// </summary>
    /// <param name="in_lng">经度</param>
    /// <param name="in_lat">纬度</param>
    /// <param name="out_lng"></param>
    /// <param name="out_lat"></param>
    public void WGS84_to_GCJ02(double in_lng, double in_lat, out double out_lng, out double out_lat)
    {
      if (OutOfChina(in_lat, in_lng))
      {
        out_lng = in_lng;
        out_lat = in_lat;
        return;
      }
      CalculateDev(in_lng, in_lat, out out_lng, out out_lat);
      out_lng = in_lng + out_lng;
      out_lat = in_lat + out_lat;
    }
    #endregion
    /// <summary>
    /// 坐标是否在中国境内
    /// </summary>
    /// <param name="lat"></param>
    /// <param name="lng"></param>
    /// <returns></returns>
    public bool OutOfChina(double lat, double lng)
    {
      if (lng < 72.004 || lng > 137.8347)
        return true;
      if (lat < 0.8293 || lat > 55.8271)
        return true;
      return false;
    }
    /// <summary>
    /// 计算偏差
    /// </summary>
    /// <param name="in_lng"></param>
    /// <param name="in_lat"></param>
    /// <param name="dLng"></param>
    /// <param name="dLat"></param>
    private void CalculateDev(double in_lng, double in_lat, out double dLng, out double dLat)
    {
      dLat = TransformLat(in_lng - 105.0, in_lat - 35.0);
      dLng = TransformLng(in_lng - 105.0, in_lat - 35.0);
      double radLat = in_lat / 180.0 * pi;
      double magic = Math.Sin(radLat);
      magic = 1 - ee * magic * magic;
      double sqrtMagic = Math.Sqrt(magic);
      dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
      dLng = (dLng * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
    }
    private double TransformLat(double x, double y)
    {
      double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
      ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
      ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
      ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
      return ret;
    }
    private double TransformLng(double x, double y)
    {
      double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
      ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
      ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
      ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;
      return ret;
    }
    // 椭球参数-圆周率
    private const double pi = 3.14159265358979324;
    // (北京54)椭球长半轴,卫星椭球坐标投影到平面地图坐标系的投影因子
    private const double a = 6378245.0;
    /*
        * Krasovsky 1940 (北京54)椭球长半轴第一偏心率平方
        * 计算方式:
        * 长半轴:
        * a = 6378245.0
        * 扁率:
        * 1/f = 298.3(变量相关计算为:(a-b)/a)
        * 短半轴:
        * b = 6356863.0188 (变量相关计算方法为:b = a * (1 - f))
        * 第一偏心率平方:
        * e2 = (a^2 - b^2) / a^2;
    */
    private const double ee = 0.00669342162296594323;
    /// <summary>
    /// APP上报GPS经纬度
    /// </summary>
    /// <param name="lon">APP GPS经度</param>
    /// <param name="lat">APP GPS纬度</param>
    public void AppLatAndLonEvent(double lon, double lat)
    {
      Console.WriteLine($"GPS经度===={lon}  \nGPS纬度===={lat}");
      //Application.LocationAction += (lon, lat) =>
      //{
      //  Console.WriteLine($"GPS经度===={lon}");
      //  Console.WriteLine($"GPS纬度===={lat}");
      //  ////GPS坐标转成高德坐标
      //  //double out_lng, out_lat;
      //  //this.WGS84_to_GCJ02(lon, lat, out out_lng, out out_lat);
      //  //上报经纬度
      //  this.AutomatedGeofenceStatusReporting(lon, lat);
      //};
      //上报经纬度<gps 上报条件大于30秒且移动距离大于100米,上报经纬度>
      this.AutomatedGeofenceStatusReporting(lon, lat);
    }
    /// <summary>
    /// 自动化地理围栏状态上报云端
    /// </summary>
    /// <param name="out_lng">APP GPS经度</param>
    /// <param name="out_lat">APP GPS纬度</param>
    private void AutomatedGeofenceStatusReporting(double out_lng, double out_lat)
    {
      if (IsOthreShare)
      {
        //不是主账号直接返回
        return;
      }
      List<LogicData> logicDataList = new List<LogicData>();
      logicDataList.Clear();
      System.Threading.Tasks.Task.Run(() =>
      {
        try
        {
          //获取逻辑ID列表,目前针对所有<备注:如果只针对当前手机的话,可以直接拿缓存数据自动化列表遍历>
          var idStr = Send.GetLogicIdList();
          if (idStr.Code == "0" && idStr.Data != null && idStr.Data.ToString() != "")
          {
            var date = Newtonsoft.Json.JsonConvert.SerializeObject(idStr.Data);
            logicDataList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<LogicData>>(date);
          }
          ///有自动列表才处理
          if (logicDataList.Count > 0)
          {
            ///遍历所有列表
            for (int i = 0; i < logicDataList.Count; i++)
            List<string> deviceTypeList = new List<string>();
            switch (if_type)
            {
              var logicDate = logicDataList[i];
              ///自动化没有配置地理围栏不处理
              if (string.IsNullOrEmpty(logicDate.geo_fence.latitude) || string.IsNullOrEmpty(logicDate.geo_fence.longitude))
              {
                //经纬度为空,认为自动化没有配置地理围栏,不处理;
                continue;
              }
              //自动化配置输入条件纬度
              double lat = Convert.ToDouble(logicDate.geo_fence.latitude.Replace(",", "."));
              //自动化配置输入条件经度
              double lon = Convert.ToDouble(logicDate.geo_fence.longitude.Replace(",", "."));
              //自动化配置输入条件<地理围栏半径><单位,公里、千米.米>
              int radius = int.Parse(logicDate.geo_fence.radius);
              //计算2个经纬度之间的距离
              int r = Infrastructure.Service.Helper.CalculatedDistance.Distance(out_lat, out_lng, lat, lon);
              //定义一个局部变量
              string direction = string.Empty;
              //两点距离小于配置距离<既自动化配置输入条件地理围栏半径>,说明进入区域
              if (r < radius)
              {
                //到达某地
                direction = "arrive";
              }
              else
              {
                //离开
                direction = "leave";
              }
              ///遍历缓存列表<不为空说明数据已经推送过,不再推送>
              var isPush = pushList.Find((o) => o.homeId == HomeId && o.userId == UserInfo.Current.ID && o.userLogicId == logicDate.userLogicId && o.arriveOnLeave == direction);
              if (isPush == null)
              {
                //推送给云端是否成功
                bool push = Send.GeoFenceStateReport(logicDate.userLogicId, logicDate.sid, direction);
                if (push)
                case condition_if:
                    {
                        deviceTypeList.Add(SPK.LightSwitch);
                        deviceTypeList.Add(SPK.LightRGB);
                        deviceTypeList.Add(SPK.LightRGBW);
                        deviceTypeList.Add(SPK.LightDimming);
                        deviceTypeList.Add(SPK.LightCCT);
                        deviceTypeList.Add(SPK.CurtainSwitch);
                        deviceTypeList.Add(SPK.CurtainRoller);
                        deviceTypeList.Add(SPK.CurtainTrietex);
                        deviceTypeList.Add(SPK.AcStandard); deviceTypeList.Add(SPK.HvacAC);
                        deviceTypeList.Add(SPK.AirFreshStandard); deviceTypeList.Add(SPK.HvacAirFresh);
                        deviceTypeList.Add(SPK.FloorHeatStandard); deviceTypeList.Add(SPK.HvacFloorHeat);
                        deviceTypeList.Add(SPK.SensorSmoke);
                        deviceTypeList.Add(SPK.SensorWater);
                        deviceTypeList.Add(SPK.SensorGas);
                        deviceTypeList.Add(SPK.SensorDryContact); deviceTypeList.Add(SPK.SensorDryContact2);
                        deviceTypeList.Add(SPK.SensorShanLan);
                        deviceTypeList.Add(SPK.SensorDuiShe);
                        deviceTypeList.Add(SPK.SensorPir);
                        deviceTypeList.Add(SPK.SensorDoorWindow);
                        deviceTypeList.Add(SPK.SensorUtrasonic);
                        deviceTypeList.Add(SPK.SenesorMegahealth);
                        deviceTypeList.Add(SPK.SenesorMegahealth2);
                        deviceTypeList.Add(SPK.SensorEnvironment);
                        deviceTypeList.Add(SPK.SensorEnvironment2);
                        deviceTypeList.Add(SPK.SensorEnvironment3);
                        deviceTypeList.Add(SPK.SensorTemperature);
                        deviceTypeList.Add(SPK.SensorHumidity);
                        deviceTypeList.Add(SPK.SensorCO2);
                        deviceTypeList.Add(SPK.SensorPm25);
                        deviceTypeList.Add(SPK.SensorTVOC);
                        deviceTypeList.Add(SPK.SensorHcho);
                        deviceTypeList.Add(SPK.AirSwitch);
                        deviceTypeList.Add(SPK.PanelSocket);
                        deviceTypeList.Add(SPK.ElectricSocket);
                        deviceTypeList.Add(SPK.HvacCac);
                        deviceTypeList.Add(SPK.SensorHelp);
                        deviceTypeList.Add(SPK.DoorLock);
                    }
                    break;
                case target_if:
                    {
                        deviceTypeList.Add(SPK.LightSwitch);
                        deviceTypeList.Add(SPK.LightRGB);
                        deviceTypeList.Add(SPK.LightRGBW);
                        deviceTypeList.Add(SPK.LightDimming);
                        deviceTypeList.Add(SPK.LightCCT);
                        deviceTypeList.Add(SPK.CurtainSwitch);
                        deviceTypeList.Add(SPK.CurtainRoller);
                        deviceTypeList.Add(SPK.CurtainTrietex);
                        deviceTypeList.Add(SPK.AcStandard); deviceTypeList.Add(SPK.HvacAC);
                        deviceTypeList.Add(SPK.FloorHeatStandard); deviceTypeList.Add(SPK.HvacFloorHeat);
                        deviceTypeList.Add(SPK.AirFreshStandard); deviceTypeList.Add(SPK.HvacAirFresh);
                        deviceTypeList.Add(SPK.AirSwitch);
                        deviceTypeList.Add(SPK.PanelSocket);
                        deviceTypeList.Add(SPK.ElectricSocket);
                    }
                    break;
            }
            return deviceTypeList;
        }
        #endregion
        /// <summary>
        /// 显示的设备列表
        /// </summary>
        /// <param name="functionType">源数据列表1</param>
        /// <param name="deviceList">源数据列表2</param>
        /// <returns></returns>
        public List<Entity.Function> GetShowDeviceList(List<string> functionType, List<HDL_ON.Entity.Function> deviceList)
        {
            List<HDL_ON.Entity.Function> devList = new List<Entity.Function>();
            for (int i = 0; i < deviceList.Count; i++)
            {
                var dev = deviceList[i];
                //过滤掉不需要显示的设备
                if (functionType.Contains(dev.spk))
                {
                  ///添加到推送列表
                  pushList.Add(new Push
                  {
                    homeId = HomeId,
                    userId = UserInfo.Current.ID,
                    userLogicId = logicDate.userLogicId,
                    sid = logicDate.sid,
                    arriveOnLeave = direction,
                  });
                    devList.Add(dev);
                }
              }
            }
          }
            return devList;
        }
        catch { }
      });
        /// <summary>
        /// 返回最终支持显示出来的设备列表
        /// </summary>
        /// <param name="room">当前房间</param>
        /// <param name="str">判断符(表示=输入设备和输出设备)</param>
        /// <returns></returns>
        public List<Entity.Function> GetFunctionDeviceList(Entity.Room room, string str)
        {
            List<string> functionTypeList = GetSupportEquipment(str);
            //返回房间设备列表
            var roomDeviceList = GetRoomDevice(room);
            //返回最终支持显示出来的设备列表
            var list = GetShowDeviceList(functionTypeList, roomDeviceList);
            return list;
        }
        /// <summary>
        /// 网关ID(获取嘉乐网关ID)
        /// </summary>
        public string GatewayId
        {
            get
            {
                if (Entity.DB_ResidenceData.Instance.HomeGateway == null)
                {
                    return DriverLayer.Control.Ins.GatewayId;
                }
                return Entity.DB_ResidenceData.Instance.HomeGateway.gatewayId;
            }
        }
        /// <summary>
        /// 住宅ID
        /// </summary>
        public string HomeId
        {
            get
            {
                return Entity.DB_ResidenceData.Instance.CurrentRegion.id;
            }
        }
        /// <summary>
        /// 是否为其他主用户分享过来的住宅
        /// </summary>
        public bool IsOthreShare
        {
            get
            {
                return Entity.DB_ResidenceData.Instance.CurrentRegion.isOtherShare;
            }
        }
        #region 高德坐标转WGS84坐标
        /// <summary>
        /// 高德坐标转WGS84坐标
        /// </summary>
        /// <param name="in_lng"></param>
        /// <param name="in_lat"></param>
        /// <param name="out_lng"></param>
        /// <param name="out_lat"></param>
        public void GCJ02_to_WGS84(double in_lng, double in_lat, out double out_lng, out double out_lat)
        {
            if (OutOfChina(in_lat, in_lng))
            {
                out_lng = in_lng;
                out_lat = in_lat;
                return;
            }
            CalculateDev(in_lng, in_lat, out out_lng, out out_lat);
            out_lng = in_lng - out_lng;
            out_lat = in_lat - out_lat;
        }
        #endregion
        #region WGS84坐标转高德坐标
        /// <summary>
        /// WGS84坐标转高德坐标
        /// </summary>
        /// <param name="in_lng">经度</param>
        /// <param name="in_lat">纬度</param>
        /// <param name="out_lng"></param>
        /// <param name="out_lat"></param>
        public void WGS84_to_GCJ02(double in_lng, double in_lat, out double out_lng, out double out_lat)
        {
            if (OutOfChina(in_lat, in_lng))
            {
                out_lng = in_lng;
                out_lat = in_lat;
                return;
            }
            CalculateDev(in_lng, in_lat, out out_lng, out out_lat);
            out_lng = in_lng + out_lng;
            out_lat = in_lat + out_lat;
        }
        #endregion
        /// <summary>
        /// 坐标是否在中国境内
        /// </summary>
        /// <param name="lat"></param>
        /// <param name="lng"></param>
        /// <returns></returns>
        public bool OutOfChina(double lat, double lng)
        {
            if (lng < 72.004 || lng > 137.8347)
                return true;
            if (lat < 0.8293 || lat > 55.8271)
                return true;
            return false;
        }
        /// <summary>
        /// 计算偏差
        /// </summary>
        /// <param name="in_lng"></param>
        /// <param name="in_lat"></param>
        /// <param name="dLng"></param>
        /// <param name="dLat"></param>
        private void CalculateDev(double in_lng, double in_lat, out double dLng, out double dLat)
        {
            dLat = TransformLat(in_lng - 105.0, in_lat - 35.0);
            dLng = TransformLng(in_lng - 105.0, in_lat - 35.0);
            double radLat = in_lat / 180.0 * pi;
            double magic = Math.Sin(radLat);
            magic = 1 - ee * magic * magic;
            double sqrtMagic = Math.Sqrt(magic);
            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
            dLng = (dLng * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
        }
        private double TransformLat(double x, double y)
        {
            double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
            ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
            ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
            return ret;
        }
        private double TransformLng(double x, double y)
        {
            double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
            ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
            ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;
            return ret;
        }
        // 椭球参数-圆周率
        private const double pi = 3.14159265358979324;
        // (北京54)椭球长半轴,卫星椭球坐标投影到平面地图坐标系的投影因子
        private const double a = 6378245.0;
        /*
            * Krasovsky 1940 (北京54)椭球长半轴第一偏心率平方
            * 计算方式:
            * 长半轴:
            * a = 6378245.0
            * 扁率:
            * 1/f = 298.3(变量相关计算为:(a-b)/a)
            * 短半轴:
            * b = 6356863.0188 (变量相关计算方法为:b = a * (1 - f))
            * 第一偏心率平方:
            * e2 = (a^2 - b^2) / a^2;
        */
        private const double ee = 0.00669342162296594323;
        /// <summary>
        /// APP上报GPS经纬度
        /// </summary>
        /// <param name="lon">APP GPS经度</param>
        /// <param name="lat">APP GPS纬度</param>
        public void AppLatAndLonEvent(double lon, double lat)
        {
            Console.WriteLine($"GPS经度===={lon}  \nGPS纬度===={lat}");
            //Application.LocationAction += (lon, lat) =>
            //{
            //  Console.WriteLine($"GPS经度===={lon}");
            //  Console.WriteLine($"GPS纬度===={lat}");
            //  ////GPS坐标转成高德坐标
            //  //double out_lng, out_lat;
            //  //this.WGS84_to_GCJ02(lon, lat, out out_lng, out out_lat);
            //  //上报经纬度
            //  this.AutomatedGeofenceStatusReporting(lon, lat);
            //};
            //上报经纬度<gps 上报条件大于30秒且移动距离大于100米,上报经纬度>
            this.AutomatedGeofenceStatusReporting(lon, lat);
        }
        /// <summary>
        /// 自动化地理围栏状态上报云端
        /// </summary>
        /// <param name="out_lng">APP GPS经度</param>
        /// <param name="out_lat">APP GPS纬度</param>
        private void AutomatedGeofenceStatusReporting(double out_lng, double out_lat)
        {
            if (IsOthreShare)
            {
                //不是主账号直接返回
                return;
            }
            List<LogicData> logicDataList = new List<LogicData>();
            logicDataList.Clear();
            System.Threading.Tasks.Task.Run(() =>
            {
                try
                {
              //获取逻辑ID列表,目前针对所有<备注:如果只针对当前手机的话,可以直接拿缓存数据自动化列表遍历>
              var idStr = Send.GetLogicIdList();
                    if (idStr.Code == "0" && idStr.Data != null && idStr.Data.ToString() != "")
                    {
                        var date = Newtonsoft.Json.JsonConvert.SerializeObject(idStr.Data);
                        logicDataList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<LogicData>>(date);
                    }
              ///有自动列表才处理
              if (logicDataList.Count > 0)
                    {
                  ///遍历所有列表
                  for (int i = 0; i < logicDataList.Count; i++)
                        {
                            var logicDate = logicDataList[i];
                      ///自动化没有配置地理围栏不处理
                      if (string.IsNullOrEmpty(logicDate.geo_fence.latitude) || string.IsNullOrEmpty(logicDate.geo_fence.longitude))
                            {
                          //经纬度为空,认为自动化没有配置地理围栏,不处理;
                          continue;
                            }
                      //自动化配置输入条件纬度
                      double lat = Convert.ToDouble(logicDate.geo_fence.latitude.Replace(",", "."));
                      //自动化配置输入条件经度
                      double lon = Convert.ToDouble(logicDate.geo_fence.longitude.Replace(",", "."));
                      //自动化配置输入条件<地理围栏半径><单位,公里、千米.米>
                      int radius = int.Parse(logicDate.geo_fence.radius);
                      //计算2个经纬度之间的距离
                      int r = Infrastructure.Service.Helper.CalculatedDistance.Distance(out_lat, out_lng, lat, lon);
                      //定义一个局部变量
                      string direction = string.Empty;
                      //两点距离小于配置距离<既自动化配置输入条件地理围栏半径>,说明进入区域
                      if (r < radius)
                            {
                          //到达某地
                          direction = "arrive";
                            }
                            else
                            {
                          //离开
                          direction = "leave";
                            }
                      ///遍历缓存列表<不为空说明数据已经推送过,不再推送>
                      var isPush = pushList.Find((o) => o.homeId == HomeId && o.userId == UserInfo.Current.ID && o.userLogicId == logicDate.userLogicId && o.arriveOnLeave == direction);
                            if (isPush == null)
                            {
                          //推送给云端是否成功
                          bool push = Send.GeoFenceStateReport(logicDate.userLogicId, logicDate.sid, direction);
                                if (push)
                                {
                              ///添加到推送列表
                              pushList.Add(new Push
                                    {
                                        homeId = HomeId,
                                        userId = UserInfo.Current.ID,
                                        userLogicId = logicDate.userLogicId,
                                        sid = logicDate.sid,
                                        arriveOnLeave = direction,
                                    });
                                }
                            }
                        }
                    }
                }
                catch { }
            });
        }
        /// <summary>
        /// 推送列表<这里数据已经推送过>
        /// </summary>
        private static List<Push> pushList = new List<Push>();
    }
    /// <summary>
    /// 推送列表<这里数据已经推送过>
    /// </summary>
    private static List<Push> pushList = new List<Push>();
    public class Push
    {
        /// <summary>
        /// 云端唯一id
        /// </summary>
        public string userLogicId = "";
        /// <summary>
        /// 网关id
        /// </summary>
        public string gatewayId = "";
        /// <summary>
        /// 逻辑唯一标识
        /// </summary>
        public string sid = "";
        /// <summary>
        /// 住宅id
        /// </summary>
        public string homeId = "";
        /// <summary>
        /// 到达某地 离开
        /// </summary>
        public string arriveOnLeave = "";
        /// <summary>
        ///  用户id
        /// </summary>
        public string userId = "";
  }
  public class Push
  {
    /// <summary>
    /// 云端唯一id
    /// </summary>
    public string userLogicId = "";
    /// <summary>
    /// 网关id
    /// </summary>
    public string gatewayId = "";
    /// <summary>
    /// 逻辑唯一标识
    /// </summary>
    public string sid = "";
    /// <summary>
    /// 住宅id
    /// </summary>
    public string homeId = "";
    /// <summary>
    /// 到达某地 离开
    /// </summary>
    public string arriveOnLeave = "";
    /// <summary>
    ///  用户id
    /// </summary>
    public string userId = "";
  }
    }
}
HDL_ON/UI/UI2/3-Intelligence/Automation/LogicView/SwitchView.cs
@@ -97,7 +97,7 @@
        /// View的方法
        /// </summary>
        ///  <param name="frame">父控件</param>
        /// <param name="i">显示选择View数量</param>
        /// <param name="i">表示View数量</param>
        ///<param name="stateVuale">之前的状态值</param>
        /// <param name="action">返回回调</param>
        /// <returns></returns>
@@ -166,23 +166,30 @@
        /// View的方法
        /// </summary>
        ///  <param name="frame">父控件</param>
        /// <param name="text1">父控件</param>
        /// <param name="text2">显示选择View数量</param>
        /// <param name="text1">第一个备注</param>
        /// <param name="text2">第二个备注</param>
        ///<param name="stateVuale">之前的状态值</param>
        /// <param name="i">表示View数量</param>
        /// <param name="action">返回回调</param>
        /// <returns></returns>
        public void FLayoutView(FrameLayout frame, int text1, int text2, string stateVuale, Action<int> action,bool tag=true)
        public void FLayoutView(FrameLayout frame, int text1, int text2, string stateVuale, int i, Action<int> action,bool tag=true)
        {
            int i = 2;
            frameLayout.Y = Application.GetRealHeight(603 - (44 * i));
            frameLayout.Height = Application.GetRealHeight(44 * i);
            frame.AddChidren(frameLayout);
            frame.AddChidren(btnCancel);
            btnOn.TextID = text1;
            btnOff.TextID = text2;
            frameLayout.AddChidren(btnOn);
            frameLayout.AddChidren(btnLine);
            frameLayout.AddChidren(btnOff);
            if (i == 1)
            {
                frameLayout.AddChidren(btnOn);
            }
            else if (i == 2)
            {
                frameLayout.AddChidren(btnOn);
                frameLayout.AddChidren(btnLine);
                frameLayout.AddChidren(btnOff);
            }
            //取消点击事件
            btnCancel.MouseUpEventHandler += (sender1, e1) =>
            {
HDL_ON/UI/UI2/3-Intelligence/Automation/PublicInterface.cs
@@ -748,6 +748,93 @@
            return list;
        }
        /// <summary>
        /// 动态获取传感器等级列表
        /// </summary>
        /// <param name="device">功能(sid)</param>
        /// <returns></returns>
        public List<string> GetSensorLevelList(Entity.Function device)
        {
            List<string> list = new List<string>();
            var dic = GetSensorLevelDic(device);
            foreach (var d in dic) {
                list.Add(d.Key);
            }
            return list;
        }
        /// <summary>
        /// 指定获取等级拼接的字符串
        /// </summary>
        /// <param name="device">功能(sid)</param>
        /// <param name="s">初始值</param>
        /// <param name="isTextBoolean">表示true(返回key);false(返回values)</param>
        /// <returns></returns>isTextBoolean
        public string GetSensorLevelText(Entity.Function device, string s, bool isTextBoolean)
        {
            if (device == null || device.attrKeyConfigs == null)
            {
                return "";
            }
            var dic = GetSensorLevelDic(device);
            if (isTextBoolean)
            {
                foreach (var d in dic)
                {
                    if (d.Value==s)
                    {
                        //如果values值存在,返回key值
                        return d.Key.ToString();
                    }
                }
            }
            else
            {
                foreach (var d in dic)
                {
                    if (d.Key==s)
                    {
                        //如果key值存在,返回values值
                        return d.Value.ToString();
                    }
                }
            }
            return "";
        }
        /// <summary>
        /// 动态获取传感器等级字典
        /// </summary>
        /// <param name="device">功能(sid)</param>
        /// <returns></returns>
        public Dictionary<string,string> GetSensorLevelDic(Entity.Function device)
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            if (device == null || device.attrKeyConfigs == null)
            {
                return dic;
            }
            string strKey = "";
            string strKeyValues = "";
            for (int i = 0; i < device.attrKeyConfigs.Count; i++)
            {
                var attrKeyConfig = device.attrKeyConfigs[i];
                foreach (var attrKeyInfo in attrKeyConfig.configs)
                {
                    //动态拼接字符串
                    strKey = attrKeyInfo.desc + ":" + attrKeyInfo.start + "~" + attrKeyInfo.end + attrKeyConfig.unit;
                    strKeyValues = "(" + attrKeyInfo.start + "," + attrKeyInfo.end + "]";
                    if (!dic.ContainsKey(strKey))
                    {
                        //没有再添加
                        dic.Add(strKey, strKeyValues);
                    }
                }
            }
            return dic;
        }
        /// <summary>
        /// 模式/风速互相转换值的方法
        /// </summary>
        /// <param name="text">文本</param>
HDL_ON/UI/UI2/3-Intelligence/Automation/Send.cs
@@ -173,6 +173,7 @@
        logicIfon.Add("noticeConfig", noticeConfigJObject);
        logicIfon.Add("pushConfigs", pushConfigsArray);
        logicjArray.Add(logicIfon);
       //string str = logicIfon.ToString();
        var jObject = new JObject { { "homeId", LogicMethod.CurrLogicMethod.HomeId }, { "logics", logicjArray } };
        responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_Add, 5);
        //如果是token过期则刷新token
HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs
@@ -142,7 +142,7 @@
                        ///开关点击事件
                        curtainSwitchView.btnClick.MouseUpEventHandler += (sender, e) =>
                        {
                            SwitchViewMethod(device, curtainSwitchView.btnState, 3);
                            SwitchViewMethod(device, curtainSwitchView.btnState, 2);
                        };
                        if (edit)
                        {
HDL_ON/UI/UI2/3-Intelligence/Scene/SceneEditPage.cs
@@ -98,7 +98,7 @@
        public void LoadPage(Action backRefresh)
        {
            DB_ResidenceData.Instance.SupportFacePass
             //DB_ResidenceData.Instance.sceneChooseRoomId
            new TopViewDiv(bodyView, Language.StringByID(StringId.EditScene)).LoadTopView(backRefresh);
            initPage();
        }
HDL_ON/UI/UI2/4-PersonalCenter/PirDevice/PirMethod.cs
@@ -574,6 +574,8 @@
                                str = Language.StringByID(StringId.shebeibucunzai);
                            }
                            break;
                        case "124006":
                        case "14006":
                            {
                                str = Language.StringByID(StringId.shebeibuzaixian);
HDL_ON/UI/UI2/4-PersonalCenter/PirDevice/PirSend.cs
@@ -291,6 +291,7 @@
        /// <returns></returns>
        public static ResponsePackNew RequestServerhomeId(object o, string api_Url, int mTimeout = 20)
        {
            MainPage.Log("请求数据=="+o.ToString());
            var requestJson = HttpUtil.GetSignRequestJson(o);
            return HttpUtil.RequestHttpsPostFroHome(api_Url, requestJson, mTimeout);
HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/AcControlPage.cs
@@ -118,7 +118,15 @@
        /// </summary>
        private void InitFrameWhiteContent1()
        {
            //获取温度值
            temp = (int)Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", "."));
            if (temp <= 0)
            {
                //默认值改成16,2022年06月10日10:03:19 成甫要求的
                temp = 16;
                device.SetAttrState(FunctionAttributeKey.SetTemp, temp.ToString());
            }
            arcBar = new DiyArcSeekBar()
            {
                Gravity = Gravity.CenterHorizontal,
@@ -147,7 +155,7 @@
            arcBar.IsOffline = device.GetAttrState(FunctionAttributeKey.OnOff) == "off";
            arcBar.MinValue = device.GetAttribute(FunctionAttributeKey.SetTemp).min;
            arcBar.MaxValue = device.GetAttribute(FunctionAttributeKey.SetTemp).max;
            arcBar.Progress = (int)Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", "."));
            arcBar.Progress = temp;
            btnTemp = new Button()
            {
@@ -158,7 +166,7 @@
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = 50,
                IsBold = true,
                Text = Convert.ToDouble( device.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", ".")).ToString(),
                Text = Convert.ToDouble(temp).ToString(),
                TextAlignment = TextAlignment.Center,
            };
            FrameWhiteCentet1.AddChidren(btnTemp);
@@ -1049,7 +1057,7 @@
                    btnSwing.UnSelectedImagePath = acFunction.GetSwingIconPath(device.GetAttrState(FunctionAttributeKey.Swing), false);
                    btnWindSpeed.UnSelectedImagePath = acFunction.GetFanIconPath(device.GetAttrState(FunctionAttributeKey.FanSpeed), false);
                    temp = Convert.ToInt32(Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", ".")));
                    arcBar.Progress = temp;
                    btnTemp.Text = temp.ToString() ;
HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/CacControlPage.cs
New file
@@ -0,0 +1,663 @@
using System;
using System.Collections.Generic;
using HDL_ON.DriverLayer;
using HDL_ON.Entity;
using HDL_ON.Stan;
using HDL_ON.UI.CSS;
using Shared;
namespace HDL_ON.UI
{
    public class CacControlPage : DeviceFunctionCardCommonForm
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 空调温度控制控件
        /// </summary>
        DiyArcSeekBar arcBar;
        /// <summary>
        /// 减号按钮
        /// </summary>
        Button btnMinus;
        /// <summary>
        /// 加号按钮
        /// </summary>
        Button btnPlus;
        /// <summary>
        /// 温度按钮
        /// </summary>
        Button btnTemp;
        Button btnTempUint;
        /// <summary>
        /// 室内温度按钮
        /// </summary>
        Button btnIndoorTemp;
        /// <summary>
        /// 模式按钮
        /// </summary>
        Button btnMode;
        /// <summary>
        /// 风速按钮
        /// </summary>
        Button btnWindSpeed;
        /// <summary>
        /// 开关按钮
        /// </summary>
        Button btnSwitch;
        AC acFunction = new AC();
        /// <summary>
        /// 控制时间
        /// </summary>
        DateTime controlTime = DateTime.MinValue.AddDays(10);
        /// <summary>
        /// 控制温度
        /// </summary>
        int temp = 16;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 初始化白色区域的内容
        /// </summary>
        public override void InitFrameWhiteContent()
        {
            var sk = device.GetAttribute(FunctionAttributeKey.SetTemp);
            if (sk != null)
            {
                if (sk.min == 0)
                {
                    sk.min = 16;
                }
                if (sk.max == 0)
                {
                    sk.max = 32;
                }
            }
            base.ShowColltionButton = false;
            base.SetTitleText(Language.StringByID(StringId.Electric));
            //初始化第一个索引页的内容
            this.InitFrameWhiteContent1();
            //刷新当前设备的状态缓存
            this.RefreshNowDeviceStatuMemory(this.device);
            //刷新界面状态
            this.RefreshFormStatu();
            //读取状态
            new System.Threading.Thread(() =>
            {
                while (true)
                {
                    if (controlTime == DateTime.MinValue)
                    {
                    }
                    else if (controlTime.AddSeconds(2) < DateTime.Now)
                    {
                        Control.Ins.SendReadCommand(device);
                        controlTime = DateTime.MinValue;
                    }
                    System.Threading.Thread.Sleep(1000);
                }
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 初始化第一个索引页的内容
        /// </summary>
        private void InitFrameWhiteContent1()
        {
            Button btnJinmaoIcon = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = Application.GetRealHeight(94),
                Width = Application.GetRealWidth(164),
                Height = Application.GetRealHeight(43),
                UnSelectedImagePath = "FunctionIcon/CAC/JinMaoIcon.png"
            };
            FrameWhiteCentet1.AddChidren(btnJinmaoIcon);
            temp = (int)Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", "."));
            if (temp <= 0)
            {
                //默认值改成16,2022年06月10日10:03:19 成甫要求的
                temp = 16;
                device.SetAttrState(FunctionAttributeKey.SetTemp, temp.ToString());
            }
            arcBar = new DiyArcSeekBar()
            {
                Gravity = Gravity.CenterHorizontal,
                OpenAngle = 160,
                ThumbImageHeight = Application.GetRealWidth(50),
                ProgressBarColor = CSS_Color.MainColor,
                OfflineProgressBarColor = CSS_Color.PromptingColor2,
                ArcColor = CSS_Color.BackgroundColor,
#if __IOS__
                Y = Application.GetRealHeight(120 + 25),
                Width = Application.GetRealWidth(260 - 40),
                Height = Application.GetRealWidth(260 - 40),
                SeekBarPadding = Application.GetRealWidth(8),
#else
                Y = Application.GetRealHeight(120 + 40),
                Width = Application.GetRealWidth(260 - 40),
                Height = Application.GetRealWidth(260 - 40),
                SeekBarPadding = Application.GetRealWidth(7),
#endif
            };
            FrameWhiteCentet1.AddChidren(arcBar);
            arcBar.ThumbImagePath = device.GetAttrState(FunctionAttributeKey.OnOff) == "on" ? "FunctionIcon/AC/DiyThumbIconOn.png" : "FunctionIcon/AC/DiyThumbIcon.png";
            arcBar.IsOffline = device.GetAttrState(FunctionAttributeKey.OnOff) == "off";
            arcBar.MinValue = device.GetAttribute(FunctionAttributeKey.SetTemp).min;
            arcBar.MaxValue = device.GetAttribute(FunctionAttributeKey.SetTemp).max;
            arcBar.Progress =temp;
            btnTemp = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = Application.GetRealHeight(206),
                Width = Application.GetRealWidth(71),
                Height = Application.GetRealWidth(60),
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = 50,
                IsBold = true,
                Text = Convert.ToDouble(temp).ToString(),
                TextAlignment = TextAlignment.Center,
            };
            FrameWhiteCentet1.AddChidren(btnTemp);
            btnTempUint = new Button()
            {
                X = btnTemp.Right,
                Y = btnTemp.Y,
                Width = Application.GetRealWidth(30),
                Height = Application.GetRealHeight(30),
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.EmphasisFontSize_Secondary,
                IsBold = true,
                TextAlignment = TextAlignment.CenterLeft,
                Text = "°C",
            };
            FrameWhiteCentet1.AddChidren(btnTempUint);
            btnIndoorTemp = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = btnTemp.Bottom,
                Width = Application.GetRealWidth(120),
                Height = Application.GetRealHeight(20),
                Text = Language.StringByID(StringId.IndoorTemp) + "20°C/" + Language.StringByID(StringId.Humidity) +"45%",
                TextColor = CSS_Color.PromptingColor1,
                TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
            };
            FrameWhiteCentet1.AddChidren(btnIndoorTemp);
            btnMinus = new Button()
            {
                X = Application.GetRealWidth(21),
                Y = Application.GetRealHeight(263),
                Width = Application.GetRealWidth(32),
                Height = Application.GetRealWidth(32),
                UnSelectedImagePath = "Public/MinusSignIcon.png",
            };
            FrameWhiteCentet1.AddChidren(btnMinus);
            btnPlus = new Button()
            {
                X = Application.GetRealWidth(275),
                Y = Application.GetRealHeight(263),
                Width = Application.GetRealWidth(32),
                Height = Application.GetRealWidth(32),
                UnSelectedImagePath = "Public/PlusSignIcon.png",
            };
            FrameWhiteCentet1.AddChidren(btnPlus);
            btnMode = new Button()
            {
                X = Application.GetRealWidth(60),
                Y = Application.GetRealHeight(334),
                Width = Application.GetRealWidth(30),
                Height = Application.GetRealWidth(30),
                UnSelectedImagePath = acFunction.GetModeIconPath(device.GetAttrState(FunctionAttributeKey.Mode),true),
            };
            FrameWhiteCentet1.AddChidren(btnMode);
            Button btnModeText = new Button()
            {
                X = Application.GetRealWidth(30),
                Y = btnMode.Bottom,
                Width = Application.GetRealWidth(90),
                Height = Application.GetRealHeight(20),
                TextAlignment = TextAlignment.Center,
                TextSize = 12,
                TextColor = CSS_Color.TextualColor,
                TextID = StringId.Mode
            };
            FrameWhiteCentet1.AddChidren(btnModeText);
            btnWindSpeed = new Button()
            {
                X = Application.GetRealWidth(238),
                Y = Application.GetRealHeight(333),
                Width = Application.GetRealWidth(38),
                Height = Application.GetRealWidth(38),
                UnSelectedImagePath = "FunctionIcon/CAC/DataIcon.png",
            };
            FrameWhiteCentet1.AddChidren(btnWindSpeed);
            Button btnDataText = new Button()
            {
                X = Application.GetRealWidth(212),
                Y = btnWindSpeed.Bottom,
                Width = Application.GetRealWidth(90),
                Height = Application.GetRealHeight(20),
                TextAlignment = TextAlignment.Center,
                TextSize = 12,
                TextColor = CSS_Color.TextualColor,
                TextID = StringId.Data
            };
            FrameWhiteCentet1.AddChidren(btnDataText);
            btnSwitch = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = Application.GetRealHeight(466),
                Width = Application.GetRealWidth(32),
                Height = Application.GetRealWidth(32),
                UnSelectedImagePath = "Public/PowerClose.png",
                SelectedImagePath = "Public/PowerOpen.png",
                IsSelected = device.GetAttrState(FunctionAttributeKey.OnOff) == "on"
            };
            FrameWhiteCentet1.AddChidren(btnSwitch);
            LoadEvent_TempChange();
            LoadEvent_AcStatesChange();
        }
        /// <summary>
        /// 加载修改模式区域
        /// </summary>
        void LoadDiv_ChangeModeView()
        {
            Dialog dialog = new Dialog();
            FrameLayout dialogView = new FrameLayout()
            {
                BackgroundColor = CSS_Color.DialogTransparentColor1,
            };
            dialog.AddChidren(dialogView);
            FrameLayout modeChangeView;
            modeChangeView = new FrameLayout()
            {
                X = Application.GetRealWidth(30),
                Y = Application.GetRealHeight(128 + 135),
                Width = Application.GetRealWidth(160),
                Height = Application.GetRealHeight(152),
                BackgroundImagePath = "Public/dialogBg2.png",
            };
            dialogView.AddChidren(modeChangeView);
            Button btnTitle;
            btnTitle = new Button()
            {
                X = Application.GetRealWidth(8 + 16),
                Y = Application.GetRealHeight(8),
                Width = Application.GetRealWidth(112),
                Height = Application.GetRealHeight(44),
                TextID = StringId.ChooseMode,
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.EmphasisFontSize_Secondary,
            };
            modeChangeView.AddChidren(btnTitle);
            Button btnLine = new Button()
            {
                X = btnTitle.X,
                Y = btnTitle.Bottom,
                Width = Application.GetRealWidth(112),
                Height = Application.GetRealHeight(1),
                BackgroundColor = CSS_Color.BackgroundColor,
            };
            modeChangeView.AddChidren(btnLine);
            var modeList = device.GetAttribute(FunctionAttributeKey.Mode).value;
            foreach (var m in modeList)
            {
                Button btnModeIcon = new Button()
                {
                    X = btnTitle.X,
                    Y = Application.GetRealHeight(44 * (modeList.IndexOf(m) + 1) + 10 + 8),
                    Width = Application.GetRealWidth(24),
                    Height = Application.GetRealWidth(24),
                    IsSelected = device.GetAttrState(FunctionAttributeKey.Mode) == m,
                };
                modeChangeView.AddChidren(btnModeIcon);
                Button btnModeText = new Button()
                {
                    X = Application.GetRealWidth(12) + btnModeIcon.Right,
                    Y = Application.GetRealHeight(44 * (modeList.IndexOf(m) + 1) + 8),
                    Height = Application.GetRealHeight(44),
                    Width = Application.GetRealWidth(90),
                    TextAlignment = TextAlignment.CenterLeft,
                    TextColor = CSS_Color.FirstLevelTitleColor,
                    SelectedTextColor = CSS_Color.MainColor,
                    IsSelected = device.GetAttrState(FunctionAttributeKey.Mode) == m,
                    TextSize = CSS_FontSize.TextFontSize,
                };
                modeChangeView.AddChidren(btnModeText);
                btnModeIcon.UnSelectedImagePath = acFunction.GetModeIconPath(m, false);
                btnModeIcon.SelectedImagePath = acFunction.GetModeIconPath(m);
                btnModeText.Text = acFunction.GetModeAttrText(m);
                if (modeList.IndexOf(m) < modeList.Count - 1)
                {
                    modeChangeView.AddChidren(new Button()
                    {
                        X = btnTitle.X,
                        Y = btnModeText.Bottom,
                        Width = Application.GetRealWidth(112),
                        Height = Application.GetRealHeight(1),
                        BackgroundColor = CSS_Color.BackgroundColor,
                    });
                }
                EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
                {
                    dialog.Close();
                };
                EventHandler<MouseEventArgs> eventHandler1 = (sender, e) =>
                {
                    //if (!device.online)
                    //{
                    //    new Tip()
                    //    {
                    //        CloseTime = 1,
                    //        Text = Language.StringByID(StringId.DeviceOfflineCannotOption),
                    //        Direction = AMPopTipDirection.None,
                    //    }.Show(MainPage.BaseView);
                    //}
                    btnModeIcon.IsSelected = btnModeText.IsSelected = true;
                    device.SetAttrState(FunctionAttributeKey.Mode, m);
                    btnMode.UnSelectedImagePath = acFunction.GetModeIconPath(m);
                    Dictionary<string, string> d = new Dictionary<string, string>();
                    d.Add(FunctionAttributeKey.Mode, m);
                    Control.Ins.SendWriteCommand(device, d);
                    dialog.Close();
                    if (device.GetAttrState(FunctionAttributeKey.Mode) == "fan")
                    {
                        arcBar.IsClickable = false;
                        arcBar.IsOffline = true;
                    }
                    else
                    {
                        arcBar.IsOffline = false;
                        arcBar.IsClickable = true;
                    }
                };
                btnModeIcon.MouseUpEventHandler = eventHandler1;
                btnModeText.MouseUpEventHandler = eventHandler1;
                dialogView.MouseUpEventHandler = eventHandler;
            }
            dialogView.MouseUpEventHandler = (sender, e) => {
                dialog.Close();
            };
            dialog.Show();
        }
        #endregion
        #region ■ 设备状态反馈_______________________
        /// <summary>
        /// 设备状态反馈
        /// </summary>
        /// <param name="i_LocalDevice"></param>
        public override void DeviceStatuPush(Function i_LocalDevice)
        {
            //不是同一个东西
            if (this.device.sid != i_LocalDevice.sid) { return; }
            //刷新当前设备的状态缓存
            this.RefreshNowDeviceStatuMemory(i_LocalDevice);
            //刷新界面状态
            this.RefreshFormStatu();
        }
        #endregion
        #region ■ 发送各种命令_______________________
        /// <summary>
        /// 温度改变模式
        /// </summary>
        void LoadEvent_TempChange()
        {
            btnMinus.MouseUpEventHandler = (sender, e) =>
            {
                //if (!device.online)
                //{
                //    new Tip()
                //    {
                //        CloseTime = 1,
                //        Text = Language.StringByID(StringId.DeviceOfflineCannotOption),
                //        Direction = AMPopTipDirection.None,
                //    }.Show(MainPage.BaseView);
                //}
                if (device.trait_on_off.curValue.ToString() == "off" || device.GetAttrState(FunctionAttributeKey.Mode) == "fan")
                {
                    return;
                }
                if (temp <= device.GetAttribute(FunctionAttributeKey.SetTemp).min)
                {
                    return;
                }
                --temp;
                Console.WriteLine($"temp == {temp}");
                controlTime = DateTime.Now;
                arcBar.Progress = temp;
                btnTemp.Text = temp.ToString();
                device.SetAttrState(FunctionAttributeKey.SetTemp, temp.ToString());
                System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                d.Add(FunctionAttributeKey.SetTemp, temp.ToString());
                Control.Ins.SendWriteCommand(device, d);
            };
            btnPlus.MouseUpEventHandler = (sender, e) =>
            {
                //if (!device.online)
                //{
                //    new Tip()
                //    {
                //        CloseTime = 1,
                //        Text = Language.StringByID(StringId.DeviceOfflineCannotOption),
                //        Direction = AMPopTipDirection.None,
                //    }.Show(MainPage.BaseView);
                //}
                if (device.trait_on_off.curValue.ToString() == "off" || device.GetAttrState(FunctionAttributeKey.Mode) == "fan")
                {
                    return;
                }
                if (temp >= device.GetAttribute(FunctionAttributeKey.SetTemp).max)
                {
                    return;
                }
                ++temp;
                controlTime = DateTime.Now;
                arcBar.Progress = temp;
                btnTemp.Text = temp.ToString();
                device.SetAttrState(FunctionAttributeKey.SetTemp, temp.ToString());
                System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                d.Add(FunctionAttributeKey.SetTemp, temp.ToString());
                Control.Ins.SendWriteCommand(device, d);
            };
            //if (device.online)
            {
                arcBar.OnStopTrackingTouchEvent = (sender, e) =>
                {
                    temp = arcBar.Progress;
                    device.SetAttrState(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString());
                    btnTemp.Text = arcBar.Progress.ToString();
                    controlTime = DateTime.Now;
                    Dictionary<string, string> d = new Dictionary<string, string>();
                    d.Add(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString());
                    Control.Ins.SendWriteCommand(device, d);
                };
                arcBar.OnProgressChangedEvent = (sender, e) =>
                {
                    device.SetAttrState(FunctionAttributeKey.SetTemp, e.ToString());
                    btnTemp.Text = e.ToString();
                };
                //arcBar.MouseDownEventHandler = (sender, e) => {
                //    Console.WriteLine("ddd");
                //    MainPage.BasePageView.ScrollEnabled =false;
                //};
                //arcBar.MouseUpEventHandler = (sender, e) => {
                //    Console.WriteLine("ddd2");
                //    MainPage.BasePageView.ScrollEnabled = true;
                //};
            }
        }
        /// <summary>
        /// 控制模式事件
        /// </summary>
        void LoadEvent_AcStatesChange()
        {
            btnMode.MouseUpEventHandler = (sender, e) =>
            {
                if (device.trait_on_off.curValue.ToString() == "off")
                {
                    return;
                }
                LoadDiv_ChangeModeView();
            };
            btnWindSpeed.MouseUpEventHandler = (sender, e) =>
            {
                var page = new CacHistoryChoosePage(device);
                MainPage.BasePageView.AddChidren(page);
                page.InitView();
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
            };
            btnSwitch.MouseUpEventHandler = (sender, e) =>
            {
                //if (!device.online)
                //{
                //    new Tip()
                //    {
                //        CloseTime = 1,
                //        Text = Language.StringByID(StringId.DeviceOfflineCannotOption),
                //        Direction = AMPopTipDirection.None,
                //    }.Show(MainPage.BaseView);
                //}
                btnSwitch.IsSelected = !btnSwitch.IsSelected;
                device.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
                if (device.trait_on_off.curValue.ToString() == "on")
                {
                    arcBar.ThumbImagePath = "FunctionIcon/AC/DiyThumbIconOn.png";
                    btnSwitch.IsSelected = true;
                    arcBar.IsOffline = false;
                }
                else
                {
                    arcBar.ThumbImagePath = "FunctionIcon/AC/DiyThumbIcon.png";
                    btnSwitch.IsBold = false;
                    arcBar.IsOffline = true;
                }
                System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                d.Add(FunctionAttributeKey.OnOff, device.trait_on_off.curValue.ToString());
                Control.Ins.SendWriteCommand(device, d);
            };
        }
        #endregion
        #region ■ 刷新界面状态_______________________
        /// <summary>
        /// 刷新界面状态
        /// </summary>
        private void RefreshFormStatu()
        {
            Application.RunOnMainThread(() =>
            {
                //app自己控制的不用更新,会造成跳动
                if (controlTime.AddSeconds(2) > DateTime.Now)
                {
                    return;
                }
                else
                {
                    btnIndoorTemp.Text = Language.StringByID(StringId.IndoorTemp) + Convert.ToInt32(Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.RoomTemp).Replace(",", "."))) + "°C"
                                        + Language.StringByID(StringId.Humidity) + Convert.ToInt32(Convert.ToDouble(device.GetAttrState("room_humidity").Replace(", ", "."))) + "%";
                    btnMode.UnSelectedImagePath = acFunction.GetModeIconPath(device.GetAttrState(FunctionAttributeKey.Mode));
                    temp = Convert.ToInt32(Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", ".")));
                    arcBar.Progress = temp;
                    btnTemp.Text = temp.ToString();
                    if (device.trait_on_off.curValue.ToString() == "on")
                    {
                        arcBar.IsOffline = false;
                        btnSwitch.IsSelected = true;
                        arcBar.ThumbImagePath = "FunctionIcon/AC/DiyThumbIconOn.png";
                        if (device.GetAttrState(FunctionAttributeKey.Mode) == "fan")
                        {
                            arcBar.IsClickable = false;
                        }
                        else
                        {
                            arcBar.IsClickable = true;
                        }
                    }
                    else
                    {
                        arcBar.IsOffline = true;
                        btnSwitch.IsSelected = false;
                        arcBar.IsClickable = false;
                        arcBar.ThumbImagePath = "FunctionIcon/AC/DiyThumbIcon.png";
                    }
                    if (device.GetAttrState(FunctionAttributeKey.Mode) == "dry")
                    {
                        arcBar.IsOffline = true;
                        arcBar.IsClickable = false;
                    }
                }
            });
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 刷新当前设备的状态缓存
        /// </summary>
        private void RefreshNowDeviceStatuMemory(Function i_LocalDevice)
        {
        }
        #endregion
    }
}
HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/FhControlPage.cs
@@ -36,6 +36,11 @@
        /// </summary>
        Button btnMode;
        /// <summary>
        /// 工作模式按钮
        /// </summary>
        Button btnWrokMode;
        /// <summary>
        /// 开关按钮
        /// </summary>
        Button btnSwitch;
@@ -172,6 +177,25 @@
            };
            FrameWhiteCentet1.AddChidren(btnPlus);
            if (device.GetAttribute("mode_work") != null)
            {
                btnWrokMode = new Button()
                {
                    X = Application.GetRealWidth(60),
                    Y = Application.GetRealHeight(334),
                    Width = Application.GetRealWidth(30),
                    Height = Application.GetRealWidth(30),
                    UnSelectedImagePath = fhTemp.GetWrokModeIconPath(device.GetAttrState("mode_work")),
                };
                FrameWhiteCentet1.AddChidren(btnWrokMode);
                if (device.GetAttribute("mode_work").value.Count > 1)
                {
                    btnMode.MouseUpEventHandler = (sender, e) =>
                    {
                        LoadDiv_ChangeModeView();
                    };
                }
            }
            if (device.GetAttribute(FunctionAttributeKey.Mode) != null)
            {
                btnMode = new Button()
@@ -208,6 +232,135 @@
            LoadEvent_AcStatesChange();
        }
        /// <summary>
        /// 加载修改模式区域
        /// </summary>
        void LoadDiv_ChangeWorkModeView()
        {
            Dialog dialog = new Dialog();
            FrameLayout dialogView = new FrameLayout()
            {
                BackgroundColor = CSS_Color.DialogTransparentColor1,
            };
            dialog.AddChidren(dialogView);
            FrameLayout modeChangeView;
            modeChangeView = new FrameLayout()
            {
                X = Application.GetRealWidth(30),
                Y = Application.GetRealHeight(128),
                Width = Application.GetRealWidth(160),
                Height = Application.GetRealHeight(287),
                BackgroundImagePath = "FunctionIcon/AC/DivBg1.png",
            };
            dialogView.AddChidren(modeChangeView);
            Button btnTitle;
            btnTitle = new Button()
            {
                X = Application.GetRealWidth(8 + 16),
                Y = Application.GetRealHeight(8),
                Width = Application.GetRealWidth(112),
                Height = Application.GetRealHeight(44),
                TextID = StringId.ChooseMode,
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.EmphasisFontSize_Secondary,
            };
            modeChangeView.AddChidren(btnTitle);
            Button btnLine = new Button()
            {
                X = btnTitle.X,
                Y = btnTitle.Bottom,
                Width = Application.GetRealWidth(112),
                Height = Application.GetRealHeight(1),
                BackgroundColor = CSS_Color.BackgroundColor,
            };
            modeChangeView.AddChidren(btnLine);
            var modeList = device.GetAttribute(FunctionAttributeKey.WorkMode).value;
            foreach (var m in modeList)
            {
                Button btnModeIcon = new Button()
                {
                    X = btnTitle.X,
                    Y = Application.GetRealHeight(44 * (modeList.IndexOf(m) + 1) + 10 + 8),
                    Width = Application.GetRealWidth(24),
                    Height = Application.GetRealWidth(24),
                    IsSelected = device.GetAttrState(FunctionAttributeKey.WorkMode) == m,
                };
                modeChangeView.AddChidren(btnModeIcon);
                Button btnModeText = new Button()
                {
                    X = Application.GetRealWidth(12) + btnModeIcon.Right,
                    Y = Application.GetRealHeight(44 * (modeList.IndexOf(m) + 1) + 8),
                    Height = Application.GetRealHeight(44),
                    Width = Application.GetRealWidth(90),
                    TextAlignment = TextAlignment.CenterLeft,
                    TextColor = CSS_Color.FirstLevelTitleColor,
                    SelectedTextColor = CSS_Color.MainColor,
                    IsSelected = device.GetAttrState(FunctionAttributeKey.Mode) == m,
                    TextSize = CSS_FontSize.TextFontSize,
                };
                modeChangeView.AddChidren(btnModeText);
                btnModeIcon.UnSelectedImagePath = fhTemp.GetModeIconPath(m, false);
                btnModeIcon.SelectedImagePath = fhTemp.GetModeIconPath(m);
                btnModeText.Text = fhTemp.GetModeAttrText(m);
                if (modeList.IndexOf(m) < modeList.Count - 1)
                {
                    modeChangeView.AddChidren(new Button()
                    {
                        X = btnTitle.X,
                        Y = btnModeText.Bottom,
                        Width = Application.GetRealWidth(112),
                        Height = Application.GetRealHeight(1),
                        BackgroundColor = CSS_Color.BackgroundColor,
                    });
                }
                EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
                {
                    dialog.Close();
                };
                EventHandler<MouseEventArgs> eventHandler1 = (sender, e) =>
                {
                    //if (!device.online)
                    //{
                    //    new Tip()
                    //    {
                    //        CloseTime = 1,
                    //        Text = Language.StringByID(StringId.DeviceOfflineCannotOption),
                    //        Direction = AMPopTipDirection.None,
                    //    }.Show(MainPage.BaseView);
                    //}
                    btnModeIcon.IsSelected = btnModeText.IsSelected = true;
                    device.SetAttrState(FunctionAttributeKey.WorkMode, m);
                    btnMode.UnSelectedImagePath = fhTemp.GetWrokModeIconPath(m);
                    System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                    btnMode.UnSelectedImagePath = btnModeIcon.UnSelectedImagePath;
                    d.Add(FunctionAttributeKey.WorkMode, m);
                    Control.Ins.SendWriteCommand(device, d);
                    dialog.Close();
                };
                btnModeIcon.MouseUpEventHandler = eventHandler1;
                btnModeText.MouseUpEventHandler = eventHandler1;
                dialogView.MouseUpEventHandler = eventHandler;
            }
            dialogView.MouseUpEventHandler = (sender, e) => {
                dialog.Close();
            };
            dialog.Show();
        }
        /// <summary>
        /// 加载修改模式区域
@@ -523,6 +676,15 @@
                    arcBar.IsClickable = false;
                    arcBar.IsOffline = true;
                }
                if(btnWrokMode!=null){
                    var dd = device.GetAttrState("mode_work");
                    if (dd != "0")
                    {
                        btnWrokMode.UnSelectedImagePath = fhTemp.GetWrokModeIconPath(dd);
                    }
                }
            });
        }
HDL_ON/UI/UI2/FuntionControlView/AC/ACPage.cs
@@ -141,7 +141,13 @@
            //{
            //    controlView.AddChidren(btnCollection);
            //}
            //获取温度值
            var tempValue = (int)Convert.ToDouble(function.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", "."));
            if (tempValue<=0) {
                //默认值改成16,2022年06月10日10:03:19 成甫要求的
                tempValue = 16;
                function.SetAttrState(FunctionAttributeKey.SetTemp, tempValue.ToString());
            }
            arcBar = new DiyArcSeekBar()
            {
                Gravity = Gravity.CenterHorizontal,
@@ -155,7 +161,7 @@
                MaxValue = function.GetAttribute(FunctionAttributeKey.SetTemp).max,
                //IsClickable = function.trait_on_off.curValue.ToString() == "on",
                ArcColor = CSS_Color.BackgroundColor,
                Progress = (int)Convert.ToDouble(function.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",",".")),
                Progress = tempValue,
#if __IOS__
                Y = Application.GetRealHeight(120 + 25),
                Width = Application.GetRealWidth(260 - 40),
@@ -180,7 +186,7 @@
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = 50,
                IsBold = true,
                Text = Convert.ToDouble(function.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", ".")).ToString(),
                Text = Convert.ToDouble(tempValue).ToString(),
                TextAlignment = TextAlignment.Center,
            };
            controlView.AddChidren(btnTemp);
HDL_ON/UI/UI2/FuntionControlView/ChooseRoomPageBLL.cs
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using HDL_ON.Common;
using HDL_ON.DAL.Server;
using Shared;
namespace HDL_ON.UI
@@ -79,7 +81,37 @@
                function.roomIds.Remove(room.roomId);
                //room.RemoveRoomFunction(function);
            }
            function.UpdataRoomIds();
            //function.UpdataRoomIds();
            new System.Threading.Thread(() =>
            {
                try
                {
                    var pack = ApiUtlis.Ins.HttpRequest.UpdataDevcieBindRoomInfo(function);
                    //直接保存本地,
                    function.SaveFunctionFile();
                    if (pack.Code == StateCode.SUCCESS)
                    {
                        if (UI.RoomPage.bodyView != null)
                        {
                            Application.RunOnMainThread(() =>
                            {
                                UI.RoomPage.bodyView.ReLoadPage();
                            });
                        }
                    }
                    else
                    {
                        IMessageCommon.Current.ShowErrorInfoAlter(pack.Code);
                    }
                }
                catch (Exception ex){
                    MainPage.Log("房间绑定设备异常" + ex.Message);
                }
            })
            { IsBackground = true }.Start();
            if (function.roomIds.Count == Entity.SpatialInfo.CurrentSpatial.RoomList.Count)
            {
                btnChooseAll.IsSelected = true;
HDL_ON/UI/UI2/FuntionControlView/DoorLock/DoorLockPage.cs
@@ -170,7 +170,7 @@
            this.picLockControl = new PicViewControl(256, 260);
            picLockControl.Y = Application.GetRealHeight(129);
            picLockControl.Gravity = Gravity.CenterHorizontal;
            picLockControl.UnSelectedImagePath = "FunctionIcon/DoorLock/LockPictrue1.png";
            picLockControl.UnSelectedImagePath = "FunctionIcon/DoorLock/LockPictrue1.png";
            FrameWhiteCentet1.AddChidren(picLockControl);
            picLockControl.ButtonClickEvent += (sender, e) =>
            {
HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPageBLL.cs
@@ -23,7 +23,7 @@
                    bodyView.btnTemp.Text = outinTemp.ToString();
                    bodyView.btnIndoorTemp.Text = Language.StringByID(StringId.IndoorTemp) + Convert.ToInt32(Convert.ToDouble(updateTemp.GetAttrState(FunctionAttributeKey.RoomTemp).Replace(",", "."))) + "°C";
                    bodyView.btnMode.SelectedImagePath = bodyView.fhTemp.GetModeIconPath(updateTemp.GetAttrState(FunctionAttributeKey.Mode));
                    bodyView.btnMode.UnSelectedImagePath = bodyView.fhTemp.GetModeIconPath(updateTemp.GetAttrState(FunctionAttributeKey.Mode),false);
                    bodyView.btnMode.UnSelectedImagePath = bodyView.fhTemp.GetModeIconPath(updateTemp.GetAttrState(FunctionAttributeKey.Mode), false);
                    bodyView.arcBar.Progress = outinTemp;
                    //if (updateTemp.trait_on_off.curValue.ToString() == "on")
                    //{
@@ -73,15 +73,16 @@
                        bodyView.arcBar.IsClickable = false;
                        bodyView.arcBar.ThumbImagePath = "FunctionIcon/AC/DiyThumbIcon.png";
                    }
                    //自动模式不允许调温度 2021-10-27 09:41:35 wxr 陈琳反馈
                    if (updateTemp.GetAttrState(FunctionAttributeKey.Mode) == "auto"|| updateTemp.GetAttrState(FunctionAttributeKey.Mode) == "timer")
                    {
                        bodyView.btnPlus.Enable = false;
                        bodyView.btnMinus.Enable = false;
                        bodyView.arcBar.IsClickable = false;
                        bodyView.arcBar.IsOffline = true;
                    }
                    ////自动模式不允许调温度 2021-10-27 09:41:35 wxr 陈琳反馈
                    //if (updateTemp.GetAttrState(FunctionAttributeKey.Mode) == "auto" || updateTemp.GetAttrState(FunctionAttributeKey.Mode) == "timer")
                    //{
                    //    bodyView.btnPlus.Enable = false;
                    //    bodyView.btnMinus.Enable = false;
                    //    bodyView.arcBar.IsClickable = false;
                    //    bodyView.arcBar.IsOffline = true;
                    //}
                    //更新不同界面状态 2022年06月09日19:22:55 wjc 修改
                    bodyView.updateStatusPage();
                });
            }
            catch (Exception ex)
@@ -102,14 +103,17 @@
                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
                //function.SaveFunctionData(true);
            };
            //自动模式不允许调温度 2021-10-27 09:41:35 wxr 陈琳反馈
            if (function.GetAttrState(FunctionAttributeKey.Mode) == "auto" || function.GetAttrState(FunctionAttributeKey.Mode) == "timer")
            {
                btnPlus.Enable = false;
                btnMinus.Enable = false;
                arcBar.IsClickable = false;
                arcBar.IsOffline = true;
            }
            ////自动模式不允许调温度 2021-10-27 09:41:35 wxr 陈琳反馈
            //if (function.GetAttrState(FunctionAttributeKey.Mode) == "auto" || function.GetAttrState(FunctionAttributeKey.Mode) == "timer")
            //{
            //    btnPlus.Enable = false;
            //    btnMinus.Enable = false;
            //    arcBar.IsClickable = false;
            //    arcBar.IsOffline = true;
            //}
            //初始化不同界面状态 2022年06月09日19:22:55 wjc 修改
            this.updateStatusPage();
        }
        /// <summary>
@@ -141,7 +145,7 @@
            }
            btnMinus.MouseUpEventHandler = (sender, e) =>
            {
                if(function.trait_on_off.curValue.ToString() == "off")
                if (function.trait_on_off.curValue.ToString() == "off")
                {
                    return;
                }
@@ -166,7 +170,7 @@
                {
                    return;
                }
                var temp =(int) Convert.ToDouble(function.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", "."));
                var temp = (int)Convert.ToDouble(function.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", "."));
                if (temp >= Convert.ToDouble(function.GetAttribute(FunctionAttributeKey.SetTemp).max))
                {
                    return;
@@ -182,7 +186,7 @@
            };
            arcBar.OnStopTrackingTouchEvent = (sender, e) =>
            {
                function.SetAttrState(FunctionAttributeKey.SetTemp,arcBar.Progress);
                function.SetAttrState(FunctionAttributeKey.SetTemp, arcBar.Progress);
                btnTemp.Text = arcBar.Progress.ToString();
                System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                d.Add(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString());
@@ -191,7 +195,7 @@
            arcBar.OnProgressChangedEvent = (sender, e) =>
            {
                function.SetAttrState(FunctionAttributeKey.SetTemp, e);
                btnTemp.Text = Convert.ToDouble( function.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", ".")).ToString();
                btnTemp.Text = Convert.ToDouble(function.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", ".")).ToString();
            };
        }
        /// <summary>
@@ -229,7 +233,7 @@
                System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
                Control.Ins.SendWriteCommand(function, d);
            };
        }
@@ -246,7 +250,7 @@
            EventHandler<MouseEventArgs> eventHandler1 = (sender, e) =>
            {
                btn1.IsSelected = btn2.IsSelected = true;
                function.SetAttrState(FunctionAttributeKey.Mode,curMode);
                function.SetAttrState(FunctionAttributeKey.Mode, curMode);
                btnMode.UnSelectedImagePath = btn1.SelectedImagePath;
                //byte pro = 6;//不处理温度显示,等待回复数据再处理
                //function.Fh_Mode_Temp.TryGetValue(curMode, out pro);
@@ -260,5 +264,37 @@
            btn2.MouseUpEventHandler = eventHandler1;
            dialogView.MouseUpEventHandler = eventHandler;
        }
        /// <summary>
        /// 更新不同界面状态
        /// </summary>
       private void updateStatusPage()
        {
            btnPlus.Enable = true;
            btnMinus.Enable = true;
            arcBar.IsClickable = true;
            arcBar.IsOffline = false;
            switch (getModeValue)
            {
                case "auto"://自动
                case "timer"://
                    btnPlus.Enable = false;
                    btnMinus.Enable = false;
                    arcBar.IsClickable = false;
                    arcBar.IsOffline = true;
                    break;
            }
        }
        /// <summary>
        /// 获取模式value值
        /// </summary>
        private string getModeValue
        {
            get
            {
                return function.GetAttrState(FunctionAttributeKey.Mode);
            }
        }
    }
}
HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPageBLL.cs
@@ -112,36 +112,35 @@
                dimmerBar.OnProgressChangedEvent = (sender, e) =>
                {
                   
                //function.fadeTime = 0;
                //if (!btnSwitch.IsSelected)
                //{
                //    dimmerBar.SetProgressBarColors(CSS_Color.AuxiliaryColor1, CSS_Color.AuxiliaryColor1);
                //}
                //btnSwitch.IsSelected = e > 0 ? true : false;
                //function.brightness = e;
                //function.trait_on_off.curValue = e > 0 ? "on" : "off";
                //if (e == 0 || e == 100)
                //{
                //    //Control.Send(CommandType_A.write, this.function);
                //    System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                //    d.Add(FunctionAttributeKey.Brightness, function.brightness.ToString());
                //    Control.Ins.SendWriteCommand(function, d);
                //}
                //else
                //{
                //    if (200 < (DateTime.Now - function.refreshTime).TotalMilliseconds)
                //    {
                //        function.refreshTime = DateTime.Now;
                //        new System.Threading.Thread(() =>
                //        {
                //            System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                //            d.Add(FunctionAttributeKey.Brightness, function.brightness.ToString());
                //            Control.Ins.SendWriteCommand(function, d);
                //        })
                //        { IsBackground = true }.Start();
                //    }
                //}
                btnBrightnessText.Y = ((100 - dimmerBar.Progress) * Application.GetRealHeight(288 - 16 - 16) / 100) + Application.GetRealWidth(40);
                    if (!btnSwitch.IsSelected)
                    {
                        dimmerBar.SetProgressBarColors(CSS_Color.AuxiliaryColor1, CSS_Color.AuxiliaryColor1);
                    }
                    btnSwitch.IsSelected = e > 0 ? true : false;
                    function.SetAttrState(FunctionAttributeKey.Brightness, e);
                    function.trait_on_off.curValue = e > 0 ? "on" : "off";
                    if (e == 0 || e == 100)
                    {
                        //Control.Send(CommandType_A.write, this.function);
                        System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                        d.Add(FunctionAttributeKey.Brightness, e.ToString());
                        Control.Ins.SendWriteCommand(function, d);
                    }
                    else
                    {
                        if (500 < (DateTime.Now - function.refreshTime).TotalMilliseconds)
                        {
                            function.refreshTime = DateTime.Now;
                            new System.Threading.Thread(() =>
                            {
                                System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                                d.Add(FunctionAttributeKey.Brightness, e.ToString());
                                Control.Ins.SendWriteCommand(function, d);
                            })
                            { IsBackground = true }.Start();
                        }
                    }
                    btnBrightnessText.Y = ((100 - dimmerBar.Progress) * Application.GetRealHeight(288 - 16 - 16) / 100) + Application.GetRealWidth(40);
                    btnBrightnessText.Text = dimmerBar.Progress + "%";
                };
            }
HDL_ON/UI/UI2/FuntionControlView/Light/RelayPageBLL.cs
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using HDL_ON.Entity;
using Shared;
@@ -76,7 +77,7 @@
                new System.Threading.Thread(() =>
                {
                    function.trait_on_off.curValue = btnSwitchIcon.IsSelected ? "on" : "off";
                    System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                    Dictionary<string, string> d = new Dictionary<string, string>();
                    d.Add("on_off", function.trait_on_off.curValue.ToString());
                    DriverLayer.Control.Ins.SendWriteCommand(function, d);
                })
HDL_ON/UI/UI2/FuntionControlView/Music/A31MusicModel.cs
@@ -53,7 +53,7 @@
     
        /// <summary>
        /// 上一次更新的时间
        /// 记录数据反馈的时间(因为有时间网络差数据不回复,导致刷新当前播放音乐时间不正确)
        /// 记录数据反馈的时间(因为有时候网络差数据不回复,导致刷新当前播放音乐时间不正确)
        /// ((当前时间)DateTime.Now - (记录时间)LastDateTimeLastDateTime).TotalSeconds=误差时间(秒)
        /// </summary>
        public DateTime LastDateTime;
HDL_ON/UI/UI2/FuntionControlView/Music/A31PlayMusicPage.cs
@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Security;
using HDL_ON.UI.UI2.FuntionControlView.Music;
using HDL_ON.Entity;
namespace HDL_ON.UI.Music
{
@@ -38,8 +39,6 @@
        /// </summary>
        View.PlayView playView = new View.PlayView();
        TopView topView;
        public void Show()
        {
@@ -90,32 +89,63 @@
            ///切换播放模式点击事件;
            playView.playOrderBtn.MouseUpEventHandler += (sender, e) =>
             {
                 string modeValueString = string.Empty;
                 string msg = Language.StringByID(StringId.switchTo);
                 switch (A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.mode))
                 //获取当前播放模式
                 string currModeKeyValue = A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.mode);
                 //获取音乐播放模式列表
                 var attributes = A31MusicModel.Current.functionMusic.GetAttribute(KeyProperty.mode);
                 if (attributes == null)
                 {
                     attributes = new FunctionAttributes();
                 }
                 var attributesList = attributes.value;
                 //找到当前播放模式索引值
                 int currModeIndexe = attributesList.IndexOf(currModeKeyValue);
                 //记录选中的播放模式的索引值
                 int count = 0;
                 if (currModeIndexe >= attributesList.Count - 1)
                 {
                     //重置索引值
                     count = 0;
                 }
                 else
                 {
                     count = currModeIndexe + 1;
                 }
                 //通过索引值找到模式value值
                 string modeValueString = attributesList[count];
                 switch (modeValueString)
                 {
                     //list_cycle列表循环,single_cycle单曲循环,random随机播放;
                     case ValueProperty.list_cycle:
                         modeValueString=ValueProperty.single_cycle;
                         playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/single.png";
                         msg += Language.StringByID(StringId.singleMode);
                         break;
                     case ValueProperty.single_cycle:
                         modeValueString =ValueProperty.random;
                         playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/random.png";
                         msg += Language.StringByID(StringId.randomMode);
                         break;
                     case ValueProperty.random:
                         modeValueString = ValueProperty.list_cycle;
                         playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/list.png";
                         msg += Language.StringByID(StringId.listMode);
                         break;
                     case ValueProperty.single_cycle:
                         playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/single_cycle.png";
                         msg += Language.StringByID(StringId.singleCycleMode);
                         break;
                     case ValueProperty.random:
                         playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/random.png";
                         msg += Language.StringByID(StringId.randomMode);
                         break;
                     case ValueProperty.single:
                         playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/single.png";
                         msg += Language.StringByID(StringId.single);
                         break;
                     case ValueProperty.order:
                         playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/order.png";
                         msg += Language.StringByID(StringId.orderMode);
                         break;
                 }
                 //写入缓存
                 A31MusicModel.Current.functionMusic.SetAttrState(KeyProperty.mode, modeValueString);
                 new PublicAssmebly().TipMsgAutoClose(msg, false,1000);
                 new PublicAssmebly().TipMsgAutoClose(msg, false, 1000);
                 Dictionary<string, string> dic = new Dictionary<string, string>();
                 dic.Add(KeyProperty.mode,modeValueString);
                 SendMethod.mMethod.SendControlCommand(A31MusicModel.Current.functionMusic,dic);
                 dic.Add(KeyProperty.mode, modeValueString);
                 //发送控制指令
                 SendMethod.mMethod.SendControlCommand(A31MusicModel.Current.functionMusic, dic);
             };
            ///添加喜爱点击事件;
            playView.loveBtn.MouseUpEventHandler += (sender, e) =>
@@ -182,7 +212,7 @@
                        }
                    });
                    //结束刷新
                };
                ///移除界面
                EventHandler<MouseEventArgs> removeFromParentView = (sen, e1) =>
@@ -203,16 +233,18 @@
            ///音量图标点击事件
            playView.volIconBtn.MouseUpEventHandler += (sender, e) =>
            {
            };
            ///音量进度条点击事件
            int startVolume =0;//之前的音量
            int startVolume = 0;//之前的音量
            //int endVolume = 0;//现在的音量
            EventHandler<int> progressClick = (sender, e) =>
            {
                playView.volValueBtn.Text = playView.volSeekBar.Progress + "%";
                if (startVolume != e)
                {
                    ///更新最新值
                    A31MusicModel.ProgressDateTime = DateTime.Now;
                    startVolume = e;
                    A31MusicModel.Current.functionMusic.SetAttrState(KeyProperty.volume, startVolume);
                    Dictionary<string, string> dic = new Dictionary<string, string>();
@@ -228,7 +260,7 @@
            {
                playView.prevBtn.IsSelected = true;
                A31MusicModel.Current.functionMusic.SetAttrState(KeyProperty.song_step,ValueProperty.down);
                A31MusicModel.Current.functionMusic.SetAttrState(KeyProperty.song_step, ValueProperty.down);
                Dictionary<string, string> dic = new Dictionary<string, string>();
                dic.Add(KeyProperty.song_step, ValueProperty.up);
                SendMethod.mMethod.SendControlCommand(A31MusicModel.Current.functionMusic, dic);
@@ -237,7 +269,7 @@
            playView.prevBtn.MouseUpEventHandler += (sender, e) =>
            {
                playView.prevBtn.IsSelected = false;
            };
            };
            ///暂停/播放点击事件
            playView.playBtn.MouseDownEventHandler += (sender, e) =>
            {
@@ -245,7 +277,8 @@
                if (playView.playBtn.IsSelected)
                {
                    playView.playBtn.IsSelected = false;
                    status = ValueProperty.off;
                    status = ValueProperty.off;
                }
                else
                {
@@ -261,7 +294,7 @@
            playView.nextBtn.MouseDownEventHandler += (sender, e) =>
            {
                playView.nextBtn.IsSelected = true;
                A31MusicModel.Current.functionMusic.SetAttrState(KeyProperty.song_step,ValueProperty.down);
                A31MusicModel.Current.functionMusic.SetAttrState(KeyProperty.song_step, ValueProperty.down);
                Dictionary<string, string> dic = new Dictionary<string, string>();
                dic.Add(KeyProperty.song_step, ValueProperty.down);
                SendMethod.mMethod.SendControlCommand(A31MusicModel.Current.functionMusic, dic);
@@ -313,22 +346,29 @@
                            int totalMusicMinute = totalSecond / 60;
                            //秒钟
                            int totalMusicSecond = totalSecond % 60;
                            //转化歌曲总时间时间格式
                            string totalTime = (totalMusicMinute.ToString().Length < 2 ? "0" + totalMusicMinute.ToString() : totalMusicMinute.ToString()) + ":" + (totalMusicSecond.ToString().Length < 2 ? "0" + totalMusicSecond.ToString() : totalMusicSecond.ToString());
                            //显示总时间
                            playView.endTimeBtn.Text = totalTime;
                            //显示播放器名称
                            topView.topNameBtn.Text = A31MusicModel.Current.functionMusic.name;
                            string s = A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.mode);
                            //显示播放模式图标
                            switch (A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.mode))
                            {
                                case ValueProperty.list_cycle://列表循环
                                    playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/list.png";
                                    break;
                                case ValueProperty.single_cycle://单曲循环
                                    playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/single.png";
                                    playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/single_cycle.png";
                                    break;
                                case ValueProperty.random://随机播放
                                    playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/random.png";
                                    break;
                                case ValueProperty.single:// 单曲<single>
                                    playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/single.png";
                                    break;
                                case ValueProperty.order://循序循环
                                    playView.playOrderBtn.UnSelectedImagePath = "MusicIcon/order.png";
                                    break;
                            }
@@ -363,13 +403,17 @@
                            //        playView.loveBtn.IsSelected = false;
                            //    }
                            //}
                            //显示播放器区域
                            playView.regionBtn.Text = A31MusicModel.Current.functionMusic.GetRoomListName();
                            //显示播放器收藏状态
                            if (A31MusicModel.Current.functionMusic.collect)
                            {
                                //收藏
                                playView.collectIconBtn.IsSelected = true;
                            }
                            else
                            {
                                //不收藏
                                playView.collectIconBtn.IsSelected = false;
                            }
                            //if (A31MusicModel.Current.A31PlayStatus.IsMute)
@@ -388,54 +432,75 @@
                            //        playView.volValueBtn.Text = A31MusicModel.Current.A31PlayStatus.vol + "%";
                            //    }
                            //}
                            if (1000 < (DateTime.Now - A31MusicModel.ProgressDateTime).TotalMilliseconds)
                            //为了防止音量条跳动,延长更新时间(多加1s)
                            if (2000 < (DateTime.Now - A31MusicModel.ProgressDateTime).TotalMilliseconds || A31MusicModel.ProgressDateTime == DateTime.MinValue)
                            {
                                //音量进度条;
                                //显示音量进度条值;
                                playView.volSeekBar.Progress = int.Parse(A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.volume));
                                //显示当前音量值;
                                playView.volValueBtn.Text = A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.volume) + "%";
                            }
                            //更新播放器音量给系统音量
                            Volume.MusicVolume = playView.volSeekBar.Progress;
                            //Volume.MusicVolume = playView.volSeekBar.Progress;
                            //当前播放音乐时间
                            //按道理不会为空,GetAttrState("playing_time")值可能为空,强制转换int.Parse()会出现异常,不过也做了异常处理了
                            int playSecond = int.Parse(A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.playing_time))+ (int)(DateTime.Now - A31MusicModel.Current.LastDateTime).TotalSeconds;
                            int playSecond = int.Parse(A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.playing_time));
                            //识别音乐状态是否在播放状态
                            if (A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.on_off) == ValueProperty.on)
                            {
                                //音乐在播放时,再计算播放时间(现在时间=原来时间+1秒)
                                playSecond += (int)(DateTime.Now - A31MusicModel.Current.LastDateTime).TotalSeconds;
                                playSecond += 1;//表示加上等待的时间1s
                                ///歌曲记录暂时时间写入缓存;
                                A31MusicModel.Current.functionMusic.SetAttrState(KeyProperty.playing_time, playSecond);
                            }
                            if (playSecond <= 0)
                            {
                                ///播放时间不能小于0;
                                playSecond = 0;
                            }
                            if (playSecond >= totalSecond)
                            {
                                ///播放时间不能超过总时间;
                                playSecond = totalSecond;
                            }
                            int playMusicMinute = playSecond / 60;
                            //秒钟
                            int playMusicSecond = playSecond % 60;
                            //转化播放时间时间格式
                            string playTime = (playMusicMinute.ToString().Length < 2 ? "0" + playMusicMinute.ToString() : playMusicMinute.ToString()) + ":" + (playMusicSecond.ToString().Length < 2 ? "0" + playMusicSecond.ToString() : playMusicSecond.ToString());
                            //显示播放时间
                            playView.startTimeBtn.Text = playTime;
                            //显示播放状态
                            if (A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.on_off) == ValueProperty.on)
                            {
                                //播放
                                playView.playBtn.IsSelected = true;
                                //如果在播放,时间就不断变化
                                playView.startTimeBtn.Text = playTime;
                                if (totalSecond == 0)
                                {
                                    //歌曲进度条
                                    playView.diyArcSeekBar.Progress = 0;
                                }
                                else
                                {
                                    //歌曲进度条
                                    playView.diyArcSeekBar.Progress = (int)(playSecond * 100.0 / totalSecond);//+1
                                }
                            }
                            else
                            {
                                //暂停
                                playView.playBtn.IsSelected = false;
                                //停止播放
                                playView.startTimeBtn.Text =playTime;
                                ///记录歌曲暂停时间;<LastDateTime 计算播放时间有用到>
                                A31MusicModel.Current.LastDateTime = DateTime.Now;
                            }
                            //显示进度条值
                            if (totalSecond == 0)
                            {
                                //歌曲播放进度
                                playView.diyArcSeekBar.Progress = 0;
                            }
                            else
                            {
                                //歌曲播放进度
                                playView.diyArcSeekBar.Progress = (int)(playSecond * 100.0 / totalSecond);//+1
                            }
                            //显示歌曲名称
                            playView.songNameTextView.Text = A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.song_name) == null ? "Unkown" : A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.song_name);
                            //显示歌手名称
                            playView.singerBtn.Text = A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.song_name) == null ? "Unkown" : A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.song_name);
                            //更新源的界面
                           // showSourcePage();
                            // showSourcePage();
                        }
                        catch (Exception e)
                        {
@@ -535,7 +600,9 @@
        void PlayListView(FrameLayout frameLayout, VerticalRefreshLayout verticalScrolViewLayout)
        {
            verticalScrolViewLayout.RemoveAll();
            //获取播放器名称
            var listName = A31MusicModel.Current.functionMusic.GetAttrState(KeyProperty.playlist_name);
            //获取缓存歌曲列表
            var musicList = A31MusicModel.Current.GetSongList(listName);
            if (musicList.Count == 0)
            {
@@ -546,6 +613,7 @@
                        A31MusicModel.Current.palyLists.Clear();
                        if (A31MusicModel.Current.palyLists.Count == 0)
                        {
                            //获取歌曲列表
                            SendMethod.mMethod.GetPalyList(A31MusicModel.Current.functionMusic);
                        }
@@ -575,8 +643,5 @@
        {
            UpdateThread.updateCurrMusicThread(frameLayout, middViewLayout, A31MusicModel.Current);
        }
    }
}
HDL_ON/UI/UI2/FuntionControlView/Music/MusicMain.cs
@@ -122,10 +122,10 @@
                var musicListFunction = FunctionList.List.GetMusicList();
                for (int i = 0; i < musicListFunction.Count; i++)
                {
                    var function = musicListFunction[i];
                    var function = musicListFunction[i];
                    var music = A31MusicModel.A31MusicModelList.Find((obj) =>
                   (obj.functionMusic.deviceId == function.deviceId && function.spk == "music.standard") || (
                     obj.functionMusic.deviceId == function.deviceId && function.spk == "av.music")
                   (obj.functionMusic.deviceId == function.deviceId && function.spk == SPK.MusicStandard) || (
                     obj.functionMusic.deviceId == function.deviceId && function.spk == SPK.AvMusic)
                    );
                    if (music == null)
                    {
HDL_ON/UI/UI2/FuntionControlView/Music/SendMethod.cs
@@ -44,7 +44,7 @@
        {
            new System.Threading.Thread(() =>
            {
                DriverLayer.Control.Ins.SendWriteCommand(function, dic);
                DriverLayer.Control.Ins.SendWriteCommand(function, dic,false,0);
            })
            { IsBackground = true }.Start();
        }
HDL_ON/UI/UI2/FuntionControlView/Music/View/MyListView.cs
@@ -102,7 +102,7 @@
                case ValueProperty.single_cycle:
                    orderIconBtn.UnSelectedImagePath = "MusicIcon/single.png";
                    orderTxetBtn.Text = Language.StringByID(StringId.singleMode);
                    orderTxetBtn.Text = Language.StringByID(StringId.singleCycleMode);
                    break;
                case ValueProperty.random: