void stromErfassung() { uint8_t fehler = 0; if (Serial.available()) { if (millis() - timeLastSignal > 300) { cntInBytes = 0; stromErfassungGestartet = 1; cntMessung++; timeStartReading = millis(); digitalWrite(LED_BUILTIN, LOW); //OnboardLed an } } while (stromErfassungGestartet == 1 && Serial.available() && (millis() - timeStartReading < 500)) { timeLastSignal = millis(); cntInBytes++; if (cntInBytes > 499) { cntInBytes = 0; } inBytes[cntInBytes] = Serial.read(); if (cntInBytes == 8) { if (inBytes[1] == 0x1B && inBytes[2] == 0x1B && inBytes[3] == 0x1B && inBytes[4] == 0x1B && inBytes[5] == 0x01 && inBytes[7] == 0x01 && inBytes[7] == 0x01 && inBytes[8] == 0x01) { startSequenzErhalten = 1; } } if (cntInBytes == 456) { if (inBytes[449] == 0x1B && inBytes[450] == 0x1B && inBytes[451] == 0x1B && inBytes[452] == 0x1B && inBytes[453] == 0x1A) { endeSequenzErhalten = 1; stromErfassungGestartet = 0; cntInBytes = 0; timeStartReading = 0; } } } if (startSequenzErhalten && endeSequenzErhalten) { //Kompletten Datensatz erhalten -> Telegramm auswerten startSequenzErhalten = 0; endeSequenzErhalten = 0; digitalWrite(LED_BUILTIN, HIGH); //OnboardLed aus delay(50); digitalWrite(LED_BUILTIN, LOW); //OnboardLed an delay(50); digitalWrite(LED_BUILTIN, HIGH); //OnboardLed aus wirkArbeitBezug = 0; for (uint16_t n = 151; n <= 158; n++) { wirkArbeitBezug = wirkArbeitBezug * 256 + inBytes[n]; } strWirkArbeitBezug = dezimalKommaSetzen(wirkArbeitBezug); for (uint16_t n = 223; n <= 230; n++) { wirkArbeitLieferung = wirkArbeitLieferung * 256 + inBytes[n]; } strWirkArbeitLieferung = dezimalKommaSetzen(wirkArbeitLieferung); if (abs(wirkArbeitBezug - wirkArbeitBezugAlt) > 10000 && wirkArbeitBezugAlt != 0) { fehler = 1; cntFehler++; } if (1) //(!fehler) -> evtl. Fehler werden zur Zeit nicht berücksichtigt { wirkLeistungL1 = 0; for (uint16_t n = 315; n <= 318; n++) { wirkLeistungL1 = wirkLeistungL1 * 256 + inBytes[n]; } wirkLeistungL2 = 0; for (uint16_t n = 335; n <= 338; n++) { wirkLeistungL2 = wirkLeistungL2 * 256 + inBytes[n]; } wirkLeistungL3 = 0; for (uint16_t n = 355; n <= 358; n++) { wirkLeistungL3 = wirkLeistungL3 * 256 + inBytes[n]; } wirkLeistungGesamt = 0; for (uint16_t n = 295; n <= 298; n++) { wirkLeistungGesamt = wirkLeistungGesamt * 256 + inBytes[n]; } if (cntMessung >= sendeTaktAnMqtt) { //Messwerte an iobroker senden cntMessung = 0; floatMesswert = wirkArbeitBezug / 10000.0; tempMqttString = String(floatMesswert, 4); tempMqttString = tempMqttString + " kWh"; mqttAktTopic = "ZählerGesamt-Bezug"; mqttPublish(); delay(130); floatMesswert = wirkArbeitLieferung / 10000.0; tempMqttString = String(floatMesswert, 4); tempMqttString = tempMqttString + " kWh"; mqttAktTopic = "ZählerGesamt-Lieferung"; mqttPublish(); delay(130); floatMesswert = (float)wirkLeistungL1; tempMqttString = String(floatMesswert, 0); tempMqttString = tempMqttString + " W"; mqttAktTopic = "ZählerGesamt-LeistungL1"; mqttPublish(); delay(130); floatMesswert = (float)wirkLeistungL2; tempMqttString = String(floatMesswert, 0); tempMqttString = tempMqttString + " W"; mqttAktTopic = "ZählerGesamt-LeistungL2"; mqttPublish(); delay(130); floatMesswert = (float)wirkLeistungL3; tempMqttString = String(floatMesswert, 0); tempMqttString = tempMqttString + " W"; mqttAktTopic = "ZählerGesamt-LeistungL3"; mqttPublish(); delay(130); floatMesswert = (float)wirkLeistungGesamt; tempMqttString = String(floatMesswert, 0); tempMqttString = tempMqttString + " W"; mqttAktTopic = "ZählerGesamt-LeistungL1L2L3"; mqttPublish(); } wirkArbeitBezugAlt = wirkArbeitBezug; wirkArbeitLieferungAlt = wirkArbeitLieferung; wirkLeistungL1Alt = wirkLeistungL1; wirkLeistungL2Alt = wirkLeistungL2; wirkLeistungL3Alt = wirkLeistungL3; wirkLeistungGesamtAlt = wirkLeistungGesamt; } else { tempMqttString = String(cntFehler); mqttAktTopic = "ZählerGesamt-Fehler"; mqttPublish(); wirkArbeitBezug = wirkArbeitBezugAlt; wirkArbeitLieferung = wirkArbeitLieferungAlt; wirkLeistungL1 = wirkLeistungL1Alt; wirkLeistungL2 = wirkLeistungL2Alt; wirkLeistungL3 = wirkLeistungL3Alt; wirkLeistungGesamt = wirkLeistungGesamtAlt; } } } void mqttPublish() { if (mqttAktiviert && mqttClient.connected()) { tempMqttString.toCharArray(tempMqttChar, tempMqttString.length() + 1); mqttAktTopic = mqttBasicTopic + mqttAktTopic; mqttAktTopic.toCharArray(tempMqttBuffer, mqttAktTopic.length() + 1); mqttClient.publish(tempMqttBuffer, tempMqttChar ); /* Serial.print("published: "); Serial.print("mqttAktTopic = "); Serial.print(tempMqttBuffer); Serial.print(" mqttAktWert = "); Serial.println(tempMqttChar); */ } }