====== 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]]