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

Zähler-Logik (z.B. für Regenmessung)

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
Antworten

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

Zähler-Logik (z.B. für Regenmessung)

#1

Beitrag von danik »

Hi

Ich habe einen Regensensor, welcher an einem Binäreingang hängt. Der Eingang ist als Zähler konfiguriert, zählt also bei jedem Impulseingang um eins hoch. Wenn das KNX-Device neu programmiert wird, fängt der Zähler aber wieder bei Null an, was natürlich dann in den Grafana-Auswertungen überhaupt nicht mehr passt (da ich dort mit der tollen Differenz-Funktion die Regenmenge ermittle). Und da ich ein 12fach KNX-Gerät habe kann es eben schon mal vorkommen, dass das Device neu programmiert werden muss.

Die Logik hier macht folgendes:

- Der Zählerwert kann mit einem beliebigen Faktor umgerechnet (bei mir z.B. 0.518 pro Impulseingang)
- Wenn der Zählerstand zurückgesetzt wird und wieder von 0 beginnt, so wird der Gesamtwert dennoch richtig weitergerechnet
- Initiale Werte können ggf. als Parameter im Code übergeben werden

WICHTIG: Logik Persistent aktivieren ist wichtig, damit die Zählerstände auch einen Reset überlegen.

Bild
Logik.png

Allfällige Codeoptimierungen sind willkommen.

Code: Alles auswählen

/**=====================================================================
Logik zur Verarbeitung von Zählerwerten, z.B. einem Regensensor.
Der Zählerwert kann mit einem Faktor umgerechnet werden. Bei
Rest des Zählerstandes (z.B. durch Programmierung des KNX-Gerätes) 
zählt der Gesamtwert korrekt weiter.
Initiale Werte (Zählerstand, Gesamtwert) können übergeben werden 
direkt im Code
======================================================================*/ 

{
    "Level":[
        // in diese beiden Variablen hier können ggf. initiale Werte
        // übergeben werden
        ["$Z_gesamt","float",0.0],
        ["$Z_alt","float",0.0],
        // ab hier keine Anpassung mehr
        ["$Z_neu","float",0.0],
        ["$Z_delta","float",0.0],
        ["$Z_offset","float",0.0],
        ["$Konst_X","float",1.0],
        ["$Min","float",0.0],
        ["$Val_ok","bool",false],
        ["$Trigger","bool",false],
        ["$Out_val","float",0.0],
        ["$Out_temp","float",0.0],
        ["$Faktor","float",1.0]
    ],
    "Module":[
        // Prüfen ob Zähler neu <= Zöhler alt ist
        ["Limiter","$Z_neu","$Out_val","$Val_ok",["$Min", "$Z_alt"]],
        // Delta zwischen Zähler alt und Zähler neu
        ["Polynomial", "$Konst_X", "$Z_delta",["-$Z_alt", "$Z_neu"]],
        //Auswahl des Wertes für Offset. Entweder Delta oder neuer Wert (i.d.R. 0)
        ["Multiplexer",["$Z_delta","$Z_neu"],"$Z_offset","$Val_ok"],
        // Zähler Offset zu gesamt addieren
        ["Polynomial", "$Faktor", "$Z_gesamt",["$Z_gesamt", "$Z_offset"]],
        // Trigger zum alten Werte überschreiben
        ["Limiter","$Z_offset","$Out_temp","-$Trigger",["$Min", "$Min"]],
        // Zähler alt korrekt setzen
        ["Latch","$Z_neu","$Z_alt","$Trigger",0]
    ],
    "Input":[
        ["Zählerstand","Eingang Zählerstand","$Z_neu","c"],
        ["Faktor","Faktor für Umrechnung Gesamtzähler","$Faktor","c"]
    ],
    "Output":[
        ["Gesamtwert","Ausgang Gesamtwert","$Z_gesamt","c"],
        ["Zähler-Reset","Zähler zurückgesetzt","$Val_ok","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. */
Als Regenzähler verwende ich dieses Gerät hier
Regensensor.png
zu finden z.B. mit dem Suchbegriff "Misol WH-SP-RG"

Gruss
Dani
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
TW 3500L (#882) + TW 950Q (#321, im Moment inaktiv), VPN offen, Reboot nach Rücksprache

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 »

Wow Dani,

sehr schön!. Tolle Anleitung!

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.

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

#3

Beitrag von danik »

Inspiriert durch den Zählerbaustein von Robert (vielen dank für die Code-Inspiration, ohne hätte ich das ganze nie hinbekommen) habe ich die Logik noch etwas ergänzt.

- neu gibt es einen zusätzlichen Ausgang, der nur nach einem definierten Intervall sendet.

Bei mir sinnvoll, um bei der Rasenbewässerung die Telegramme für die Langzeitarchivierung zu reduzieren.

Bildschirmfoto 2020-04-13 um 08.58.57.png

Code: Alles auswählen

/**
 * Version 2 vom 12.4.2020
 */
 
/**=====================================================================
Logik zur Verarbeitung von Zählerwerten, z.B. einem Regensensor.
Der Zählerwert kann mit einem Faktor umgerechnet werden. Bei
Rest des Zählerstandes (z.B. durch Programmierung des KNX-Gerätes) 
zählt der Gesamtwert korrekt weiter.
Initiale Werte (Zählerstand, Gesamtwert) können direkt im Code 
übergeben werden.

======================================================================*/ 

{
    "Level":[
        // in diese beiden Variablen hier können ggf. initiale Werte
        // übergeben werden
        ["$ZaehlerGesamt","float",0.0],
        ["$InAlt","float",0.0],
        // ab hier keine Anpassung mehr
        ["$InNeu","float",0.0],
        ["$Delta","float",0.0],
        ["$Delta1","float",0.0],
        ["$ZaehlerGesamtNeu","float",0.0],
        ["$ZaehlerGesamt1","float",0.0],
        ["$Konst1","float",1.0],
        ["$Konst0","float",0.0],
        ["$KonstTrue","bool",true],
        ["$Neu","bool",false],
        ["$Neu1","bool",false],
        ["$NeuInit","bool",false],
        ["$NeuIsInit","bool",false],
        ["$Faktor","float",1.0],
        ["$Interval","float",15.0]
    ],
    "Module":[
        // Delta berechnen
        ["Polynomial", "$Konst1", "$Delta",["-$InAlt", "$InNeu"]],
        // Prüfen ob neuer Input
        ["Limiter","$Delta",0,"-$Neu",["$Konst0", "$Konst0"]],

        // prüfen ob Wert "neu" kleiner Wert "alt" ist, dann neu Initialisiert
        ["Comparator" , "$InNeu" , "-$NeuIsInit" , "$InAlt"],
        // Neuer Wert und Init --> 
        ["And" , ["$NeuIsInit" , "$Neu"], "$NeuInit"],
        
        // bei NeuInit den Zählerstand als Delta nehmen, sonst das errechnete Delta aus alt und neu
        ["Multiplexer",["$Delta","$InNeu"],"$Delta1","$NeuInit"],

        // Addieren
        ["Polynomial", "$Faktor", "$ZaehlerGesamtNeu",["$ZaehlerGesamt", "$Delta1"]],     
        // Auswahl des Wertes
        ["Multiplexer",["$ZaehlerGesamt","$ZaehlerGesamtNeu"],"$ZaehlerGesamt","$Neu"],
        // Wert In --> in Wert alt speichern
        ["Polynomial", "$Konst1", "$InAlt",["$InNeu"]], 
        // Time für Ausgabe (min. Interval)
        ["Monoflop","$Neu","-$KonstTrue","$Neu1","$Interval",0],
        // korrekten Wert auf Ausgang schrebein
        ["Multiplexer",["$ZaehlerGesamt","$ZaehlerGesamt1"],"$ZaehlerGesamt1","$Neu1"]
     ],
    "Input":[
        ["Zählerstand","Eingang Zählerstand","$InNeu","c"],
        ["Faktor","Faktor für Umrechnung Gesamtzähler","$Faktor","c"],
        ["Interval","Interval für Ausgabe in Sekunden","$Interval","c"]
    ],
    "Output":[
        ["Gesamtwert","Ausgang Gesamtwert bei jeder Änderung","$ZaehlerGesamt","c"],
        ["Gesamtwert_i","Ausgang Gesamtwert nach Interval","$ZaehlerGesamt1","c"],
        ["Zöhler init","Zähler neu initialisiert","$NeuInit","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. */

Gruss
Dani
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von danik am Mo Apr 13, 2020 9:04 am, insgesamt 1-mal geändert.
TW 3500L (#882) + TW 950Q (#321, im Moment inaktiv), VPN offen, Reboot nach Rücksprache
Antworten

Zurück zu „Zusätzliche Logikbausteine“