NEWS
Gaszähler auswerten - Problem
-
Hallo zusammen,
ich werte meinen Gaszähler mit einem WEMOS D1 und einem Reed-Kontakt aus.
Vorgegangen bin ich dabei ziemlich exakt nach dieser Anleitung die eigentlich für mich bisher recht gut ist / war da verständlich:https://github.com/msussek/arduino/tree/master/pulsecounter
Auf dem WEMOS D1 läuft das im o.g. Link befindliche genannte Arduino-Script (https://github.com/msussek/arduino/blob/master/pulsecounter/src/wemos/PulseCounter.ino), jedoch habe ich in der Zeile 180 den Wert auf 120 Sekunden angepasst, denn:
Meine Gastherme habe ich auf maximal 3kW Heizleistung eingestellt, der Impulsgeber im Zählwerk kommt daher bei minimaler Leistung von 3kW nur alle ca. 120 Sekunden am Reed Kontakt vorbei (1 Imp = 0,01m³). Wenn ich den Timer weiter runter drehe, dann sinkt die Leistung zwischendurch immer auf 0kW und es wird entsprechend die Anzahl der Brennerstarts (fälschlicherweise) hochgezählt: Das ist jedoch nicht korrekt, da der Zähler ja durchgehend läuft und der Brenner nicht an und ausgeht.
Wenn ich den Timer bei 120 Sekunden (oder höher) setze, dann übermittelt er jedoch zu hohe Leistungen, da er in einem Datenpaket ja 2 Impulse registriert, damit steigt dann die Brennerleistung von exakt 3044W auf 6088W.
Ich bin nun absolut nicht der Programmierer und habe gerade irgendwie auch Probleme das gedanklich zu lösen.
Meine (total simplen) Ansätze waren von der Logik her wie folgt: Wenn Brennerleistung = 6088 dann setze Brennerleistung auf 3044 - das ist jedoch nicht sauber.Hat jemand eine gute Idee wie ich das sauber lösen kann?
Ich werfe das bestehende Script gerne auch weg und baue das neu auf.Hier mal ein paar Screenshots von meinem Problem:
Es wurde konstant mit 3kW geheizt außer in den Peaks um 18:00 und 20:00. Die kleinen Spitzen sind alle ein "Vielfaches" von 3044, entweder 6088 oder 9132. Ziel ist hier eine flache Linie.
Script / Code von Marco Sussek gemäß obenstehendem Github im ioBroker / Blockly:
var deltaZeit, value, oldValue, deltaWert, verbrauchInKubikmeter, verbrauchInKwh, gasVolumenStrom, leistung; on({id: 'mqtt.0.SmartHome.Sensor.Haustechnikraum.Impulszaehler.Zaehler_0.Impulse', change: "any"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; // Zeitdifferenz seit letzter Änderung in ms deltaZeit = (new Date().getTime()) - getState("javascript.0.Gaszaehler.Verbrauch_Volumen").lc; if (value < oldValue) { // Sonderfälle ESP Reset oder Überlauf if (value >= 0) { // ESP Reset deltaWert = value; } else { // Impulswertüberlauf deltaWert = 1; } } else { // Anzahl Impulse seit letzter Änderung deltaWert = value - oldValue; } if (deltaWert > 0) { // Wenn Zähler läuft if (!getState("javascript.0.Gaszaehler.BrennerAktiv").val) { setState("javascript.0.Gaszaehler.BrennerAktiv"/*BrennerAktiv*/, true, true); setState("javascript.0.Gaszaehler.Brennerstarts"/*Brennerstarts*/, (getState("javascript.0.Gaszaehler.Brennerstarts").val + 1), true); } // Verbrauch in m³ verbrauchInKubikmeter = Math.round((getState("javascript.0.Gaszaehler.Verbrauch_Volumen").val + deltaWert * 0.0106)*100)/100; setState("javascript.0.Gaszaehler.Verbrauch_Volumen"/*Verbrauch Volumen*/, verbrauchInKubikmeter, true); // Verbrauch in kwh verbrauchInKwh = Math.round((verbrauchInKubikmeter * getState("javascript.0.Gaszaehler.Brennwert").val * getState("javascript.0.Gaszaehler.Zustandszahl").val)*100)/100; setState("javascript.0.Gaszaehler.Verbrauch_Energie"/*Verbrauch Energie*/, verbrauchInKwh, true); // gasVolumenStrom in m³/s gasVolumenStrom = (deltaWert * 0.0106) / (deltaZeit / 1000); // leistung in W leistung = Math.round(gasVolumenStrom * getState("javascript.0.Gaszaehler.Brennwert").val * getState("javascript.0.Gaszaehler.Zustandszahl").val * 3600000); if (leistung == 6088) { leistung = 3044; } setState("javascript.0.Gaszaehler.Leistung"/*Leistung*/, leistung, true); // Laufzeit in h setState("javascript.0.Gaszaehler.Brennerlaufzeit_Stunden"/*Brennerlaufzeit_Stunden*/, Math.round((getState("javascript.0.Gaszaehler.Brennerlaufzeit").val / 3600)*100)/100, true); // Starts Laufzeit setState("javascript.0.Gaszaehler.Laufzeit_je_Start"/*Laufzeit_je_Start*/, Math.round((getState("javascript.0.Gaszaehler.Brennerlaufzeit").val / getState("javascript.0.Gaszaehler.Brennerstarts").val)*100)/100, true); } else { // Wenn Zähler nicht läuft if (getState("javascript.0.Gaszaehler.BrennerAktiv").val) { deltaZeit = (new Date().getTime()) - getState("javascript.0.Gaszaehler.BrennerAktiv").lc; setState("javascript.0.Gaszaehler.BrennerAktiv"/*BrennerAktiv*/, false, true); setState("javascript.0.Gaszaehler.Leistung"/*Leistung*/, 0, true); setState("javascript.0.Gaszaehler.Brennerlaufzeit"/*Brennerlaufzeit*/, (Math.round(getState("javascript.0.Gaszaehler.Brennerlaufzeit").val + deltaZeit / 1000)), true); } } });
Code für den Wemos D1
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <ESP8266HTTPUpdateServer.h> #include <Ticker.h> #include <WiFiClient.h> #include <PubSubClient.h> extern "C" { #include "gpio.h" #include "user_interface.h" } #define INT_PIN1 5 // Zuordnung der GPIOs #define INT_PIN2 4 #define INT_PIN3 2 #define INT_PIN4 13 #define INT_PIN5 12 #define INT_PIN6 14 unsigned long impulse[6], alteZeit[6], entprellZeit[6]; ESP8266WebServer server(80);// Serverport hier einstellen ESP8266HTTPUpdateServer httpUpdater; Ticker Timer; WiFiClient net; PubSubClient client(net); // Zugangsdaten zum WLAN: const char* ssid = "meineWLAN-SSID"; const char* password = "meinWLANPasswort"; // Zugangsdaten zum MQTT-Broker: const char* mqtt_server = "HostnameMQTT-Broker"; const int mqtt_port = 1883; const char* mqtt_user = "meinMQTTUserName"; const char* mqtt_password = "meinMQTTPasswort"; void ICACHE_RAM_ATTR interruptRoutine1() { handleInterrupt(0); } void ICACHE_RAM_ATTR interruptRoutine2() { handleInterrupt(1); } void ICACHE_RAM_ATTR interruptRoutine3() { handleInterrupt(2); } void ICACHE_RAM_ATTR interruptRoutine4() { handleInterrupt(3); } void ICACHE_RAM_ATTR interruptRoutine5() { handleInterrupt(4); } void ICACHE_RAM_ATTR interruptRoutine6() { handleInterrupt(5); } void handleInterrupt(int i){ unsigned long timeInMillis = millis(); if((timeInMillis - alteZeit[i]) > entprellZeit[i] || timeInMillis < alteZeit[i]) { impulse[i]++; Serial.println("Impulse Zähler " + String(i) + ": " + String(impulse[i])); alteZeit[i] = timeInMillis; } } void handleHttpRequest(){ String response = ""; for (int i = 0; i < 6; i++){ response += String(impulse[i]) + ","; } server.sendHeader("Cache-Control", "no-cache"); server.send(200, "text/plain", response); } void sendMqttMessage(){ Serial.println("Sende MQTT Nachrichten"); for (int i = 0; i < 6; i++) { char buffer[10]; sprintf(buffer, "%lu", impulse[i]); String topic = "/SmartHome/Sensor/Haustechnikraum/Impulszaehler/Zaehler_" + String(i) + "/Impulse"; client.publish(const_cast<char*>(topic.c_str()), buffer); } for (int i = 0; i < 6; i++) { char buffer[10]; sprintf(buffer, "%lu", entprellZeit[i]); String topic = "/SmartHome/Sensor/Haustechnikraum/Impulszaehler/Zaehler_" + String(i) + "/Entprellzeit"; client.publish(const_cast<char*>(topic.c_str()), buffer); } } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Verbindungsaufbau zum MQTT-Broker..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str(), mqtt_user, mqtt_password)) { Serial.println("connected"); client.subscribe("/SmartHome/Sensor/Haustechnikraum/Impulszaehler/*/Entprellzeit"); } else { Serial.print("fehlgeschlagen, rc="); Serial.print(client.state()); Serial.println(" erneut versuchen in 5 Sekunden"); // Wait 5 seconds before retrying delay(5000); } } } void callback(char* topic, byte* payload, unsigned int length) { String sTopic = String(topic); for (int i = 0; i < 6; i++) { char buffer[10]; String topic = "/SmartHome/Sensor/Haustechnikraum/Impulszaehler/Zaehler_" + String(i) + "/Entprellzeit"; if (sTopic == topic) { // Workaround to get int from payload payload[length] = '\0'; Serial.println("Setze Entprellzeit für Zähler " + String(i) + " auf " + String((char*)payload)); entprellZeit[i] = String((char*)payload).toInt(); } } } void setup(){ pinMode(INT_PIN1, INPUT_PULLUP); pinMode(INT_PIN2, INPUT_PULLUP); pinMode(INT_PIN3, INPUT_PULLUP); pinMode(INT_PIN4, INPUT_PULLUP); pinMode(INT_PIN5, INPUT_PULLUP); pinMode(INT_PIN6, INPUT_PULLUP); Serial.begin(115200); Serial.println(""); Serial.println("Start"); Serial.println(""); Serial.println("Warte auf Verbindung"); WiFi.mode(WIFI_STA); // station modus verbinde mit dem Router WiFi.begin(ssid, password); // WLAN Login daten WiFi.hostname("ESP-Zaeler"); // Warte auf verbindung int timout = 0; while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("O"); timout++; if (timout > 20) // Wenn Anmeldung nicht möglich { Serial.println(""); Serial.println("Wlan verbindung fehlt"); break; } } if (WiFi.status() == WL_CONNECTED) { Serial.println(""); Serial.println("Mit Wlan verbunden"); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); } for (int i = 0; i < 6; i++){ alteZeit[i]=0; entprellZeit[i]=1000; } client.setServer(mqtt_server, mqtt_port); server.on("/", handleHttpRequest); // Bechandlung der Ereignissen anschlissen httpUpdater.setup(&server); // Updater server.begin(); // Starte den Server Serial.println("HTTP Server gestartet"); Timer.attach(120, sendMqttMessage); // Starte den 60s Timer DIESEN WERT HABE ICH AUF 120 SEKUNDEN ANGEPASST! // ---------------------- Starte Interrupts --------------------------------------------- attachInterrupt(INT_PIN1, interruptRoutine1, FALLING); attachInterrupt(INT_PIN2, interruptRoutine2, FALLING); attachInterrupt(INT_PIN3, interruptRoutine3, FALLING); attachInterrupt(INT_PIN4, interruptRoutine4, FALLING); attachInterrupt(INT_PIN5, interruptRoutine5, FALLING); attachInterrupt(INT_PIN6, interruptRoutine6, FALLING); reconnect(); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); server.handleClient(); }
Ich würde mich freuen, wenn mir jemand helfen kann
Danke,
Moritz -
Ich denke du machst einen Denkfehler. Du versuchst direkt aus den ankommenden Pulsen eine Heizleistung zu generieren.
Du musst dich was die Kombination WEMOS Pulszähler / ioBroker angeht für eine von 3 Optionen entscheiden:
- Pulszählerintervall so klein, das die vom Pulszähler übermittelte Zahl es erlaubt jeden Puls zu erkennen.
- Pulszählerintervall so gross das im Betrieb die Werte immer so übertragen werden das mehr als n Pulse zusammengefasst übertragen werden. Die Frage wie gross n ist bestimmt den möglichen Fehler, da durch Überlappung von unterschiedlichen Intervallen es immer wieder dazu kommen kann das auch bei minimalen Betrieb n+1 Pulse übermittelt werden - Wenn n also 1 ist hast du manchmal auch 2 Pulse.
- Pulszähler auf dem WEMOS deaktivieren und jedes mal wenn ein Signal vom Sensor kommt direkt ein MQTT Telegramm senden das ein Puls erkannt wurde.
Ich Persönlich würde das Intervall klein stellen, und die "Brenner An" Erkennung auf ioBroker Seite dadurch lösen das der Brenner auf an gesetzt wird wenn ein Impuls erkannt wird und der Brenner auf aus gesetzt wird wenn über "Mindestzeit * 1.5" Sekunden kein Impuls erkannt wurde.
Bliebe noch die Darstellung der Heizleistung. Da würde ich so vorgehen:
-
Heizleistung der letzten 10 Minuten in einem internen Datenpunkt kontinuierlich berechnen: Heizleistung aus den Pulsen berechnen, dabei eine Zeitbasis von 600 Sekunden nutzen. Skripttechnisch würde ich mit einer Liste von Wertepaaren (Pulszahl, Zeit) arbeiten um einen gleitenden Mittelwert über die letzten 600 Sekunden erzeugen zu können. (Immer wenn ein Wert ankommt: Liste durchgehen, alle Werte rauswerfen die älter als 600 sekunden sind, dann den neuen Wert hinzufügen, Pulse aufaddieren, durch 120 teilen und mit 3kW malnehmen um die mittlere Leistung in zu ermitteln.
-
Brenner aus => Heizleistung 0
-
Brenner an => Heizleistung = Max (3kW, Heizleistung der letzten 10 Minuten)
A.
-
Danke dir erstmal!
Zum ersten Teil:
Ok, dann würde ich deinem Vorschlag folgen und den Pulsintervall möglichst klein stellen. Dieser muss am Ende doch so klein sein, dass auch bei maximaler Umdrehung des Zählwerkes / maximaler Leistung jeder Puls übermittelt wird, korrekt?Beispiel: Wenn er mit 22kW Warmwasser aufbereitet, dann gibt es alle 2 Sekunden einen Impuls. Der Pulsintervall muss also kleiner als 2 Sek. gewählt sein, korrekt?
Die Mindestzeit ist muss ja irgendwo ab 120 Sekunden (1 Imp alle 120 Sekunden bei 3kW als Minimalleistung) + X liegen. Wenn über (sagen wir) 180 Sekunden kein Impuls kommt, dann ist der Brenner aus, korrekt?
Wie ich das sinnvoll in Blockly abbilden kann zaubert mir gerade noch ein Fragezeichen ins Gesicht.
Zur Berechnung der Heizleistung muss ich dann noch mal abtauchen, Schritt für Schritt.
-
@dasmoritz sagte in Gaszähler auswerten - Problem:
Danke dir erstmal!
Zum ersten Teil:
Ok, dann würde ich deinem Vorschlag folgen und den Pulsintervall möglichst klein stellen. Dieser muss am Ende doch so klein sein, dass auch bei maximaler Umdrehung des Zählwerkes / maximaler Leistung jeder Puls übermittelt wird, korrekt?Beispiel: Wenn er mit 22kW Warmwasser aufbereitet, dann gibt es alle 2 Sekunden einen Impuls. Der Pulsintervall muss also kleiner als 2 Sek. gewählt sein, korrekt?
Nach der strengen Theorie - ja. Allerdings ist ein Intervall von unter 2 Sekunden doch exzessiv und wahrscheinlich unnötig. Ich würde mit einem Intervall von 50 Sekunden starten. Dabei ist damit zu rechnen das bei minimaler Leistung zwischen 2 echten Impulsen immer 2 Werte ohne neue Impulse kommen. Erst wenn dadurch die Genauigkeit der angezeigten Leistung nicht ausreicht würde ich das auf bis auf 10 Sekunden senken, nicht kleiner.
Die Mindestzeit ist muss ja irgendwo ab 120 Sekunden (1 Imp alle 120 Sekunden bei 3kW als Minimalleistung) + X liegen. Wenn über (sagen wir) 180 Sekunden kein Impuls kommt, dann ist der Brenner aus, korrekt?
Ja.
Wie ich das sinnvoll in Blockly abbilden kann zaubert mir gerade noch ein Fragezeichen ins Gesicht.
Das ist einfach. Du setzt einen Trigger auf den State mit den Pulsen, aktiv nur wenn geändert. Darin machst du:
- clear Timeout
- set Timeout(180 sekunden, setze Brenner auf aus)
- setze Brenner auf an
- die Listen-Magie für die Leistungsberechnung wie oben beschrieben.
Zur Berechnung der Heizleistung muss ich dann noch mal abtauchen, Schritt für Schritt.
A.
-
@asgothian sagte in Gaszähler auswerten - Problem:
Ich würde mit einem Intervall von 50 Sekunden starten. Dabei ist damit zu rechnen das bei minimaler Leistung zwischen 2 echten Impulsen immer 2 Werte ohne neue Impulse kommen.
aber nach Murphy wird das zu "Probleme" führen
Impulsabstand und Intervall werden nie ein einheitliches gemeinsames Vielfaches haben so dass es vorkommen wird, dass mal 2 oder 3 Impulse in dem Intervall sind, was 50% Unterschied ausmacht (böses Beispiel - ich weiß!)ich habe das gleiche Problem beim all-in-device Zähler der etwa im 5 Minuten Abstand den Zählerstand ausliest.
Wenn nicht der Zeitabstand zwischen den Impulsen exakt gemessen werden kann (ich habe den Code nicht gelesen, wäre eh zwecklos ) und daraus etwas berechnet wird kann es immer zu solchen "Phänomenen" kommen.
Von stall.biz gibt es einen Pulsecounter, vielleicht wäre das hilfreich
-
@homoran sagte in Gaszähler auswerten - Problem:
aber nach Murphy wird das zu "Probleme" führen
Impulsabstand und Intervall werden nie ein einheitliches gemeinsames Vielfaches haben so dass es vorkommen wird, dass mal 2 oder 3 Impulse in dem Intervall sind, was 50% Unterschied ausmacht (böses Beispiel - ich weiß!)Das ist Absicht. Die darauf folgende Auswertung muss mit diesem Effekt umgehen können, da die Pulsfrequenz (wenn ich die Zahlen von @DasMoritz korrekt interpretiere) zwischen 120 s / Puls und 2 s/Puls variieren kann. Egal welches Intervall wir also einstellen - wir werden immer irgendwann das "1 Puls / 2 Pulse" Problem bekommen - weswegen ich zur Anzeige der Leistung einen Mittelwert über 600 Sekunden vorschlage.
Letztendlich geht es bei der Frequenz der Übertragung der Pulszahlen um 3 Dinge:
- Wie schnell erkenn ich das der Brenner an ist
- Ab wann habe ich sowieso so schnelle Pulse das ich mit dem "mal 1 und mal 2 Pulse" keine Probleme bekomme.
- Ab wann sind die Pulse so schnell das ich nicht wirklich jeden Puls einzeln gemeldet bekommen will.
A.
-
Moin,
ich habe den Wert auf dem Wemos D1 nun einmal auf 50 Sekunden gesetzt, ansonsten nichts weiteres verändert.
Optische Darstellung in Grafana ist nun wie folgt:Ergebnis ist optisch damit erstmal das gleiche.
Soll ich den Intervall von 50 Sek. nun weiter reduzieren oder aber das in ioBroker lösen?
-
@dasmoritz
Du solltest den rest jetzt im ioBroker lösen. Das das Diagramm so aussieht entspricht der Erwartung.A.
-
Moin,
hier mal ein Wurf:
Ist das so korrekt?
Irgendwie passt das rein optisch / prozessual nicht zu meiner gedanklichen Logik:
Wenn das Objekt "Impulse" geändert wurde, dann warte 180 Sekunden und schaue ob sich noch eine weitere Änderung ergibt. Wenn das der Fall ist, dann setze "Brenner aktiv" auf wahr. Wenn dies nicht der Fall ist, dann setzte "Brenner aktiv" auf falsch.Da passt doch in meinen Skript etwas nicht, oder?
-
@dasmoritz da ist aber noch keine Glättung drin.
außerdem stoppst du den Timeout nicht.
wenn der Trigger innerhalb des Timeouts nochmal anspringt, läuft der selbe Timeout doppelt und mehrfach -
Danke dir, stimmt.
Daraus ergeben sich natürlich zwei Fragen: Wie stoppe ich den Timeout und wie glätte ich das sauber?
Sorry, aber ich bin mit Blockly recht "neu".
-
@dasmoritz sagte in Gaszähler auswerten - Problem:
Wie stoppe ich den Timeout
mit stop timeout vor dem erneuten Start
@dasmoritz sagte in Gaszähler auswerten - Problem:
wie glätte ich das sauber?
zum Beispiel über eine Liste, in die du den aktuellen Wert einträgst, dann sobald die Länge der Liste deine gewünschte Anzahl Messungen/Zeit überschritten hat, den jeweils letzten Eintrag wieder entfernst.
Anschließend den Mittelwert bilden und verwenden.EDIT:
hier mal auf die Schnelle ein Beispiel:
Zusammenfassung:
- Liste erzeugen
- Wert einfügen
- Länge überprüfen
- bei bedarf Element entfernen
- Mittelwert (hier noch gerechnet, gibt es aber auch als Baustein) aus der Liste nehmen
- diesen in Variable übernehemn und
- damit weiterrechnen
-
@homoran und @Asgothian
Uff, etwas heftig.
Frage: Wo muss ich den stop timeout in meinem Beispiel einbauen?
Es macht doch irgendwie keinen Sinn, den "stop timeout" vor den Beginn des Timeouts zu setzen, oder?Ich glaube wenn ich nicht Schritt für Schritt vorgehe, dann bin ich Lost.
-
@dasmoritz sagte in Gaszähler auswerten - Problem:
Es macht doch irgendwie keinen Sinn, den "stop timeout" vor den Beginn des Timeouts zu setzen, oder?
Oder!
Danach wird ja der Timeout erneut gestartetAber ich denke, dass dein Ansatz mit dem Timeout komplett falsch ist
-
@dasmoritz sagte in Gaszähler auswerten - Problem:
@homoran und @Asgothian
Uff, etwas heftig.
Frage: Wo muss ich den stop timeout in meinem Beispiel einbauen?
Es macht doch irgendwie keinen Sinn, den "stop timeout" vor den Beginn des Timeouts zu setzen, oder?Ich glaube wenn ich nicht Schritt für Schritt vorgehe, dann bin ich Lost.
Doch, das ist genau so korrekt. Es geht ja bei dem "stop timeout" gerade darum dafür zu sorgen das ein schon laufender timeout gestoppt wird bevor du einen weiteren anlegst.
Nun zum Thema Liste und Glätten: Das Hauptproblem welches du hast ist das deine Werteänderungen nicht in gleichen Intervallen kommen. Deswegen musst du etwas Arbeit hinein stecken:
Zunächst einmal brauchst du 2 Variablen für deine Listen
Dann füllst du diese mit den entsprechenden Werten - das muss in den Trigger, hinter die BrennerAktiv Geschichte.
Wichtig dabei ist das die Bausteine Wert, Vorheriger Wert, Zeitstempel und vorheriger Zeitstempel keine Variablen sind sondern alle der gleiche Baustein - der der im folgenden Screenshot mit "Objekt ID" Vorbelegt
Als nächstes kommt das Berechnen des Durchschnitts:
Damit hast du dann einen Datenpunkt der dir Anzeigt wieviele Impulse du pro Sekunde innerhalb der jeweils letzten 600 sekunden bekommen hast.
Als letztes willst du noch die Werte aus der Liste werfen die zu alt sind. Das geht am einfachsten so:
Um sicher zu stellen das du 0 bekommst wenn das System meint der Brenner ist aus kommt noch ein löschen des Wertes nach 180 Sekunden mit dazu - das kommt mit in den Timeout um "BrennerAn" auf "falsch" zu setzen.
Das letzte was dann noch übrig ist ist die Umrechnung von Pulsen/sekunde auf kW Leistung. Das solltest du selber können.Zur Vereinfachung kommt im Spoiler der Code für das Blockly
Das ganze lässt sich noch an 2 Stellen optimieren, wird dann aber schwerer Verständlich - deswegen erst einmal so.
-
Wow, Danke, tausend Dank!
Es läuft noch nicht, aber das ist mal eine Hilfe!Du schreibst:
"Wichtig dabei ist das die Bausteine Wert, Vorheriger Wert, Zeitstempel und vorheriger Zeitstempel keine Variablen sind sondern alle der gleiche Baustein - der der im folgenden Screenshot mit "Objekt ID" Vorbelegt"Ich referenziere mit der Objekt-ID auf einen Wert im ioBroker, der erhöht wird wenn ein neuer Impuls kommt, dass sieht so aus:
Verstehe ich es nun richtig, dass die genannten Variablen Wert, Vorheriger Wert, Zeitstempel und vorheriger Zeitstempel Bezug zur Objekt-ID (von oben) haben müssen?
Dann müsste ich im ioBroker ja sagen können "Nehme dir den Wert von ObjektID..." bzw. "Nehme dir den vorherigen Wert von ObjektID..." usw.
Oder verstehe ich da gerade was falsch?
Ich kann mich nur noch einmal bedanken!
-
@dasmoritz sagte in Gaszähler auswerten - Problem:
Verstehe ich es nun richtig, dass die genannten Variablen Wert, Vorheriger Wert, Zeitstempel und vorheriger Zeitstempel Bezug zur Objekt-ID (von oben) haben müssen?
nicht müssen - sondern haben
@dasmoritz sagte in Gaszähler auswerten - Problem:
Dann müsste ich im ioBroker ja sagen können "Nehme dir den Wert von ObjektID..." bzw. "Nehme dir den vorherigen Wert von ObjektID..." usw.
genau das tut dieser Baustein in allen seinen Ausprägungen
-
Okay, dann beende ich mal mein bestehendes Script und starte das obenstehende.
Das die ObjektID auf die Impulse referenziert die der Wemos D1 in den ioBroker schreibt ist korrekt?
-
@dasmoritz sagte in Gaszähler auswerten - Problem:
Das die ObjektID auf die Impulse referenziert die der Wemos D1 in den ioBroker schreibt ist korrekt?
das verstehe ich jetzt nicht.
die ObjektID ??? schreibt -
@dasmoritz sagte in Gaszähler auswerten - Problem:
Das die ObjektID auf die Impulse referenziert die der Wemos D1 in den ioBroker schreibt ist korrekt?
Ja.Das ist die Objekt id für den Trigger.Nein - du musst 2 unterschiedliche Objekt-ID's auswählen.
Eine für den Trigger, und eine wo die Werte aus der Umrechnung hinein sollen.
A.
sorry - hatte deinen Post missverstanden