Page 9 sur 13
Re: Téleinfo filaire avec Linky
Publié : 01 déc. 2020, 18:57
par Carthman
Salut !
Alors oui, je le savais bien, dans mon code il y a bien une différence entre les deux, mais là où je viens de trouver l'erreur c'est que dans la commande json pour aller écrire les valeurs dans le dispositifs Domoticz, je séparais les 2 valeurs avec une virgule, comme recopié avec le code de manuloup, alors qu'en fait il faut d'après la doc un point virgule.
D'ailleurs je me demande comment ça peut marcher chez toi manuloup avec la virgule ???!!!
Re: Téleinfo filaire avec Linky
Publié : 01 déc. 2020, 19:33
par manuloup
Carthman a écrit : 01 déc. 2020, 18:26
J'ai pu voir que dans ton code original tu rajoutes cela :
Code : Tout sélectionner
if [[ $PAPP < 100 ]] ; then
echo "$(date) : PAPP : $PAPP2 " >> /var/log/domoticz_teleinfo.txt
fi
Quelle est l'utilité ?
C'est du debug car j'avais des trames où la valeur de PAPP était négative et ça merdait. Du coup j'ai envoyé ça dans une log pour regarder de plus près. Aucune utilité pour toi

Re: Téleinfo filaire avec Linky
Publié : 02 déc. 2020, 14:58
par Carthman
Bonjour
Alors ce morceau de code fonctionne chez moi
Code : Tout sélectionner
#!/bin/bash
DOMO_IP="192.168.X.X" # Domoticz IP Address à renseigner
DOMO_PORT="XXX" # Domoticz Port à renseigner
TELEINFO_CONSO_IDX="90" # Teleinfo CONSO IDX à renseigner
#EAST=$(grep EAST /dev/ttyUSB12 -m 1 | awk '{ print $2}')
#EAIT=$(grep EAIT /dev/ttyUSB12 -m 1 | awk '{ print $2}')
#SINSTS=$(grep SINSTS /dev/ttyUSB12 -m 1 | awk '{ print $2}')
#SINSTI=$(grep SINSTI /dev/ttyUSB12 -m 1 | awk '{ print $2}')
echo "EAST : $EAST"
echo "EAIT : $EAIT"
echo "SINSTS : $SINSTS"
echo "SINSTI : $SINSTI"
#if [[ $SINSTS = +([0-9]) ]] ; then
#curl -s "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$TELEINFO_CONSO_IDX&nvalue=0&svalue=$SINSTS;$EAST" > /dev/null
#fi
Ca fonctionne pas trop mal, mais ça peut être un peu lent, car même si j'ai mis l'ordre des différents grep en fonction de l'ordre d'arrivée des infos désirées, le temps de traitement peut sauter une trame et du coup ça attend la trame d'après pour récupérer l'info manquante.
Je cherche donc à récupérer les 4 infos en une seule trame, avec cela :
et j'obtient
Code : Tout sélectionner
SINSTS 03856 \
SINSTI 00000 <
EAST 026715032 )
EAIT 002666950 '
Le problème c'est que je n'arrive pas à utiliser ce résultat dans une variable : le $variable me renvoie que la première ligne :
Code : Tout sélectionner
TELEINFO=$(grep -E 'EAST|EAIT|SINSTS|SINSTI' /dev/ttyUSB12 -m 4)
echo $TELEINFO
SINSTI 00000 < '
Bien sûr, en fonction de quand le script est déclenché, la première valeur à apparaitre n'est pas toujours la même !
J'ai passer des heures à essayer différents moyens, avec
sed, avec
awk, avec
| tr '\n' ' ',..., entre autres pour essayer de compiler le résultat affiché sur 4 lignes en une seule pour qu'elle puisse entrer dans la variable, rien n'y fait, je dois passer à côté de quelque chose, ou peut être faut-il définir la variable d'une autre manière ?
Si quelqu'un est susceptible de m'aider, je suis preneur !!!
Merci.
Re: Téleinfo filaire avec Linky
Publié : 02 déc. 2020, 15:14
par manuloup
Hello,
Tu peux pas le faire comme ça en une ligne je pense, il faut mieux faire 4 variables pour bien récupérer ce que tu veux pour chaque valeur, puis les mettre dans la variable finale si tu veux faire comme ça.
par exemple pour SINSTS :
>echo $SINSTS
SINSTS 03856 \
>SINSTS=$(echo $SINSTS |cut -d " " -f2)
>echo $SINSTS
03856
Le cut va splitter la chaine avec le caractère choisi (ici l'espace). Et tu récupères la chaine splittée dans ta variable.
Re: Téleinfo filaire avec Linky
Publié : 02 déc. 2020, 15:24
par Carthman
C'est ce que je fais dans le code un peu plus haut qui fonctionne bien, j'ai bien mes 4 variables différentes.
Et je ne l'ai pas précisé, mais je compte continuer à utiliser ces 4 variables, c'est obligé !
Je veux juste faire un seul grep de /dev/ttyUSB12 plutôt que 4 grep différents, et arriver à traiter ce grep avec mes 4 infos ensuite !
Re: Téleinfo filaire avec Linky
Publié : 03 déc. 2020, 01:25
par Carthman
Je finalise mon script qui fonctionne bien, je ferai un post plus détaillé prochainement.
En tout cas je peux te dire que c'est plus rapide de récupérer d'un coup les 4 trames et de les traiter ensuite, que de récupérer et traiter les trames 1 par 1 !
Pour cette partie du code :
Code : Tout sélectionner
if [[ $EAST = +([0-9]) ]] ; then
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$TELEINFO_EAST_IDX&nvalue=0&svalue=$EAST"
fi
A quoi sert le
if [[ $EAST = +([0-9]) ]] ; then si tu es sûr que c'est bien une valeur numérique ?
Dans le curl, j'envoie le résultat qui s'écrit normalement dans la console vers dev/null pour ne pas être embêté.
J'ai également enlevé le
-i et surtout le
-H "Accept: application/json".
A quoi sert-il vraiment ?
Merci.
Re: Téleinfo filaire avec Linky
Publié : 10 déc. 2020, 09:27
par manuloup
C'est justement parce que parfois j'avais une trame à vide ou avec des caractères pourris que je testais si j'avais bien du numérique.
Re: Téleinfo filaire avec Linky
Publié : 13 déc. 2020, 11:47
par Carthman
OK effectivement ça évite d'injecter des valeurs erronées au cas, petite précaution que je rajouterai également.
D'ailleurs j'ai des gros soucis avec mon Teleinfo qui me renvoit que des données brouillées, illisibles !!!
C'est une autre histoire, mais je vais essayer avec un PC portable pour voir si c'est pareil.
Re: Téleinfo filaire avec Linky
Publié : 13 déc. 2020, 18:55
par Carthman
Bonsoir,
Alors je mets à disposition le script bash que j'ai adapté à ma sauce pour lire le Teleinfo de mon Linky en mode Standard.
Tout fonctionne bien, merci pour votre aide !
Code : Tout sélectionner
#!/bin/bash
#TELEINFO LINKY STANDARD
#Script pour lire les données Teleinfo d'un Linky en Mode Standard
#Il peut être adapté pour le Mode Historique en modifiant les données souhaitées
#En fonction du besoin, créer un Compteur Conso EDF, Injection EDF, Autoconso, un pourcentage de charge et un compteur intelligent P1
#Les données de production sont récupérées grâce au dispositif créé avec ce plugin https://github.com/rklomp/Domoticz-SMA-SunnyBoy
#A mettre dans la Crontab avec @reboot pour qu'il se lance au démarrage
#Variables utilisateur à modifier
DOMO_IP="192.168.0.1" # IP Domoticz à renseigner
DOMO_PORT="1234" # Port Domoticz à renseigner
TELEINFO_USB="12" # Port USB où est branché le module Teleinfo
PUISSANCE="9000" # Puissance du compteur en VA
CONSO_IDX="87" # IDX Compteur Conso EDF à renseigner
INJECTION_IDX="88" # IDX Compteur Injection EDF à renseigner
P1_IDX="92" # IDX Compteur Intelligent P1 à renseigner
AUTOCONSO_IDX="90" # IDX Compteur Autoconso à renseigner
CHARGE_IDX="91" # IDX Charge à renseigner
SMA_IDX="78" # IDX Plugin SMA
VALEUR_DECOMPTE="3" # MAJ des compteurs toutes les 4 secondes environ (un passage du script prend en moyenne 1.3 Secondes)
DECOMPTE="$VALEUR_DECOMPTE"
sudo stty -F /dev/ttyUSB$TELEINFO_USB 9600 evenp -crtscts
while true
do
#Récupération de toutes les données dans la trame USB et traitement pour utilisation
TELEINFO=$(grep -E 'EAST|EAIT|SINSTS|SINSTI' /dev/ttyUSB$TELEINFO_USB -m 4 | sort | awk '{ print($1 $2) }' | sed 's/[a-z A-Z]//g')
#Récupération des données de production
PRODPV=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$SMA_IDX" | jq -r .result[]."Usage" | sed 's/[a-z A-Z]//g')
PRODPVKWH=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$SMA_IDX" | jq -r .result[]."Data" | sed 's/[a-z A-Z .]//g')
#Lecture des données récupérées
#EAIT = Energie Active Injectée Totale
#EAST = Energie Active Soutirée Totale
#SINSTI = Puissance Apparente Instantanée Injectée
#SINSTS = Puissance Apparente Instantanée Soutirée
#CHARGE = Pourcentage de Charge par rapport à l'abonnement - Peut-être utilisée pour faire du délestage
#AUTOCONSO = Autoconsommation instantanée en W
#AUTOCONSOKWH = Autoconsommation totale en Wh
#TOTALELEC = Consommation Totale en W (Autoconso + EDF)
EAIT=$(echo $TELEINFO | awk '{ print $1}')
EAST=$(echo $TELEINFO | awk '{ print $2}')
SINSTI=$(echo $TELEINFO | awk '{ print $3}')
SINSTS=$(echo $TELEINFO | awk '{ print $4}')
CHARGE=$(echo "scale=2; $SINSTS/$PUISSANCE*100" | bc -l)
AUTOCONSO=$(echo $(($PRODPV-$SINSTI)))
AUTOCONSOKWH=$(echo "$PRODPVKWH-$EAIT" | bc)
TOTALELEC=$(echo "$AUTOCONSO+$SINSTS" | bc)
ERREUR_TELEINFO="0"
#Tests pour affichage des données dans la console
#echo $TELEINFO
#echo "EAIT : $EAIT"
#echo "EAST : $EAST"
#echo "SINSTI : $SINSTI"
#echo "SINSTS : $SINSTS"
#echo "CHARGE : $CHARGE"
#echo "PRODPV : $PRODPV"
#echo "PRODPVKWH : $PRODPVKWH"
#echo "AUTOCONSO : $AUTOCONSO"
#echo "AUTOCONSOKWH : $AUTOCONSOKWH"
#echo "TOTALELEC : $TOTALELEC"
#echo "ERREUR : $ERREUR_TELEINFO"
#echo "DECOMPTE : $DECOMPTE"
if [[ $DECOMPTE = 0 ]] ; then
#Données envoyées vers le compteur Conso EDF
if [[ $SINSTS = +([0-9]) ]] && [[ $EAST = +([0-9]) ]] ; then
curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$CONSO_IDX&nvalue=0&svalue=$SINSTS;$EAST" > /dev/null
else ERREUR_TELEINFO="1"
fi
#Données envoyées vers le compteur Injection EDF
if [[ $SINSTI = +([0-9]) ]] && [[ $EAIT = +([0-9]) ]] ; then
curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$INJECTION_IDX&nvalue=0&svalue=$SINSTI;$EAIT" > /dev/null
else ERREUR_TELEINFO="1"
fi
#Données envoyées vers le compteur Autoconso
if [[ $AUTOCONSO = +([0-9]) ]] && [[ $AUTOCONSOKWH = +([0-9]) ]] ; then
curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$AUTOCONSO_IDX&nvalue=0&svalue=$AUTOCONSO;$AUTOCONSOKWH" > /dev/null
else ERREUR_TELEINFO="1"
fi
#Données envoyées vers le compteur intelligent P1
if [[ $TOTALELEC = +([0-9]) ]] && [[ $ERREUR_TELEINFO = 0 ]] ; then
curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$P1_IDX&nvalue=0&svalue=$EAST;$AUTOCONSOKWH;$EAIT;$AUTOCONSOKWH;$TOTALELEC;$PRODPV" > /dev/null
fi
DECOMPTE="$VALEUR_DECOMPTE+1"
fi
#Données envoyées vers le compteur de charge
curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$CHARGE_IDX&nvalue=0&svalue=$CHARGE" > /dev/null
DECOMPTE=$((DECOMPTE-1))
done
Re: Téleinfo filaire avec Linky
Publié : 13 déc. 2020, 20:39
par manuloup
Impeccable, bravo à toi.