TUTO: Raspberry - Teleinfo - 1wire
-
- Actif
- Messages : 23
- Enregistré le : mer. sept. 11, 2013 2:44 pm
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
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
-
- Actif
- Messages : 23
- Enregistré le : mer. sept. 11, 2013 2:44 pm
me revoilà
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 : car m'écrivait un fichier à chaque lecture. D'où une confirmation de l'hypothèse que le checksum est mal calculé.
Code du checksum :
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
un peu d'aide svp... ?
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
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 ;
}
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
-
- Très assidu
- Messages : 116
- Enregistré le : mer. févr. 22, 2012 3:24 pm
- Localisation : pau
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.
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.
-
- Actif
- Messages : 23
- Enregistré le : mer. sept. 11, 2013 2:44 pm
-
- Très assidu
- Messages : 116
- Enregistré le : mer. févr. 22, 2012 3:24 pm
- Localisation : pau
-
- Actif
- Messages : 23
- Enregistré le : mer. sept. 11, 2013 2:44 pm
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
et j'appelle cette fonction dans le main :
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.
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 ;
}
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).
}
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.
-
- Accro
- Messages : 231
- Enregistré le : sam. juil. 25, 2009 8:24 pm
- Localisation : Montebourg dans la Manche (50)
Re: TUTO: Raspberry - Teleinfo - 1wire
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.moi641 a écrit :
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
http://www.chaleurterre.com/forum/viewt ... 3016#93016
-
- Accro
- Messages : 231
- Enregistré le : sam. juil. 25, 2009 8:24 pm
- Localisation : Montebourg dans la Manche (50)
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.
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
http://www.chaleurterre.com/forum/viewt ... 3016#93016
-
- Accro
- Messages : 231
- Enregistré le : sam. juil. 25, 2009 8:24 pm
- Localisation : Montebourg dans la Manche (50)
SAlut impossible de trouver un connecteur femmelle à souder pour rajouter une carte perso. C'est incroyable.
Bon week end.
Bon week end.
mon installation PAC daikin BT 16kW + chauffe eau solaire thermodynamique :
http://www.chaleurterre.com/forum/viewt ... 3016#93016
http://www.chaleurterre.com/forum/viewt ... 3016#93016
-
- Actif
- Messages : 23
- Enregistré le : mer. sept. 11, 2013 2:44 pm
-
- Accro
- Messages : 231
- Enregistré le : sam. juil. 25, 2009 8:24 pm
- Localisation : Montebourg dans la Manche (50)
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.
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
http://www.chaleurterre.com/forum/viewt ... 3016#93016
-
- Très assidu
- Messages : 116
- Enregistré le : mer. févr. 22, 2012 3:24 pm
- Localisation : pau
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"
A+
@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 ;
Pac Ajtech/Zuran100 TRI phase 2 sur Plancher Chauffant+Radiateurs HC/HP.
-
- Actif
- Messages : 23
- Enregistré le : mer. sept. 11, 2013 2:44 pm