Piloter un périphérique Tuya/Smart Life depuis eedomus

On parle ici de l’utilisation de vos objets connectés avec eedomus

Re: Piloter un périphérique Tuya/Smart Life depuis eedomus

Messagepar Djay78 » 04 Mai 2026 10:48

Bonjour dommarion, Zoara, Lagaff86,

En analysant le code source de votre excellent plugin (Tuya_direct.php v1.11), j'ai identifié un bug : le statut online/offline et les métadonnées de l'appareil sont bien récupérés depuis l'API Tuya via l'endpoint /v2.0/cloud/thing/{device_id}, mais ils ne sont jamais injectés dans le XML final retourné à eedomus.

La cause : le premier XML (ligne 448 : $xml=sdk_json2Xml($json)) est immédiatement écrasé par le second appel API (ligne 472), et la ligne //echo $xml confirme que ce premier XML était bien destiné à être utilisé mais a été commenté. Seul $is_online était extrait avant l'écrasement, mais sans jamais être injecté dans le XML final.

Mon humble suggestion de CORRECTIF — 2 modifications dans la section if ($device_id) :

1. Après la ligne 451, sauvegarder les métadonnées avant écrasement :
Code : Tout sélectionner
$device_meta = $response['result'];


2. Après la ligne 476 ($nonce = $tid;), injecter les métadonnées dans le XML final :

Code : Tout sélectionner
// Nettoyage des caractères hors ISO-8859-1
$meta_name        = utf8_decode(preg_replace('/[^\x00-\xFF]/u', '-', str_replace('"', '', isset($device_meta['name'])       ? $device_meta['name']       : '')));
$meta_customName  = utf8_decode(preg_replace('/[^\x00-\xFF]/u', '-', str_replace('"', '', isset($device_meta['custom_name']) ? $device_meta['custom_name'] : '')));
$meta_ip          = str_replace('"', '', isset($device_meta['ip'])          ? $device_meta['ip']          : '');
$meta_active_time = str_replace('"', '', isset($device_meta['active_time']) ? $device_meta['active_time'] : '');
$meta_update_time = str_replace('"', '', isset($device_meta['update_time']) ? $device_meta['update_time'] : '');
$xml = str_replace('</result>',
    '<is_online>'   . $is_online        . '</is_online>' .
    '<name>'        . $meta_name        . '</name>' .
    '<customName>'  . $meta_customName  . '</customName>' .
    '<ip>'          . $meta_ip          . '</ip>' .
    '<active_time>' . $meta_active_time . '</active_time>' .
    '<update_time>' . $meta_update_time . '</update_time>' .
    '</result>',
    $xml);


---

NOTES TECHNIQUES :
- $device_meta doit être sauvegardé AVANT le second appel API car sdk_json2Xml() écrase la variable globale $response
- utf8_decode() est nécessaire car l'API Tuya retourne du UTF-8 et eedomus attend de l'ISO-8859-1
- preg_replace('/[^\x00-\xFF]/u', '-', ...) gère les caractères Unicode hors ISO-8859-1 (ex. em dash —) non convertibles par utf8_decode
- custom_name (avec underscore) est le nom personnalisé SmartLife — attention, ce n'est pas customName (camelCase) comme on pourrait le supposer
- ip est vide pour les devices Zigbee (normal, ils passent par la passerelle)

---

XPATH eedomus pour exploiter les nouveaux champs :
/root/result/is_online
/root/result/name
/root/result/customName
/root/result/ip
/root/result/active_time
/root/result/update_time

---

XML de validation obtenu après patch sur un device Zigbee Smart Metering Switch :

<is_online>true</is_online>
<name>SY1-ZigBee Smart Metering Switch</name>
<customName>VMC-SY1-ZigBee Smart Metering Switch</customName>
<ip></ip>
<active_time>1777834501</active_time>
<update_time>1777887613</update_time>

Patch testé et validé sur eedomus+ :)


Merci pour ce plugin très bien conçu ! ;)
Onduleur APC | Aspirateur Xiaomi | Weather Underground | Mes temporisations | Nuki | Tuya SmartLife | Concaténateur | Sonos | Spotify | TV Samsung | Cozytouch2
Djay78
 
Messages : 10
Inscription : 30 Mai 2019

Précédent

Retour vers Objets connectés

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 5 invité(s)