Ferraris Zähler auslesen

Moin,
ich habe schon viele hilfreiche Sachen bei euch gefunden aber jetzt komme ich nicht mehr weiter. Ich lese das Rad mit einem tcrt5000 und werte das ganze an einem Wemos D1 Mini mit folgendem Sketch aus.

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

const unsigned int rpm_per_kWh = 75;
const char* SSID = "SSID";
const char* PSK = "PASS";
const char* MQTT_BROKER = "192.168.XXX.XXX";
const char* MQTT_USER = "MQTTuser";
const char* MQTT_PASSWORD = "MQTTPass";
const int MQTT_PORT = 1883;
const char* clientId = "Strom";

#define IRPIN D2
#define RED LOW
#define SILVER HIGH

//in 10ms = 200ms
#define MINTIME 20

////////END OF CONFIGURATION////////

// 0 = Silver->Red; 1 = Red->Silver
uint8_t lastState = 0;
unsigned long lastmillis = 0;
unsigned long pendingmillis = 0;
bool inbuf[MINTIME];
bool startup=true;

void setup() {
  Serial.begin(115200);
  delay(3000);
  Serial.println("\nPOWER MONITOR - BOOT\n");
  setup_wifi();
  setup_MQTT();

  pinMode(IRPIN, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  lastmillis = millis();
}

void setup_MQTT() {
 client.setServer(MQTT_BROKER, MQTT_PORT);//MQTT Server, - Port
 
  if (client.connect(clientId , MQTT_USER, MQTT_PASSWORD)) {
    Serial.println("MQTT connected");
    //client.publish("/home/strom", "MQTT verbunden");
  }
}

void setup_wifi() {
	delay(10);
	Serial.println();
	Serial.print("Connecting to ");
	Serial.println(SSID);

	WiFi.begin(SSID, PSK);

	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
	}

	Serial.println("");
	Serial.println("WiFi connected");
	Serial.println("IP address: ");
	Serial.println(WiFi.localIP());
  //client.publish("/home/strom", "WLAN verbunden");
}

bool getInput(uint8_t pin) {
  byte inchk=0;
  for(byte i=0; i<5; i++) {
    inchk += digitalRead(pin);
    delay(2);
  }
  if(inchk >= 3) return 1;
  return 0;
}

void reconnect() {
	while (!client.connected()) {
		Serial.print("Reconnecting...");
		if (!client.connect("ESP8266Client")) {
			Serial.print("failed, rc=");
			Serial.print(client.state());
			Serial.println(" retrying in 5 seconds");
			delay(5000);
		}
	}
}

bool procInput(bool state) {
  byte inchk=0;

  //Array shift
  for (byte k = MINTIME-2; (k >= 0 && k < MINTIME); k--) {
    inbuf[k+1] = inbuf[k];
    inchk += inbuf[k];
  }
  
  //New value
  inbuf[0] = state;
  inchk += state;
  
  //Return average
  if(inchk > MINTIME/2) return 1;
  return 0;
}

void calcPower(void)  {
  unsigned long took = pendingmillis - lastmillis;
  lastmillis = pendingmillis;

  float kWh = 3600000.00 / took / rpm_per_kWh;

  if(!startup) {
    Serial.print(kWh);
    Serial.print(" kW @ ");
    Serial.print(took);
    Serial.println("ms");
    snprintf (msg, 50, "%f", kWh);

    //Add MQTT, HTTP or whatever you want to do with the measurement here
    client.publish("/home/strom", msg);

    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }else{
    startup=false;
  }
}

void loop() {
  bool cur = getInput(IRPIN);
  cur = procInput(cur);

  switch(lastState) {
    case 0: //Silver; Waiting for transition to red
      if(cur != SILVER) {
        lastState++;
        pendingmillis = millis();
        Serial.println("Silver detected; waiting for red");
        calcPower();
      }
      break;
    case 1: //Red; Waiting for transition to silver
      if(cur != RED) {
        lastState=0;
        Serial.println("Red detected; Waiting for silver");
      }
      break;
  }
}

Wenn ich es außerhalb des Verteilerkastens prüfe läut alles so wie es soll, ich bringe den tcrt5000 an den Zähler sehe ich das geschaltet wird (sowohl am tcrt5000 als auch am Wemos), es wird aber nichts mehr via MQTT versendet.
Ich habe schon die IR und Photodiode vom Board entfernd und getrennt vor den Zähler gehängt aber auch hier das gleiche Problem. Aussen funktioniert alles wenn ich an den Zähler gehe wird nichts mehr versendet.
Hat jemand eine Idee was ich machen kann?

Danke und Gruß
Olaf

....ganz ehrlich?
Netzbetreiber anrufen und Zählerwechel verlangen.
Dann mit IR-Lesekopf auslesen.
Das funktioniert viel zuverlässiger und nachhaltiger.
Die meisten Zähler geben auch den momentanen Leistungswert aus.
Warum am Ferraris Zähler festhalten?

Beste Grüße,
Chris

Hi Chris,
danke für den Hinweis. Der Zählerwechsel wurde schon vor Wochen beantragt aber es dauert wohl noch etwas und daher möchte ich jetzt erstmal so beginnen.

Gruß
Olaf

Vermutlich lieg das an der "Feldstärke" RSSI deines WLan Routers.
Lass dir mal die Feldstärke anzeigen.
Evtl. brauchst du eine externe Antenne.

Ist der Verteilerkasten aus Metall?

Das muss er garnicht.
Die ganzen Kabel drumherum reichen da schon aus, um die WLan Empfangsleistung zu stören.

Moin,
der Wemos hängt nicht im Schaltkasten (genauso wie das Board des IR Sensors). Im Schaltkasten befinden sich nur die beiden Dioden, verbunden mit einem geschirmten Kabel zum Board (welches wie gesagt außerhabl des Schaltschranks ist. Mit dem Wemos ist das Board über ein weiteres geschirmtes Kabel verbunden, welcher damit noch weiter (ca. 0,5m) vom Schaltschrank weg ist. Der Access Point ist ca. 1m Luftlienie vom WEMOS entfernt (mit Sichtkontakt). Ich kann die Wemos anpingen und sehe ihn auch in meiner Netzwerkübersicht.

Gruß
Olaf

Dann solltest du es besser beschreiben.

Vermutlich liegt das dann an Einstrahlungen in den Sensor.
Mehr kann man da nicht raten.

Evtl. doch.
Baue den kompletten Sensor inkl. Platine an den Zähler, nicht nur die Dioden.

Moin,
der Sensor detektiert ja die die Umdrehungen und soweit ich das nachvollziehen kann wird das Signal auch an den Wemos weitergeleiet (die onboard LED wechselt entsprechend).
Ich hatte den Sensor zu erste komplett am Zähler, ich werde es jetzt noch mla versuchen alles direkt an den Zähler zu bringen.
Ich hatte auch schon versucht die nur die LEDs vom Zähler weg zu nehmen (ca. 10cm) und dann mit dem Finger auszulösen. Dabei hat es funktioniert.
Mir fällt gerade folgendes ein

-WEMOS Stomversorgung aus
-alles in Position bringen
-LEDs (IR) 10cm abstand vom Zähler
-WEMOS Strommversorgung an
-Test mit finger -> Meldung via MQTT empfangen
-LEDs (IR) vor dem Zähler in Position
-keine Meldungen mehr über MQTT
-LEDs (IR) wieder weg vom Zähler -> immernoch keine Meldung
-WEMOS reset (LEDs 10cm weg vom Zähler) -> giobt wieder Meldung

kann es sein das der PIN des WEMOS irgendwie ein Signal bekommt um teile des WEMOS abzuschalten?

Gruß
Olaf

Das ist durchaus möglich. Störungen in deinem Schaltkasten können den Controller zum Absturz (keine Funktion mehr) bringen. Was ist denn alles im Schaltkasten drin ?
Z.B. können Starkstromleitungen in die Leitungen zum Controller Störungen induzieren.
(ähnlich wie in einem Trafo)
Mach doch mal davon ein Foto.

Weiterhin kannst du über eine Led am Controller (haertbeat) prüfen, ob der Controller selbst noch funktioniert.


Moin,
hier der SChaltschrank mit der Einbauposition.

  1. die IR LED und der Fotosensor
  2. das Board des Sensors (beide LEDs sind an und die Fotozelle geht auch aus wenn der rote Strich kommt)
  3. [nicht im Bild, ca. 20cm unter dem Ende des Bildes) WEMOS D1 mini, Die blaue LED auf dem Bord schaltet auch wenn der Sensor auslöst
  4. AP nicht im Bild (ca. 30cm unter dem WEMOS)

Wenn ich jetzt die IR LED vom Zähler entferne, ca. 10cm Abstand (der Rest bleibt wie es ist) und den WEMOS neu starte und dann mit dem Finger die IR LED abdecke bekomme ich via MQTT eine Nachricht. Sobald ide IR LED wieder an den Zähler kommt, wird alles wie oben beschrieben angezeigt nur das ich keine Nachricht über MQTT bekomme.

Gruß
Olaf

Dann ist es wohl so, wie ich vermute, irgendwas stört den Controller.

Baue mal eine Haertbeat-Led ein. Dann kannst du erkennen, ob der Controller stehen bleibt. Dann muss deine Schaltung entsprechend "entstört" werden.
Den Weg dahin findest du vermutlich nur mit einem Oszilloskop raus.

Weil der gegebenenfalls rückwärts zählt.

Musst du nur anmelden, dass du eine "BalkonPV"-Anlage anschließen willst, und du kriegst ruckzuck einen neuen Zähler.

Moin,
so die Haertbeat LED hat nichts zu Tage gefördert (läuft ohne Unterbrechung) aber ich habe das Problem trotzdem gefunden und das ist wohl unabhängig vom Einbauort. Der WEMOS verliert die Verbindung zum MQTT Broker, ich kann sie auch mit dem Reconnet nicht wieder herstellen. Ein Reboot löst das Problem.
Gibt es Vorschläge ?

Gruß
Olaf

Na, da kommen wir der Sache schon näher.
Allerdings bei MQTT muss jemand anders helfen.

Moin,
ich hbae es hinbekommen, also über Umwege. Die reconnect() war nicht richtig konfiguriert. Jetzt läuft es.
Danke an alle
Gruß
Olaf

P.S. wie kann ich den Post schließen?

Das ist so keine hilfreiche Lösung, also kannst du es auch nicht schließen.
Abwarten, bald sieht keiner mehr den Thread, und in einem halben Jahr wird er automatisch geschlossen.

Alternnativ könntest du auch zeigen, wie du es hinbekommen hast. Und das als Lösung markieren. (Geht auch bei eigenen Beiträgen)

Moin,
Entschuldigung für das lange Schweigen. Hier jetzt meine Lösung. Sieht noch nicht so schön aus und ist auch noch nicht kommentiert funktioniert aber.

Es wird der aktuelle Verbrauch und der Zählerstand berechnet und zusammen mit einem Zeitstempel (jeweils als einzelner Topic) via MQTT versendet.
Ich hoffe es hilft jemanden der es braucht.

Gruß
Olaf

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg_actual [12];
char msg_counter [12];
int value = 0;
const unsigned int rpm_per_kWh = 75;    //muss angepasst werden
float counter_start = 30925.85;         //muss angepasst werden

const char* SSID = "SSID";
const char* PSK = "SSID pw";

const char* MQTT_BROKER = "MQTT Broker IP";
const char* MQTT_USER = "MQTT user";
const char* MQTT_PASSWORD = "MQTT pw";
const int MQTT_PORT = 1883;
const char* MQTT_clientId = "MQTT client ID";
const char* MQTT_topic_current = "topic verbrauch aktuell";
const char* MQTT_topic_total = "topic zaehlerstand";

// NTP
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");

#define IRPIN D2
#define RED LOW
#define SILVER HIGH

//in 10ms = 2000ms
#define MINTIME 200



////////END OF CONFIGURATION////////

// 0 = Silver->Red; 1 = Red->Silver
uint8_t lastState = 0;
unsigned long lastmillis = 0;
unsigned long pendingmillis = 0;
bool inbuf[MINTIME];
bool startup=true;

void sendTimestamp() {

  char timestampStr[20];
  snprintf(timestampStr, sizeof(timestampStr), "%ld", timeClient.getEpochTime());

  Serial.print("Sende Zeitstempel: ");
  Serial.println(timestampStr);

  client.publish(topic Zeitstempel, timestampStr);
}

void setup() {
  Serial.begin(115200);
  delay(300);
  Serial.println("\nPOWER MONITOR - BOOT\n");
  setup_wifi();
    setup_MQTT();

  pinMode(IRPIN, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  lastmillis = millis();
}

void setup_MQTT() {
 client.setServer(MQTT_BROKER, MQTT_PORT);//MQTT Server, - Port
 
  if (client.connect(MQTT_clientId , MQTT_USER, MQTT_PASSWORD)) {
    Serial.println("MQTT connected");
  }
}

boolean reconnect() {
  //Serial.print("Attempting MQTT connection...");
  // Attempt to connect
  if (client.connect(MQTT_BROKER)) {
    //Serial.println("connected");
  } else {
    Serial.print("failed, rc=");
    Serial.println(client.state());
  }
  return client.connected();
}

void setup_wifi() {
  IPAddress ip(xxx, xxx, xxx, xxx);
  IPAddress gateway(xxx, xxx, xxx, xxx);
  IPAddress subnet(xxx, xxx, xxx, xxx);
  IPAddress dns(xxx, xxx, xxx, xxx);
  WiFi.config(ip, dns, gateway, subnet);
  Serial.print("Verbinde mit WiFi ");
  Serial.println(SSID);
  WiFi.begin(SSID, PSK);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print("\nVerbunden mit WiFi ");
  Serial.println(SSID);
  Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}

bool getInput(uint8_t pin) {
  byte inchk=0;
  for(byte i=0; i<5; i++) {
    inchk += digitalRead(pin);
    delay(2);
  }
  if(inchk >= 3) return 1;
  return 0;
}

bool procInput(bool state) {
  byte inchk=0;

  //Array shift
  for (byte k = MINTIME-2; (k >= 0 && k < MINTIME); k--) {
    inbuf[k+1] = inbuf[k];
    inchk += inbuf[k];
  }
  
  //New value
  inbuf[0] = state;
  inchk += state;
  
  //Return average
  if(inchk > MINTIME/2) return 1;
  return 0;
}

void calcPower(void)  {
  unsigned long took = pendingmillis - lastmillis;
  lastmillis = pendingmillis;

  float kWh = 3600000.00 / took / rpm_per_kWh;
  float counter = (1.00 / 75.00) + counter_start;
  

  if(!startup) {
    Serial.print(kWh);
    Serial.print(" kW @ ");
    Serial.print(took);
    Serial.println("ms");
    snprintf (msg_actual, 12, "%f", kWh);
    snprintf (msg_counter, 12, "%f", counter);
    counter_start = counter;

    //Add MQTT, HTTP or whatever you want to do with the measurement here
    client.publish(MQTT_topic_current, msg_actual);
    client.publish(MQTT_topic_total, msg_counter);
    //Zeit holen und senden
    timeClient.update();
    sendTimestamp();

    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }else{
    startup=false;
  }
}

void loop() {
  bool cur = getInput(IRPIN);
  cur = procInput(cur);

  reconnect();

  switch(lastState) {
    case 0: //Silver; Waiting for transition to red
      if(cur != SILVER) {
        lastState++;
        pendingmillis = millis();
        Serial.println("Silver detected; waiting for red");
        calcPower();
      }
      break;
    case 1: //Red; Waiting for transition to silver
      if(cur != RED) {
        lastState=0;
        Serial.println("Red detected; Waiting for silver");
      }
      break;
  }
  
}

die externe NTP library kannst weglassen.
NTP ist mittlerweile im ESP Core.

https://werner.rothschopf.net/201802_arduino_esp8266_ntp.htm

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.