Delta Dore X2D/X3D (Tydom)

Forum pour tous les autres protocoles : Enocean, X10, les cartes piface.razberry ...
Pour les questions concernant le choix de protocoles, merci d'utiliser le forum Les autres objets.
Répondre
jjlf
Messages : 43
Inscription : 04 févr. 2018, 20:58

Delta Dore X2D/X3D (Tydom)

Message par jjlf »

Bonjour, pour les possesseur de box Tydom 1.0 ou superieur.
Avec l'aide de Eli, développeur d'un plugin pour Jeedom, on a fait du reverse engineering sur les commandes à envoyer au Tydom pour piloter les devices Delta Dore.
N'ayant pas le temps de développer un plugin Domoticz, j'ai mis sur mon github un code python qui permet d'envoyer des commandes au tydom.
Il est capable :
  • de récuperer la liste des devices associés au Tydom
  • d'ouvrir/fermer (avec un % de fermeture) un volet.
  • de récuperer la position d'un volet
  • d'executer un scenario préalablement entré dans la box via l'appli Tydom.
  • de récuperer les programmations
Le code se trouve ici:
https://github.com/cth35/tydom_python

N'hésitez pas à me proposer des idées ou des retours.
freulon9292
Messages : 45
Inscription : 03 nov. 2018, 22:53

Re: Delta Dore X2D/X3D (Tydom)

Message par freulon9292 »

Yeesssss !
Enfin (depuis le temps que j'attends une compatibilité X3D)

J'ai investit lourdement (50€ sur le bon coin) et j'ai paramétré le tydom sur mon réseau.
partie simple, ça fonctionne.
Le reste, je suis une b*te, donc je vais détailler :
un mkdir pour faire un nid au bébé (c'est le max de mes capacités en linux)

git clone https://github.com/cth35/tydom_python
(j'ai déja cherché ça 5mn)

suivi de
chmod +x main.py

et de la mise à jour des paramètres dans le fichier (j'en ai trouvé 4 : mac, login, password, et host)

puis une commande qui passe pas :
python -m pip install websockets requests

ben non, faut python3 ... à priori, il était deja installé sur mon PI, donc :
python3 -m pip install websockets requests

et ça passe.
Bon, comment on lance un script python ?
10 mn de recherche plus tard :
python3 -E main.py get_devices_meta

ça se lance, et sa semble se connecter (j'utilise l'IP ou mediation, même résultat) :

Code : Tout sélectionner

send: b'GET /mediation/client?mac=001A2501636A&appli=1 HTTP/1.1\r\nAccept-Encoding: identity\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nHost: mediation.tydom.com:443\r\nAccept: */*\r\nSec-WebSocket-Key: 3KuWmZhdyyhYKeWApQ6bvw==\r\nSec-WebSocket-Version: 13\r\n\r\n'
reply: 'HTTP/1.1 401 \r\n'
header: X-Content-Type-Options: nosniff
header: X-XSS-Protection: 1; mode=block
header: Cache-Control: no-cache, no-store, max-age=0, must-revalidate
header: Pragma: no-cache
header: Expires: 0
header: X-Frame-Options: DENY
header: Set-Cookie: JSESSIONID=FDFA852D739E635C9E41F3F0718F629C;path=/;HttpOnly
header: WWW-Authenticate: Digest realm="ServiceMedia", qop="auth", nonce="MTU3NjUwMTY3MTQ0NDozZTI4OTQ1YzYzYjBhMWEzMTUxMzA3NGMxMmVlMDJmYg=="
header: Content-Length: 0
header: Date: Mon, 16 Dec 2019 13:02:50 GMT
DEBUG:websockets.protocol:client - state = CONNECTING
DEBUG:websockets.protocol:client - event = connection_made(<asyncio.sslproto._SSLProtocolTransport object at 0x758f06b0>)
DEBUG:websockets.client:client > GET /mediation/client?mac=001A2501636A&appli=1 HTTP/1.1
DEBUG:websockets.client:client > Headers([('Host', 'mediation.tydom.com'), ('Upgrade', 'websocket'), ('Connection', 'Upgrade'), ('Sec-WebSocket-Key', 'aFXqInuIaCXaKwbR8mtRzw=='), ('Sec-WebSocket-Version', '13'), ('Sec-WebSocket-Extensions', 'permessage-deflate; client_max_window_bits'), ('Authorization', 'Digest username="001A2501636A", realm="ServiceMedia", nonce="MTU3NjUwMTY3MTQ0NDozZTI4OTQ1YzYzYjBhMWEzMTUxMzA3NGMxMmVlMDJmYg==", uri="/mediation/client?mac=001A2501636A&appli=1", response="f557e5fd5a2dd4e199b467cc50979142", qop="auth", nc=00000001, cnonce="6665460873b8a6cc"'), ('User-Agent', 'Python/3.7 websockets/8.1')])
DEBUG:websockets.protocol:client - event = data_received(<474 bytes>)
DEBUG:websockets.client:client < HTTP/1.1 101
DEBUG:websockets.client:client < Headers([('X-Content-Type-Options', 'nosniff'), ('X-XSS-Protection', '1; mode=block'), ('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate'), ('Pragma', 'no-cache'), ('Expires', '0'), ('X-Frame-Options', 'DENY'), ('Set-Cookie', 'JSESSIONID=18B000F62AD6E670E487203FC60864AA;path=/;HttpOnly'), ('Upgrade', 'websocket'), ('Connection', 'upgrade'), ('Sec-WebSocket-Accept', 'Q01HVrZChRZpFvGIHf3SUbvi5K0='), ('Sec-WebSocket-Extensions', 'permessage-deflate;client_max_window_bits=15'), ('Date', 'Mon, 16 Dec 2019 13:02:51 GMT')])
DEBUG:websockets.protocol:client - state = OPEN
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=2, data=b'\x02GET /scenarios/file HTTP/1.1\r\nContent-Length: 0\r\nContent-Type: application/json; charset=UTF-8\r\nTransac-Id: 0\r\n\r\n', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - event = data_received(<4 bytes>)
DEBUG:websockets.protocol:client - event = data_received(<239 bytes>)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=2, data=b'\x02HTTP/1.1 404 Not Found\r\nServer: Tydom-001A2501636A\r\nUri-Origin: /scenarios/file\r\nContent-Type: application/json\r\nTransfer-Encoding: chunked\r\nTransac-Id: 0\r\n\r\n9C\r\n<!doctype html>\r\n<html>\r\n<head><title>Error 404</title></head>\r\n<body>\r\n<h2>Error 404</h2>\r\n<p>The requested page could not be found</p>\r\n</body>\r\n</html>\r\n\r\n0\r\n\r\n', rsv1=False, rsv2=False, rsv3=False)
Cannot parse response
Expecting value: line 1 column 1 (char 0)
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=2, data=b'\x02PUT /scenarios/15 HTTP/1.1\r\nContent-Length: 0\r\nContent-Type: application/json; charset=UTF-8\r\nTransac-Id: 0\r\n\r\n\r\n\r\n', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - event = data_received(<34 bytes>)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=2, data=b'\x02HTTP/1.1 200 OK\r\nServer: Tydom-001A2501636A\r\nUri-Origin: /scenarios/15\r\nContent-Type: application/json\r\nContent-Length: 0\r\nTransac-Id: 0\r\n\r\n', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - state = CLOSING
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - event = data_received(<2 bytes>)
DEBUG:websockets.protocol:client - event = data_received(<2 bytes>)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - event = eof_received()
DEBUG:websockets.protocol:client - event = connection_lost(None)
DEBUG:websockets.protocol:client - state = CLOSED
DEBUG:websockets.protocol:client x code = 1000, reason = [no reason]
DEBUG:websockets.protocol:client x closing TCP connection


bref, ça à l'air de se connecter, mais je vois des 404, et je ne vois pas de données exploitables.
:-/

je vais faire des tests, mais un peu d'aide serait la bienvenue!
freulon9292
Messages : 45
Inscription : 03 nov. 2018, 22:53

Re: Delta Dore X2D/X3D (Tydom)

Message par freulon9292 »

OOOOhhhhhhhh Misère !!!


Je vais avoir besoin d'aide pour faire fonctionner ça, moi : on est bien au delà de mon level.


Ligne 243 du main.py, je suis passé de level=logging.DEBUG à level=logging.ERROR
du coup, j'y vois beaucoup plus clair !
Et je me rend compte que lancer le script donne toujours le même résultat.

En fait, le paramétrage ne fonctionne pas, il faut modifier le script pour chaque usage en commentant/décommentant chaque fonction en fin de fichier.

Le GIT se présente comme ça :

Code : Tout sélectionner

   # Get informations (not very useful)
        #await get_info(websocket)

        # Get all moments stored on Tydom
        #await get_moments(websocket)

        # Get scenarios ids
        await get_scenarios(websocket)

        # Run scenario with scn id returned in previous command
        await put_scenarios(websocket, 15)

        #await get_configs_file(websocket)
        #await get_devices_meta(websocket)

        # Get data of all device
        #await get_devices_data(websocket)

        # Get data of a specific device
        #await get_device_data(websocket, 9)

        # Set a shutter position to 10%
        #await put_devices_data(websocket, 9, "position", "10.0")
        # TODO : Wait hardcoded for now to put response from websocket server
        #time.sleep(45)
pour moi, pour modifier l'état d'un volet, je dois modifier comme ça :

Code : Tout sélectionner

#        await get_moments(websocket)

        # Get scenarios ids
#        await get_scenarios(websocket)

        # Run scenario with scn id returned in previous command
#        await put_scenarios(websocket, 145916207)

#        await get_configs_file(websocket)
#        await get_devices_meta(websocket)

        # Get data of all device
#        await get_devices_data(websocket)

        # Get data of a specific device
#        await get_device_data(websocket, 9)

        # Set a shutter position to 10%
        await put_devices_data(websocket, 1576496493, "position", "50.0")
        # TODO : Wait hardcoded for now to put response from websocket server
        #time.sleep(45)
vous comprenez le principe.

Donc pour avoir un truc utilisable (à mon niveau), il me faudrait un fichier.py par usage ....
Ce qu'il faudrait (et que je ne sais pas faire), c'est récupérer les arguments passés au lancement du fichier.

Quelqu'un s'y connait en python pour aider notre ami jjlf (qui a déjà fourni un boulot formidable !) ???
Thorgal
Messages : 913
Inscription : 16 août 2018, 20:02
Contact :

Re: Delta Dore X2D/X3D (Tydom)

Message par Thorgal »

Regardes du coté de la fonction getopt en python.
freulon9292
Messages : 45
Inscription : 03 nov. 2018, 22:53

Re: Delta Dore X2D/X3D (Tydom)

Message par freulon9292 »

:D
si seulement !

je n'y connais rien : assez doué pour comprendre quelle partie s'occupe de quoi, mais loin, très loin de pouvoir modifier quoi que ce soit de plus qu'un # !!!
freulon9292
Messages : 45
Inscription : 03 nov. 2018, 22:53

Re: Delta Dore X2D/X3D (Tydom)

Message par freulon9292 »

C'est surprenant, que je passe en local ou par les serveurs DeltaDore, la vérification de la température extérieure ne varie que 2 fois par jour avec le script .... alors qu'elle est bien en temps réel dans l'appli DD ou sur mon tywatt2000 !?

Egalement, le listing de tous les devices ne remonte que les volets et les scenarios, et ne remonte rien sur les conso gaz et électriques... alors que c'est dispo en local (tywatt) et accessibles via l’appli (donc dans tydom).
jjlf
Messages : 43
Inscription : 04 févr. 2018, 20:58

Re: Delta Dore X2D/X3D (Tydom)

Message par jjlf »

Hello désolé pour la réponse tardive.
Le script python que j'ai mis à disposition est juste une base pour ceux qui souhaitent développer et enrichir le code.
Le script permet juste de se connecter à la Tydom en local ou via les serveur de DeltaDore. Ensuite je fourni un jeu minimal de commandes qui permettent de "jouer" avec les volets et les scenarii parametrés dans la box Tydom.
Il ne gère rien d'autre car je n'ai pas le matériel adéquat (je n'ai que des volets). J'ai mergé aussi des choses pour les alarmes.
Certaines personnes ont forké le code de base pour en fait un truc plus fonctionnel. Je pense notamment à https://github.com/WiwiWillou/tydom2mqtt qui à utilisé mon script et l'a pluggué à un serveur MQTT pour home-assistant (Hass.io) je crois. Il avance petit a petit dessus de son coté. Je n'ai pas eu le temps de merger son travail.
Sinon un truc plus clef en main et payant (4 euros) sous jeedom : le plugin JeeDore developpé par Eli qui m'a aidé pour la partie reverse enginering..
Une autre personne est partie de mon script pour développer sur Homekit (Apple)
https://github.com/mgcrea/homebridge-tydom
Et même un client tydom pour NodeJs :
https://github.com/mgcrea/node-tydom-client
Avec tout ca tu devrais trouver ton bonheur ;)
freulon9292
Messages : 45
Inscription : 03 nov. 2018, 22:53

Re: Delta Dore X2D/X3D (Tydom)

Message par freulon9292 »

J'ai découvert nodered ... c'est un peu trop au dessus de mon level, je suis trop bleubite !
:D

Je vais en rester au bricolage : j'ai bidouillé les scripts pour qu'ils montent / descendent mes volets selon 3/4 scénarios pré-enregistrés : ça donne des variations de fin de fichier :

Code : Tout sélectionner

        # Set a shutter position to 10% -- positionne les volets 1 par 1  0 = fermé
        await put_devices_data(websocket, 1576496493, "position", "0.0") # Baie 1
        await put_devices_data(websocket, 1576496099, "position", "0.0") # Cuisine
        await put_devices_data(websocket, 1576496181, "position", "0.0") # Baie 2
#        await put_devices_data(websocket, 1576496242, "position", "100.0") # SDB +1
#        await put_devices_data(websocket, 1576496297, "position", "100.0") # SDB +2
        await put_devices_data(websocket, 1576496364, "position", "0.0") # SDB RDC
#        await put_devices_data(websocket, 1576496432, "position", "100.0") # Dressing
#        await put_devices_data(websocket, 1576496493, "position", "100.0") # Bureau
#        await put_devices_data(websocket, 1576496754, "position", "100.0") # Suite Parentale
#        await put_devices_data(websocket, 1576497291, "position", "100.0") # Eryne
#        await put_devices_data(websocket, 1576497342, "position", "100.0") # Chbre ami
#        await put_devices_data(websocket, 1576497414, "position", "100.0") # Eliott
j'ai collé ça sur un bouton.
Pas de retour d'état, pas de fioritures, pas de confort, mais ça remplit la fonction principale, et c'est interfaçable avec le reste de domoticz.

Et je vais patienter gentiment que quelqu'un se penche sur ce dossier à ma place. :oops:
C'est désolant, mais je n'ai pas les capacités d'aider plus.

Merci pour le boulot déjà réalisé, c'est énorme de mon point de vue.
Casnav
Messages : 4
Inscription : 03 mai 2020, 17:12

Re: Delta Dore X2D/X3D (Tydom)

Message par Casnav »

Bonjour à tous
Je ne suis pas sûr d'être au bon endroit mais j'ai vu X2D et c'est la source de mon problème.
Je m'explique :
j'ai installé un programmateur de chauffage électrique modèle Delta dore driver 220 CPL qui pilote les radiateurs de ma maison. J'ai rajouté à l'intérieur un module TYDOM 520 qui permet de communiquer en RF 433Mhz.
Je souhaite commander ce programmateur en RF 433Mhz.

J'ai acheté un module TYDOM 1.0, mais ce dernier n'est apparemment pas compatible avec le TYDOM 520 d'après Delta dore.
Je viens d'acheter un sonoff bridge RF 433 et je voudrais savoir si il est possible de communiquer en X2D pour parvenir à mes fins sur le TYDOM 520.
À noter que je ne connais pas les trames X2D propriété de Delta dore, et que je découvre à peine les possibilités du sonoff.

Merci d'avance pour vos conseils
John_Matrix
Messages : 9
Inscription : 04 déc. 2018, 11:08

Re: Delta Dore X2D/X3D (Tydom)

Message par John_Matrix »

Salut à tous,

Je suis en train d'essayer de faire fonctionner le script sur mon Tydom 1.0 mais pas moyen de s'y connecter :

Code : Tout sélectionner

send: b'GET /mediation/client?mac=001A25XXXXXX&appli=1 HTTP/1.1\r\nAccept-Encoding: identity\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nHost: 10.0.0.100:443\r\nAccept: */*\r\nSec-WebSocket-Key: 1OygkmOkPxRXVa5fmkojIA==\r\nSec-WebSocket-Version: 13\r\n\r\n'
reply: 'HTTP/1.1 401 Unauthorized\r\n'
header: Server: Oryx Embedded HTTP Server
header: Connection: close
header: WWW-Authenticate: Digest
  realm="Protected Area",
  qop="auth",
  nonce="4368ccad4e243304c2cb96063d0733b4",
  opaque="f7c131f78ed5952861168bf4ae7ff96a"
header: Content-Type: text/html
DEBUG:websockets.protocol:client - state = CONNECTING
DEBUG:websockets.protocol:client - event = connection_made(<asyncio.sslproto._SSLProtocolTransport object at 0x7f3654812ba8>)
DEBUG:websockets.client:client > GET /mediation/client?mac=001A25XXXXXX&appli=1 HTTP/1.1
DEBUG:websockets.client:client > Headers([('Host', '10.0.0.100'), ('Upgrade', 'websocket'), ('Connection', 'Upgrade'), ('Sec-WebSocket-Key', 'ZIxTBL/hygThNt6edf6XmQ=='), ('Sec-WebSocket-Version', '13'), ('Sec-WebSocket-Extensions', 'permessage-deflate; client_max_window_bits'), ('Authorization', 'Digest username="XXXXXX", realm="protected area", nonce="4368ccad4e243304c2cb96063d0733b4", uri="/mediation/client?mac=001A25XXXXXX&appli=1", response="83af103c73cbba028ad4f596c1d81000", qop="auth", nc=00000001, cnonce="f24e37ad386ee7d7"'), ('User-Agent', 'Python/3.7 websockets/8.1')])
DEBUG:websockets.protocol:client - event = data_received(<129 bytes>)
DEBUG:websockets.client:client < HTTP/1.1 101 Switching Protocols
DEBUG:websockets.client:client < Headers([('Upgrade', 'websocket'), ('Connection', 'Upgrade'), ('Sec-WebSocket-Accept', 'wRbt5KInXmEskhCrlIE5Wxi9kxs=')])
DEBUG:websockets.protocol:client - state = OPEN
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=2, data=b'GET /scenarios/file HTTP/1.1\r\nContent-Length: 0\r\nContent-Type: application/json; charset=UTF-8\r\nTransac-Id: 0\r\n\r\n', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - event = data_received(<4 bytes>)
DEBUG:websockets.protocol:client - event = data_received(<171 bytes>)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=2, data=b'HTTP/1.1 200 OK\r\nServer: Tydom-001A25XXXXXX\r\nUri-Origin: /scenarios/file\r\nContent-Type: application/json\r\nContent-Length: 10\r\nTransac-Id: 0\r\nFile-Version: 17\r\n\r\n{"scn":[]}', rsv1=False, rsv2=False, rsv3=False)
{
    "scn": []
}
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=2, data=b'PUT /scenarios/15 HTTP/1.1\r\nContent-Length: 0\r\nContent-Type: application/json; charset=UTF-8\r\nTransac-Id: 0\r\n\r\n\r\n\r\n', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - event = data_received(<4 bytes>)
DEBUG:websockets.protocol:client - event = data_received(<140 bytes>)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=2, data=b'HTTP/1.1 200 OK\r\nServer: Tydom-001A25XXXXXX\r\nUri-Origin: /scenarios/15\r\nContent-Type: application/json\r\nContent-Length: 0\r\nTransac-Id: 0\r\n\r\n', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - state = CLOSING
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - event = data_received(<4 bytes>)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - event = connection_lost(None)
DEBUG:websockets.protocol:client - state = CLOSED
DEBUG:websockets.protocol:client x code = 1000, reason = [no reason]
DEBUG:websockets.protocol:client x closing TCP connection
Est-ce que c'est moi qui merde ou c'est Delta Dore qui aurait mis à jour leur mode d'accès ?

Edit : c'est bon, c'est moi qui avait merdé en copiant/collant l'adresse MAC et n'avait pas pris en compte le post de freulon qui disait qu'il fallait décommenter les fonctions en fin de script pour récupérer quelque chose.
Répondre