UPGRADE IP 9 verfügbar!
Timberwolf VISU jetzt mit NEUEM Layout Editor
Freie Anordnung, Reihenfolge und Größe der Widgets - viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/06SeuHRJ

NEU! Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Damit kann nun jeder das Upgrade vornehmen und VISU & IFTTT testen. Alle Info hier: viewtopic.php?f=8&t=5074

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

Hier stellen Foristen und Kunden Ihre EIGENEN Logikbausteine vor. Diese Logikbausteine stehen jedem im Rahmen der vom Autor eingeräumten / genannten Lizenz zur Verfügung.
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

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

#1

Beitrag 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. */
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Robert_Mini am So Feb 09, 2020 10:53 am, insgesamt 2-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

StefanW
Elaborated Networks
Reactions:
Beiträge: 9689
Registriert: So Aug 12, 2018 9:27 am
Wohnort: Frauenneuharting
Hat sich bedankt: 4831 Mal
Danksagung erhalten: 7633 Mal
Kontaktdaten:

#2

Beitrag 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
Stefan Werner
Product Owner für Timberwolf Server, 1-Wire und BlitzART
Bitte WIKI lesen. Allg. Support nur im Forum. Bitte keine PN
Zu Preisen, Lizenzen, Garantie, HW-Defekt an service at elabnet dot de

Link zu Impressum und Datenschutzerklärung oben.

mclb
Reactions:
Beiträge: 126
Registriert: Mo Jan 07, 2019 9:27 pm
Wohnort: Sonnberg
Hat sich bedankt: 8 Mal
Danksagung erhalten: 63 Mal
Kontaktdaten:

#3

Beitrag 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
TWS 950Q ID:249 <VPN offen, Reboot nach Absprache erlaubt>

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#4

Beitrag 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
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

mclb
Reactions:
Beiträge: 126
Registriert: Mo Jan 07, 2019 9:27 pm
Wohnort: Sonnberg
Hat sich bedankt: 8 Mal
Danksagung erhalten: 63 Mal
Kontaktdaten:

#5

Beitrag 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
TWS 950Q ID:249 <VPN offen, Reboot nach Absprache erlaubt>

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#6

Beitrag 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
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

danik
Reactions:
Beiträge: 391
Registriert: Mo Sep 10, 2018 8:40 pm
Hat sich bedankt: 256 Mal
Danksagung erhalten: 266 Mal

#7

Beitrag 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
TW 3500L (#882) + TW 950Q (#321, im Moment inaktiv), VPN offen, Reboot nach Rücksprache

Ersteller
Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#8

Beitrag 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
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

danik
Reactions:
Beiträge: 391
Registriert: Mo Sep 10, 2018 8:40 pm
Hat sich bedankt: 256 Mal
Danksagung erhalten: 266 Mal

#9

Beitrag 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
TW 3500L (#882) + TW 950Q (#321, im Moment inaktiv), VPN offen, Reboot nach Rücksprache

MacLitze
Reactions:
Beiträge: 66
Registriert: Mo Mär 18, 2019 4:30 pm
Hat sich bedankt: 10 Mal
Danksagung erhalten: 11 Mal

#10

Beitrag 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
TWS 950Q ID:318, VPN offen, Reboot erlaubt
Antworten

Zurück zu „Zusätzliche Logikbausteine“