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.pngHDL-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.pngHDL-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: