====== LYWSD03MMC ====== Sensor de temperatura y humedad. {{ :informatica:domotica:lywsd03mmc.jpg?400 |}} * Pantalla LCD * Batería 2032 * Chip TLSR8258 * Conectividad Bluetooth BLE (//Bluetooth Low Energy//) Los datos que publica el sensor están cifrados. Los datos de temperatura y humedad se publican cada 10 minutos y la batería una vez cada hora. Solo permite lecturas por Bluetooth cuando un dispositivo se conecta a él, es decir, el sensor no está continuamente publicando sus datos. Una vez conectados al sensor, no permitirá que se establezca otras conexiones. Una vez conectados al sensor, enviará los datos cada 6 segundos (10 lecturas de temperatura y humedad por minuto). ===== Lectura ===== Hay dos formas de obtener información del sensor: * Conectándonos a él. * Leyendo la información que emite automáticamente. ==== Conexión ==== * https://github.com/JsBergbau/MiTemperature2 En Arch Linux instalamos: * ''python-pip'' * ''bluez'' Una vez instalado pip, instalamos el módulo ''bluepy'': pip3 install bluepy Y ahora usamos el script: python LYWSD03MMC.py -d AA:BB:CC:00:11:22 -r -b 3 Ejemplo de salida: $ python LYWSD03MMC.py -d AA:BB:CC:00:11:22 -r -b 3 Trying to connect to A4:C1:38:8E:1E:AC Temperature: 24.2 Humidity: 66 Battery voltage: 3.21 Battery level: 100 Temperature: 24.2 Humidity: 65 Battery voltage: 3.21 Battery level: 100 Temperature: 24.2 Humidity: 65 Battery voltage: 3.21 Battery level: 100 * ''r'': redondear el valor de la temperatura a un decimal * ''b'': obtener nivel estimado de batería Si solo queremos hacer 1 lectura, utilizaremos la opción ''c'' (o ''count''): $ python LYWSD03MMC.py -d AA:BB:CC:00:11:22 -r -b 3 -c 1 Trying to connect to AA:BB:CC:00:11:22 Temperature: 25.2 Humidity: 64 Battery voltage: 3.21 Battery level: 100 1 measurements collected. Exiting in a moment. También podemos definir un número máximo de intentos de conexión con ''unreachable-count'': $ python LYWSD03MMC.py -d AA:BB:CC:00:11:22 -r -b 3 -c 1 --unreachable-count 3 Trying to connect to AA:BB:CC:00:11:22 Connection lost Waiting... Trying to connect to AA:BB:CC:00:11:22 Connection lost Waiting... Trying to connect to AA:BB:CC:00:11:22 Connection lost Maximum numbers of unsuccessful connections reaches, exiting === Varios sensores === Si tenemos más de un sensor y queremos obtener la lectura de cada uno de ellos, el script de Python solo permite obtener la lectura de una dispositivo a la vez, así que una posible solución sería llamar al script con la dirección de cada uno de los sensores en serie. Almacenamos en un fichero las MAC de cada sensor: AA:BB:CC:00:11:11 AA:BB:CC:00:11:22 AA:BB:CC:00:11:33 AA:BB:CC:00:11:44 Y ejecutamos: cat addresses.txt | awk {'print $1'} | xargs -I {} python3 LYWSD03MMC.py -d {} -r -b 3 -c 1 --unreachable-count 5 === Manual === $ btgatt-client -d AA:BB:CC:00:11:22 -v btgatt-client: Opening L2CAP LE connection on ATT channel: src: 00:00:00:00:00:00 dest: AA:BB:CC:00:11:22 Connecting to device... Done Los UUID son los servicios disponibles en el dispositivo BLE [GATT client]# Service Added - UUID: 00001800-0000-1000-8000-00805f9b34fb start: 0x0001 end: 0x0007 [GATT client]# Service Added - UUID: 00001801-0000-1000-8000-00805f9b34fb start: 0x0008 end: 0x000b [GATT client]# Service Added - UUID: 0000180a-0000-1000-8000-00805f9b34fb start: 0x000c end: 0x0018 [GATT client]# Service Added - UUID: 0000180f-0000-1000-8000-00805f9b34fb start: 0x0019 end: 0x001c [GATT client]# Service Added - UUID: 00010203-0405-0607-0809-0a0b0c0d1912 start: 0x001d end: 0x0020 [GATT client]# Service Added - UUID: ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6 start: 0x0021 end: 0x004b [GATT client]# Service Added - UUID: 0000fe95-0000-1000-8000-00805f9b34fb start: 0x004c end: 0x005f [GATT client]# Service Added - UUID: 00000100-0065-6c62-2e74-6f696d2e696d start: 0x0060 end: 0x0068 [GATT client]# GATT discovery procedures complete Los //handles// son los puntos de conexión donde se puede leer y escribir datos. Por ejemplo, el sensor puede tener un //handle// para acceder al nivel de batería y otro para activar alguna opción. Generic Attribute Protocol (GATT) determina cómo dos dispositivos BLE intercambian información utilizando los conceptos //service// y //characteristic//. Este protocolo almacena //service// y //characteristic// en una tabla utilizando IDs de 16 bits * //services//: contenedor de //characteristics//. Cada servicio tiene un UUID (//universally unique identifier//). https://www.bluetooth.com/specifications/gatt/services/ * //characteristics//: contienen un solo punto de datos. Cada característica tiene un UUID. https://www.bluetooth.com/specifications/gatt/characteristics/ Para leer los datos de temperatura y humedad del sensor: * Servicio: ''ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6'' * Característica: ''ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6'' Ejemplo para el valor: ''89-09-41-00-0c'' El tercer elemento es la humedad (41 -> 65 % en decimal) El primer elemento son los decimales de humedad y el segundo los grados, así que en lugar de leerlo como ''0x8909'', tendríamos que hacer ''0x0989'' que es lo mismo que 2441 en decimal y si lo separamos: 24,41 ºC ==== Leer publicación ==== Es necesario obtener //bind key// Lo más rápido es desde un móvil Android ir a la web https://atc1441.github.io/TelinkFlasher.html - Activar Bluetooth del móvil - Estar cerca del sensor - Pulsar en //Connect// y esperar que abajo, en el log, aparezca //Connected// - Pulsar en **Do activation** Si todo ha ido bien, veremos el **Mi Token** y la **Mi Bind Key**: Status: Connected, you can now Do the Activation to either get the Token or flash a new Firmware Temp/Humi: 25.3°C / 66% Device known id: Mi Token: 69cafd4b9d563c9c36c55a6e Mi Bind Key: 68fe0308f566cf774875cc9bf703afc5 When doing an activation here the device is needed to be activated in the Mi app again when wanted to use there. * https://community.home-assistant.io/t/xiaomi-passive-ble-monitor-sensor-platform/177352/407 ===== Conectividad Zigbee ===== El chip que integra este sensor (TLSR8258) no solo soporta Bluetooth sino también Zigbee, pero el firmware oficial de Xiaomi no lo utiliza. Empleando un [[https://github.com/devbis/z03mmc|firmware personalizado]] (//custom firmware//) podemos utilizar Zigbee. Pasos: * Activar características experimentales en Google Chrome, Opera o Edge. * En Google Chrome abriendo ''chrome:%%//%%flags/#enable-experimental-web-platform-features'' * Abrir la herramienta https://devbis.github.io/telink-zigbee/ * Pulsar en "Connect" y buscar el dispositivo ''LYWSD03MMC''. Esperar para conexión (//Connected// en los registros) * Si el termómetro tiene el firmware oficial, pulsar en "Do Activation" y esperar. * Pulsar en "Select Firmware" para elegir el firmware de transición ''ATC_ota_400000''. Pulsar **Start Flashing**. Este paso es obligatorio incluso si ya está instalado un firmware personalizado. Si no lo hacemos, es posible que el dispositivo quede inutilizado y haga falta hacer el flash mediante USB/UART. * Al terminar, veremos en los registros //Update done after XX.YYY seconds// * El dispositivo se desconectará del equipo * Conectamos el dispositivo de nuevo (con nombre ''ATC_802190'' o similar, según sus últimos 6 dígitos de la MAC). Si no aparece, quitar la batería, volver a introducirla y actualizar la web con la herramienta de flash. * Pulsar en **Select Firmware** para //flashear// el último ''z03mmc.bin'' sobre el firmware de transición para convertirlo a Zigbee. Durante el proceso, la pantalla del sensor no mostrará información. * Al terminar, veremos en los registros //Update done after XX.YYY seconds// y se desconectará. A partir de este momento, el dispositivo debería ahora mostrarse en nuestro bridge Zigbee (si tiene habilitado el //joining// de dispositivos). Si no, reinserta la batería y/o haz cortocircuito en los contactos RESET y GO de la placa durante 3 segundos. Mi Token: 6296fa46f3e8dc36a5682903 Mi Bind Key: be92519d5c8e438274c55e994986fd31 ====== Recursos ====== * http://www.d0wn.com/using-bash-and-gatttool-to-get-readings-from-xiaomi-mijia-lywsd03mmc-temperature-humidity-sensor/ * https://github.com/custom-components/sensor.mitemp_bt#encryptors * https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp * https://github.com/custom-components/sensor.mitemp_bt/issues/7#issuecomment-595874419 * https://github.com/atc1441/ATC_MiThermometer * https://github.com/JsBergbau/MiTemperature2/issues/1 * https://github.com/custom-components/sensor.mitemp_bt/blob/master/faq.md#my-sensors-ble-advertisements-are-encrypted-how-can-i-get-the-key * [[https://smarthomescene.com/guides/convert-xiaomi-lywsd03mmc-from-bluetooth-to-zigbee/|Convert Xiaomi LYWSD03MMC From Bluetooth to Zigbee]]