Update: Timberwolf Custom Logic Referenz V4.2 - Negation, Trigger, KB-Limits & mehr geklärt!)
Hallo liebe Timberwolf Community,
hier ist ein Update zu unserer umfassenden Custom Logic Referenzdatei, die ursprünglich hier vorgestellt wurde: [Link zum V4.1 Beitrag:
viewtopic.php?p=62155#p62155]
Gemeinsam mit der Community (insbesondere durch intensives Testen und Feedback von eib-eg / Georg) und dem Studium der Knowledge Base (großer Dank an die Autoren
@Robert_Mini ,
@S. Kolbinger ,
@Robosoc ) sowie der Analyse von Beispiellogiken (Danke an
@Dragonos2000 ) haben wir die Referenzdatei weiterentwickelt und viele wichtige Details geklärt. Das Ergebnis ist die Version V4.2.
Die Reise zu V4.2 – Was wir gelernt haben:
Der Weg von V4.1 zu V4.2 war sehr lehrreich! Wir sind auf einige Fallstricke gestoßen und konnten wichtige Punkte klären, die oft zu Fehlern oder unerwartetem Verhalten führen können:
1. Die Negation (Logisches NICHT): DAS GROSSE LERN-HIGHLIGHT!
Unsere V4.1 verwendete einen Workaround (Comparator vs $KonstFalse), da wir Probleme mit anderen Methoden hatten.
Nach wertvollem Feedback aus Richtung Entwicklung und gezielten neuen Tests konnten wir die Verwirrung auflösen:
JA, das Minuszeichen (-) funktioniert für die logische Negation! Aber nur im richtigen Kontext: Direkt vor einer booleschen Variable innerhalb der Input-Liste [...] von Logikmodulen wie And, Or etc. (Beispiel: [ "And", ["-$InputBool"] ... ]).
Für die robuste Prüfung "Ist ein Wert (bool/float) FALSCH?" (also numerisch 0) ist weiterhin der Comparator (Mode 0) gegen die Konstante $Konst0_float die beste Methode.
Die V4.2 verwendet jetzt konsequent das - Zeichen für die Negation in Modul-Inputs und erklärt beide Methoden im überarbeiteten Tipp #15.
2. ASTRO_local braucht einen Trigger: Ein wichtiger Praxistipp aus der KB: Das Standard-Astro-Modul muss extern getriggert werden (z.B. jede Minute), sonst liefert es keine aktuellen Werte (siehe Tipp #18).
3. Trigger-Option u (Update only): Die KB hat bestätigt, wie essenziell diese Option ist, um Mehrfachausführungen oder Fehler durch Zwischenzustände zu vermeiden, wenn Objekte mehrfach verwendet werden (siehe Tipp #19).
4. KB-Einschränkungen zu I/O-Variablen: Es gibt zwei wichtige Regeln aus der KB, die wir nun aufgenommen haben, um Probleme zu vermeiden (Tipp #20 und #21):
Keine Variable darf gleichzeitig Input und Output sein.
Namen von I/O-Variablen dürfen nicht Teil voneinander sein (z.B. $Input und $Input2 ist verboten).
5. Klarheit bei Modul-Details & Implementierung:
Nicht alle UI-Module sind Custom-Module: Wir mussten feststellen, dass einige Logikzellen, die man im UI auswählen kann (wie RS-FlipFlop oder Addition), im Custom Logic JSON nicht direkt mit diesem Namen funktionieren. Sie müssen mit Basismodulen nachgebaut werden. V4.2 enthält nun funktionierende Nachbauten für diese Beispiele (siehe Tipp #3, #25).
Stringcompare-Parameter: Es hat sich bestätigt, dass der Modus-Parameter (z.B. "E", "I") für Stringcompare als Variable aus dem Level-Block übergeben werden muss, nicht als direktes String-Literal im Modulaufruf (siehe Tipp #24 und Beispiel).
Monoflop: Die 8 verschiedenen Modi sind jetzt im Tipp #22 genauer beschrieben.
Regex: Liefert den gesamten Match ($Match) und bis zu 5 Capture Groups ($MatchGroup1-$MatchGroup5) - Beispiel angepasst (Tipp #23).
Was ist neu in der V4.2 Datei?
Alle oben genannten Erkenntnisse sind in die Tipps & Häufige Fehler eingeflossen.
Die Beispiele für Astro, Monoflop, Regex, Stringcompare wurden präzisiert/korrigiert.
Funktionierende Nachbauten für RS-FlipFlop (mit Persistenz) und Addition (mit Polynomial) wurden hinzugefügt.
Ein Bool -> Text-Nachbau mit Multiplexer wurde hinzugefügt.
Das Pattern "Zeitlich begrenzte Ausgabe" wurde als Beispiel ergänzt.
Die Nennung der Kollaborateure und das Datum wurden aktualisiert.
Der Code wurde erfolgreich im TWS V4.1.1 gespeichert.
Ziel:
Diese Referenzdatei soll weiterhin als Nachschlagewerk für die Syntax und als verbesserter Kontext für AI-Assistenten dienen, um euch (und die AI) noch besser bei der Erstellung von Custom Logics unterstützen zu können.
Der Code für V4.2:
Timberwolf Custom Logic - Umfassender Referenzcodeblock (V4.2).txt
{
// ==========================================================================
// Timberwolf Custom Logic - Umfassender Referenzcodeblock (V4.2 - 2025-05-05)
// ==========================================================================
// Zweck: Demonstriert Syntax und Verwendung einer breiten Palette von Modulen.
// Soll als erweiterte Referenz für AI-Assistenten und Benutzer dienen.
// Fokus: Darstellung der Vielfalt, korrekte Syntax, häufige Fehler, wichtige Muster.
// Basis: V4.1, erweitert um Erkenntnisse aus KB-Artikeln & intensivem Testen.
// Kollaborateure:
// - eib-eg / Georg (Input, Testing & KB Insights!)
// - Robert_Mini (Umfangreiche KB-Artikel)
// - S. Kolbinger (KB-Artikel)
// - Robosoc (KB-Artikel)
// - Dragonos2000 (Beispiel Logikbaustein)
// Inspirationsquelle für SM/Sequencer: Hans Martin (Bewässerungs-Logik im Forum)
// ==========================================================================
// ANLEITUNG:
// - Dieser Code kann als Basis und Nachschlagewerk für eigene Projekte dienen.
// - Er kann einer AI (wie ChatGPT, Claude) als Kontext gegeben werden,
// um bessere Hilfe bei spezifischen TWS Custom Logic Fragen zu erhalten.
// (Siehe Forenbeitrag:
viewtopic.php?t=5822 )
// - **WICHTIG:** Die offizielle Knowledge Base (KB) unter
app.php/kb/index
// enthält die detailliertesten Beschreibungen der einzelnen Module! Diese Referenz hier
// dient als Ergänzung und zeigt Beispiele im Kontext.
// - Teste Beispiele immer sorgfältig, bevor du sie produktiv einsetzt!
// ==========================================================================
// WICHTIGE TIPPS & HÄUFIGE FEHLER (V4.2 - Aktualisiert & Erweitert):
// --------------------------------------------------------------------------
// 1. KOMMASETZUNG: Fehlerquelle #1!
// a) KEIN Komma nach dem LETZTEN Element in einem Array [...]. (Level, Module, Input, Output)
// b) EIN Komma ZWISCHEN den Hauptblöcken (`Level`], `"Module"`, etc.). Fehler oft erst im nächsten Block!
// c) KEIN Komma nach dem letzten Key-Value-Paar im Hauptobjekt (`}`).
// 2. UNDEFINIERTE VARIABLEN: Jede `$Variable` muss im "Level"-Block definiert sein.
// 3. UNBEKANNTE MODULE: Namen exakt (Groß/Kleinschreibung!). Nicht alle in der UI gelisteten "Logikzellen" sind direkt als Custom-Modul verfügbar (z.B. RS-FlipFlop, Addition müssen nachgebaut werden). Prüfe die tatsächlich funktionierenden Modulnamen.
// 4. DATENTYPEN: Auf korrekte Typen achten (float, integer, bool, string). String braucht Längenangabe (z.B. `,64`).
// 5. LATCH-MODI & TRIGGER: Mode 0 (Pegel) mit `$KonstTrue` als Trigger ist häufig für Persistenz über Zyklen. Mode 1 (Flanke) für Event-basierte Speicherung.
// 6. STATEFUL MODULE & PERSISTENZ: `Latch`, `PID`, `Monoflop`, `Hobbs`, `Ramp`, `Statemachine` etc. speichern Zustände. Sie müssen korrekt initialisiert werden (Default-Werte im Level-Block!).
// 7. `_Alt` SUFFIX PATTERN: Für Persistenz eigener Zustände (Zähler, FF, etc.): Berechne neuen Wert in `$Calc_X_Neu`, schreibe per `Latch` (Mode 0, Trigger `$KonstTrue`) in `$State_X_Alt`. Im nächsten Zyklus steht der alte Wert in `$State_X_Alt` zur Verfügung.
// 8. AUSFÜHRUNGSREIHENFOLGE: Module oben nach unten. Ergebnis nur von Modulen *darüber* nutzbar. Der TWS "Dispatcher" liefert Werte sequenziell an Ziele (siehe Tipp 19).
// 9. PARSER-EMPFINDLICHKEIT: Kommentare an "ungewöhnlichen" Stellen (direkt vor `]`) vermeiden. Im Zweifel sparsam kommentieren.
// 10. `CalcFormula`: Die Formel (z.B. "X1 + X2") MUSS in einer String-Variable im `$Level`-Block stehen! Der Modulaufruf referenziert dann diese Variable.
// 11. `Comparator` PARAMETER: Struktur des Schwellwert-Parameters hängt vom Modus ab!
// - Modi mit *einem* Schwellwert (0-5): Parameter ist die Variable direkt (z.B. `$Schwelle`).
// - Modi mit *zwei* Schwellwerten (Hysterese Mode 6/7): Parameter ist ein Array (z.B. `["$Unten", "$Oben"]`).
// -> Falsche Struktur führt zu "Level index has wrong type" Fehlern! (Siehe auch offizielle Modi 0-7 in der KB).
// 12. `$Error?` VARIABLE: Definiere `["$Error?", "bool", false]` im Level und `["Err","Fehler","$Error?","ce"]` im Output. Der Server setzt `$Error?` auf TRUE, wenn zur Laufzeit ein Fehler auftritt (z.B. Division durch Null). ESSENZIELL fürs Debugging!
// 13. LOGIK PAUSIERT (Gelber Rand): Eine Logik mit gelbem Rand im TWS-Editor ist pausiert und wird NICHT ausgeführt. Aktivieren nicht vergessen (Button unten rechts im Editor)!
// 14. COPY/PASTE FEHLER: Unsichtbare Zeichen oder falsche Zeilenenden können den Parser stören. Code im Zweifel über einfachen Texteditor (Notepad etc.) bereinigen.
// 15. NEGATION (Logisches NICHT - KORRIGIERT!): Es gibt kein `Not`-Modul. Die Methode hängt vom Kontext ab:
// a) **INNERHALB VON MODUL-INPUTS (Empfohlen für Logik):** Verwende das Minuszeichen (`-`) direkt vor der booleschen Variable im Input-Array `[...]` von Logikmodulen (`And`, `Or`, `Xor`, etc.). Dies führt die logische Negation (true <-> false) korrekt durch.
// * **Beispiel:** `[ "And", ["$InputA", "-$InputB"], "$Output" ]` (Negiert `$InputB`)
// b) **ROBUSTE PRÜFUNG "IST FALSCH?" (Für Bool/Float):** Um robust zu prüfen, ob ein Wert (Boolean oder Float) logisch `false` (d.h. numerisch 0) ist, verwende `Comparator` Mode `0` (Gleichheit `==`) gegen die Konstante `$Konst0_float`.
// * **Beispiel:** `[ "Comparator", "$AnyInput", "$IsFalseBool", "$Konst0_float", 0 ]`
// * *(Hinweis: Der frühere Workaround mit `$KonstFalse` ist nicht empfohlen, da er bei Float-Inputs unzuverlässig ist.)*
// 16. `$VAR<Inhibit?>`: Empfohlener Name für den boolschen Input des `Break`-Moduls (oder anderer Steuer-Eingänge). Typ `u` ist hier sinnvoll.
// 17. `Statemachine` Persistenz: Der Zustand der SM muss i.d.R. persistent gespeichert werden (`_Alt` Pattern mit `Latch`).
// 18. `ASTRO_local` TRIGGER: Das Standard-Astro-Modul (`ASTRO_local`), das die Server-Koordinaten nutzt, hat keine sich ändernden Inputs und **benötigt einen externen Trigger** (z.B. Zeitintervall via `Clocksignal` oder `Cron`), damit es regelmäßig neue Werte berechnet und ausgibt!
// 19. TRIGGER-OPTION `u` (Update only): Wenn dasselbe Objekt an mehrere Inputs derselben Logik geht, oder wenn mehrere Logiken vom selben Objekt getriggert werden und deren Ausgänge weiterverarbeitet werden, **MUSS** die Trigger-Option `u` für alle außer dem *letzten* betroffenen Input verwendet werden! Sonst kommt es zu Mehrfachausführungen mit Zwischenzuständen. Siehe KB Artikel zu Triggerverhalten/Dispatcher.
// 20. KEINE I/O-VARIABLEN-WIEDERVERWENDUNG: Eine Variable darf **nicht** gleichzeitig im `"Input"`- *und* im `"Output"`-Block derselben Logik aufgeführt sein. Zum Durchschleifen zwei Variablen + `Latch`/`Multiplexer` verwenden. (KB-Einschränkung)
// 21. KEINE TEILSTRING-NAMEN FÜR I/O-VARIABLEN: Variablennamen im `"Input"`- oder `"Output"`-Block dürfen **nicht Teil voneinander** sein (z.B. `$Input` und `$Input2` ist **verboten**; `$Input1` und `$Input2` ist OK). Dies betrifft nur I/O-Variablen, nicht interne `$Calc_` oder `$State_`. (KB-Einschränkung wg. UI-Handling).
// 22. `Monoflop` MODI (0-7): Beachte die 8 Modi für unterschiedliches Trigger- (Pegel, steigend, fallend, beide Flanken) und Retrigger-Verhalten (retriggerbar/nicht retriggerbar). Siehe Modul-Beispiel unten.
// 23. `Regex` OUTPUTS: Liefert `$HasMatch`, den gesamten `$Match` und bis zu 5 Capture Groups (`$MatchGroup1` bis `$MatchGroup5`).
// 24. `Stringcompare` MODI:** Der Modus (z.B. "E", "e", "S"...) muss als **Variable** übergeben werden, nicht als Literal! Siehe Beispiel und KB. (Mögliche Modi: E=ExactCS, e=ExactCIS, S=StartCS, s=StartCIS, I=IncludesCIS, i=IncludesCS?).
// 25. DEDIZIERTE MODULE NUTZEN (wo möglich): Für Standardaufgaben (z.B. String-Vergleich/-Konvertierung) gibt es oft vorinstallierte Logikzellen im UI, die intern eventuell optimierter sind oder spezielle Module nutzen. Wenn diese nicht als Custom-Modul direkt verfügbar sind (wie `Addition`), baue sie mit Basismodulen nach (`Polynomial`, `Comparator`, `Multiplexer`, etc.).
// ==========================================================================
// ENTHALTENE MODUL-BEISPIELE (V4.2 - Auswahl & Kurzbeschreibung):
// --------------------------------------------------------------------------
// - Logik: And/Or/Xor, **RS-FlipFlop(Nachbau!)**, Comparator(Syntax!), Multiplexer/BinaryMultiplexer
// - Arithmetik: **Addition(Nachbau mit Poly!)**, CalcFormula(Syntax!), Polynomial, Ratio(Null-Schutz!), Limiter, Step
// - Timing: Monoflop(Timer, **Modi erklärt!**), HobbsMeter/Stopwatch, Clocksignal/Cron/Localtime
// - Zustand/Sequenz: Latch(Persistenz), Statemachine, $Error?, Break
// - System/Filter: PID_awu, Lowpass, Ramp
// - String/Typen: **Stringcompare(Modi, Parameter!)**, **KONVERTIERE bool->Text(Nachbau!)**, HEX->INT, Printf (String format), **Regex(Outputs erweitert!)**
// - Sonstige: Astro(**Trigger/Varianten erklärt!**), Interpolation, Statistic
// - Patterns: **Zeitlich begrenzte Ausgabe**
// (KONKATENIERE entfernt, da Umsetzung unklar)
// ==========================================================================
// STAND & LIZENZ:
// --------------------------------------------------------------------------
// Stand: 2025-05-05 (V4.2) - Basierend auf V4.1, Community-Beispielen, KB-Artikeln & Tests.
// TOLL Lizenz ("Timberwolf Open Logikblock License"):
https://wrgt.news/TOLL. Keine Garantie.
// ==========================================================================
}
Wir hoffen, diese aktualisierte Version ist nützlich für euch! Feedback und weitere Erkenntnisse sind natürlich immer willkommen.
Viele Grüße,
eib-eg / Georg & die AI
