Moin,
ich arbeite gerade an einem WLAN Sender, der am Ende SML ablesen soll, die Nachricht dekodiert und dann die einzelnen Werte an einen MQTT Boker schickt. Mein Zähler ist ein EMH ED300S. Das ist ein Zähler, der im Push Betrieb vorne seine Daten rauspustet.
Dazu habe ich mir einen TTL Lesekopf von volkszaeher.org bestellt und an die serielle Schnittstelle eines ESP8266 angeschlossen.
Das Programm sucht erst nach der Startsequenz der SML Nachricht und danach nach der Endsequenz. Das geht auch schon fast. Und da kommt ihr ins Spiel...
Als Startsequenz benutze ich:
Die Suche danach sieht so aus:
void findStartSequence() {
while (Serial.available())
{
// read continously the incoming bytes. If the first match occurs, the startIndex counter increases.
// in the next iteration, the next incoming byte is will be compared to the second byte in the array
// this repeats until...
inByte = Serial.read();
if (inByte == startSequence[startIndex])
{
smlMessage[startIndex] = inByte;
startIndex++;
// ... the number of matches are equal to the length of the byte array given. Here starts the message.
if (startIndex == sizeof(startSequence))
{
idx = startIndex; //index where to write the next sml data
startIndex = 0;
String topic = CLIENT_ID;
topic += "/energy/debug/start";
String valueStr(idx);
// publish value to topic
myMqtt.publish(topic, valueStr);
startFound = true;
}
}
else {
startIndex = 0;
}
}
}
Alles anzeigen
doch bei der Endsequenz bin ich mir nicht sicher. Das müßte eigentlich eine Escape Sequenz sein, gefolgt von 1A, dann der Anzahl der Füllbytes und der CRC Prüfsumme. Stimmt das so? Denn leider finde ich kein
und nur nach der Escapesequenz zu suchen mach ja keinen Sinn. (Die kann auch so in den Nutzdaten auftreten und wird dann zweimal übertragen. (so wie bei einem "\\".)
Quelle:
BSI TR-03109-1 Anforderungen an die Interoperabilität der Kommunikationseinheit eines intelligenten Messsystems
Seite 68
https://www.bsi.bund.de/DE/Pub…en/tr03109/index_htm.html