La lecture de /dev/ttyAMA0 marche bien debug :
ADSC 061961603260 5
VTIC 02 J
DATE E210424091645 D
NGTF H PLEINE/CREUSE \
LTARF HEURE PLEINE A
EAST 010893318 0
EASF01 005110053 1
EASF02 005783265 G
EASF03 000000000 $
EASF04 000000000 %
EASF05 000000000 &
EASF06 000000000 '
EASF07 000000000 (
EASF08 000000000 )
EASF09 000000000 *
EASF10 000000000 "
EASD01 005110053 /
EASD02 005783265 E
EASD03 000000000 "
EASD04 000000000 #
EAIT 000038838 #
ERQ1 000007904 O
ERQ2 000007294 R
ERQ3 000040821 L
ERQ4 004086122 U
IRMS1 002 0
URMS1 234 C
PREF 09 H
PCOUP 09 "
SINSTS 00465 U
SMAXSN E210424063606 01899 G
SMAXSN-1 E210423060619 02700 S
SINSTI 00000 <
SMAXIN E210424000000 00000 M
SMAXIN-1 E210423134052 00634 F
CCASN E210424090000 00460 8
CCASN-1 E210424083000 00836 _
CCAIN E210424090000 00000 $
CCAIN-1 E210424083000 00000 D
UMOY1 E210424091000 234 +
STGE 001A4501 A
MSG1 PAS DE MESSAGE <
PRM 14275687320408 :
RELAIS 000 B
NTARF 02 O
NJOURF 00 &
NJOURF+1 00 B
PJOURF+1 0000C001 ...
Mais quand je branche ma fonction de décodage :
// Enlever les codes début et fin de trame
var lines = msg.payload.toString().replace("\u0002\n","").replace("\r\u0003","");
// Récupérer chaque ligne une à une
lines = lines.split("\r\n");
for (var line in lines)
{
var i;
var checksum = 32;
// Recupérer le label, la valeur et la checksum
// si la checksum est un espace on le remplace par un caractère non
// autorisé en checksum (ici 's') pour eviter pb de split
// donc espace espace devient espace s
var myline = lines[line].toString().replace(" "," s").split(" ");
// on dépile nos 3 valeurs
var check = myline.pop();
var value = myline.pop();
var label = myline.pop();
// On peu repositionner la checksum à espace si c'était le cas
if (check == "s") check = " ";
// Calcul de la checksum sur ce qu'on a reçu, on balaye tous les caractères
for (i = 0; i < label.length; i++) checksum += label.charCodeAt(i);
for (i = 0; i < value.length; i++) checksum += value.charCodeAt(i);
checksum = ((checksum%256) & 63) + 32;
checksum = String.fromCharCode(checksum);
// Checksum correcte ?
if (checksum == check )
{
if ( label == "EASF01")
{
flow.set("HC",parseInt(value,10));
}
if ( label == "EASF02")
{
flow.set("HP",parseInt(value,10));
}
if ( label == "LTARF")
{
if (value == 'HEURE PLEINE')
{
flow.set("TARIF",'HP..');
}
else
{
flow.set("TARIF",'HC..');
}
}
if ( label == "IRMS1")
{
flow.set(label,parseInt(value,10));
}
if ( label == "SINSTS")
{
flow.set(label,parseInt(value,10));
}
if ( label == "EAIT")
{
flow.set(label,parseInt(value,10));
}
}
else
{
console.log("'%s' '%s' '%s' => Bad Checksum '%s'", label, value, check, checksum );
}
}
J'ai un message d'erreur dans le debug :
TypeError: Cannot read property 'length' of undefined
Le parsing est différent entre les trames Historiques et Standard ?
Car j'ai pris le code dans ton exemple sur une trame Historique :
http://hallard.me/pitinfo/
Si ça peut aider, voici les trames reçues avec picocom :
Trames_Linky.txt