Suggestion: Intégration ampoule v-link Eglo vendue par Leroy Merlin

Bonjour,

Leroy Merlin vend des ampoules connectées wifi à un prix assez bas, mais fortement liées à l’environnement Enki (a priori, il suffit d’avoir l’appli Enki, pas besoin de la box).

Il serait intéressant de pouvoir les intégrer dans ce plugin…je ne sais pas si c’est de l’ordre du possible…

Cordialement,
Philippe

Oui… D autant que leroy merlin a fait un concours-où-tout-le-monde-a-gagner, et a distribué 40000 ampoules…

Je vais en avoir 2… Ça serait bien dans jeedom… :slight_smile:

pas prévu et peu de chance que quelqu’un cracke le protocole car pas assez diffusé

Je voulais essayer de sniffer un peu le trafic, ayant reçu 1 ampoule de ce type à ce fameux concours et un Android rooté…sauf que je n’arrive pas à l’associer avec l’application officielle…donc elle va finir à la cave, comme le reste des périphériques fermés Enki qui ne fonctionnent pas.

Ah bah je l’ai eue aussi cette ampoule et j’ai réussi à l’appairer, il faut impérativement une connexion à Internet pour que l’appli et l’ampoule se parlent, et aussi un réseau WiFi en 2.4GHz, surtout pas en 5GHz.

J’ai fait une trace avec Wireshark et on voit passer pas mal de SecureMQTT (port TCP 8883), l’ampoule envoie les données à un serveur chez OVH qui renvoie les données à l’appli. Avec la clé privée du certificat utilisé, on pourrait décoder ces messages. J’imagine d’ailleurs qu’elle est dans les fichiers d l’appli, faudrait voir si on peut la sortir du package apk par exemple.

L’ampoule fait aussi régulièrement des requêtes mdns dont le nom est « _alljoyn._tcp.local » ce qui me laisse penser qu’on devrait pouvoir lui parler avec un client AllJoyn

A voir si j’ai le temps dans les jours qui viennent…

Bonjour, oui c’est une bonne nouvelle… Si on pouvait l’intégrer dans jeedom !

je peux en beta ajouter l’affichage du message AllJoyn

Oui, si ça peux faire avancer le projet.

fait. télécharger la beta.
les messages reçus devraient être affichés dans les logs

Bonjour, avez vous avancé ?

Bonjour,

Alors, tout d’abord, j’ai contacté Eglo pour leur demander le protocole employé, mais je n’ai eu aucune réponse. Non pas que j’en attendais une, mais ça valait le coup de le tenter.

Du coup, j’ai continué mes investigations et après avoir installé tcpdump sur un téléphone android rooté, j’ai pu capture tous les paquets qui sortent par l’interface wifi, quel que soit le réseau sur lequel elle est connectée.

Pour rappel, voici la procédure de « connexion » entre l’ampoule et l’appli :

  1. Lancer l’application, avec une connexion à Internet
  2. Ajouter un nouvel objet, en sélectionnant Eglo et le bon modèle
  3. Allumer l’ampoule
  4. Se connecter au wifi de l’ampoule
  5. Laisser l’appli parler à l’ampoule
  6. Se reconnecter au wifi résidentiel
  7. Contrôler l’ampoule via l’application

Après analyse des traces, voici ce que j’ai compris

Lors de la connexion au réseau wifi de l’ampoule, cette dernière diffuse des requêtes mDns qui cherchent _alljoyn._tcp.local et _alljoyn._udp.local
L’application android répond à ces requêtes avec un contenu indiquant le port à utiliser pour la communication
L’ampoule se connecte à l’application android sur le port TCP donné et le protocole est clairement du AllJoyn (si tant est qu’on configure Wireshark pour reconnaitre AllJoyn sur le port trouvé à l’étape d’avant)
Après quelques allers-retours pour l’authentification et l’échange de clés, un ordre ConfigureWifi est émis par l’application en direction de l’ampoule avec une charge utile cryptée que je soupçonne de contenir le SSID et le mot de passe du réseau Wifi.
Le wifi de l’ampoule disparait alors et aussi bien l’ampoule que l’appli se connectent au réseau wifi résidentiel, celui qui a accès à Internet.
A nouveau, des allers-retours mDNS et AllJoyn pour que l’appli et l’ampoule se parlent à nouveau. On découvre d’ailleurs à cette occasion que l’ampoule tourne probablement sous MicroEJ pour gérer ses communications et que le numéro de modèle exact est EG-FWCCT8-1
L’application android demande alors une résolution DNS pour device-broker.iot.leroymerlin.fr et lui parle via HTTPs. Après avoir reçu un paquet MQTT sécurisé du même hôte, l’application android fait maintenant une résolution DNS pour enki-backend.iot.leroymerlin.fr à qui elle parle aussi via HTTPs.
Entre ces deux événements, quelques paquets AllJoyn encryptés sont échangés entre l’appli et l’ampoule, que je soupçonne de contenir le nom de l’hôte à utiliser en tant que broker MQTT.

Et à partir de là, l’application android envoie des paquets MQTT au broker que l’ampoule reçoit à son tour pour réagir aux commandes.

Vu que c’est du AllJoyn et que ce projet a été « incorporé » à Iotivity, j’ai tenté de construire le projet découverte de ce dernier, mais j’ai juste réussi à tomber sur un problème qui ne semble pas intéresser grand monde.

Mon idée pour la suite est de monter un DNS menteur sur le réseau interne afin de donner l’IP de mon broker Mosquitto au lieu de celui hébergé chez OVH. Avec un peu de chance, l’ampoule et l’appli accepterons le certificat SSL même si le « sujet » ne correspond pas au nom d’hôte, auquel cas je devrais pouvoir récupérer les trames MQTT en clair.

Alors, la chance est à moitié avec moi. En effet, l’ampoule refuse de se connecter à mon serveur mosquitto parce qu’elle ne connait pas la root CA de mon certificat. C’est assez surprenant parce que le certificat est rooté chez Let’s Encrypt, mais je soupçonne les échanges « Alljoyn » de fournir le certificat à l’ampoule et que donc celle-ci ne connait qu’une seule root CA.

Par contre, coté application Enki, ça ne lui pose aucun problème de se connecter à mon serveur MQTT et j’ai donc pu voir ce qui est envoyé par l’application :

{"capability":"check_bulb_state","externalId":"IDAmpoule","nodeId":"UIDNode","gatewayId":"UIDGateway","requestIdentifier":"check_bulb_state_android_GUID1_UIDRequests","responseMessageKey":"check_bulb_state","type":"CAPABILITY","userId":"UIDUser"}
{"value":"ON","capability":"switch_electrical_power","externalId":"IDAmpoule","nodeId":"UIDNode","gatewayId":"UIDGateway","requestIdentifier":"switch_electrical_power_android_GUID2_UIDRequests","responseMessageKey":"switch_electrical_power","type":"CAPABILITY","userId":"UIDUser"}
{"value":0.75,"capability":"change_brightness","externalId":"IDAmpoule","nodeId":"UIDNode","gatewayId":"UIDGateway","requestIdentifier":"change_brightness_android_GUID3_UIDRequests","responseMessageKey":"change_brightness","type":"CAPABILITY","userId":"UIDUser"}
{"value":"T2750K","capability":"change_color_temperature","externalId":"IDAmpoule","nodeId":"UIDNode","gatewayId":"UIDGateway","requestIdentifier":"change_color_temperature_android_GUID4_UIDRequests","responseMessageKey":"change_color_temperature","type":"CAPABILITY","userId":"UIDUser"}

Rien de bien violent donc, si ce ne sont les UIDs utilisés qui semblent avoir été échangés avec l’ampoule également pour éviter de contrôler l’ampoule du voisin vu que tout le monde passe par le même broker. D’ailleurs, j’ai essayé de me connecter à ce broker, mais mosquitto_sub n’est pas content lui non plus parce que la root CA utilisée est « auto signée » par Leroy Merlin et donc inaccessible.

Bref, il faut vraiment que j’arrive à interpréter les messages AllJoyn pour pouvoir configurer l’ampoule proprement afin qu’elle se passe des serveurs de LM.

A ce propos, j’ai utilisé l’appli AllJoyn Dashboard pour Android disponible ici et elle voit bien l’ampoule. Mais elle me dit qu’elle n’a aucune « capability » connue, ce qui n’est pas très surprenant.

Suite au prochain épisode.

Et je serai passionné de te lire…

Bravo pour vos recherches.
Au plaisir de vous relire.

Avez-vous avancé sur le sujet ?

Merci

Bonjour, des nouvelles sur ce sujet ?

Cdlt