Tags

arm64 bhyve bit blacklistd bluepill bluetooth cu dns dovecot elf envsubst esp8266 filter freebsd iot ipfw lets_encrypt meross openocd opensmtpd openwrt perl prises python shell ssh ssl stm32 template tls unbound wifi yubikey

Powered by

blOg
maRkdown
awK
shEll

30/10/2024

[ iot prises meross python ]

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:

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


Lien vers ce billet

16/04/2022

[ esp8266 python ]

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

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:

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:

Commentaires: https://github.com/bsdsx/blog_posts/issues/13


Lien vers ce billet