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 !
