Stromzähler S0 → ESP8266 mit ESPEasy → MQTT → FHEM

Begonnen von pink99panther, 30 November 2016, 23:33:50

Vorheriges Thema - Nächstes Thema

sash.sc

Zitat von: pink99panther am 18 November 2017, 11:23:08
Einen 100 nF Keramik-Kondensator parallel zum Wiederstand hast Du schon?

Ein Prellen sollte es bei S0 nicht geben. Ist ja kein mechanischer Kontakt.
Aber bei Hochohmigen Pulldownwiederstand kann es zu Störimpulsen auf der S0-Leitung kommen.
Deshalb den Wiederstand lieber in Richtung 1K nehmen.
Schau mal auf dem Bild in Antwort #4
So. Habe mir meine Zähler nochmal angeschaut und gleich das neue espeasyMega geflasht.

Da bin ich doch der Produktbeschreibung verfallen, wovon 1000 Impulsen je KWh die Rede war. Auf dem Zähler stand dann 0,5 KWh pro Impuls, sprich 2000 Impulse je KWh. Habe dann Das notify angepasst und jetzt funktioniert es auch richtig. Auch mit der Leistungsmessung.

Was sagt uns das? Nicht immer auf die Produktbeschreibung vertrauen.

Gruß Sascha

Gesendet von meinem SM-T560 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

smoudo

Tolles projekt! Ich habe das ganze mal nachgebaut und am Wemos D1 mini an:
pin D6 den Stromzähler via Lichtschranke
pin D7 den Wasserzähler via Näherungssensor
pin D5 den Gaszähler via Reedkontakt und zusätzlichem Pullup 10k

angeschlossen.
FHEM seitig habe ich den Code von fl_Indigo genommen. HAt mir am besten gefallen das alles nur in einem Device ist.
Die readings werden über espeasy und dem easyesp Modul auch sauber gefüttert.

Jetzt habe ich allerdings das problem das ich perl warnings bekomme:


2018.01.09 22:09:44 1: PERL WARNING: Deep recursion on subroutine "main::readingsSingleUpdate" at fhem.pl line 2235.
2018.01.09 22:09:44 1: PERL WARNING: Deep recursion on subroutine "main::readingsEndUpdate" at fhem.pl line 4555.
2018.01.09 22:09:44 1: PERL WARNING: Deep recursion on subroutine "main::fhem" at (eval 10700) line 1.
2018.01.09 22:09:44 1: PERL WARNING: Deep recursion on subroutine "main::AnalyzeCommandChain" at fhem.pl line 3519.
2018.01.09 22:09:44 1: PERL WARNING: Deep recursion on subroutine "main::AnalyzeCommand" at fhem.pl line 1022.
2018.01.09 22:09:44 1: PERL WARNING: Deep recursion on subroutine "main::CommandSetReading" at fhem.pl line 1168.
Out of memory!


Dannach ist FHEM nicht mehr erreichbar. Der Host läuft aber noch. nach einem sudo /etc/init.d/fhem start
ist FHEM sofort wieder da.
Hat jemand schon was ähnliches gehabt? wo kommt das her?

Viele Grüße

Matze


ChristianK.

Ich schliesse mich hier mal an... habe das identische Problem  :-\

Grüße
FHEM: 5.5 auf NUC unter Ubuntu
1x RFXTRX433, 1x CUL868_V3.4 (fw1.58)
CUL-MAX: MAX! Funk-Heizkörperthermostat, Fensterschalter
IT: 2 AB440 kompatible :-)

pink99panther

Wäre euer Problem nicht besser im "easyesp Modul" thread aufgehoben?

Gruß
Manfred

smoudo

Meinst du es hängt am easyesp Modul oder am verwendeten Perl Code?
RAM mäßig kann ich eigentlich keine Probleme feststellen. Da hab ich durchgängig 1500mb frei.
Sieht für mich nach irgendeiner Begrenzung der Perl libs aus.


Viele Grüße

Matze

noob70

Hallo,
ich verfolge das hier mit großem Interesse - leider gelingt es mir nicht, die Impulse von meinem Zählert
https://www.eltako.com/fileadmin/downloads/de/_bedienung/DSZ12D-3x80A_28380612-1_dt.pdf zu lesen.
Der Aufbau sollte ja so sein:
ZitatDer Ausgang S0+ wird mit den 3,3V (VCC) des ESP verbunden.
Der S0- wird mit dem GPIO der als Zähleingang definiert wurde verbunden.
Außerdem wird ein Widerstand 1 bis 5 kOhm von diesem GPIO gegen GND angebracht.
Daraufhin habe ich es wie im im Bild aufgebaut (hab soetwas noch nie zusammengebaut...):

Einstellung ein EasyESP

Hardware/GPIO boot states: 12 (D6) auf Input
Devices:
generic Pulse Couinter
1st GPIO: GPIO-12 (D6)
Debounce Time (mSec) 10
Counter Type: Delta/Tolat/Time
Mode Type: Falling

Send To Controller (enabled)
Delay 10 s


Es wird aber nichts gezählt. Ich steh da wie der Ochs vor'm Berg – was habe ich übersehen ???

fl_Indigo

S0- ghört auf D6 und nicht auf GND, dann sollts funzen ;)

noob70


Dr.E.Witz

Hallo zusammen,

wenn ich eine einen anderen Puls pro Counter habe, muss ich ja ein paar werte anpassen.
Das  wurde ja unter #44 bereits gemacht allerdings auch für diese Zeile.

$StromProStdRounded=int(1000 * $StromProStd + 0.5) / 1000;
in
$StromProStdRounded=int(1000 * $StromProStd + 0.5) / 600;

Wenn ich das richtig verstehe, ist das doch nur eine Rundungsfunktion, oder?

Desweiteren würde ich gerne einer Variable dafür einsetzen.

ist das dann so IO?

PulsStrom {
my $PulseProkWh =75;
my $StromUmlaufzeit = ReadingsVal("PulsStrom","Time","0") / 1000;
my $count = ReadingsVal("PulsStrom","Count","0");
my $StromProStd=0;
if ($StromUmlaufzeit > 0){
$StromProStd=3.6/$StromUmlaufzeit;
}
my $StromProStdRounded=0;
if($count > 0){$StromProStdRounded=int(1000 * $StromProStd + 0.5) / 1000;
}
my $StromProTag = ReadingsVal("PulsStrom","Total","0") / $PulseProkWh;
fhem("set Strom StromverbrauchStd $StromProStdRounded");;
fhem("set Strom StromverbrauchTag $StromProTag");;
}


Gerne würde ich auch den Anfangszählerstand irgendwo eintragen bzw. die gesammelten werte auf 0 setzen.
Ein Blick auf #56 hat mir nicht wirklich geholfen.
Mein Gedanke wäre hier ein Atribut "ZaelerOffset" zu ´setzen und den gesetzten Wert dann zu addieren im StromverbrNoti zu addieren.
Auch dabei wäre ein "unter die Arme greifen" klasse :-)

Danke für Tipps!

Michael





Neuhier

Was ist das nebulöse S0- und S0+ ?
Fotodiode?
Lesekopf?
Irgendwasspezielles?


Neuhier

#86
S0+ und S0- sind Anschlüsse am Stromzähler.  ::)

Das Bild im Link zeigt u.a. einen Fototransistor, mit Widerstand und Diode in Reihe.
Die Seite hatte ich mittlerweile auch gefunden.
Ich dachte, das hast Du nachgebaut.



joewanne

#87
Zitat von: fl_Indigo am 05 Mai 2017, 10:03:28
hab die config nochmal etwas verfeinert, damit man bei einem neustart des ESP die tagesstände nicht verliert, weiters kann der offset genutzt werden um den zählerstand bei bedarf zu korrigieren


define ESPEasy_ESP8266_Server_S0_Watt ESPEasy 10.0.0.91 80 ESPBridge ESP8266_Server_S0_Watt
attr ESPEasy_ESP8266_Server_S0_Watt IODev ESPBridge
attr ESPEasy_ESP8266_Server_S0_Watt Interval 60
attr ESPEasy_ESP8266_Server_S0_Watt alias Serverrack S0
attr ESPEasy_ESP8266_Server_S0_Watt event-min-interval .*:300
attr ESPEasy_ESP8266_Server_S0_Watt event-on-change-reading .*
attr ESPEasy_ESP8266_Server_S0_Watt group ESPEasy Device
attr ESPEasy_ESP8266_Server_S0_Watt presenceCheck 1
attr ESPEasy_ESP8266_Server_S0_Watt readingSwitchText 1
attr ESPEasy_ESP8266_Server_S0_Watt room 15_ESPEasy,02_Energie
attr ESPEasy_ESP8266_Server_S0_Watt setState 3
attr ESPEasy_ESP8266_Server_S0_Watt stateFormat { sprintf("Zählerstand: %.2f kWh<br>Verbrauch gestern/vorgestern: %.2f / %.2f kWh<br>Verbrauch heute: %.2f kWh<br>Stromverbrauch aktuell: %.2f W", (ReadingsVal($name, "ZaehlerStand",0)), (ReadingsVal($name, "StromverbrauchGestern",0)), (ReadingsVal($name, "StromverbrauchVorgestern",0)),(ReadingsVal($name, "StromverbrauchHeute",0)), (ReadingsVal($name, "StromverbrauchAktuell",0)) ) }
attr ESPEasy_ESP8266_Server_S0_Watt userReadings StromverbrauchAktuell:Time:.* { 3600/ReadingsVal("$name", "Time", 0)*1000 },\
ZaehlerStand:Time:.* { ReadingsVal("$name", "StromverbrauchHeute", 0) + ReadingsVal("$name", "ZaehlerStandVortag", 0) + ReadingsVal("$name", "StromverbrauchHeuteOffset", 0);; },\
StromverbrauchHeute:Time:.* { my $Strom_Gesamt = ReadingsVal("$name", "StromverbrauchHeute", 0) + (ReadingsVal("$name", "Count", 0)/1000);; fhem ("setreading ESPEasy_ESP8266_Server_S0_Watt StromverbrauchHeute $Strom_Gesamt");; }
attr ESPEasy_ESP8266_Server_S0_Watt verbose 0

define at_ESPEasy_ESP8266_Server_S0_Watt_reboot at *00:00:00 {\
my $Stromverbrauch_Heute = ReadingsVal("ESPEasy_ESP8266_Server_S0_Watt","StromverbrauchHeute","0");;\
my $Zaehler_Stand_Vortag = ReadingsVal("ESPEasy_ESP8266_Server_S0_Watt","ZaehlerStandVortag","0");;\
my $Stromverbrauch_Gestern = ReadingsVal("ESPEasy_ESP8266_Server_S0_Watt","StromverbrauchGestern","0");;\
my $zaehlerNeu = $Zaehler_Stand_Vortag + $Stromverbrauch_Heute;;\
fhem ("setreading ESPEasy_ESP8266_Server_S0_Watt ZaehlerStandVortag $zaehlerNeu");;\
fhem ("setreading ESPEasy_ESP8266_Server_S0_Watt StromverbrauchGestern $Stromverbrauch_Heute");;\
fhem ("setreading ESPEasy_ESP8266_Server_S0_Watt StromverbrauchVorgestern $Stromverbrauch_Gestern");;\
fhem ("setreading ESPEasy_ESP8266_Server_S0_Watt StromverbrauchHeute 0");;\
fhem ("setreading ESPEasy_ESP8266_Server_S0_Watt StromverbrauchHeuteOffset 0");;\
fhem ("set ESPEasy_ESP8266_Server_S0_Watt reboot");; }

define FileLog_StromzaehlerServer FileLog ./log/StromzaehlerServer-%Y-%m.log ESPEasy_ESP8266_Server_S0_Watt:StromverbrauchAktuell:.*|ESPEasy_ESP8266_Server_S0_Watt:ZaehlerStand:.*|ESPEasy_ESP8266_Server_S0_Watt:ZaehlerStandVortag:.*|ESPEasy_ESP8266_Server_S0_Watt:StromverbrauchHeute:.*|ESPEasy_ESP8266_Server_S0_Watt:StromverbrauchVortag:.*


Erstmal gute Arbeit.
Funktioniert 1a!!!
Habe aber noch eine Frage, gibt es die Möglichkeit, den Zählerstand anzupassen ???
Wenn ja, wie kann ich das machen?

Liebe Grüße Jörg

**EDIT**
Habs gefunden!
setreading ist die Lösung

joewanne

Ich habe mich wohl zu früh gefreut, heute Nacht habe ich folgende Fehler bekommen.


2019.06.10 00:00:06 1: PERL WARNING: Deep recursion on subroutine "main::readingsEndUpdate" at fhem.pl line 4913.
2019.06.10 00:00:06 3: eval: { my $Strom_Gesamt = ReadingsVal("$name", "StromverbrauchHeute", 0) + (ReadingsVal("$name", "Count", 0)/1000); fhem ("setreading ESPEasy_ESP_Easy_1_Watt StromverbrauchHeute $Strom_Gesamt"); }
2019.06.10 00:00:06 1: PERL WARNING: Deep recursion on subroutine "main::fhem" at (eval 34139) line 1.
2019.06.10 00:00:06 3: eval: { my $Strom_Gesamt = ReadingsVal("$name", "StromverbrauchHeute", 0) + (ReadingsVal("$name", "Count", 0)/1000); fhem ("setreading ESPEasy_ESP_Easy_1_Watt StromverbrauchHeute $Strom_Gesamt"); }
2019.06.10 00:00:06 1: PERL WARNING: Deep recursion on subroutine "main::AnalyzeCommandChain" at fhem.pl line 3790.
2019.06.10 00:00:06 3: eval: { my $Strom_Gesamt = ReadingsVal("$name", "StromverbrauchHeute", 0) + (ReadingsVal("$name", "Count", 0)/1000); fhem ("setreading ESPEasy_ESP_Easy_1_Watt StromverbrauchHeute $Strom_Gesamt"); }
2019.06.10 00:00:06 1: PERL WARNING: Deep recursion on subroutine "main::AnalyzeCommand" at fhem.pl line 1085.
2019.06.10 00:00:06 3: eval: { my $Strom_Gesamt = ReadingsVal("$name", "StromverbrauchHeute", 0) + (ReadingsVal("$name", "Count", 0)/1000); fhem ("setreading ESPEasy_ESP_Easy_1_Watt StromverbrauchHeute $Strom_Gesamt"); }
2019.06.10 00:00:06 1: PERL WARNING: Deep recursion on subroutine "main::CommandSetReading" at fhem.pl line 1232.
2019.06.10 00:00:06 3: eval: { my $Strom_Gesamt = ReadingsVal("$name", "StromverbrauchHeute", 0) + (ReadingsVal("$name", "Count", 0)/1000); fhem ("setreading ESPEasy_ESP_Easy_1_Watt StromverbrauchHeute $Strom_Gesamt"); }
2019.06.10 00:00:06 1: PERL WARNING: Deep recursion on subroutine "main::readingsSingleUpdate" at fhem.pl line 2411.
2019.06.10 00:00:06 3: eval: { my $Strom_Gesamt = ReadingsVal("$name", "StromverbrauchHeute", 0) + (ReadingsVal("$name", "Count", 0)/1000); fhem ("setreading ESPEasy_ESP_Easy_1_Watt StromverbrauchHeute $Strom_Gesamt"); }
2019.06.10 00:05:05 1: PERL WARNING: Argument "Error evaluating ESPEasy_ESP_Easy_1_Watt userReading Str..." isn't numeric in sprintf at (eval 238805) line 1.
2019.06.10 00:05:05 3: eval: { my $Strom_Gesamt = ReadingsVal("$name", "StromverbrauchHeute", 0) + (ReadingsVal("$name", "Count", 0)/1000); fhem ("setreading ESPEasy_ESP_Easy_1_Watt StromverbrauchHeute $Strom_Gesamt"); }
2019.06.10 00:05:07 1: PERL WARNING: Argument "Error evaluating ESPEasy_ESP_Easy_1_Watt userReading Str..." isn't numeric in sprintf at (eval 238806) line 1.
2019.06.10 00:05:07 3: eval: { my $Strom_Gesamt = ReadingsVal("$name", "StromverbrauchHeute", 0) + (ReadingsVal("$name", "Count", 0)/1000); fhem ("setreading ESPEasy_ESP_Easy_1_Watt StromverbrauchHeute $Strom_Gesamt"); }
2019.06.10 00:05:09 1: PERL WARNING: Argument "Error evaluating ESPEasy_ESP_Easy_1_Watt userReading Str..." isn't numeric in sprintf at (eval 238807) line 1.


Die Fehler gingen über mehrere Stunden, so das sich das komplette System aufgehängt hat.
Wer kann mir hier weiterhelfen ?

Liebe Grüße
Jörg

joewanne

Zitat
Leider habe ich glaube ein kleines Masseproblem..

Sporadisch kommt mal ein Wert von 30KW raus. Leider jeden Tag merhfach.
Neues Netzteil hat etwas abhilfe geschaft. Leider nicht komplett weg und macht jeden Graphen kaputt. Hat jemand eine Idee


Hallo,
konnte das 30KW Problem gelöst werden ?
Wenn ja wie.
Ich habe nämlich das gleiche Problem und bekomme es einfach nicht hin.
Würde mich über hilfe dabei sehr freuen.

Liebe Grüße
Jörg