Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New Block-Types Count (Boolean Inputs) and Aggregation (Sum, Mean, Min, Max, Range) #3

Draft
wants to merge 40 commits into
base: v1dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
22aa336
Fix: Set ComObject Size to Maximum Size of all Ref-Usages
cornelius-koepp Oct 26, 2024
753e1a4
ETS-App: Remove H-Ruler after Channel Type Headline
cornelius-koepp Oct 26, 2024
114cd22
ETS-App: Add Comment-Field (to AND/OR/Prio)
cornelius-koepp Oct 26, 2024
4314687
ETS-App: Cleanup FunctionBlock Definition Blocks Comments
cornelius-koepp Oct 28, 2024
90e6dc9
Fix: Remove Dependency `bblanchon/ArduinoJson`
cornelius-koepp Oct 30, 2024
cca469b
Fix/Cleanup: Unique Block ParamBlock-Name
cornelius-koepp Oct 30, 2024
02f41cb
Fix/Update library.json: Use OpenKNX GitHUB Repo Url
cornelius-koepp Nov 4, 2024
58a4c2e
Cleanup Function Block Creation
cornelius-koepp Oct 27, 2024
b15f524
Set Version to 0.2.0-DEV
cornelius-koepp Nov 4, 2024
e5105fb
Simplify: `valueCompare` will Always Send for NOT initialized
cornelius-koepp Oct 26, 2024
478a3db
Prepare Additional LogicFunctionBlocks
cornelius-koepp Oct 26, 2024
a515fbb
Expicitly Use Type bool
cornelius-koepp Oct 26, 2024
b6222a7
Draft: New Block Type for Count of Bool Value
cornelius-koepp Oct 26, 2024
b3b6e82
ETS-App (Count): Remove H-Ruler after Channel Type Headline
cornelius-koepp Oct 26, 2024
ca50fad
ETS-App (Count): Add Comment-Field
cornelius-koepp Oct 26, 2024
fbd30b0
ETS-App (Count): Cleanup FunctionBlock Definition Blocks Comments
cornelius-koepp Oct 28, 2024
ec13639
Add Missing Headline-Comment for Count
cornelius-koepp Oct 28, 2024
242342f
Draft: New Block Type for Simple Statistic Aggregation (with Subtypes)
cornelius-koepp Oct 28, 2024
2a29f9c
Include Debug Logging
cornelius-koepp Oct 31, 2024
a6b6c99
Rounding Config for Int-Output, Overflow-Handling, UI Improvements on…
cornelius-koepp Oct 31, 2024
d00dba8
Cleanup: DPT-Handling
cornelius-koepp Nov 4, 2024
8c76d81
Cleanup Statistic Calculation - Calc All Values
cornelius-koepp Nov 4, 2024
4cc6259
Fix/Cleanup Value Definition of `%AID%_PT-FCBChannelType`
cornelius-koepp Nov 6, 2024
7e7f686
Add Task for OpenKNX ContextHelp Build
cornelius-koepp Nov 4, 2024
87b56a5
Documentation: Cleanup/Improve Applikationsbeschreibung
cornelius-koepp Nov 4, 2024
6efdef2
Documentation: Include Block-Type Anzahl
cornelius-koepp Nov 4, 2024
fbd1d82
Documentation: Multi-Line-Comment
cornelius-koepp Nov 4, 2024
ad805c0
Documentation: Sendeverhalten - Describe Once Only
cornelius-koepp Nov 5, 2024
14cfc9c
Documentation: Include Block-Type Aggregation
cornelius-koepp Nov 5, 2024
6d615d3
Cleanup ComObject Definitions
cornelius-koepp Nov 5, 2024
078c102
Aggregation Memory Layout Cleanup
cornelius-koepp Nov 5, 2024
ac66349
Documentation: "Kanalauswahl" + Anzahl + Aggregation
cornelius-koepp Nov 5, 2024
9b68392
Draft/WIP: Weighted Aggregation Support for Sum/Avg
cornelius-koepp Nov 5, 2024
500c96d
Cleanup / Refactor / Extract Methods
cornelius-koepp Nov 6, 2024
8d0dad3
Add Block-Types Count + Aggregation to Readme
cornelius-koepp Nov 6, 2024
35ebe26
Fix: Links in Applikationsbeschreibung
cornelius-koepp Nov 6, 2024
a91af10
Cleanup ETS-XML
cornelius-koepp Nov 6, 2024
7b7716e
Fix: Use Channel Label "Range"
cornelius-koepp Nov 6, 2024
186af3a
Fix Doc: Invertiert
cornelius-koepp Nov 14, 2024
0025144
Fix: FunctionText is Required in ComObject
cornelius-koepp Nov 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "OpenKNXproducer Documentation",
"type": "shell",
"command": "~/bin/OpenKNXproducer.exe",
"args": [
"baggages",
"--DocFileName",
"doc/Applikationsbeschreibung-FunctionBlocks.md",
"--BaggagesDir",
"src/Baggages/Help_de",
"--Prefix",
"FCB"
],
"problemMatcher": [],
"group": "test"
}
]
}
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ Bei Bedarf können die FunktionsBlöcke mit Logiken ergänzen werden.
- AND mit 9 Eingängen
- OR mit 9 Eingängen
- Prioritätsschalter
- Anzahl
- Aggregation
- Summe
- Mittelwert
- Minimum
- Maximum
- Spannbreite (Maximum - Minimum)


## Planned Features
- Multiplexer
Expand Down
232 changes: 184 additions & 48 deletions doc/Applikationsbeschreibung-FunctionBlocks.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,29 @@

Die Anwendung stellt je Kanal einen Funktionsblock bereit.
Folgende Funktionsblöcke stehen zur Auswahl:
* [UND](#und)
* [ODER](#oder)
* [Prioritätsschalter](#prioritätsschalter)
* [Beispielanwendungen](#beispielsanwendung)
* [Anzahl](#anzahl)
* [Statistische Aggregation](#statistische-aggregation)



### ETS Konfiguration

* **[Allgemein](#allgemein)**
* [Kanalauswahl](#kanalauswahl)
* (n=1 bis 99) *Abhängig vomTyp*:
* [Kanal-Typ-unabhängige Einstellungen](#kanaleinstellungen)
* {[**UND**, **ODER**, **Anzahl**](#undoderanzahl-kanaleinstellungen)}
* [**Prioritätsschalter**](#prioritätsschalter-2)
* [**Aggregation**](#aggregation)



# Blocktypen


<!-- DOC -->
## UND
Expand Down Expand Up @@ -38,7 +61,21 @@ Jedoch bietet der Taste die Möglichkeit verschiedene Prozentwerte mit verschied
So können z.B. für einen Jalousientaster Kommunikationswerte für Nachbetrieb, Beschattung aktiv, Windsperre auf Prozentwerte umgesetzt werden, die der Taster in verschiedene Farbwerte umsetzt.


# Konfiguration
<!-- DOC -->
## Anzahl

Ein Anzahl-Funktionsblock verfügt über bis zu 9 Eingänge.
Der Ausgang gibt aus, wie viele der (verwendeten) Eingänge den Wert EIN angenommen haben.
Die Eingänge können vor Zählung invertiert werden.

<!-- DOC -->
## Statistische Aggregation

Ein Aggregations-Funktionsblock verfügt über bis zu 9 numerische Eingänge, gängiger DPTs.
Der Ausgangswert wird basierend auf der gewählten Funktion (Summe, Mittelwert, Minimum, Maximum, Spannbreite) berechnet und kann in verschiedenen numerischen DPTs ausgegeben werden.
Es kann beeinflusst werden, wie mit Werten umgegangen wird die vom Ausgatyp nicht dargestellt werden können.

# ETS Konfiguration

<!-- DOC -->
## Allgemein
Expand All @@ -55,19 +92,25 @@ Die Einstellung dient lediglich dazu, die Seite der Basiseinstellungen kompakt a

Für jeden Kanal kann für einen Funktionsblock konfiguriert werden:

#### UND
- **UND**
Ein UND-Funktionsblock verfügt über bis zu 9 Eingänge.
Der Ausgang gibt EIN aus, wenn alle Eingänge EIN sind.

Ein UND-Funktionsblock verfügt über bis zu 9 Eingänge.
Der Ausgang gibt EIN aus, wenn alle Eingänge EIN sind.
- **ODER**
Ein ODER-Funktionsblock verfügt über bis zu 9 Eingänge.
Der Ausgang gibt EIN aus, wenn mindestens ein Eingang EIN ist.

#### ODER
- **Prioritätsschalter**
Ein Prioritätsschalter hat bis zu 9 Eingänge vom Typ EIN/AUS.
Der Eingang mit der höchsten Priorität der EIN ist, bestimmt den Ausgangswert.

Ein ODER-Funktionsblock verfügt über bis zu 9 Eingänge. Der Ausgang gibt EIN aus, wenn mindestens ein Eingang EIN ist.
- **Anzahl**
Ein Anzahl-Funktionsblock hat bis zu 9 Eingänge vom Typ EIN/AUS.
Der Ausgang gibt die Anzahl der Eingänge mit dem Wert EIN aus.

#### Prioritätsschalter

Ein Prioritätsschalter hat bis zu 9 Eingänge vom Typ EIN/AUS.
Der Eingang mit der höchsten Priorität der EIN ist, bestimmt den Ausgangswert.
- **Statistische Aggregation**
Ein Aggregations-Funktionsblock hat bis zu 9 Eingänge mit numerischem Typ.
Es kann zwischen fünf Funktionen (Summe, Mittelwert, Minimum, Maximum, Spannbreite) zur Berechnung des Ausgangswertes gewählt werden.

## Kanaleinstellungen

Expand All @@ -76,8 +119,8 @@ Jeder Kanal bietet folgende Einstellungen:
<!-- DOC -->
### Bezeichnung

Die Bezeichnung wird innerhalb der ETS für die Bennenung des Kanals und für die Bennenung der Funktionsblock Ein- und Ausgänge verwendet.
Die Bezeichnung hat keinen Einfluss auf die Funktion des Funktionsblocks und kann jederzeit auch nachträglich angepasst werden.
Die Bezeichnung wird innerhalb der ETS für die Benennung des Kanals und für die Benennung der Funktionsblock Ein- und Ausgänge verwendet.
Die Bezeichnung hat keinen Einfluss auf das Verhalten des Funktionsblocks und kann jederzeit auch nachträglich angepasst werden.

<!-- DOC -->
### Kanal deaktivieren (zu Testzwecken)
Expand All @@ -86,12 +129,53 @@ Mit dieser Einstellung kann ein Kanal deaktiviert werden, ohne das die Konfigura
Ein deaktivierter Kanal sendet keine Telegramme auf dem KNX-Bus.


## UND/ODER Kanaleinstellungen
<!-- DOC -->
#### Kommentar

Hier kann eine ausführlichere - auch mehrzeilige - Dokumention des Blocks erfolgen.
Es wird empfohlen zentrale Annahmen die der Konfiguration des Blocks zugrunde liegen hier festzuhalten.
Die Dokumentation hat keinen Einfluss auf das Geräteverhalten.

Eine mehrzeilige Eingabe ist aufgrund von Beschränkungen der ETS nicht direkt möglich,
kann jedoch durch Eingabe mit `\n` und Drücken des Buttons erzeugt werden.
Anschließend kann der Text mehrzeilig bearbeitet werden.

<!-- DOCEND -->
*Beispiel:*
>
> Der Text
> ```
> Ein Text\nmit mehreren\nZeilen!
> ```
> wird umgewandelt in
> ```
> Ein Text
> mit mehreren
> Zeilen!
> ```


<!-- DOC -->
### Sendeverhalten

Zur Auswahl stehen:

- **Bei jedem Eingangstelegram**
Wenn einer der Eingänge ein Telegramm empfängt, wird der Ausgangswert auf den Bus gesendet.
Diese Einstellung kann zu hintereinderfolgenden gleichen Ausgangswerten am Bus führen.

- **Nur bei Änderung des Ausgangswertes**
Der Ausgang wird nur dann auf den Bus gesendet, wenn sich durch die berechnete Logikfunktion der Wert ändert.


Unabhängig von der Einstellung wird der Ausgangswert auch nach der Initialisierungsphase inklusive eventueller Wartezeit für Leseanforderungs-Antworten einmalig auf den Bus gesendet.

## UND/ODER/Anzahl Kanaleinstellungen

<!-- DOC HelpContext="LogicEingang" -->
### Eingang 1-9

Legt fest ob der Eingang verwendet wird und ob der Eingangswert normal oder invertiert verwendet wird.
Legt fest, ob der Eingang verwendet wird, und falls ja, ob der Eingangswert **normal** oder **invertiert** verwendet wird.

<!-- DOC -->
### Initialisierung
Expand All @@ -113,26 +197,11 @@ Zur Auswahl stehen:
**Wichtig**: Die Vorbelegung erfolgt vor einer möglichen eingestellten Invertierung des Eingangswertes.
Das bedeutet das bei einer Vorbelegung von "AUS" und einer eingestellten Invertierung der Wert als EIN von der Logik interpretiert wird.

<!-- DOC -->
### Invertiert
### Invertiert (nur UND/ODER)

<!-- DOC HelpContext="Invertiert" -->
Legt fest, ob der Ausgangswert normal oder invertiert auf den Bus gesendet wird.

<!-- DOC -->
### Sendeverhalten

Zur Auswahl stehen:

- **Bei jedem Eingangstelegram**
Wenn einer der Eingänge ein Telegramm empfängt, wird der Ausgangswert auf den Bus gesendet.
Diese Einstellung kann zu hintereinderfolgenden gleichen Ausgangswerten am Bus führen.

- **Nur bei Änderung des Ausgangswertes**
Der Ausgang wird nur dann auf den Bus gesendet, wenn sich durch die berechnete Logikfunktion der Wert ändert.


Unabhängig von der Einstellung wird der Ausgangswert auch nach der Initialisierungsphase inklusive eventueller Wartezeit für Leseanforderungs-Antworten einmalig auf den Bus gesendet.

## Prioritätsschalter

<!-- DOC HelpContext="PrioOutputType" -->
Expand All @@ -145,22 +214,6 @@ Legt fest, welchen Werttype für den Ausgang verwendet wird
- **1 Byte (Ohne Vorzeichen)**
Ausgang ist byte (5.* 8 bit vorzeichenlos)

<!-- DOCEND -->

### Sendeverhalten

Zur Auswahl stehen:

- **Bei jedem Eingangstelegram**
Wenn einer der Eingänge ein Telegramm empfängt, wird der Ausgangswert auf den Bus gesendet.
Diese Einstellung kann zu hintereinderfolgenden gleichen Ausgangswerten am Bus führen.

- **Nur bei Änderung des Ausgangswertes**
Der Ausgang wird nur dann auf den Bus gesendet, wenn sich durch die berechnete Logikfunktion der Wert ändert.


Unabhängig von der Einstellung wird der Ausgangswert auch nach der Initialisierungsphase inklusive eventueller Wartezeit für Leseanforderungs-Antworten einmalig auf den Bus gesendet.

<!-- DOC -->
### Ausgangswert wenn alle Eingänge AUS

Expand All @@ -169,7 +222,7 @@ Legt den Wert für den Ausgang fest, wenn alle Eingänge AUS sind.
<!-- DOC HelpContext="PrioEingang" -->
### Eingang 1-9

Legt fest ob der Eingang verwendet wird und ob der Eingangswert normal oder invertiert verwendet wird.
Legt fest, ob der Eingang verwendet wird und ob der Eingangswert normal oder invertiert verwendet wird.
Die Eingangsnummer 1-9 entspricht gleichzeitig der Priorität, wobei 1 die höchste und 9 die niedrigste darstellt.

<!-- DOCEND-->
Expand Down Expand Up @@ -197,4 +250,87 @@ Das bedeutet das bei einer Vorbelegung von "AUS" und einer eingestellten Inverti
### Ausgangswert

Legt den Wert fest, der auf den Bus gesendet wird, wenn dieser Eingang der Eingang mit der höchsten Nummer ist der auf EIN gesetzt ist.
<!-- DOCEND-->


## Aggregation

<!-- DOC HelpContext="AggrFunction" -->
### Funktion

Legt fest, wie der Ausgangswert aus den Werten der aktiven Eingänge berechnet wird:

- **Summe**
Addiert die Eingangswerte.
Das Ergebnis kann außerhalb des Eingangs-Wertebereichs liegen!
- **Mittelwert**
Summe dividiert durch die Anzahl der aktiven Eingänge.
Das Ergebnis ist i.d.R. nicht ganzzahlig, wird jedoch innerhalb des Eingangs-Wertebereichs liegen.
- **Minimum**
Verwendet den kleinsten Eingangswert.
- **Maximum**
Verwendet den größten Eingangswert.
- **Spannbreite (Maximum - Minimum)**
Liefert ein einfaches Maß dafür, wie weit sich die Eingangs-Werte voneinander unterscheiden.
Das Ergebnis kann außerhalb des Eingangs-Wertebereichs liegen, wenn vorzeichenbehaftet ist!

<!-- DOC -->
### Gewichtung der Eingänge

<!-- DOC Skip="2" -->
> Nur für *Summe* und *Mittelwert*

**Individuelle Gewichte** erlaubt eine Berechnung bei der die Eingänge unterschiedlich stark in der Ergebnis einfließen.
Dazu kann je aktivem Eingang ein individuelles Gewicht (Standardwert 1) angegeben werden.
Mindestens ein Gewicht muss von 0 abweichen, sonst wird kein Ergebnis ausgegeben!


<!-- DOC HelpContext="DptEingang" -->
### Wertetyp / DPT (Eingänge)

Definiert den DPT der Eingänge. Zur Auswahl stehen gängige numerische DPTs mit 1Byte, 2Bytes und 4Bytes.

<!-- DOC HelpContext="AggrEingang" -->
### Eingang 1-9

Legt fest, ob der Eingang verwendet wird.

<!-- DOC HelpContext="AggrEingangGewicht" -->
### Gewicht Eingang 1-9

Definiert wie stark dieser Eingang in das Ergebnis einfließt.

Bei 0 hat dieser Eingang keinen Einfluss auf das Resultat der Berechnung,
wird aber verhindern dass ein Ergebnis entsteht so lange der Eingang noch keinen Wert hat,
oder kann abhängig vom Sendeverhalten ein Senden auf de Bus auslösen.

Ein negativer Wert ändert das Vorzeichen des Eingangswertes. Bei der Gewichtssumme fließt der Betrag ein.

<!-- DOC HelpContext="DptAusgang" -->
### Wertetyp / DPT (Ausgang)

Definiert den DPT des Ausgangs. Zur Auswahl stehen gängige numerische DPTs mit 1Byte, 2Bytes und 4Bytes.

In der Standardeinstellung **Identisch mit Eingängen** wird der DPT der Eingänge übernommen.

<!-- DOC -->
### Rundungsmodus

> *Nur* einstellbar, wenn ein Ganzzahl-Wertetyp für den Ausgang gewählt wurde und das berechnete Ergebnis nicht zwingend ganzzahlig ist.

- **Nachkommastellen verwerfen**
Kein besondere Behandlung.
- **Runden (ab 0,5 aufrufen)**
Anwendung der üblichen Rundungsregeln.

<!-- DOC HelpContext="OutOfRange"-->
### Bei Überschreiten des Wertebereichs

> *Nur* relevant, wenn der berechnete Ausgangswert durch den gewählten Ausgangs-DPT nicht mehr in jedem Fall abbildbar ist.

- **KO nicht aktualisieren / nicht senden**
Ignoriert den Wert.
- **Auf Bereichsrand setzen**
Ein zu kleiner Wert wird durch den Minimalwert des DPT ersetzt, ein zu großer Wert durch den Maximalwert.


7 changes: 2 additions & 5 deletions library.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
{
"name": "OFM-FunctionBlocks",
"version": "0.1.0",
"dependencies": {
"bblanchon/ArduinoJson": "^7.0.4"
},
"version": "0.2.0-DEV",
"description": "Function Blocks",
"homepage": "https://openknx.de",
"authors": {
Expand All @@ -14,6 +11,6 @@
},
"repository": {
"type": "git",
"url": "https://github.com/mgeramb/OFM-FunctionBlocks"
"url": "https://github.com/OpenKNX/OFM-FunctionBlocks"
}
}
4 changes: 4 additions & 0 deletions src/Baggages/Help_de/FCB-AggrEingang.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
### Eingang 1-9

Legt fest, ob der Eingang verwendet wird.

10 changes: 10 additions & 0 deletions src/Baggages/Help_de/FCB-AggrEingangGewicht.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
### Gewicht Eingang 1-9

Definiert wie stark dieser Eingang in das Ergebnis einfließt.

Bei 0 hat dieser Eingang keinen Einfluss auf das Resultat der Berechnung,
wird aber verhindern dass ein Ergebnis entsteht so lange der Eingang noch keinen Wert hat,
oder kann abhängig vom Sendeverhalten ein Senden auf de Bus auslösen.

Ein negativer Wert ändert das Vorzeichen des Eingangswertes. Bei der Gewichtssumme fließt der Betrag ein.

18 changes: 18 additions & 0 deletions src/Baggages/Help_de/FCB-AggrFunction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
### Funktion

Legt fest, wie der Ausgangswert aus den Werten der aktiven Eingänge berechnet wird:

- **Summe**
Addiert die Eingangswerte.
Das Ergebnis kann außerhalb des Eingangs-Wertebereichs liegen!
- **Mittelwert**
Summe dividiert durch die Anzahl der aktiven Eingänge.
Das Ergebnis ist i.d.R. nicht ganzzahlig, wird jedoch innerhalb des Eingangs-Wertebereichs liegen.
- **Minimum**
Verwendet den kleinsten Eingangswert.
- **Maximum**
Verwendet den größten Eingangswert.
- **Spannbreite (Maximum - Minimum)**
Liefert ein einfaches Maß dafür, wie weit sich die Eingangs-Werte voneinander unterscheiden.
Das Ergebnis kann außerhalb des Eingangs-Wertebereichs liegen, wenn vorzeichenbehaftet ist!

Loading