Je complète mon précédent post car j'ai progressé.
Je possède deux sondes de température OTIO (voir photos jointes).
Références : 93806-0001 et 93807-0001
Elles délivrent les trames suivantes.
93806-000
07 03 10 64 18 86 15 88 pour 21.8°C
07 03 10 81 18 86 15 85 pour 21.5°C
93807-0001
07 03 10 85 18 4C 0D 80 pour 13.0°C
07 03 10 89 18 4C 0E 87 pour 14.7°C
(attention, la représentation en hexa ci-dessus est un effet du formatage par hexdump.
En réalité c'est une suite de 64 bits.
En faisant un peu de reverse engineering on peut interpréter une partie du format:
- les bits 1 à 24 bits (6 chiffres hexa) ne varient pas (peut être une identification du capteur/constructeur ...)
- les bits 25 à 32 varient beaucoup (peut être un cks mais en général le cks est en fin de trame ... donc non élucidé.
- les bits 33 à 40 sont constant (valeur 18 en base 16)
- les bits 41 à 48 sont constant mais propre à chaque capteur 86 pour l'un et 4C pour l'autre : j'ai considéré que c'est l'ID du capteur
- le bit 49 est à 1 quand les températures sont négatives et à 0 sinon
- les bits 50 à 56 codent la partie entière de la température (codage binaire pur non signé)
- les bits 57 à 60 sont toujours à 1000
- les bits 61 à 64 codent la partie décimale de la température (codage binaire pur sans non signé)
Avec ce décodage partiel, c'est suffisant pour une intégration (certes un peu sommaire) dans Domoticz.
N'ayant pas trouvé mieux, j'ai écrit un code (en C) qui lit /dev/ttyUSB0 pour récupérer la trame émise par le RFX433 et effectue le décodage et formatte un message selon la syntaxe JSON.
Côté Domoticz, il faut avoir créé deux capteurs virtuels et noter leur IDX car c'est mon code C qui fait l'association ID OTIO- ID Domoticz.
Ne pas oublier aussi de valider les protocoles "Rubicson" et de mettre "undec on" à ON.
Ensuite par un jeu de pipe j'envoie ce message JSON à Domotics par le protocole MTQQ.
L'ennui c'est que deux process ne peuvent pas lire en même temps ttyUSB0. Donc si mon code C lit en permanence ce port, Domoticz ne reçoit plus rien et ne peux plus récupérer les valeurs de mes autres capteurs (Oregon).
J'ai donc fait une "bidouille" qui ne me plait qu'à moitié. (Je suis preneur d'une meilleure solution)
Mon code C est lancé toutes les 5 minutes (voir la crontab) ne monopolise le port USB0 jamais plus de 90 secondes consécutives. Ensuite le port est libéré pour Domoticz.
Ne pas oublier de faire un
sudo crontab -e
et ajouter dans la crontab
Code : Tout sélectionner
*/5 * * * * cat /dev/ttyUSB0 | /home/pi/otio2domoticz 134 89 76 90| mosquitto_pub -h localhost -t "domoticz/in" -s
Ci-dessous mon code C (fichier otio2domoticz.c)
Code : Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
/* nombre max de capteurs OTIO */
#define MAX_OTIO (10)
int globaltimeout = 3;
/* alarm signal handler */
void alarm_func()
{
fprintf(stderr, "Timeout %d seconde atteint !\n", globaltimeout);
exit(0);
}
/* getchar avec timeout */
int mygetchar(int timeout)
{
int c;
globaltimeout = timeout;
alarm(timeout);
c = getchar();
alarm(0);
return c;
}
void main(int argc, char **argv)
{
unsigned short int c;
unsigned short int sensorID;
short int enttemp, dectemp;
char sign;
unsigned short tidotio[MAX_OTIO+1], tiddomo[MAX_OTIO+1];
short int i, j, myargc, nbotio;
if(argc > MAX_OTIO+1){
fprintf(stderr, "Trop de capteurs déclarés (ne peut dépasser %d)\n", MAX_OTIO);
exit(1);
}
if ((argc < 2) || ((argc % 2) == 0) ){
fprintf(stderr, "Manque arguments d'affectation capteurs\n");
exit(0);
}
/* nombre de capteurs à traiter */
nbotio = (argc-1)/2;
/* Appairage ID OTIO a ID Domoticz */
myargc = argc;
while (myargc > 1) {
i = (myargc-1)/2;
fprintf(stderr, "myargc=%d i=%d\n", myargc, i);
tidotio[i] = atoi(argv[myargc-2]);
tiddomo[i] = atoi(argv[myargc-1]);
myargc -=2;
}
/* verification */
for (i=1; i<=(argc-1)/2; i++)
fprintf(stderr, "L'ID OTIO %3d est affecté à l'ID DOMO %d\n", tidotio[i], tiddomo[i]);
signal(SIGALRM, alarm_func );
for(j=0; j<nbotio;j++){
redo:
while ((c = mygetchar(90)) != 0x07);
if ( (c = mygetchar(3) ) != 0x03)
//continue;
goto redo;
if ( (c = mygetchar(3) ) != 0x10)
//continue;
goto redo;
/* on saute deux char */
mygetchar(3);
mygetchar(3);
/* on lit ce qui est supposé etre l'ID sensor */
sensorID = mygetchar(3);
/* recherche de l'ID Domo */
for(i=1; i<MAX_OTIO; i++)
if(sensorID == tidotio[i])
break;
/* lecture signe et partie entière */
c = mygetchar(3);
sign = (c & 0x80) ? '-': '+';
enttemp = (c & 0x7f);
/* lire la décimale */
dectemp = mygetchar(3) & 0x0F;
fprintf(stderr, "ID OTIO:%3u ID DOMO:%d %c%d.%d\n", sensorID, tiddomo[i], sign, enttemp, dectemp);
printf("{\"idx\" : %d, \"nvalue\" : 0, \"svalue\" : \"%c%d.%d\"}\n", tiddomo[i], sign, enttemp, dectemp);
}
}
Le résultat final est illustré par la copie d'écran Domoticz
On voit 4 indications de tempé : l'une provient d'un BME280, une autre de ma sonde OREGON et deux viennent de mes sondes OTIO