Pensant acheter un composant EnOCean

, je me suis retrouvé avec un composant ZigBee

... J'ai fait l'erreur tout seul, mais hier le vendeur m'a à peine cru quand je lui est dit qu'il n'était pas EnOcean, donc l’honneur est sauf.
Le composant en question est vendu à 39.90 chez Leroy Merlin, il permet : la détection de mouvement (capteur PIR), l'ouverture d'une porte (inter à aimant), la mesure de température, la mesure de lumière (lux), il dispose d'un contact permettant de savoir s'il a été démonté et enfin retourne l'état de la batterie.
Chez Leroy Merlin, il est vendu sous la marque Evology mais c'est en fait un capteur de chez Philio Technology Corporation (une société Taiwanaise)
Vous pourrez trouvez sa documentation, via Google (en tapant par exemple) : PST03 Philio filetype:pdf (il n'est pas possible de télécharger de PDF sur le forum, ou j'ai loupé un truc)
Le vrai nom du capteur est : PST03A-v2.2.5.
Fonctionnement grossier :
- * Lorsqu'un mouvement se produit ou que la porte surveillée passe de l'état fermée à ouverte (ou le contraire), une alerte est émise. 5 secondes plus tard la température est émise et une seconde après les 'lux'
* Lorsque le composant est démonté une alerte est envoyée (mais pas la température et les lux)
* La température et les lux ne sont pas envoyés à intervalles réguliers (que sur demande et en cas d'alerte)
* Lorsqu'il faut changer la batterie une alerte est envoyée toutes les 30'
Nota : Il existe quelques autres messages, que je n'ai pas utilisés
Tant bien que mal je suis arrivé à patcher le driver pour le faire marcher. J'ai deux capteurs de ce type et une lampe Ikea qui fonctionnent (depuis quelques heures maintenant).
Bon, je découvre Domoticz, ZigBee, python, les plugins Domoticz, donc je n'ai pas la prétention d'avoir fait un truc parfait... Mais ça semble marcher...

- La vue des périphériques (zig59) dans l'onglet interrupteurs
- PeriphDansDomoInterrupteurs.PNG (71.47 Kio) Consulté 7575 fois

- La vue des périphériques (zig59) dans l'onglet température
- PeriphDansDomoTempérature.PNG (33.88 Kio) Consulté 7575 fois

- La vue des périphériques (zig59) dans l'onglet mesure
- PeriphDansDomoLux.PNG (36.86 Kio) Consulté 7575 fois
Après cette introduction pour appâter le lecteur, quelques détails :
Une fois intégrés les composants ont la structure suivante (dictionnaire python)
Code : Tout sélectionner
'b76c':
{
'Heartbeat': '18',
'ProfileID': '0104',
'Model': 'PST03A-v2.2.5',
'RIA': '8',
'Ep':
{
'01':
{
'0400': 17782, ## Le capteur de LUX
'0406': {},
'0000': {},
'0402': 28.9, ## Le capteur de température
'0009': {},
'0500': 13,
'0001': {},
'Type': 'Door/Switch/Lux/Temp' ## Une nouveauté
},
'02':
{
'0000': {},
'0009': {},
'0500': 21,
'000f': {},
'0001': {},
'Type': 'Motion' ## Une nouveauté
}
},
'Status': 'inDB',
'Battery': '100',
'MacCapa': '80',
'IEEE': '000d6f00030bb4cb7',
'ZDeviceID': '0402',
'Type': 'Motion/Door/Switch/Lux/Temp'
},
A noter : le cluster 0500 qui a la valeur 21 ou 13 sert à indiquer le type de capteur dans le EndPoint
- 21 ==> Motion
13 ==> Contact de porte
Dans la spécification c'est le contraire, en tout cas dans Domoticz ce n'est pas inversé... (il faudrait que je regarde si c'est une erreur de spécification ou mois qui inversé quelque chose).
Modification dans le code :
1/
Avec le plugin, les "devices domoticz" déclarés ('Motion/Door/Switch/Lux/Temp') dans la clé 'Type' sont créés pour chaque EndPoints, ce qui ne m'arrangeait pas, car l'un à 3 capteurs et l'autre 1 seul. Ainsi j'avais deux "Capteur de mouvements" alors que physiquement il n'y en a qu'un.
Pour contourner le problème j'ai ajouté une clé 'Type' dans la définition de chaque EndPoint et j'ai modifié le code ainsi :
Pour un EndPoint si la clé 'Type' existe elle utilisée, si elle n'existe pas c'est la clé 'type' de premier niveau qui est utilisée. Ainsi pour chaque EndPoint on peut définir les "devices Domoticz" que l'on veut.
Ma modification semble OK, j'ai une ampoule Ikea qui fonctionne toujours et qui elle utilise la clé 'type' de premier niveau. Donc en théorie je n'ai rien cassé.
La ligne à ajouter dans DeviceConf.txt est
'PST03A-v2.2.5':{'Ep':{'01':{'0406':'','0500':'','0400':'','0402':'','Type':'Door/Switch/Lux/Temp'},'02':{'0500':'','Type':'Motion'}},'Type':'Motion/Door/Switch/Lux/Temp'}
A noter : pour les clusters il faut les '' (exemple : '0406':'') sinon le "eval" dans le plugin plante. 1h30 de recherche pour trouver....
2/
J'ai créé un "devices Domoticz" Porte. C'est essentiellement lié au fait que le composant comporte 2 interrupteurs :
- 1 pour l'ouverture de porte
- 1 pour le démontage du boitier
Je n'arrivait pas à gérer deux "switch" pour un même composant (ça doit être faisable mais je n'ai pas trouvé)
3/
La fonction de découpage en message unitaire (onChange) a été réécrite.
Le nom du périphérique est PST03A-v2.2.5.
'0' se code 30 en ASCII et '3' se code 33 en ASCII, ainsi dans la chaine texte se trouvait une sequence "03" qui régulièrement coupait le message après le T de PST (et rien ne pouvait fonctionner).
Pour contourner le problème, le découpage en message unitaire est fait sur la version binaire et c'est seulement qu'une fois que le "message unitaire" est recomposé qu'il est convertit en ASCII et le reste s’enchaine sans modification.
4/
J'ai commencé à ajouter le numéro des EndPoints pour le nommage par défaut des "devices Domoticz", je trouve cela pratique (surtout quand j’avais tout en double) : à continuer ou à supprimer.
5/
Le traitement des alertes est fait dans la fonction Decode8401().
Le composant indique le niveau de la batterie par un unique bit :
0 = OK
1 = A changer
Pour le cas 'OK' self.ListOfDevices[MsgSrcAddr]['Battery'] est rempli avec la valeur "100", j'ignore si c'est la bonne valeur
Dans Domoticz, le contact "démontage/ouverture composant" n'est pas remis à Zéro automatiquement (d'ailleurs le périphérique n’envoie pas de message pour indiquer quand le composant est remonté). Il faut le faire à la main (ou par script) dans Domoticz, s'agissant d'une alerte je trouve ça normal, s'il était remis à zéro automatiquement on pourrait louper l'information.
Pour le remettre à zéro il faudrait implémenter le même mécanisme que pour le capteur de mouvement.
A prévoir/
Le nom du périphérique est PST03A-v2.2.5, on n'est pas à l'abri qu'il change un jour (si la version change).
Si on ne veut pas avoir autant de lignes dans le fichier DeviceConf.txt que de versions, il faut modifier le plugin.
Par ailleurs il existe des versions allégées PST03B et PST03C qui devraient fonctionner avec ce code (non testé)
Ouf, fin !
Sauf bugs, les modifications n'altèrent pas le fonctionnement pour les autres périphériques.
En espérant avoir été clair (et pas trop pénible)
Bon, je parts en vacances !