Posté : mar. oct. 08, 2013 9:02 pm
OK.
Mais le plus dur commence pour toi si tu connais pas le php.
Bon courage.
Mais le plus dur commence pour toi si tu connais pas le php.
Bon courage.
Energies renouvelables - Géothermie - Aérothermie - Solaire - Eolien - Biomasse
https://chaleurterre.com/forum/
Code : Tout sélectionner
#define DEBUG
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 ;
}
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
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
}
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).
}
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 :
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 ;