30/10/2024
202410300800 iot prises meross python
Alors que je baguenaudais sur un site de vente en ligne à une période propice à moultes réductions et dans un énième moment d'égarement j'ai fait l'acquisition de "prises connectées". Par 'égarement' j'entends qu'aucune recherche préalable de compatibilité avec mon environnement n'a été faite et que le besoin à ce moment était loin d'être justifié. Bref, j'ai craqué.
Le matos
Lot de 2 prises Meross MSS305ZF Smart Wi-Fi Plug 16A
Première impression
Autant le dire tout de suite: port série, Tasmota, firmware alternatif et autres bidouilleries ne seront pas de la partie. Et comme ce genre de bestiole s'accompagne toujours d'une application pour débilophone, l'oubli au fond du tiroir 'okazou' semblait être la destinée finale de cet achat compulsif. Après quelques (tardives) recherches, je m'aperçois que tout n'est pas perdu.
Configuration initiale
Je ne suis pas spécialiste de ce genre de gadget mais la séquence suivante me semble la façon usuelle de procéder:
- installer une application sur le débilophone
- dire au revoir à sa vie privée
- brancher l'appareil
- passer l'appareil en mode "comment c'est-y que j'me connecte à la wifi pour tout balancer dans le claoude" (sic)
- pousser l'accès au réseau sans fil à l'aide de l'application
- dire au revoir à sa vie privée (bis)
Problème: mon débilophone est un Samsung S9 sous LineageOS (ce qui le rend tout de suite un peu moins con) qui n'a pas accès aux magasins d'applications.
Solution: Grâces soient rendues à Fabi019 et l'apk qu'il met à disposition depuis https://github.com/Fabi019/MerossBLE et qui s'installe sans problème. 2 minutes plus tard, une première prise est connectée. Le truc à retenir qui servira plus tard: la valeur du champ 'Key' du cartouche '1. Server Configuration' .
Faire mumuse
Je n'ai pas (encore ?) de solution domotique, j'ai vaguement lancé un serveur mqtt (la prise envoie bien des données dessus) mais ce qui m'intérresse c'est d'interagir directement avec la prise. Pour se faire j'ai trouvé des projets en go, nodejs et python. Comme chacun sait, le plus important c'est la doc. Et la doc, pour mon cas, elle est là: https://github.com/arandall/meross/blob/main/doc/protocol.md .
Le protocole n'est pas très compliqué et consiste à l'envoi d'un JSON à une url fixe. J'ai longtemps buté sur un élément:
sign == Signing value equal to md5(messageId + key + timestamp)
car, de ce que j'avais lu, cette 'key' semblait être fournie après l'ouverture d'un compte chez meross. J'ai finalement compris que je pouvais fixer cette valeur depuis l'application du débilophone, comme vu un peu plus haut (le truc à retenir).
Je me suis fendu de quelques lignes de python (car on n'est jamais aussi bien servi que par soi-même et non c'est pas du nih) et je peux désormais contrôler mes prises depuis la VM FreeBSD de ma Freebox Delta.
Reste à faire
La prise en mode "appairage" propose un point d'accès wifi à partir duquel il est possible de pousser la configuration. Je n'ai pas encore testé cette possibilité. Le point d'accès auquel se connectent les prises ne propose pas d'ipv6 et je ne trouve pas trace des adresses MAC des prises dans mon voisinage ipv6. Je pense qu'on peut faire des trucs rigolos avec les '.TriggerX' . Quant à 'Appliance.Control.Upgrade', si bucket-meross-static.meross.com existe, je n'ai pas encore trouvé le moyen d'obtenir le chemin vers une éventuelle mise à jour du firmware.
Conclusion
Est-ce que je regrette mon achat ? Non. Est-ce que je vais surveiller ma consommation électrique afin de la faire baisser ? Je ne crois pas. Est-ce que je vais faire du mqtt ? Je ne sais pas. Est-ce que je vais finir par installer une solution de domotique ? J'en doute mais si j'ai bien compris c'est un engrenage. Et comme j'ai aussi 2 prises 'Amazon smart plug', le mal est peut-être déjà fait.
Commentaires: https://github.com/bsdsx/blog_posts/issues/21
16/04/2022
202204160800 esp8266 python
esp8266 et MicroPython
Il y a déjà plusieurs mois, au détour d'une commande de composants électronique, j'avais ajouté dans mon panier un choupi bouzin àpacher qui non seulement faisait wifi mais intégrait en plus un écran oled. Vite oublié pendant ma découverte de l'Arduino, revoila t'y pas que je tombe dessus en faisant un peu de tri dans mon bazar.
Le bouzin
C'est un heltec wifi kit 8. Il existe une autre version plus péchue du bouzin, le wifi kit 32 pour qui il faudra faire en gros
s/8266/32/gc
Installer de quoi causer avec le bouzin:
$ doas pkg install py38-esptool
Tester qu'on peut causer avec le bouzin:
$ esptool.py --port /dev/cuaU0 --chip ESP8266 read_mac esptool.py v3.3 Serial port /dev/cuaU0 Connecting......... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: dc:4f:22:19:18:88 Uploading stub... Running stub... Stub running... MAC: dc:4f:22:19:18:88 Hard resetting via RTS pin
$ esptool.py --port /dev/cuaU0 --chip ESP8266 flash_id esptool.py v3.3 Serial port /dev/cuaU0 Connecting......... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: dc:4f:22:19:18:88 Uploading stub... Running stub... Stub running... Manufacturer: ef Device: 4016 Detected flash size: 4MB Hard resetting via RTS pin...
On a bien un bouzin avec 4 Mo de RAM (Detected flash size: 4MB), on va pouvoir jouer avec MicroPython
- https://www.micropython.fr/
- http://docs.micropython.org/en/latest/esp8266/quickref.html
- https://randomnerdtutorials.com/projects-esp32-esp8266-micropython/
MicroPython
L'installation de MicroPython est largement décrite dans les liens précédents, mais histoire d'avoir une version FreeBSD:
On nettoie le bouzin:
Tout en pressant le bouton 'PRG' (on peut le relacher quand apparait 'Erasing flash (this may take a while)...')
$ esptool.py --port /dev/cuaU0 --chip ESP8266 erase_flash esptool.py v3.3 Serial port /dev/cuaU0 Connecting...... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: dc:4f:22:19:18:88 Uploading stub... Running stub... Stub running... Erasing flash (this may take a while)... Chip erase completed successfully in 7.4s Hard resetting via RTS pin...
Et on installe micropython fraîchement téléchargé depuis https://micropython.org/download/esp8266/ :
Tout en pressant le bouton 'PRG' (on peut le relacher quand apparait le pourcentage de progression)
$ esptool.py --port /dev/cuaU0 --chip ESP8266 write_flash --flash_mode dio --flash_size detect 0x0 /tmp/esp8266-20220117-v1.18.bin esptool.py v3.3 Serial port /dev/cuaU0 Connecting...... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: dc:4f:22:19:18:88 Uploading stub... Running stub... Stub running... Configuring flash size... Auto-detected Flash size: 4MB Flash will be erased from 0x00000000 to 0x0009bfff... Flash params set to 0x0240 Compressed 635992 bytes to 418428... Wrote 635992 bytes (418428 compressed) at 0x00000000 in 37.2 seconds (effective 136.9 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin...
Et maintenant magie du bouzin:
Taper Enter pour afficher l'invite de l'interpréteur python (>>>), tilde + point pour quitter cu
$ cu -l /dev/cuaU0 -s 115200 can't open log file /var/log/aculog. Connected >>> import esp >>> esp.check_fw() size: 635976 md5: 40b5ad861d83667d6c8ea59fd38c7ff9 True
Il ne me serait jamais venu à l'esprit d'utiliser un language de si haut niveau avec un microcontrôleur (le C c'est bon, mangez-en) mais je dois avouer que la simplicité du truc m'a laissé sur le cul.
L'interpréteur python c'est bien pratique pour tester en direct mais pour survivre à un reset il faut télécharger le code sur le bouzin:
$ doas pkg install py38-adafruit-ampy $ ampy --port /dev/cuaU0 ls /boot.py
Reste à lire https://pythonforundergradengineers.com/upload-py-files-to-esp8266-running-micropython.html, envoyer son premier main.py et reset le bouzin.
Le traditionnel clignotement de led se verra remplacé ici par l'affichage d'un "Hello world" (il n'y a pas de led pilotable sur la carte). J'ai suivi les liens suivants:
- https://robotzero.one/heltec-wifi-kit-8/
- https://micropython.fr/modules_center/seriel_i2c/oled_128x64_0_96_ssd_1306/
- https://resource.heltec.cn/download/WiFi_Kit_8/WIFI_Kit_8_Pinout_Diagram.pdf
- https://resource.heltec.cn/download/WiFi_Kit_8/WIFI_Kit_8_Schematic_diagram.PDF
Je commence par scanner le bus i2c:
>>> from machine import Pin, I2C >>> i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) >>> devices = i2c.scan() >>> print('i2c devices found:', len(devices)) i2c devices found: 1 >>> for device in devices: ... print("Decimal address: ", device, " | Hexa address: ", hex(device)) ... [ appui sur backspace puis enter ] Decimal address: 60 | Hexa address: 0x3c
Je récupère le module kivabien:
$ cd /tmp && fetch https://raw.githubusercontent.com/micropython/micropython/master/drivers/display/ssd1306.py && ampy --port /dev/cuaU0 put ssd1306.py && ampy --port /dev/cuaU0 ls /boot.py /ssd1306.py
Et c'est parti:
>>> from machine import Pin, I2C >>> import ssd1306 >>> i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) >>> oled = ssd1306.SSD1306_I2C(128, 32, i2c, 0x3c) >>> oled.fill(0) >>> oled.text("Hello World", 0, 0) >>> oled.show()
Je ne dirais pas que le python est ma tasse de thé ou mon bol de chocolat ou mon mug de café mais il faut bien reconnaitre que:
- l'installation de micropython est neuneuproof
- la documentation est abondante
- la liste des modules disponibles est plus que conséquente (https://micropython.fr/modules_center/)
- l'accès à un interpréteur est redoutable d'efficacité lors des tests
Commentaires: https://github.com/bsdsx/blog_posts/issues/13