Seite 1 von 3

Impulszähler mit Mengenumrechnung (zB Stromverbrauch, Regenmenge) inkl Tages/Wochen/Monats/Jahreszähler

Verfasst: Sa Nov 16, 2019 9:44 am
von Robert_Mini
Hallo zusammen!

Heute ist wieder Samstag, Zeit eine neue Entwicklung zu teilen => Logik für Stromzählerstand oder Regenmengenauswertung.

Update: 22.1.2020: Sendeintervall für Tageszähler und Wochen-/Monats-/Jahreszähler.

Einleitung:
Diese Logik ist ergänzend zur Logik "Leistungberechnung aus Impulszähler mit Telegrammratenbegrenzung" (viewtopic.php?f=65&t=1613) zu sehen, die aus den Impulswerten die aktuelle Leistung oder Regenintensität berechnet.
Die beiden Logiken funktionieren aber unabhängig voneinander.

Funktion:
Nachstehende Logik zählt die eingeheneden Impuls und berechnet auf dieser Basis den aktuellen Zählerstand. Die Zähler für Tag/Woche/Monat und Jahr werden automatisch zum richtigen Zeitpunkt zurückgesetzt. Das Sendeintervall kann für den Tageszähler und die restlichen Zähler getrennt angegeben werden (Hintergrund: so kann man das Zählen in der Visu noch sehen, für die anderen Zähler ist das nicht interessant bzw. die Zahl ohnehin zu groß.)

Typische Anwendung ist die Strom- oder Regenmengenmessung, Voraussetzung ist ein Impulssignal das von 0-1-0-1 wechselt.
Hinweis: Es wird jeder Flankenwechsel gezählt, soll nur jeder Impuls gezählt werden, muss dies im Faktor berücksichtigt werden.

Ein-/Ausgänge:
  • Der Impulseingang wird mit dem Impulsgeber verknüpft
  • Mit Faktor erfolgt die Umrechnung von Impuls => Menge (im Beispiel im Anhang 0.001, da jeder Impuls 0.001kWh entspricht)
  • Min. Interval Tag: Sendeintervall für Tageszähler
  • Min. Interval: Sendeintervall für Wochen-/Monats-und Jahreszähler
  • Impulszaehler Tag: zeigt die Anzahl der Impulse des aktuellen Tages
  • Zählerstand Tag/Woche/Monat Jahr zeigen den jeweiligen Zählerstand an
  • Zählerstand Gesamt zeigt den Zählerstand seit Beginn und wird nie zurückgesetzt.
Da die Logik Werte zwischenspeichert, muss Persistenz aktiviert werden, damit bei einem Neustart etc. die Zählerstände nicht verloren gehen.

Nutzungsrechte:
Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht.

Falls wer einen freiwilligen Beitrag zur Motivation leisten will: Klick

Viel Spaß damit und gerne Rückmeldung, wenn was fehlt oder euch die Sache gefällt.
Robert

Zaehlerstand_mitSendeintervall.png

Code: Alles auswählen

/**=====================================================================
Zählen von Impulsen und Umrechnung zu Gesamtmenge oder Verbrauch           
- Tages/Wochen/Monats/Jahres und Gesamtzähler 
- Sendeintervall getrennt für Tageszähler und Wochen/Monats/Jahreszähler.
======================================================================*/
{
  "Level": [
    ["$In","bool",false],
    ["$In_Last","bool",false],
    ["$New","bool",false],
	["$New1","bool",false],
	["$New2","bool",false],
	["$ZaehlerTag","integer",0.0],
	["$ZaehlerTag2","float",0.0],
	["$ZaehlerTag3","float",0.0],
	["$ZaehlerTagNeu","integer",0.0],
	["$ZaehlerWoche","integer",0.0],
	["$ZaehlerWoche2","float",0.0],
	["$ZaehlerWoche3","float",0.0],
	["$ZaehlerWocheNeu","integer",0.0],	
	["$ZaehlerMonat","integer",0.0],
	["$ZaehlerMonat2","float",0.0],
	["$ZaehlerMonat3","float",0.0],
	["$ZaehlerMonatNeu","integer",0.0],
	["$ZaehlerJahr","integer",0.0],
	["$ZaehlerJahr2","float",0.0],
	["$ZaehlerJahr3","float",0.0],
	["$ZaehlerJahrNeu","integer",0.0],
	["$ZaehlerGes","integer",0.0],
	["$ZaehlerGes2","float",0.0],
	["$ZaehlerGes3","float",0.0],
	["$ZaehlerGesNeu","integer",0.0],
	["$Faktor","float",2],
	["$Interval","float",10.0],
	["$Interval2","float",10.0],
	["$Delta","integer",0.0],
	["$Konst1","float",1.0],
    ["$Konst0","float",0.0],
    ["$KonstTrue","bool",true],
	["$ResetTag","bool",false],
	["$ResetWoche","bool",false],
	["$ResetMonat","bool",false],
	["$ResetJahr","bool",false],
    ["$StartZeitTag","string","0 5 0 * * *"],
    ["$StartZeitWoche","string","1 5 0 * * 1"],
    ["$StartZeitMonat","string","2 5 0 1 * *"],
    ["$StartZeitJahr","string","3 5 0 1 1 *"]
  ],
  "Module": [   
	// Impuls mit altem Wert vergleichen (anderer Trigger?)
	["Polynomial","-$Konst1","$Delta",["$In", "$In_Last"]],
	["Limiter","$Delta",0,"-$New",["$Konst0","$Konst0"]],	
	// Anzahl Impuls erhöhen, wenn sich Impuls geändert hat
	["Polynomial","$Konst1","$ZaehlerTagNeu",["$ZaehlerTag", "$Konst1"]],
	["Polynomial","$Konst1","$ZaehlerWocheNeu",["$ZaehlerWoche", "$Konst1"]],
	["Polynomial","$Konst1","$ZaehlerMonatNeu",["$ZaehlerMonat", "$Konst1"]],
	["Polynomial","$Konst1","$ZaehlerJahrNeu",["$ZaehlerJahr", "$Konst1"]],
	["Polynomial","$Konst1","$ZaehlerGesNeu",["$ZaehlerGes", "$Konst1"]],
	// Nur addieren, wenn Wert "neu" ist.
    ["Multiplexer",["$ZaehlerTag","$ZaehlerTagNeu"],"$ZaehlerTag","$New"],   
    ["Multiplexer",["$ZaehlerWoche","$ZaehlerWocheNeu"],"$ZaehlerWoche","$New"],  
    ["Multiplexer",["$ZaehlerMonat","$ZaehlerMonatNeu"],"$ZaehlerMonat","$New"],  
    ["Multiplexer",["$ZaehlerJahr","$ZaehlerJahrNeu"],"$ZaehlerJahr","$New"],  
    ["Multiplexer",["$ZaehlerGes","$ZaehlerGesNeu"],"$ZaehlerGes","$New"], 
    // Tag Zurücksetzen
    ["Cron","$KonstTrue","$ResetTag",0,"$StartZeitTag"],
	["Multiplexer",["$ZaehlerTag","$Konst0"],"$ZaehlerTag","$ResetTag"],
    ["Multiplexer",["$ResetTag","$Konst0"],"$ResetTag","$ResetTag"],
    // Woche Zurücksetzen	
    ["Cron","$KonstTrue","$ResetWoche",0,"$StartZeitWoche"],
	["Multiplexer",["$ZaehlerWoche","$Konst0"],"$ZaehlerWoche","$ResetWoche"],
    ["Multiplexer",["$ResetWoche","$Konst0"],"$ResetWoche","$ResetWoche"],
	// Monat Zurücksetzen	
    ["Cron","$KonstTrue","$ResetMonat",0,"$StartZeitMonat"],
	["Multiplexer",["$ZaehlerMonat","$Konst0"],"$ZaehlerMonat","$ResetMonat"],
    ["Multiplexer",["$ResetMonat","$Konst0"],"$ResetMonat","$ResetMonat"],	
	// Jahr Zurücksetzen	
    ["Cron","$KonstTrue","$ResetJahr",0,"$StartZeitJahr"],
	["Multiplexer",["$ZaehlerJahr","$Konst0"],"$ZaehlerJahr","$ResetJahr"],
    ["Multiplexer",["$ResetJahr","$Konst0"],"$ResetJahr","$ResetJahr"],	
    //
	// (In_Last = In)
  	["Polynomial","$Konst1","$In_Last",["$In"]],
  	// Zahlerstand umrechnen
	["Polynomial","$Faktor","$ZaehlerTag2",["$Konst0","$ZaehlerTag"]],
	["Polynomial","$Faktor","$ZaehlerWoche2",["$Konst0","$ZaehlerWoche"]],
	["Polynomial","$Faktor","$ZaehlerMonat2",["$Konst0","$ZaehlerMonat"]],
	["Polynomial","$Faktor","$ZaehlerJahr2",["$Konst0","$ZaehlerJahr"]],
	["Polynomial","$Faktor","$ZaehlerGes2",["$Konst0","$ZaehlerGes"]],
  // Nur Aktualisieren, wenn Sendebedingung erfüllt ist
	["Monoflop","$New","-$KonstTrue","$New2","$Interval2",0],
	["Multiplexer",["$ZaehlerTag2","$ZaehlerTag3"],"$ZaehlerTag3","$New2"],   
	//
	["Monoflop","$New","-$KonstTrue","$New1","$Interval",0],
    ["Multiplexer",["$ZaehlerWoche2","$ZaehlerWoche3"],"$ZaehlerWoche3","$New1"],  
    ["Multiplexer",["$ZaehlerMonat2","$ZaehlerMonat3"],"$ZaehlerMonat3","$New1"],  
    ["Multiplexer",["$ZaehlerJahr2","$ZaehlerJahr3"],"$ZaehlerJahr3","$New1"],  
    ["Multiplexer",["$ZaehlerGes2","$ZaehlerGes3"],"$ZaehlerGes3","$New1"]
  ],
  "Output": [
    ["Zählerstand Tag","Zählerstand Tag","$ZaehlerTag3","c"],
    ["Zählerstand Woche","Zählerstand Woche","$ZaehlerWoche3","c"],
    ["Zählerstand Monat","Zählerstand Monat","$ZaehlerMonat3","c"],
    ["Zählerstand Jahr","Zählerstand Jahr","$ZaehlerJahr3","c"],
    ["Zählerstand Gesamt","Zählerstand Gesamt","$ZaehlerGes3","c"],
    ["New","New","$New","c"],
    ["Impulszähler Tag","Anzahl der Impulse Tag","$ZaehlerTag","c"],
    ["Impulszähler Woche","Anzahl der Impulse Woche","$ZaehlerWoche","c"],
    ["Impulszähler Monat","Anzahl der Impulse Monat","$ZaehlerMonat","c"],
    ["Impulszähler Jahr","Anzahl der Impulse Jahr","$ZaehlerJahr","c"],
    ["Impulszähler Gesamt","Anzahl der Impulse Gesamt","$ZaehlerGes","c"]
  ],
  "Input": [
    ["Impulssignal","Eingang Impulssignal alternierend 1-0-1-0","$In","c"],
    ["Faktor","Faktor Impulsanzahl => Zählerstand","$Faktor","c"],
	["Min. Interval Tag","Mindestzeitinterval zum Senden Tageszähler","$Interval2","c"],
	["Min. Interval","Mindestzeitinterval zum Senden Wochen/Monats/Jahreszähler","$Interval","c"]
  ]
}
/**Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht. */

Re: Impulszähler mit Mengenumrechnung (zB Stromverbrauch, Regenmenge) inkl Tages/Wochen/Monats/Jahreszähler

Verfasst: Sa Nov 16, 2019 10:05 am
von StefanW
Wunderbar Robert, danke schön.

Wir werden Deine tollen Kreationen auch (künftig) als Standard-Logiken mit hinzunehmen (ich denke das ist ok für Dich), damit es noch einfacher nutzbar ist für Euch. Über ein Repo für leichten Austausch denken wir noch nach, bis dahin fügen wir die guten Customs den Standard-Bausteinen hinzu.

lg

Stefan

Re: Impulszähler mit Mengenumrechnung (zB Stromverbrauch, Regenmenge) inkl Tages/Wochen/Monats/Jahreszähler

Verfasst: So Jan 05, 2020 11:59 pm
von mclb
Hi Robert,

ich habe die Logik mal bei mir angelegt. Ist es gewollt, dass jede steigende und jede fallende Flanke gezählt wird? Ich suche nämlich nach einem Zähler, der nur die steigenden Flanken zählt.

Das Einzige, was ich geändert habe ist die StartZeitTag von 5 auf 18 Uhr und alle anderen StartZeit-Variablen auf 0 0 0 ... das sollte ja das Verhalten an sich nicht ändern, denke ich.

Danke
Marcus

Re: Impulszähler mit Mengenumrechnung (zB Stromverbrauch, Regenmenge) inkl Tages/Wochen/Monats/Jahreszähler

Verfasst: So Jan 12, 2020 12:47 pm
von Robert_Mini
Hallo Marcus!

Hab grad gesehen, dass ich nie geantwortet habe.
Ja das ist so gewollt, da ich die Blink-Impulse über ein Flip Flop auf den Bus sende.

Könnte man anpassen, oder du dividierst die Zählerstände / 2 indem du den Faktor halbierst.

lg
Robert

Re: Impulszähler mit Mengenumrechnung (zB Stromverbrauch, Regenmenge) inkl Tages/Wochen/Monats/Jahreszähler

Verfasst: So Jan 12, 2020 9:16 pm
von mclb
Hi Robert,

ich wollte eh schon mal nachfragen, aber so dringend wars dann auch wieder nicht. :-)
Dann weiß ich jetzt, dass das beabsichtigt ist und kann damit umgehen.

Danke
Marcus

Re: Impulszähler mit Mengenumrechnung (zB Stromverbrauch, Regenmenge) inkl Tages/Wochen/Monats/Jahreszähler

Verfasst: Mi Jan 22, 2020 7:21 pm
von Robert_Mini
Hallo zusammen!

Habe gerade ein Update im ersten Beitrag eingestellt. Damit kann nun ein Sendeintervall getrennt für Tageszähler und die Wochen-/Monats-/Jahreszähler angegeben werden.

lg
Robert

Re: Impulszähler mit Mengenumrechnung (zB Stromverbrauch, Regenmenge) inkl Tages/Wochen/Monats/Jahreszähler

Verfasst: Di Mär 17, 2020 10:17 pm
von danik
Hi Robert

Danke für die Logik. Wollte gerade mein Regenmengenzähler damit realisieren. Das ganze als ein fortlaufender Zähler, die Auswertung dann in Grafana mit Difference(). Was mir jetzt aber aufgefallen ist. Wenn die Logik modifiziert wird (was ja durchaus irgendwann mal vorkommen kann), fängt der Zähler wieder bei Null an, und die Auswertungen passen dann leider überhaupt nicht mehr. Ich hatte bis anhin die Regenmenge direkt als Zähler im Binäreingang konfiguriert, aber auch da das Problem gehabt, dass bei einer Änderung des Gerätes der Zähler wieder bei Null anfängt.

Ich war der Hoffnung, mit Persistenz wird der Zustand gespeichert, auch bei einer Anpassung der Konfiguration. Dem ist aber nicht so. Wie löst Du das Problem? Von Edomi kenne ich solche Bausteine, die den Zählerwert in eine interne Variable speichern (welche einen Reboot überlebt) und wo dann den Zählerausgang wieder als Eingang zuführen (und so immer den letzten/aktuellen Stand zu haben).

lg
Dani

Re: Impulszähler mit Mengenumrechnung (zB Stromverbrauch, Regenmenge) inkl Tages/Wochen/Monats/Jahreszähler

Verfasst: So Mär 22, 2020 1:32 pm
von Robert_Mini
Hallo Danik!

Deine Frage ist mir leider durchgerutscht.

Du hast das schon gut beschrieben. Persistenz sichert den Wert bei Stromausfall, Reboot und dergleichen.
Leider oder auch zurecht aber nicht bei einer Änderung der Konfiguration - wie soll die Logik wissen, ob mit dem Speichern vielleicht Regeln, Zählweise oder dergleichen geändert wurden.

Ich mache das im Moment so (und das ist meist sehr selten), dass ich vor dem Speichern die Startwerte im Code eintrage.

Man könnte natürlich auch die Impulszaehler als Eingang oder Ausgang definieren, dann könnte man die Werte zumindest im Dokmode anpassen.


lg
Robert

Re: Impulszähler mit Mengenumrechnung (zB Stromverbrauch, Regenmenge) inkl Tages/Wochen/Monats/Jahreszähler

Verfasst: Mo Mär 23, 2020 12:53 pm
von danik
Robert_Mini hat geschrieben: So Mär 22, 2020 1:32 pm Du hast das schon gut beschrieben. Persistenz sichert den Wert bei Stromausfall, Reboot und dergleichen.
Leider oder auch zurecht aber nicht bei einer Änderung der Konfiguration - wie soll die Logik wissen, ob mit dem Speichern vielleicht Regeln, Zählweise oder dergleichen geändert wurden.
In der Tat eine technische Hürde
Robert_Mini hat geschrieben: So Mär 22, 2020 1:32 pm Man könnte natürlich auch die Impulszaehler als Eingang oder Ausgang definieren, dann könnte man die Werte zumindest im Dokmode anpassen.
Wäre sicher einfacher.

Ideal wäre ggf. ja folgendes: Eingang mit Zählerstand. Sofern da 0 oder Null (nicht initialisiert, z.B. nach speichern der Logik) daherkommt, liest die Logik den letzten Wert aus der Timeseries (ich meinte dies wurde auch mal erwähnt dass dies irgendwann mal möglich sein sollte). Auch das Thema zum internen Speichern von Werten (losgelöst von der Persistez in der LE) war doch mal in Diskussion. Zumindest für so einen Fall wäre dies jedenfalls zu begrüssen.

Gruss
Dani

Re: Impulszähler mit Mengenumrechnung (zB Stromverbrauch, Regenmenge) inkl Tages/Wochen/Monats/Jahreszähler

Verfasst: Mo Mär 23, 2020 5:50 pm
von MacLitze
Hi Robert

Super deine Logik für die Zähler!!!

Eine kleine Nachfrage. Wie ist das mit den Intervallen zum senden der Zählerstände zu verstehen?
Min. Interval Tag -> Parameter=1 bedeutet der Zählerstand wird einmal am Tag gesendet?
Min. Interval -> Parameter=1 bedeutet ???

Hab bis jetzt nur 2 Stromzähler die nicht wirklich viel Last haben und dadurch kann ich das schlecht testen.

Nochmal vielen dank!!!

Gruß
Kay