Aider à développer DeltaDore Tydom2Mqtt et Tysense Outdoor

Bonjour à tous et à toute.

Voilà, j’ai terminé ma maison et j y ai installé des volets DeltaDore qui fonctionnent très bien avec le plugin Tydom2Mqtt

J’ai aussi des DVI (détecteurs de verrouillage intégrés) sur toute les ouvertures et j’ai réussi à les connecter aussi (même s’il n’y a aucun template remonte depuis le plugin Tydom2Mqtt mais j’ai fait les carte on a les sensors qui remontent bien)

Cependant j’ai aussi installé le Tysense Outdoor (détecteur d’ensoleillement et un détecteur de température extérieure) mais ces informations ne remontent pas dans Mqtt.

J’ai ce message dans les logs :

tydom.MessageHandler - WARNING - Unknown device name (1710070382_1710070382)
2024-03-19 00:34:09,117 - tydom.MessageHandler - WARNING - Unknown device type (1710070382_1710070382)

J’aimerais aider la communauté à maintenir le plugin e a intégrer les nouveaux produit Deltadore mais je sais pas trop comment on fait, ou sont les modèles en fonction des attributs etcs, comment définir une objet …

Si vous voulez bien me guider, je peux faire des tests avec vous :blush:

Je vous remercie infiniement

Salut…

Plugin c’est pas une notion HA.
Si tu veux participer, il faut voir de quelle sorte de composant il s’agit :

  • intégration native => Github du core HA pour la doc et les sources
  • addons => trouver le lien dans les infos de l’addon (modules complétaires)
  • custom_component = => trouver le lien dans les infos dans HACS

J’ai déjà regarde tout ça :slight_smile:

On est sur un addon (Tydom2Mqtt), j’essai de déchiffrer un peu les sources, mais je suis pas très doué en python :stuck_out_tongue:

J’ai réussi à extraire les information via un proxy de l’application Tydom pour ces deux nouveaux appareils :

[
  {
    "id": "1710070382",
    "endpoints": [
      {
        "id": "1710070382",
        "name": "Tysense Thermo",
        "first_usage": "sensor",
        "last_usage": "sensorThermo",
        "metadata": [
          {
            "name": "battDefect",
            "permission": "r",
            "type": "boolean",
            "enum_values": [],
            "unit": "boolean"
          },
          {
            "name": "configTemp",
            "permission": "r",
            "type": "numeric",
            "enum_values": [],
            "min": 0,
            "max": 4294967294,
            "step": 1,
            "unit": "NA"
          },
          {
            "name": "outTemperature",
            "permission": "r",
            "type": "numeric",
            "enum_values": [],
            "min": -99.9,
            "max": 99.9,
            "step": 0.01,
            "unit": "degC"
          }
        ],
        "data": [],
        "cmetadata": [],
        "access": {
          "protocol": "X3D",
          "profile": "temperature",
          "type": "direct",
          "addr": {
            "MSB": "xxx",
            "ISB": "xxx",
            "LSB": "xxx",
            "index": "xxx"
          },
          "subAddr": "0"
        },
        "devices": [],
        "error": 0
      }
    ],
    "suppress_requested": false
  },
  {
    "id": "1710070535",
    "endpoints": [
      {
        "id": "1710070535",
        "name": "Tysense Sun",
        "first_usage": "sensor",
        "last_usage": "sensorSun",
        "metadata": [
          {
            "name": "battDefect",
            "permission": "r",
            "type": "boolean",
            "enum_values": [],
            "unit": "boolean"
          },
          {
            "name": "configSensor",
            "permission": "r",
            "type": "numeric",
            "enum_values": [],
            "min": 0,
            "max": 4294967294,
            "step": 1,
            "unit": "NA"
          },
          {
            "name": "configTemp",
            "permission": "r",
            "type": "numeric",
            "enum_values": [],
            "min": 0,
            "max": 4294967294,
            "step": 1,
            "unit": "NA"
          },
          {
            "name": "lightPower",
            "permission": "r",
            "type": "numeric",
            "enum_values": [],
            "min": 0,
            "max": 65534,
            "step": 1,
            "unit": "W/m2"
          }
        ],
        "data": [],
        "cmetadata": [],
        "access": {
          "protocol": "X3D",
          "profile": "sensor",
          "type": "direct",
          "addr": {
            "MSB": "xxx",
            "ISB": "xxx",
            "LSB": "xxx",
            "index": "xxx"
          },
          "subAddr": "0"
        },
        "devices": [],
        "error": 0
      }
    ],
    "suppress_requested": false
  }
]

J’ai ouvert une demande sur le repo : Compatibilité Pack Tysense Outsoor (Sun et thermomètre) · Issue #184 · fmartinou/tydom2mqtt · GitHub

Si quelqu’un peux me guider :slight_smile: je serais infiniment reconnaissant

Bonjour, pour continuer notre discussion sur github ici.
J’ai créé un fork de tydom2mqtt GitHub - koleos6/hassio-addons: Hass.io addons repository
J’y ai ajouté la gestion des 2. Dis moi si ok je peux pas tester.

Je te remercie je test ça dès que possible.

J’ai le plombier qui branche la PAC actuellement et j’ai le choix entre : Deltadore Tywell control ou alors les Navilink A59 de chez atlantic.

Est-ce que les Tywell control avec le typass ATL (codeveloppe avec atlantic et Deltadore) est 100% pris en charge par tydom2mqtt sinon je passe en cosytouch de chez atlantic, mais je dois choisir qu’est-ce que tu me propose pour la meilleure intégration HA ?

Hello, pour te répondre, je n’arrive pas a faire fonctionner ton extention.

J’ai bien installé l’extension via HACS, mais j’ai l’erreur suivante au lancement :

[FATAL tini (7)] exec python failed: Exec format error

Puis le module s’arrête.

J’ai fait ça :
1- Supprimer le module tydom2mqtt d’avant
2- installer ton module
3- configurer ton module
4- Start

Ok mince t’es sur qu’elle platforme ?

Je suis sous HAOS sur un pi 4 :grimacing:

J’ai corrigé, nouvelle version dispo.

Je débute avec les docker et eu du mal a bien générer le tout

J’espère que c’était ça

Et re @koleos6, impossible de lancer l’add-on, voici les logs d’erreur :


2024-03-28 13:38:11,204 - Starting tydom2mqtt
2024-03-28 13:38:11,204 - Hassio environment detected: loading configuration from /data/options.json
2024-03-28 13:38:11,206 - Validating configuration ({
    "deltadore_login": null,
    "deltadore_password": "",
    "log_level": "INFO",
    "mqtt_host": "homeassistant",
    "mqtt_password": "**************",
    "mqtt_port": xxxxx,
    "mqtt_ssl": false,
    "mqtt_user": "mqtt",
    "thermostat_custom_presets": null,
    "tydom_alarm_home_zone": 1,
    "tydom_alarm_night_zone": 2,
    "tydom_alarm_pin": "",
    "tydom_ip": "192.168.--.--",
    "tydom_mac": "001A2---------",
    "tydom_password": "***************",
    "tydom_polling_interval": 300
}
2024-03-28 13:38:11,206 - The configuration is valid
2024-03-28 13:38:11,207 - tydom.TydomClient    - INFO    - Configure local mode (192.168.86.27)
2024-03-28 13:38:11,215 - mqtt.MqttClient      - INFO    - Connecting to mqtt broker (host=homeassistant, port=1883, user=mqtt, ssl=False)
2024-03-28 13:38:11,225 - tydom.TydomClient    - INFO    - Connecting to tydom
2024-03-28 13:38:13,783 - mqtt.MqttClient      - INFO    - Connected to mqtt broker
2024-03-28 13:38:16,244 - tydom.TydomClient    - ERROR   - Exception when trying to connect with websocket (server rejected WebSocket connection: HTTP 401)
2024-03-28 13:38:16,272 - asyncio              - ERROR   - Task exception was never retrieved
future: <Task finished name='Task-2' coro=<listen_tydom() done, defined at /app/main.py:42> exception=SystemExit(1)>
Traceback (most recent call last):
  File "/app/tydom/TydomClient.py", line 187, in connect
    self.connection = await websockets.connect(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/websockets/legacy/client.py", line 647, in __await_impl_timeout__
    return await self.__await_impl__()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/websockets/legacy/client.py", line 654, in __await_impl__
    await protocol.handshake(
  File "/usr/local/lib/python3.11/site-packages/websockets/legacy/client.py", line 325, in handshake
    raise InvalidStatusCode(status_code, response_headers)
websockets.exceptions.InvalidStatusCode: server rejected WebSocket connection: HTTP 401

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/asyncio/base_events.py", line 607, in run_forever
    self._run_once()
  File "/usr/local/lib/python3.11/asyncio/base_events.py", line 1922, in _run_once
    handle._run()
  File "/usr/local/lib/python3.11/asyncio/events.py", line 80, in _run
    self._context.run(self._callback, *self._args)
  File "/app/main.py", line 46, in listen_tydom
    await tydom_client.connect()
  File "/app/tydom/TydomClient.py", line 198, in connect
    sys.exit(1)
SystemExit: 1
2024-03-28 13:38:16,305 - asyncio              - ERROR   - Task was destroyed but it is pending!
task: <Task pending name='Task-4' coro=<Client._resend_qos_messages() running at /usr/local/lib/python3.11/site-packages/gmqtt/client.py:181> wait_for=<Future pending cb=[Task.task_wakeup()]>>
2024-03-28 13:38:16,307 - asyncio              - ERROR   - Task was destroyed but it is pending!
task: <Task pending name='Task-5' coro=<MQTTProtocol._read_loop() running at /usr/local/lib/python3.11/site-packages/gmqtt/mqtt/protocol.py:211> wait_for=<Future pending cb=[Task.task_wakeup()]>>
2024-03-28 13:38:16,307 - asyncio              - ERROR   - Task was destroyed but it is pending!
task: <Task pending name='Task-91' coro=<WebSocketCommonProtocol.close_connection() running at /usr/local/lib/python3.11/site-packages/websockets/legacy/protocol.py:1337> wait_for=<Future finished result=None>>
2024-03-28 13:38:16,308 - asyncio              - ERROR   - Task was destroyed but it is pending!
task: <Task pending name='Task-3' coro=<poll_device_tydom() running at /app/main.py:76> wait_for=<Future pending cb=[Task.task_wakeup()]>>

:cry:

@koleos6 bon… j’ai réussi à faire fonctionner, mon password Tydom à du être modifié je pense, je suis passé par mon compte Deltadore avec mes identifiants dans la connexion.

Du coup, voici mes retours :

1- J’ai vu dans le code que logiquement on devrai avoir un lors du DEBUG un log :

logger.debug("Your Tydom password : %s",
                         json_response["sites"][0]["gateway"]["password"])

Sauf que quand je lance et que je regarde les logs, je vois bien les connexion mqtt, client Deltadore etc et d’un coup hop, comme si le logger se réinitialisait ou comme s’il y avait une rotation de log, ça efface tout et ça affiche les mises à jour du status de mes devices etc… du coup je perd l’historique et je peux pas voir ce log qui me donne le password de me Tywell pro :slight_smile: tu saurais pourquoi ?

2- Par ailleurs, je remarque que mes DVI (Détecteur de verrouillage intégrés de chez Kline) sont bien remontés, par contre j’ai remarqué quelques petits soucis (Déjà connu de base sur tydom2mqtt):

  • Je n’ai pas de « Modèle » remonté comme mes volet (ça pourrait être DVI, ou capteur ouverture quelques chose comme ça.

  • Je n’ai pas non plus le name, et c’est très dommage car très difficile de les différencier ils s’appellent tous Mosquito broker ^^ je dois les tester 1 par 1 à chaque fois, je pense que c’est une petite modification subtile à faire:

  • Voici le endpoint de /gateways pour les DVI que j’ai pour les PORTES :

{
  "id": "1710583924",
  "endpoints": [
    {
      "id": "1710583924",
      "name": "Porte Cellier",
      "first_usage": "belmDoor",
      "last_usage": "belmDoor",
      "metadata": [
        {
          "name": "config",
          "permission": "r",
          "type": "numeric",
          "enum_values": [],
          "min": 0,
          "max": 254,
          "step": 1,
          "unit": "NA"
        },
        {
          "name": "battDefect",
          "permission": "r",
          "type": "boolean",
          "enum_values": [],
          "unit": "boolean"
        },
        {
          "name": "supervisionMode",
          "permission": "r",
          "type": "string",
          "enum_values": [
            "SHORT",
            "LONG",
            "NONE"
          ]
        },
        {
          "name": "intrusionDetect",
          "permission": "r",
          "type": "boolean",
          "enum_values": [],
          "unit": "boolean"
        },
        {
          "name": "openState",
          "permission": "r",
          "type": "string",
          "enum_values": [
            "LOCKED",
            "UNLOCKED"
          ]
        },
        {
          "name": "calibrationDefect",
          "permission": "r",
          "type": "boolean",
          "enum_values": [],
          "unit": "boolean"
        }
      ],
      "data": [],
      "cmetadata": [],
      "access": {
        "protocol": "X3D",
        "profile": "detector",
        "type": "direct",
        "addr": {
          "MSB": "xxx",
          "ISB": "xxx",
          "LSB": "xxx",
          "index": "xxx"
        },
        "subAddr": "0"
      },
      "devices": [],
      "error": 0
    }
  ],
  "suppress_requested": false
}

Et voici les DVI pour les fenêtre coulissantes :

{
     "id": "1710065985",
     "endpoints": [
       {
         "id": "1710065985",
         "name": "Ouvrant gauche",
         "first_usage": "window",
         "last_usage": "windowSliding",
         "metadata": [
           {
             "name": "config",
             "permission": "r",
             "type": "numeric",
             "enum_values": [],
             "min": 0,
             "max": 254,
             "step": 1,
             "unit": "NA"
           },
           {
             "name": "battDefect",
             "permission": "r",
             "type": "boolean",
             "enum_values": [],
             "unit": "boolean"
           },
           {
             "name": "supervisionMode",
             "permission": "r",
             "type": "string",
             "enum_values": [
               "SHORT",
               "LONG",
               "NONE"
             ]
           },
           {
             "name": "intrusionDetect",
             "permission": "r",
             "type": "boolean",
             "enum_values": [],
             "unit": "boolean"
           },
           {
             "name": "openState",
             "permission": "r",
             "type": "string",
             "enum_values": [
               "LOCKED",
               "UNLOCKED"
             ]
           }
         ],
         "data": [],
         "cmetadata": [],
         "access": {
           "protocol": "X3D",
           "profile": "detector",
           "type": "direct",
           "addr": {
             "MSB": "xxx",
             "ISB": "xxx",
             "LSB": "xxx",
             "index": "xxx"
           },
           "subAddr": "0"
         },
         "devices": [],
         "error": 0
       }
     ],
     "suppress_requested": false
   }

Et les fenêtres ouvrant à la française (classiques):

{
     "id": "1710067026",
     "endpoints": [
       {
         "id": "1710067026",
         "name": "Ouvrant central",
         "first_usage": "window",
         "last_usage": "windowFrench",
         "metadata": [
           {
             "name": "config",
             "permission": "r",
             "type": "numeric",
             "enum_values": [],
             "min": 0,
             "max": 254,
             "step": 1,
             "unit": "NA"
           },
           {
             "name": "battDefect",
             "permission": "r",
             "type": "boolean",
             "enum_values": [],
             "unit": "boolean"
           },
           {
             "name": "supervisionMode",
             "permission": "r",
             "type": "string",
             "enum_values": [
               "SHORT",
               "LONG",
               "NONE"
             ]
           },
           {
             "name": "intrusionDetect",
             "permission": "r",
             "type": "boolean",
             "enum_values": [],
             "unit": "boolean"
           },
           {
             "name": "openState",
             "permission": "r",
             "type": "string",
             "enum_values": [
               "LOCKED",
               "OPEN_FRENCH",
               "OPEN_HOPPER"
             ]
           }
         ],
         "data": [],
         "cmetadata": [],
         "access": {
           "protocol": "X3D",
           "profile": "detector",
           "type": "direct",
           "addr": {
             "MSB": "xxx",
             "ISB": "xxx",
             "LSB": "xxx",
             "index": "xxx"
           },
           "subAddr": "0"
         },
         "devices": [],
         "error": 0
       }
     ],
     "suppress_requested": false
   }
  • On voit bien le name par exemple: « Porte Cellier », j’aimerais si possible que mon objet MQTT me remonte bien cette information se serait un gros plus pour le retrouver rapidement…

  • Ensuite, je remarque aussi que battDefect et intrusionDetect ne sont pas remontés, j’ai seulement: openState qui ai remonté dans mes capteurs.


    Se serait possible de rajouter les deux autre ? :slight_smile:

  • Idem pour les capteurs de température et d’ensoleillement, j’ai bien les objets mais pas de nom (sauf : Mosquitto broker)



    Voici les retours pour le Tysense Thermo et le Tysense Sun :

{
     "id": "1710070382",
     "endpoints": [
       {
         "id": "1710070382",
         "name": "Tysense Thermo",
         "first_usage": "sensor",
         "last_usage": "sensorThermo",
         "metadata": [
           {
             "name": "battDefect",
             "permission": "r",
             "type": "boolean",
             "enum_values": [],
             "unit": "boolean"
           },
           {
             "name": "configTemp",
             "permission": "r",
             "type": "numeric",
             "enum_values": [],
             "min": 0,
             "max": 4294967294,
             "step": 1,
             "unit": "NA"
           },
           {
             "name": "outTemperature",
             "permission": "r",
             "type": "numeric",
             "enum_values": [],
             "min": -99.9,
             "max": 99.9,
             "step": 0.01,
             "unit": "degC"
           }
         ],
         "data": [],
         "cmetadata": [],
         "access": {
           "protocol": "X3D",
           "profile": "temperature",
           "type": "direct",
           "addr": {
             "MSB": "xxxx",
             "ISB": "xxxx",
             "LSB": "xxxx",
             "index": "xxxx"
           },
           "subAddr": "0"
         },
         "devices": [],
         "error": 0
       }
     ],
     "suppress_requested": false
   },
   {
     "id": "1710070535",
     "endpoints": [
       {
         "id": "1710070535",
         "name": "Tysense Sun",
         "first_usage": "sensor",
         "last_usage": "sensorSun",
         "metadata": [
           {
             "name": "battDefect",
             "permission": "r",
             "type": "boolean",
             "enum_values": [],
             "unit": "boolean"
           },
           {
             "name": "configSensor",
             "permission": "r",
             "type": "numeric",
             "enum_values": [],
             "min": 0,
             "max": 4294967294,
             "step": 1,
             "unit": "NA"
           },
           {
             "name": "configTemp",
             "permission": "r",
             "type": "numeric",
             "enum_values": [],
             "min": 0,
             "max": 4294967294,
             "step": 1,
             "unit": "NA"
           },
           {
             "name": "lightPower",
             "permission": "r",
             "type": "numeric",
             "enum_values": [],
             "min": 0,
             "max": 65534,
             "step": 1,
             "unit": "W/m2"
           }
         ],
         "data": [],
         "cmetadata": [],
         "access": {
           "protocol": "X3D",
           "profile": "sensor",
           "type": "direct",
           "addr": {
             "MSB": "xxx",
             "ISB": "xxx",
             "LSB": "xxx",
             "index": "xxx"
           },
           "subAddr": "0"
         },
         "devices": [],
         "error": 0
       }
     ],
     "suppress_requested": false
   }
  • Dans l’idée se serait d’avoir les name de renseigné dès l’initialisation des objet mqtt, se serait top et d’avoir aussi le retour de l’unité (degC pour le thermo et W/m2 pour le Sun) actuellement on a déjà les valeurs c’est pas mal mais il manque ces infos :slight_smile:

J’aurais aimé échanger avec toi car j’ai quelques incompréhensions sur le code de base, et peut-être que si j’arrive a me débloquer je pourrais te proposer des PR propres avec mes devs pour aider, car tu as l’air de bien mieux connaitre l’extension que moi

Je te remercie beaucoup pour ton aide et désolé pour ce long, très long retour mais pour améliorer au mieux l’extension pour la communauté.

Bonjour, les principaux éléments que tu remontent sont en effet des comportements de l’addon. Pour les noms ca a ete conçu comme ca dans l’addon j’ai pas encore compris pourquoi par contre rien ne t’empeche de modifier le nom de tes éléments apres coup dans home assistant.
Je vais voir si je peux améliorer quelques petites choses d’apres tes retours mais pas forcément évident.

Le truc c’est que quand mon home assistant redémarre mes sensors (id) changent aussi pour se réinitialiser. Pas evident du coup ^^

Si j’ai bien compris, dans l’entité Sensor on pourrait améliorer des choses mais j’essai de faire des tests en local mais pas évident.

Merci pour ton aide en tout cas

Petit aperçus de mes capteurs

Bon là je suis à 0W/m2 car il fait nuit :slight_smile:

Ha oui, du coup les sensor sont bizarre ils ont pas unit_measurement du coup ça fait du sensor « valeur » je peux pas avoir de graphique comme mes W par exemple :

image

Idem pour le tysense sun

Question, comment tu fais pour récupérer ces infos sur tes capteurs? J’aimerai faire de même pour comparer nos 2 portes et merger la solution.

Pour les unites on devrait pouvoir faire quelque chose les infos sont la mais ne sont pas lues dans le code faut que je me penche dessus

Pour les noms des senseurs j’ai trouvé quelque chose qui marche.
Par contre ce que tu me dis est bizarre. A chaque redémarrage l’id est le même, ca be devrait pas te l’effacer si tu avais changé le nom dans mqtt

Edit @Eoras : J’ai mis une nouvelle version avec les sensors en plus et la mise a jour pour les noms

Ha super je vais essayer ça :slight_smile:
Est-ce que ça va mettre à jour tout seul mes entités dans home assistant ou pas ?

J’ai bien

Seulement pour les portes pas pour les fenêtres.

Les modèle sensor sont mis partout je sais plus si les volets j’étais en mode Shutter ou Cover ou Vollet je sais plus la j’ai sensor du coup.

je récupère que calibrationDefect du coup c’est normal ? Et seulement sur les deux porte pas les fenêtres.

J’ai modifié que pour portes donc normal. Pour le intrusiondetect je l’ai mis mais il ne doit pas etre remonté dans les messages si il ne s’affiche pas

Pour model c’est sensor a partir du moment ou s’est géré comme sensor par l’addon