TUTO: Raspberry - Teleinfo - 1wire

OneWire, TéléInfo, logs et enregistrements
Répondre
moi641
Très assidu
Très assidu
Messages : 116
Enregistré le : mer. févr. 22, 2012 3:24 pm
Localisation : pau

Message par moi641 »

OK.
Mais le plus dur commence pour toi si tu connais pas le php.
Bon courage.
Pac Ajtech/Zuran100 TRI phase 2 sur Plancher Chauffant+Radiateurs HC/HP.
nightfever
Actif
Actif
Messages : 23
Enregistré le : mer. sept. 11, 2013 2:44 pm

Message par nightfever »

merci mais je me sens une peu plus à l'aise avec le php (moins avec le JS).
Va encore falloir que je mette un peu les mains dans le cambouis car les graphes s'affichent bien (exactement comme sur ce site). Par contre les étiquettes m'affichent 2000 €. Enfin voilà me reste à fouiner encore un peu mais ça s'approche du but.

Pour info, je ne sais pas pourquoi mais j'ai à présent le "MOTDETAT" qui s'est ajouté à la trame. J'ai aussi un fichier pour chaque trame qui se crée dans mon répertoire tmp même s'il n'y a pas d'erreur... Bizar...

Au final, je vais avoir des graphiques avec mes T°C, batteries de mes sondes domotique et la conso élec. Reste plus qu'à trouver le moyen de faire pareil pour la conso d'eau :D
nightfever
Actif
Actif
Messages : 23
Enregistré le : mer. sept. 11, 2013 2:44 pm

Message par nightfever »

me revoilà :D
ma BDD se remplit bien et l'affichage du graphe se passe très bien sauf quand j'ai une ligne dans la BDD avec 0 partout => 20 000 kwh - 0 = 20 000 et du coup ça me fou un bordel monstre dans les graphes. Si je ne me trompe pas, ça doit être dans cette partie (cheksum) qu'il faut modifier les valeurs mais je ne vois pas lesquelles.
Pour le moment j'ai désactivé le mode débug en mettant en commentaire cette ligne en début de programme :

Code : Tout sélectionner

#define DEBUG 
car m'écrivait un fichier à chaque lecture. D'où une confirmation de l'hypothèse que le checksum est mal calculé.

Code du checksum :

Code : Tout sélectionner

/*------------------------------------------------------------------------------*/
/* Test checksum d'un message (Return 1 si checkum ok)				*/
/*------------------------------------------------------------------------------*/
int checksum_ok(char *etiquette, char *valeur, char checksum) 
{
	unsigned char sum = 32 ;		// Somme des codes ASCII du message + un espace
	int i ;
 
	for (i=0; i < strlen(etiquette); i++) sum = sum + etiquette[i] ;
	for (i=0; i < strlen(valeur); i++) sum = sum + valeur[i] ;
	sum = (sum & 63) + 32 ;
	if ( sum == checksum) return 1 ;	// Return 1 si checkum ok.
	#ifdef DEBUG
		syslog(LOG_INFO, "Checksum lu:%02x   calculé:%02x", checksum, sum) ;
	#endif
	return 0 ;
}
 
/*------------------------------------------------------------------------------*/
/* Recherche valeurs des étiquettes de la liste.				*/
/*------------------------------------------------------------------------------*/
int LitValEtiquettes()
{
	int id ;
	erreur_checksum = 0 ;
 
	for (id=0; id<NB_VALEURS; id++)
	{
		if ( (match = strstr(message, etiquettes[id])) != NULL)
		{
			sscanf(match, "%s %s %s", etiquettes[id], valeurs[id], checksum) ;
			if ( strlen(checksum) > 1 ) checksum[0]=' ' ;	// sscanf ne peux lire le checksum à 0x20 (espace), si longueur checksum > 1 donc c'est un espace.
			if ( ! checksum_ok(etiquettes[id], valeurs[id], checksum[0]) ) 
			{
				syslog(LOG_ERR, "Donnees teleinfo [%s] corrompues (essai %d) !\n", etiquettes[id], no_essais) ;
				erreur_checksum = 1 ;
				return 0 ;
			}
		}
	}
	// Remplace chaine "HP.." ou "HC.." par "HP ou "HC".
	valeurs[5][2] = '\0' ;
	#ifdef DEBUG
	printf("----------------------\n") ; for (id=0; id<NB_VALEURS; id++) printf("%s='%s'\n", etiquettes[id], valeurs[id]) ;
	#endif
	return 1 ;
}
J'aimerais que s'il détecte 0 sur HC ou HP il n'écrive pas dans la BDD et c'est ce que normalement le checksum est censé faire je pense.

ce que j'ai ci-dessous : nom_étiquette / nb caractère étiquette / nb caractère valeur de l'étiquette

Code : Tout sélectionner

ADCO / 4 / 12
OPTARIF / 7 / 4
ISOUSC / 6 / 2
HCHC / 4 / 9 
HCHP / 4 / 9
PTEC / 4 / 2
IINST / 5 / 3
IMAX / 4 / 3 
PAPP / 4 / 5 
HHPHC / 5 / 1
MOTDETAT / 7 / 6

TOTAL / 54 / 56
un peu d'aide svp... ? :D
moi641
Très assidu
Très assidu
Messages : 116
Enregistré le : mer. févr. 22, 2012 3:24 pm
Localisation : pau

Message par moi641 »

Salut,
J'avais ce problème sur mon compteur qui est loin de mon PI.
Résolu en testant si le ADCO=="" alors je n'enregistre pas en bdd.

Code : Tout sélectionner

if(strcmp(valeurs[0],"")!=0){
				
					if (! writemysqlteleinfo(datateleinfo,MYSQL_TABLE_PAC) ) writecsvteleinfo(datateleinfo) ;		// Si écriture dans base MySql KO, écriture dans fichier csv.
			}
			else
			{
	//envoie mail
		}
Pac Ajtech/Zuran100 TRI phase 2 sur Plancher Chauffant+Radiateurs HC/HP.
nightfever
Actif
Actif
Messages : 23
Enregistré le : mer. sept. 11, 2013 2:44 pm

Message par nightfever »

cool, merci pour l'info.
je vais laisser tourner cette nuit pour vérifier que j'avais aussi 0 sur cette étiquette (j'ai effacé les lignes dans la BDD). Dans ce cas, je fais comme toi demain.
Mais à mon avis, le checksum est mal réglé car il devrait empécher ça.

Enfin, merci pour l'astuce ;)
moi641
Très assidu
Très assidu
Messages : 116
Enregistré le : mer. févr. 22, 2012 3:24 pm
Localisation : pau

Message par moi641 »

Attention c'est pas 0 mais une de chaine de caractère vide.
Je suis preneur si il y a une autre solution pour résoudre ce pb.
A+
Pac Ajtech/Zuran100 TRI phase 2 sur Plancher Chauffant+Radiateurs HC/HP.
nightfever
Actif
Actif
Messages : 23
Enregistré le : mer. sept. 11, 2013 2:44 pm

Message par nightfever »

Bon après quelques tests et recherches :
j'ai affiché les cheksum lus et calculés dans le syslog. Quelque soit le nb de valeurs lues, les cheksum sont bons.
Le pb est que si il récupère que 6 valeurs au lieu des 11 que je dois recevoir, ben je n'ai pas d'erreur. Tu as une idée de comment s'assurer qu'il a bien lu les 11 datas ?

sinon j'ai mis ce bout de code

Code : Tout sélectionner

int Erreur_acqusition()
{
	//  Test sur les étiquettes pour monophasé.
	if ( valeurs[0]==NULL || valeurs[1]==NULL || valeurs[2]==0 || valeurs[3]==0 || valeurs[4]==0 || valeurs[5]==NULL || valeurs[6]==0 || valeurs[7]==0 || valeurs[8]==0 || valeurs[9]==NULL || valeurs[10]==NULL )
	{
		syslog(LOG_INFO, "erreur d'acquisition: ADCO='%s', OPTARIF='%s', ISOUSC='%s', HCHC='%s', HCHP='%s', PTEC='%s', IINST='%s', IMAX='%s', PAPP='%s', HHPHC='%s', MOTDETAT='%s' !", valeurs[0], valeurs[1], valeurs[2], valeurs[3], valeurs[4], valeurs[5], valeurs[6], valeurs[7], valeurs[8], valeurs[9], valeurs[10]) ;
		return 1 ;
	}
	return 0 ;
}
et j'appelle cette fonction dans le main :

Code : Tout sélectionner

Erreur_acqusition();           // Test si erreur d'acquisition.
	
	if ( LitValEtiquettes() ) 			// Lit valeurs des étiquettes de la liste.
	{
		sprintf(datateleinfo,"'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s'", timestamp, sdate, sheure, valeurs[0], valeurs[1], valeurs[2], valeurs[3], valeurs[4], valeurs[5], valeurs[6], valeurs[7], valeurs[8], valeurs[9], valeurs[10]) ;
		if (! writemysqlteleinfo(datateleinfo) ) writecsvteleinfo(datateleinfo) ;		// Si écriture dans base MySql KO, écriture dans fichier csv.
 
		//DepasseCapacite() ; 			// Test si etiquette dépassement intensité (log l'information seulement).
	}
j'ai laissé tourner ce code pour voir ce que ça donne. Ca ne va pas empêcher d'écrire dans la BDD car mal placé mais je vais déjà voir s'il détecte le pb rencontré ;)
ta solution pourrait fonctionner mais si il lit bien la première valeur et certaines qui suivent ben j'ai toujours le même souci.
Qu'en penses-tu ?
EDIT : ça ne fonctionne pas. Ca ne m'écrit rien dans le syslog et ça me remplit une ligne avec rien pour certaines valeurs ou 0 pour d'autres. :(
yohgwen2000
Accro
Accro
Messages : 231
Enregistré le : sam. juil. 25, 2009 8:24 pm
Localisation : Montebourg dans la Manche (50)

Re: TUTO: Raspberry - Teleinfo - 1wire

Message par yohgwen2000 »

moi641 a écrit : Image
Image
Bonjour je vais me lancer également dans l'aventure raspberry. Je vais donc utiliser ces schémas pour raccorder mes deux compteurs et mon réseau de 8 sondes.
Je suppose que pour les 8 ds18b20, il suffit de les relier en dérivation et ne mettre qu'une seule résistance.
Merci et bonne journée à tous.
mon installation PAC daikin BT 16kW + chauffe eau solaire thermodynamique :
http://www.chaleurterre.com/forum/viewt ... 3016#93016
moi641
Très assidu
Très assidu
Messages : 116
Enregistré le : mer. févr. 22, 2012 3:24 pm
Localisation : pau

Message par moi641 »

@yohgwen2000
Il te faudra peut être ajouter une capa sur le 3.3V si tes sondes sont éloignées du PI.
A+
Pac Ajtech/Zuran100 TRI phase 2 sur Plancher Chauffant+Radiateurs HC/HP.
yohgwen2000
Accro
Accro
Messages : 231
Enregistré le : sam. juil. 25, 2009 8:24 pm
Localisation : Montebourg dans la Manche (50)

Message par yohgwen2000 »

re, un condensateur polarisé de quelle valeur, j'ai pas mal de distance entre le raspberry et les sondes.
De plus, je voudrais trouver un connecteur à souder pour réaliser une carte avec tout dessus, comme la rapsidom.
Où le trouver ?
Merci.
mon installation PAC daikin BT 16kW + chauffe eau solaire thermodynamique :
http://www.chaleurterre.com/forum/viewt ... 3016#93016
yohgwen2000
Accro
Accro
Messages : 231
Enregistré le : sam. juil. 25, 2009 8:24 pm
Localisation : Montebourg dans la Manche (50)

Message par yohgwen2000 »

SAlut impossible de trouver un connecteur femmelle à souder pour rajouter une carte perso. C'est incroyable.
Bon week end.
mon installation PAC daikin BT 16kW + chauffe eau solaire thermodynamique :
http://www.chaleurterre.com/forum/viewt ... 3016#93016
nightfever
Actif
Actif
Messages : 23
Enregistré le : mer. sept. 11, 2013 2:44 pm

Message par nightfever »

si tu ne te sers pas des autres entrées / sorties du GPIO, tu n'as pas besoin de chercher un 2x13 broches ;)

perso, j'ai trouvé le mien chez Conrad. Il devrait arriver prochainement. J'ai profité d'une commande là-bas pour éviter les gros frais de port.

bon courage
yohgwen2000
Accro
Accro
Messages : 231
Enregistré le : sam. juil. 25, 2009 8:24 pm
Localisation : Montebourg dans la Manche (50)

Message par yohgwen2000 »

Salut j'ai commandé en chine 10 connecteurs 2X40 que je vais couper pour 3€ fdpi.
J'ai le même souci pour l'achat des optocoupleurs dont les frais de port sont énorme par rapport au prix du matériel. Je vais devoir acheter directement en Chine pour avoir des frais de port moindre voir aucun. C'est un scandale en France de payer 6,99€ pour moins de 20g.
Bonne soirée.
mon installation PAC daikin BT 16kW + chauffe eau solaire thermodynamique :
http://www.chaleurterre.com/forum/viewt ... 3016#93016
moi641
Très assidu
Très assidu
Messages : 116
Enregistré le : mer. févr. 22, 2012 3:24 pm
Localisation : pau

Message par moi641 »

J'ai plus la référence du connecteur que j'ai choisi mais il me semble que j'ai trouvé ça chez antelec.
@nightfever.
J'ai modifié le code de la fonction de lecture des étiquettes pour qu'elle retourne 0 si on ne trouve pas d'étiquettes et donc rien écrire en bdd.
C'est ainsi plus "propre"

Code : Tout sélectionner


/*------------------------------------------------------------------------------*/ 
/* Recherche valeurs des étiquettes de la liste.            */ 
/*------------------------------------------------------------------------------*/ 
int LitValEtiquettes() 
{ 
   int id ; 
   erreur_checksum = 0 ; 
  
   for (id=0; id<NB_VALEURS; id++) 
   { 
      if ( (match = strstr(message, etiquettes[id])) != NULL) 
      { 
         sscanf(match, "%s %s %s", etiquettes[id], valeurs[id], checksum) ; 
         if ( strlen(checksum) > 1 ) checksum[0]=' ' ;   // sscanf ne peux lire le checksum à 0x20 (espace), si longueur checksum > 1 donc c'est un espace. 
         if ( ! checksum_ok(etiquettes[id], valeurs[id], checksum[0]) ) 
         { 
            syslog(LOG_ERR, "Donnees teleinfo [%s] corrompues (essai %d) !\n", etiquettes[id], no_essais) ; 
            erreur_checksum = 1 ; 
            return 0 ; 
         } 
      } 
     else
     {
           return 0;
      }
   } 
   // Remplace chaine "HP.." ou "HC.." par "HP ou "HC". 
   valeurs[5][2] = '\0' ; 
   #ifdef DEBUG 
   printf("----------------------\n") ; for (id=0; id<NB_VALEURS; id++) printf("%s='%s'\n", etiquettes[id], valeurs[id]) ; 
   #endif 
   return 1 ; 

A+
Pac Ajtech/Zuran100 TRI phase 2 sur Plancher Chauffant+Radiateurs HC/HP.
nightfever
Actif
Actif
Messages : 23
Enregistré le : mer. sept. 11, 2013 2:44 pm

Message par nightfever »

Pas eu le temps avant dslé.
je viens de mettre ton code à la place du précédent (celui qui était dans le main).
je laisse tourner mais ça a l'air d'aller.
Avant, j'avais parfois une erreur quand il essayait d'écrire 2x un timestamp = 0 mais la BDD ne se remplissait pas (le principal).

Merci ;)
Répondre

Retourner vers « Monitoring des consos et des performances »