Author Topic: ESP 8266 MQTT Stromsensor läuft nicht stabil  (Read 10659 times)

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
ESP 8266 MQTT Stromsensor läuft nicht stabil
« on: August 22, 2020, 05:15:33 PM »
Hallo Zusammen
Hier mein Coding von einem ESP8266 um den Stromzähler auszulesen und per MQTT an das SmartHome zu sende.
Der Lichtsensor ist per Interuppt angeschlossen. Das senden der Daten erfolgt regelmässsig alle 3 Minuten.
Der ESP verarbeitet auch eingehende MQTT Meldungen, damit kann auf den Realtime Modus umgeschalten werden.
Dann wird der Stromverbrauch live per MQTT gesendet.

Das Problem ist der ESP läuft wärend maximum 4-24 Stunden dann hängt er irgend wie. Die Ursache habe ich noch nicht gefunden.

Im Anhang mein Coding, evtl. fällt Euch ein Fehler auf.

Oder Ihr habe eine Idee wie ich auf den Fehler kommen kann.

Danke und Gruss
Reto

pylon

  • freakyfriday
  • Full Member
  • *
  • Posts: 158
  • Karma: +16/-0
Re: ESP 8266 MQTT Stromsensor läuft nicht stabil
« Reply #1 on: August 25, 2020, 08:00:35 AM »
Hallo Reto,
ich sehe ein grosses Problem: Innerhalb eines Interrupt-Handlers sollten keine Funktionen verwendet werden, die wiederum von Interrupts abhängen. Somit ist der Aufruf der publish()-Methode innerhalb von incurrent() wahrscheinlich der Grund für Deine Freezes. Setze ein Flag im Handler und reagiere im loop() darauf, das läuft über Wochen ohne Probleme.

Zusätzlich aufgefallen ist mir das hier:
Code: [Select]
  char m1[50];
  String(current_now).toCharArray(m1, String(current_now).length() + 1);
  client.publish("user/strom/realtimecurrent", m1);
würde ich schreiben als:
Code: [Select]
  char m1[50];
  dtostrf(current_now, 49, 4, m1);
  client.publish("user/strom/realtimecurrent", m1);

So ähnlich kommt es mehrfach in Deinem Code vor. Die neue Form ist nicht nur erheblich übersichtlicher, sie verzichtet auch auf Heap-Allokationen (auf dem ESP8266 weniger heikel als auf der AVR-Plattform) und ist deutlich schneller.

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: ESP 8266 MQTT Stromsensor läuft nicht stabil
« Reply #2 on: August 25, 2020, 10:49:38 PM »
Hallo Philipp

Danke für Dein Feedback. Die Anpassungen habe ich jetzt so vorgenommen. Jetzt lasse ich es mal laufen.

Hier die geänderte Methoden:

Code: [Select]
//*******************************************
// Interupt run Current
//*******************************************
void incurrent() {
   
 unsigned long interrupt_time = millis();
 // If interrupts come faster than 200ms, assume it's a bounce and ignore
 if (interrupt_time - last_interrupt_time >  500)
 {
  diff_interrupt_time = interrupt_time - last_interrupt_time;
  last_interrupt_time = interrupt_time;

  if (diff_interrupt_time > 1){
  current_now = 3600000 / diff_interrupt_time;
  } else {
    current_now = 0;
  }

  if (modus == 'r'){
  push_realtime_current = HIGH;
  }
 
 }
 
//Serial.print("Incurrent millis: ");
//Serial.println(interrupt_time);

}


//*******************************************
// Push Interupt
//*******************************************
void push_incurrent(int l_current_now) {

  char m1[50];
  dtostrf(l_current_now, 49, 4, m1);
  client.publish("user/strom/realtimecurrent", m1);
  Serial.println("Realtime: ");
  Serial.println(current_now);
 
}

//*******************************************
// LOOP
//*******************************************
void loop() {

// Wifi & MQTT connection
  if (!client.connected()) {
    reconnect();
    client.subscribe("user/strom/currentmode");
  }
  client.loop();

digitalWrite(CurrentLedPin, currentLedState);

// Disable Current Blink led after 500ms
if ( currentLedState == HIGH ){
   currentnowtime = millis();
   if ( last_interrupt_time + 500 < currentnowtime ){
    currentLedState = LOW;
   }
}

  currentMillis = millis();
// Regular Push Current
//*********************
  if (currentMillis - previousMillis >= interval) {

// Calc actual current
    if (diff_interrupt_time > 1){
    current_now = 3600000 / diff_interrupt_time;
    } else {
      current_now = 0;
    }

    updateData();
    previousMillis = currentMillis;
  }

// Realtime Push Current
//*********************
if (push_realtime_current){
  push_incurrent(current_now);
  push_realtime_current = LOW;
}

}

Danke und Gruss
Reto

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: ESP 8266 MQTT Stromsensor läuft nicht stabil
« Reply #3 on: August 28, 2020, 08:18:00 AM »
Hallo Philipp

Das läuft stabil seit dem 25.8. Danke nochmals für die Hilfe.
Jetzt habe ich regelmässig die Stromzähler Daten.
Gruss Reto

 

anything