Page 9 sur 13

Re: Téleinfo filaire avec Linky

Publié : 01 déc. 2020, 18:57
par Carthman
Keros a écrit : 01 déc. 2020, 18:32 Je pense que ton soucis vient que ton deuxième compteur a besoin de deux infos pour être mis à jour : https://www.domoticz.com/wiki/Domoticz_ ... counter.29
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

PAPP=`expr $PAPP + 0`

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 :

Code : Tout sélectionner

grep -E 'EAST|EAIT|SINSTS|SINSTI' /dev/ttyUSB12 -m 4
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&param=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&param=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&param=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&param=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&param=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&param=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.