@ChristianM Da ich Eugens pulsecounter nur theoretisch - und das nur sehr oberflächlich - kenne, weiß ich nicht, ob der ESPEasy besser funktioniet. Ich habe den ESPEasy auch nicht ordentlich an einem Funktionsgenerator etc geprüft. Einfach das S0 Interface vorschriftsgemäß mit zusätzlichem Optokoppler aufgebaut, alles in ein AP Verteilergehäuse gepackt, an Versorgung und S0-Ausgang angeschlossen und HW fertig.
Von meinem Wasserzähler weiß ich, daß es beim ESP8266 zu Impulsverlusten kommen kann, wenn das Teil mit dem Webserver beschäftigt ist. Aber da habe ich deutlich höhere Abtastraten getestet, als so ein S0-Zähler braucht.
Die "Zeitbasis" kann man konfigurieren. Hatte ursprünglich 10 Skunden ud dann auf 60 Sekunden erhöht. In dieser Applikation gehts um den Stromverbrauch der Ölheizung, also Brenner, Pumpen, Regelung etc. Da liegt der Maximalwert so etwa unter 400W. Da sind 60 Sekunden Zeitbasis nicht schlecht. Könnte auch noch länger sein.
Im ESPEasy selbst könnte man auch Umrechnungsformeln eingeben. Da man die Totalisierung aber ohnehin in ioBroker vornehmen muß, habe ich mich damit nicht beschäftigt.
So sieht der entsprechende Teil im Menue aus. Unten kann man das "Interval" einstellen.
ESPEasy-pulscounter-config.JPG
Die Übertragung läuft über MQTT Protokolleinstellung "Home Assistant (openHAB) MQTT".
Die Totalisierung in ioBroker habe ich recht stmpf und straight forward umgesetzt:
/* S0-conter converter for heating electical energy
increments ticks
calculates energy
calculates power */
const timeBase = 60; //seconds
const ticksPerKWhOfCounter = 2000; // 2000 ticks per kWh for Eltaco S0 counter
const kWhPerTick = 1/ticksPerKWhOfCounter; //
const ticksToPower = 3600/ticksPerKWhOfCounter / timeBase ;
const initialEnergyValue = 4658.539; // kWh value of the counter when installing the S0 interface and this script ist started for the first time
const ticksName = 'mqtt.0.Heizraum-Energy.Heizraum-Energy-S0.ticks'/*Heizraum-Energy/Heizraum-Energy-S0/ticks*/;
const ticksSumName = 'data.0.heating.Heizraum.Electricity.ticksSum'/*ticksSum*/;
const energyName = 'data.0.heating.Heizraum.Electricity.Energy'/*Energy*/;
const powerName = 'data.0.heating.Heizraum.Electricity.Power'/*Power*/;
function calculatePowerEnergy (ticksSumName, energyName, powerName, ticks){
var ticksSum = getState(ticksSumName).val;
ticksSum = ticksSum + ticks;
var Energy = initialEnergyValue + ticksSum * kWhPerTick;
var Power = ticks * ticksToPower;
setState(ticksSumName, ticksSum);
setState(energyName, Energy);
setState(powerName, Power);
}
// start subscriptions Add an subscription for each sensor
on({id: ticksName, change: "any" },
function (obj) {
ticks = getState(ticksName).val;
calculatePowerEnergy (ticksSumName, energyName, powerName, ticks);
});
Diese primitive Umsetzung hat allerdings den Nachteil, daß bei einem ioBroker Update Impulse in der Totalisierung verloren gehen.
Wenn der Absolutwert wichtig ist, kann man da noch die Totalisierung im ESP mit verwenden. Man müßte die dann plausibilisieren, um einen Neustart des ESP zu erkennen. Also generell auf die Totalisierung im ESP selbst setzen und nur wenn man ein Zurücksetzen dieser Summe erkannt hat, mit der Zwischenspeicherung im ioBroker aushelfen. Da man den ESP ohnehin nicht so oft updatet wie ioBroker wäre das das bessere Konzept - zumindest wenn das "grand total" sehr wichtig ist..