Page 4 sur 9

Posté : mar. oct. 08, 2013 9:02 pm
par moi641
OK.
Mais le plus dur commence pour toi si tu connais pas le php.
Bon courage.

Posté : mer. oct. 09, 2013 4:35 pm
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

Posté : jeu. oct. 10, 2013 9:12 pm
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

Posté : jeu. oct. 10, 2013 9:44 pm
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
		}

Posté : jeu. oct. 10, 2013 10:07 pm
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 ;)

Posté : jeu. oct. 10, 2013 10:14 pm
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+

Posté : dim. oct. 13, 2013 11:24 pm
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. :(

Re: TUTO: Raspberry - Teleinfo - 1wire

Posté : ven. oct. 18, 2013 7:33 am
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.

Posté : ven. oct. 18, 2013 9:35 am
par moi641
@yohgwen2000
Il te faudra peut être ajouter une capa sur le 3.3V si tes sondes sont éloignées du PI.
A+

Posté : ven. oct. 18, 2013 5:42 pm
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.

Posté : sam. oct. 19, 2013 8:45 am
par yohgwen2000
SAlut impossible de trouver un connecteur femmelle à souder pour rajouter une carte perso. C'est incroyable.
Bon week end.

Posté : mar. oct. 22, 2013 1:44 pm
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

Posté : mar. oct. 22, 2013 8:20 pm
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.

Posté : mar. oct. 22, 2013 9:24 pm
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+

Posté : lun. oct. 28, 2013 11:05 pm
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 ;)