SmartMeter avec port P1

Bonjour. J’ai un peu travaillé sur le sujet, sur la base des informations que vous aviez partagées ici. Et je suis arrivé à un bonne solution, quoique pas spécialement simple à mettre en place. Pour ceux qui veulent tous les détails, je les ai documenté ici :

Bonjour @neitsabes1981,

Mon port P1 a été activé, quelle solution as-tu donc finalement mise en place ?
utilises-tu un 2e rpi que celui de jeedom ?
Si je comprends bien, tu ne passes pas via p1monitor.

Bien à toi,
M

Bonjour
Alors moi j’ai réussi à lire les données en direct, depuis mon seul rpi avec Jeedom.
Je récupère bien mes données, mais je n’ai plus eu le temps de travailler sur la présentation ni l’utilisation de ce que je récupère, à part les afficher et les historiser, je ne fais rien de plus pour le moment.
ça nécessite un script et des variables virtuelles, c’est tout.

image

Bonjour,

Je suis également passé début du mois sur un compteur intelligent double flux.
Mon modèle est le meme que celui de @Domex : le Sagemcom T211, ports p1/s1 ouverts.

Ce post m’a beaucoup aidé, du coup je vais ajouter ma pierre a l’édifice :slight_smile: .

J’ai opté pour la solution raspberry branché sur mon compteur avec la dernière image de P1Monitor ( très facile à installer du coup).
Pour le cable, j’étais pas sur du tout de mon coup vu le flou sur les modèles etc.
j’en ai trouvé un qui fonctionne très bien sur un très célèbre site d’ecommerce :smiley:
Facilement trouvable en cherchant la référence : Für ISKRA AM550/Sagemcom XS210 T210-D.

Une fois sur l’interface de P1Monitor, j’ai un peu cherché comment configurer tout ça étant donné que je n’avais pas de données qui remontaient ( je ne savais pas si j’avais fait le bon choix de cable :smiley: ).

Heureusement, les informations de @neitsabes1981 m’ont été très utiles :

Citation
Etant donné que j’ai réussi à récupérer les données avec la vitesse de transmission de 115200 et sans parité, je vais supposer pouvoir utiliser le script pour ESMR 5.0

Sur l’écran de configuration du port p1, ça donne ceci :

Je n’ai pas bougé à grand chose d’autre si ce n’est des données affichées sur le dashboard.

Ensuite je n’ai plus eu qu’à faire un petit script pour appeler l’api ( assez bien faite :stuck_out_tongue: ) depuis jeedom et mettre à jour les commandes infos précédemment créées.

Voici ce que ça donne pour le moment :

.

Il ne manque plus qu’a rajouter les données annuelles, et ça devrait être une bonne base pour la suite :slight_smile: .

Voilà, en espérant que ça aidera aussi ceux pour qui ce n’était pas encore totalement clair ^^

salut, j’ai lu ton article avec intérêt, juste qqs petites choses pour amélioré tout cela,

tasmota a changé le schémas de câblage, il apporte l’alimentation direct via le compteur:

cela facilite l’installation

et a la place de passer par un script, pourquoi ne pas passé via un scenario avec du code dedans, comme cela tu sais tout faire au même endroit.

bon, mon compteur arrive dans un mois, je vais commencer a souder sur une platine wemos

image
ce sera le plus propre, a mon avis. j’espère pouvoir le mettre dans la trappe du compteur sans que les fils ne sortent

1 « J'aime »

Merci. Sympa pour les précisions. Je pense qu’un plugin serait encore mieux. Ayant été dévelopeur, j’y ai regardé. Ce ne serait pas si compliqué. Il me manque juste du temps.

2 « J'aime »

bon, la platine est en cours de montage. voila ce que cela donne:



et avec le wemos:

j’espere que tout rentrera dans le compartiment. le compteur arrive ds 2-3 semaines, on testera

Salut,

A la demande de @Darween, je partage mon code pour les call api du p1monitor et du virtuel :

# DECLARATION DES VARIABLES
ip_jeedom = "ip jeedom"
ip_p1monitor = "ip p1 monitor"
apikey_jeedom = "api key jeedom"
  
# ID DES COMMANDES SOUS JEEDOM
idConsoTotaleJour = "6215"
idConsoTotaleNuit = "6216"
idProdTotaleJour = "6217"
idProdTotaleNuit = "6218"
idConsoInstant = "6219"
IdInjectionInstant = "6220"
idInjectionJourna = "6222"
idConsoJourna = "6223"
idAutoConsoJourna = "6224"
idConsoMensuelle = "6228"
idInjectionMensuelle = "6229"
idAutoConsoMensuelle = "6230"
idConsoAnnuelle = "6231"
idInjectionAnnuelle = "6232"
idAutoConsoAnnuelle = "6233"
idProductionPanneauxJour = "3134"
idProductionPanneauxMois = "3133"
idProductionPanneauxAnnee = "3132"
  
import sys
import urllib
from datetime import datetime, timedelta
import requests
from requests.exceptions import HTTPError
  
try:
	#Call donnees courantes
	response = requests.get('http://'+ip_p1monitor+'/api/v1/smartmeter?limit=1&sort=desc&json=object')
	response.raise_for_status()
    # access JSOn content
	jsonResponse = response.json()
    
    #On additionne les donnees du jour et de la nuit pour le total
	consoNowTotal = jsonResponse[0]["CONSUMPTION_KWH_HIGH"] + jsonResponse[0]["CONSUMPTION_KWH_LOW"]
	injectionNowTotal = jsonResponse[0]["PRODUCTION_KWH_HIGH"] + jsonResponse[0]["PRODUCTION_KWH_LOW"]

    # ON DEFINI LES URLS POUR CHAQUE VARIABLE
	urlConsoTotaleJour = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idConsoTotaleJour+"&value="+str(jsonResponse[0]["CONSUMPTION_KWH_HIGH"])
	urlConsoTotaleNuit = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idConsoTotaleNuit+"&value="+str(jsonResponse[0]["CONSUMPTION_KWH_LOW"])
	urlProdTotaleJour = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idProdTotaleJour+"&value="+str(jsonResponse[0]["PRODUCTION_KWH_HIGH"])
	urlProdTotaleNuit = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idProdTotaleNuit+"&value="+str(jsonResponse[0]["PRODUCTION_KWH_LOW"])
	urlConsoInstant = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idConsoInstant+"&value="+str(jsonResponse[0]["CONSUMPTION_W"])
	urlInjectionInstant = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+IdInjectionInstant+"&value="+str(jsonResponse[0]["PRODUCTION_W"])

	
    ########  calculs journaliers  ############
    
    #call api pour donnees du jour
	urlApiDay = str("http://"+ip_p1monitor+"/api/v1/powergas/day?limit=1&sort=desc&json=object&round=off")
	dayResponse = requests.get(urlApiDay)
	dayResponse.raise_for_status()
	dayJsonResponse = dayResponse.json()
    
    #consommation et injection du jour
	injectionJourna = dayJsonResponse[0]["PRODUCTION_DELTA_KWH"]
	consoJourna = dayJsonResponse[0]["CONSUMPTION_DELTA_KWH"]
    
    # ON DEFINI LES URLS POUR CHAQUE VARIABLE
	urlInjectionJourna = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idInjectionJourna+"&value="+str(round(injectionJourna, 2))
	urlConsoJourna = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idConsoJourna+"&value="+str(round(consoJourna, 2))
    
    #On recupere la production journaliere actuelle des panneaux
	urlProductionJournaActuelle = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=cmd&id="+idProductionPanneauxJour
	responseTotProdPanneaux = requests.get(urlProductionJournaActuelle)
	responseTotProdPanneaux.raise_for_status()
	totalProdPanneaux = float(responseTotProdPanneaux.json())
    
	if(totalProdPanneaux > 0):
    	#Calcul du pourcentage d'auto-consommation
		percentageAutoConso = round(((totalProdPanneaux - injectionJourna) / totalProdPanneaux ) * 100 , 2)
	else:
		percentageAutoConso = 0
    
    # ON DEFINI LES URLS POUR CHAQUE VARIABLE
	urlAutoConsoJourna = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idAutoConsoJourna+"&value="+str(percentageAutoConso)
    
    
    
    ########  calculs mensuels  ############
    #call api pour donnees du mois
	urlApiMonth = str("http://"+ip_p1monitor+"/api/v1/powergas/month?limit=1&sort=desc&json=object&round=off")
	monthResponse = requests.get(urlApiMonth)
	monthResponse.raise_for_status()
	monthJsonResponse = monthResponse.json()
    
    #calcul des consommation et injection du mois
	injectionMensuelle = monthJsonResponse[0]["PRODUCTION_DELTA_KWH"]
	consoMensuelle = monthJsonResponse[0]["CONSUMPTION_DELTA_KWH"]
    
    # ON DEFINI LES URLS POUR CHAQUE VARIABLE
	urlInjectionMensuelle = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idInjectionMensuelle+"&value="+str(round(injectionMensuelle, 2))
	urlConsoMensuelle = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idConsoMensuelle+"&value="+str(round(consoMensuelle, 2))
    
    
    #On recupere la production mensuelle actuelle des panneaux
	urlProductionMensuelleActuelle = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=cmd&id="+idProductionPanneauxMois
	responseTotProdMensuellePanneaux = requests.get(urlProductionMensuelleActuelle)
	responseTotProdMensuellePanneaux.raise_for_status()
	totalProdMensuellePanneaux = float(responseTotProdMensuellePanneaux.json())
    
	if(totalProdMensuellePanneaux > 0):
    	#Calcul du pourcentage d'auto-consommation
		percentageAutoConsoMensuelle = round(((totalProdMensuellePanneaux - injectionMensuelle) / totalProdMensuellePanneaux ) * 100 , 2)
	else:
		percentageAutoConsoMensuelle = 0
    
    # ON DEFINI LES URLS POUR CHAQUE VARIABLE
	urlAutoConsoMensuelle = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idAutoConsoMensuelle+"&value="+str(percentageAutoConsoMensuelle)
    
    
    ########  calculs annuels  ############

    #call api pour donnees de l annee
	urlApiYear = str("http://"+ip_p1monitor+"/api/v1/powergas/year?limit=1&sort=desc&json=object&round=off")
	yearResponse = requests.get(urlApiYear)
	yearResponse.raise_for_status()
	yearJsonResponse = yearResponse.json()
    
    #calcul des consommation et injection de l annee
	injectionAnnuelle = yearJsonResponse[0]["PRODUCTION_DELTA_KWH"]
	consoAnnuelle = yearJsonResponse[0]["CONSUMPTION_DELTA_KWH"]
    
    # ON DEFINI LES URLS POUR CHAQUE VARIABLE
	urlInjectionAnnuelle = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idInjectionAnnuelle+"&value="+str(round(injectionAnnuelle, 2))
	urlConsoAnnuelle = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idConsoAnnuelle+"&value="+str(round(consoAnnuelle, 2))
    
     #On recupere la production annuelle actuelle des panneaux
	urlProductionAnnuelleActuelle = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=cmd&id="+idProductionPanneauxAnnee
	responseTotProdAnnuellePanneaux = requests.get(urlProductionAnnuelleActuelle)
	responseTotProdAnnuellePanneaux.raise_for_status()
	totalProdAnnuellePanneaux = float(responseTotProdAnnuellePanneaux.json())
    
	if(totalProdAnnuellePanneaux > 0):
    	#Calcul du pourcentage d'auto-consommation
		percentageAutoConsoAnnuelle = round(((totalProdAnnuellePanneaux - injectionAnnuelle) / totalProdAnnuellePanneaux ) * 100 , 2)
	else:
		percentageAutoConsoAnnuelle = 0
    
    # ON DEFINI LES URLS POUR CHAQUE VARIABLE
	urlAutoConsoAnnuelle = "http://"+ip_jeedom+"/core/api/jeeApi.php?apikey="+apikey_jeedom+"&type=virtual&id="+idAutoConsoAnnuelle+"&value="+str(percentageAutoConsoAnnuelle)
	
    
   	# ON POST LES VARIABLES
	urllib.urlretrieve (urlConsoTotaleJour)
	urllib.urlretrieve (urlConsoTotaleNuit)
	urllib.urlretrieve (urlProdTotaleJour)
	urllib.urlretrieve (urlProdTotaleNuit)
	urllib.urlretrieve (urlConsoInstant)
	urllib.urlretrieve (urlInjectionInstant)
	urllib.urlretrieve (urlInjectionJourna)
	urllib.urlretrieve (urlConsoJourna)
	urllib.urlretrieve (urlAutoConsoJourna)
	urllib.urlretrieve (urlInjectionMensuelle)
	urllib.urlretrieve (urlConsoMensuelle)
	urllib.urlretrieve (urlAutoConsoMensuelle)
	urllib.urlretrieve (urlInjectionAnnuelle)
	urllib.urlretrieve (urlConsoAnnuelle)
	urllib.urlretrieve (urlAutoConsoAnnuelle)
    
except:
	print("Unexpected error:", sys.exc_info()[0])
	raise

Le code n’est surement pas parfait, mais il a le mérite de fonctionner ^^.
Je récupère les infos de production de mes panneaux via le plugin solaredge pour la partie auto-consommation, donc pas obligatoire.

Concernant le virtuel :

toutes les commandes sont des Infos Numériques, un exemple de quelques commandes :

.

Voilà, je pense qu’il y a tout :slight_smile:

2 « J'aime »

bon, pour ceux qui veulent, j’ai aussi repensé la chose en PHP
je me connecte sur un wemos qui est branché sur le compteur (data + alim) avec le soft mega:

Le script tourne dans un scenario ce qui me permet de faire d’autres règles apres

$cfgServer ="192.168.3.174";
$cfgPort    = "8088";                
$cfgTimeOut = "5";

$f=fsockopen("$cfgServer",$cfgPort,$cfgTimeOut);

if (!$f)
{
  $scenario->setLog('pas connecté');
  cmd::byId("19215")->event(0);
}
else
{
 $scenario->setLog('connecté');
  cmd::byId("19215")->event(1);
 $data2 = '';
 while (($data =  fgets($f, 4096)) !== false) {
    $scenario->setLog($data);
    $data2 .= $data;
    //on remplit les valeurs dans les commandes jeedom
    if (substr( $data, 0, 9 ) === "1-0:1.8.1") {
       $scenario->setLog("1.8.1: " . substr( $data, 10, 10 ));
       cmd::byId("19201")->event(substr( $data, 10, 10 )) ;
       }
    if (substr( $data, 0, 9 ) === "1-0:1.8.2") { 
       $scenario->setLog("1.8.2: " . substr( $data, 10, 10 ));
       cmd::byId("19203")->event(substr( $data, 10, 10 ));
       }
    if (substr( $data, 0, 9 ) === "1-0:2.8.1") {
       $scenario->setLog("2.8.1: " . substr( $data, 10, 10 ));
       cmd::byId("19202")->event(substr( $data, 10, 10 ));
       }
    if (substr( $data, 0, 9 ) === "1-0:2.8.2") {
       $scenario->setLog("2.8.2: " . substr( $data, 10, 10 ));
       cmd::byId("19204")->event(substr( $data, 10, 10 ));
       }
    if (substr( $data, 0, 9 ) === "1-0:1.7.0") {
       $scenario->setLog("1.7.0: " . floatval(substr( $data, 10, 6 ))*1000);
       cmd::byId("19205")->event(floatval(substr( $data, 10, 6 ))*1000);
       }
    if (substr( $data, 0, 9 ) === "1-0:2.7.0") {
       $scenario->setLog("2.7.0: " . floatval(substr( $data, 10, 6 ))*1000);
       cmd::byId("19206")->event(floatval(substr( $data, 10, 6 ))*1000);
       }
    
	if (substr( $data, 0, 11 ) === "0-0:96.13.0") {
       $scenario->setLog('Quitte la boucle');
       break;
	   } 
   	
    }
 $scenario->setLog($data2);

 // coupe la session
 $scenario->setLog('coupe la session');
fclose($f);

}

Si vous avez besoin des tensions et du courant, il est possible de dupliquer les IF en changeant les id des virtuels et les codes (ex: 1-0:1.8.2).

au niveau des commandes virtuelles:


j’ai ajouté une commande « état » qui me permet de savoir si le lien est ok avec le wemos

dans le dashboard:
image

juste pour préciser, j’ai des panneaux solaires avec un systeme de batterie, c’est pour cela que certain compteurs sont atypique.

1 « J'aime »

Pour ceux que cela intéresse, j’ai commandé des pcb spécifique pour le compteur et y placer un esp dessus. Dès que je les ai, je fais qqs photos

Bonjour DOMEX

Ravi de ton message.
Je suis devant la même situation, le compteur a été installé il y a quelques jours.
Les ports client sont opérationnels.
Je ne demande qu’a extraire mes infos via le port P1.
Quelle carte, quels câbles acheter, chez qui ?
Quel logiciel faut-il mettre dans l’adaptateur, idem pour mon PC.
La liaison entre le compteur et mon PC sera-t-elle par Wifi ? Mon PC, un récepteur TV et une radio DAB sont déjà sur mon réseau domestique, le compteur y sera-t-il aussi ?
Ce qui est extrais du Raspberry est-ce du texte en csv à partir duquel on peut bidouiller dans un SGBD ou Excel ?
Je suis du bon côté de la fracture informatique mais j’ai quand même 85 ans, ça doit être plus ou moins simple ou fort bien expliqué hi hi.

Ce serait vraiment chouette si l’un ou l’autre pouvait me prendre par la main et je ne comprend pas que ce soit problématique alors que tous sont logés à la même enseigne suit à une décision de changer les compteurs prise au niveau européen, ça devrait être simplissime, une chose toute cuite que SAGEM aurait dû inclure à son compteur comme le fournisseur de ma radio DAB l’a inclus dans son bidule.
Le compteur TT211 est certes communicant, comme si il avait un GSM dans le ventre mais il n’est pas intelligent.
Oups, mon coup de gueule est passé !

André

attention que c’est un compteur belge et pas francais

un exemple de ce que j’ai fait chez moi:

je peux te fournir le module a mettre dans le compteur s’il faut

1 « J'aime »

Bonjour,

On vient de me placer le compteur ce matin.

Je suis intéressé par ton PCB, est-ce que tu le vend ? J’ai déjà l’ESP.

Merci.

Christophe

1 « J'aime »

Il m’en reste, je t’ai répondu en message privé

1 « J'aime »

Hello. Pareil pour moi, on m’a installé le compteur. Est-ce qu’il t’en reste encore au fond d’un tiroir ?
J’ai pas encore l’ESP mais je vais le commander. Je suppose qu’un wemos est bon ? Carte de développement IOT Wifi ESP8266 (Lua / Arduino) Lolin v3 - Wemos [ESP8266]
(Je suis pas vraiment doué en électronique…)
Merci

Salut, oui, j’en ai, j’ai le wemos aussi s’il faut.
Passe via mp :wink:

Bon je ne peut que remercier @Poluket matos nickel (et déjà flashé en plus!) et son tutorial est très bien fait

Les données remontées par le compteur sont impec, par contre il me semble quand même que les valeurs calculées sont bizarres. Faut que j’enquête, j’ai pas encore eu le temps. J’ai peut être fait des erreurs en copiant/collant les calculs

1 « J'aime »

Les calculs peuvent un peu déconner quand il n’y a pas encore assez d’historique. Après qqs jours cela devrait être bon

1 « J'aime »

Oui je verrais bien. Je connaissais pas la fonction statisticsbetween.
Si ça se normalise pas je mettrais les index dans les variable comme ça suffit de faire une soustraction la fois suivante.

Hello
Petite question, comment ça se fait que le compteur remonte à la fois de la production et de la consommation ? Je ne pensais pas que c’était possible ?

Exemple:

image