Hallo Frank (
@JustMe),
ich habe mir deinen Code und deine Problemstellung für die Gartenbewässerung angesehen. Das ist ein klassischer Anwendungsfall, bei dem Custom Logic seine Stärken ausspielen kann! Georg (eib-eg) und ich haben uns im Rahmen unserer Experimente mit AI-unterstützter Logikerstellung mal deinen Code vorgenommen und einen überarbeiteten Vorschlag erstellt, der hoffentlich einige deiner ursprünglichen Herausforderungen adressiert.
Hier ist der Code
Franks_Gartenbewaesserung_Vorschlag_AI_V1.0.txt
________________________________________________________________
{
"_Meta": {
"Description": "Logik für Gartenbewässerung mit Manuellem und Automatikbetrieb (Vorschlag AI & eib-eg für JustMe)",
"Version": "1.0"
},
"Input": [
["Manuell_Start_Stop", "Taster: Manuell Pumpe EIN/AUS", "$I_Manuell_Start_Stop", "c"],
["Automatik_Ein_Aus", "Schalter: Automatikbetrieb EIN/AUS", "$I_Automatik_Ein_Aus", "c"],
["Trigger_Automatik_Start", "Externer Trigger für Automatikstart (z.B. 4 Uhr)", "$I_Trigger_Automatik_Start", "a"],
["Bewae_Dauer_min", "Bewässerungsdauer Automatik (Minuten)", "$I_Bewae_Dauer_min", "u"],
["Wasserstand_Ist", "Aktueller Wasserstand Sensor (z.B. 0-10V)", "$I_Wasserstand_Ist", "u"],
["Wasserstand_Schwelle_OK", "Schwellwert Wasserstand OK (Pumpe darf laufen wenn Ist >= Schwelle)", "$P_Wasserstand_Schwelle_OK", "u"],
["Bodentrockenheit_Ist", "Aktuelle Bodentrockenheit Sensor (z.B. 0-3V, höher=trockener)", "$I_Bodentrockenheit_Ist", "u"],
["Bodentrockenheit_Schwelle_Trocken", "Schwellwert Bodentrockenheit (Pumpe läuft wenn Ist >= Schwelle)", "$P_Bodentrockenheit_Schwelle_Trocken", "u"]
],
"Output": [
["Pumpe_Ein_Aus", "Steuerung Pumpe EIN/AUS", "$O_Pumpe_Ein_Aus", "a"],
["Automatik_Timer_Aktiv", "Status: Automatik-Timer läuft", "$O_Automatik_Timer_Aktiv", "a"],
["Status_Betriebsart", "Statusanzeige (z.B. für LED - Logik hierfür noch anpassen)", "$O_Status_Betriebsart", "a"],
["Err","Fehler","$Error?","ce"]
],
"Level": [
// --- Eingangs-Variablen (Inputs aus der UI) ---
["$I_Manuell_Start_Stop", "bool", false],
["$I_Automatik_Ein_Aus", "bool", false],
["$I_Trigger_Automatik_Start", "bool", false],
["$I_Bewae_Dauer_min", "float", 30.0],
["$I_Wasserstand_Ist", "float", 5.0],
["$P_Wasserstand_Schwelle_OK", "float", 2.5],
["$I_Bodentrockenheit_Ist", "float", 2.0],
["$P_Bodentrockenheit_Schwelle_Trocken", "float", 1.5],
// --- Ausgangs-Variablen (Outputs in die UI) ---
["$O_Pumpe_Ein_Aus", "bool", false],
["$O_Automatik_Timer_Aktiv", "bool", false],
["$O_Status_Betriebsart", "bool", false],
// --- Interne Berechnungen & Zustände ---
["$Calc_Wasserstand_OK", "bool", false],
["$Calc_Boden_Ist_Trocken_Genug", "bool", false],
["$Calc_Automatik_Bedingungen_Erfuellt", "bool", false],
["$Calc_Automatik_Start_Signal", "bool", false],
["$Calc_Bewae_Dauer_s", "float", 0.0],
["$Konst_Umrechnungsfaktor_s_pro_min", "float", 60.0],
["$Konst_CalcFormula_Multiply", "string,16", "X1*X2"],
["$State_Manuell_Aktiv_Vorheriger_Zyklus", "bool", false],
["$Calc_Manuell_Wurde_Gerade_Eingeschaltet", "bool", false],
["$Calc_Reset_AutomatikTimer", "bool", false],
// --- Systemvariablen ---
[ "$Error?", "bool", false ],
[ "$KonstTrue", "bool", true]
],
"Module": [
// Block 1: Bedingungen für den Automatikmodus prüfen
// ---------------------------------------------------
// Prüft, ob der Wasserstand ausreichend ist (Ist >= Schwelle).
// Ggf. Comparator-Modus (hier 3 für ">=") anpassen, falls z.B. "<=" benötigt wird.
["Comparator", "$I_Wasserstand_Ist", "$Calc_Wasserstand_OK", "$P_Wasserstand_Schwelle_OK", 3],
// Prüft, ob der Boden trocken genug ist (Ist >= Schwelle).
// Annahme: Höherer Sensorwert bedeutet trockener. Ggf. Modus anpassen.
["Comparator", "$I_Bodentrockenheit_Ist", "$Calc_Boden_Ist_Trocken_Genug", "$P_Bodentrockenheit_Schwelle_Trocken", 3],
// Verknüpft die Sensorbedingungen mit dem Zustand des Automatik-Schalters.
["And", ["$Calc_Wasserstand_OK", "$Calc_Boden_Ist_Trocken_Genug", "$I_Automatik_Ein_Aus"], "$Calc_Automatik_Bedingungen_Erfuellt"],
// Block 2: Startsignal für den Automatik-Timer erzeugen
// ------------------------------------------------------
// Der Automatik-Timer startet nur, wenn die Bedingungen erfüllt sind UND der externe Trigger ($I_Trigger_Automatik_Start) kommt.
["And", ["$Calc_Automatik_Bedingungen_Erfuellt", "$I_Trigger_Automatik_Start"], "$Calc_Automatik_Start_Signal"],
// Block 3: Umrechnung der Bewässerungsdauer von Minuten in Sekunden
// -----------------------------------------------------------------
["CalcFormula",["$I_Bewae_Dauer_min","$Konst_Umrechnungsfaktor_s_pro_min"], "$Calc_Bewae_Dauer_s", "$Konst_CalcFormula_Multiply"],
// Block 4: Reset-Bedingung für den Automatik-Timer definieren
// -----------------------------------------------------------
// Der Timer soll resetten, wenn:
// a) Der manuelle Betrieb gerade aktiviert wurde (steigende Flanke von $I_Manuell_Start_Stop) ODER
// b) Der Automatik-Modus generell ausgeschaltet wird.
["Latch", "$I_Manuell_Start_Stop", "$State_Manuell_Aktiv_Vorheriger_Zyklus", "$KonstTrue", 0],
["And", ["$I_Manuell_Start_Stop", "-$State_Manuell_Aktiv_Vorheriger_Zyklus"], "$Calc_Manuell_Wurde_Gerade_Eingeschaltet"],
["Or", ["$Calc_Manuell_Wurde_Gerade_Eingeschaltet", "-$I_Automatik_Ein_Aus"], "$Calc_Reset_AutomatikTimer"],
// Block 5: Monoflop für die zeitgesteuerte Automatik-Bewässerung
// --------------------------------------------------------------
// Modus 2: Startet bei steigender Flanke von $Calc_Automatik_Start_Signal, ist NICHT retriggerbar.
// Läuft für $Calc_Bewae_Dauer_s Sekunden.
// Wird durch $Calc_Reset_AutomatikTimer vorzeitig beendet.
["Monoflop", "$Calc_Automatik_Start_Signal", "$Calc_Reset_AutomatikTimer", "$O_Automatik_Timer_Aktiv", "$Calc_Bewae_Dauer_s", 2],
// Block 6: Logik für Pumpensteuerung
// -----------------------------------
// Die Pumpe ist EIN, wenn entweder der manuelle Taster EIN ist ODER der Automatik-Timer läuft.
["Or", ["$I_Manuell_Start_Stop", "$O_Automatik_Timer_Aktiv"], "$O_Pumpe_Ein_Aus"],
// Block 7: Statusanzeige (Beispiel - muss ggf. angepasst werden)
// ----------------------------------------------------------------
// Diese Logik ist ein einfacher Platzhalter. Sie könnte z.B. für eine LED genutzt werden,
// die leuchtet, wenn Automatik aktiv ist, oder blinkt bei manuellem Betrieb.
// Aktuell zeigt sie nur den Status des Automatik-Timers an, wenn Automatik EIN ist.
["Multiplexer", ["$O_Automatik_Timer_Aktiv"], "$O_Status_Betriebsart", "$I_Automatik_Ein_Aus"]
]
}
________________________________________________
Wesentliche Änderungen und Hinweise im Vergleich zu deinem ursprünglichen Code:
Comparator-Module (entscheidend!):
In deinem ursprünglichen Code hast du bei den Comparator-Modulen keinen expliziten Vergleichsmodus angegeben. Auf der Firmware-Version 4.1.1 führt dies laut unseren Tests dazu, dass der Comparator immer false liefert, unabhängig von den Werten!
Verbesserung: Wir haben explizite Modi hinzugefügt (hier Mode 3, was >= bedeutet).
["Comparator", "$I_Wasserstand_Ist", "$Calc_Wasserstand_OK", "$P_Wasserstand_Schwelle_OK", 3]
["Comparator", "$I_Bodentrockenheit_Ist", "$Calc_Boden_Ist_Trocken_Genug", "$P_Bodentrockenheit_Schwelle_Trocken", 3]
Wichtig für dich: Bitte prüfe, ob >= (Mode 3) für deine Sensoren und Logik korrekt ist. Wenn z.B. der Wasserstand kleiner als eine Schwelle sein muss, bräuchtest du Mode 1 (<) oder 2 (<=). Unsere gemeinsame Referenzdatei (Link siehe Signatur von eib-eg oder suche nach "TWS_CustomLogic_Reference") enthält in Tipp 11 eine detaillierte Erklärung der Comparator-Modi.
Externer Trigger für Automatikstart:
Du erwähntest einen externen Trigger um 4 Uhr. Wir haben dafür einen neuen Input $I_Trigger_Automatik_Start (Typ "a") hinzugefügt.
Die Automatik startet jetzt nur, wenn dieser Trigger kommt UND die anderen Bedingungen (Wasserstand, Trockenheit, Automatikmodus aktiv) erfüllt sind ($Calc_Automatik_Start_Signal).
Monoflop-Modus:
Du hattest Mode 3 (Flanke steigend, retriggerbar) verwendet.
Verbesserung: Wir haben Mode 2 (Flanke steigend, nicht retriggerbar) eingesetzt. Das stellt sicher, dass der Timer nach dem Start durch den 4-Uhr-Trigger einmal für die eingestellte Dauer läuft und nicht durch eventuell länger anstehende Triggerbedingungen neu gestartet wird. Wenn du ein retriggerbares Verhalten bevorzugst, kannst du wieder auf Mode 3 wechseln. (Siehe Tipp 22 unserer Referenz.)
Reset-Logik für den Automatik-Timer:
Der Automatik-Timer ($O_Automatik_Timer_Aktiv) wird nun zurückgesetzt, wenn:
Der Automatik-Modus ($I_Automatik_Ein_Aus) ausgeschaltet wird.
Oder wenn der manuelle Betrieb über $I_Manuell_Start_Stop aktiviert wird (Erkennung der steigenden Flanke des Tasters). Das verhindert, dass die Automatik "im Hintergrund" weiterläuft, wenn du manuell eingreifst.
Klarere Variablennamen und Struktur:
Wir haben versucht, die Variablennamen etwas sprechender zu gestalten und die Modulblöcke durch Kommentare zu gliedern, um die Lesbarkeit zu erhöhen.
Wie du diesen Vorschlag testen solltest:
Kopiere den gesamten Code (inklusive { am Anfang und } am Ende) in eine neue Custom Logikzelle in deinem Timberwolf Server.
Verknüpfe die Inputs:
Manuell_Start_Stop mit deinem Taster.
Automatik_Ein_Aus mit deinem Schalter/Taster für den Automatikmodus.
Trigger_Automatik_Start mit dem Objekt, das deinen 4-Uhr-Impuls liefert (z.B. Ausgang eines Cron-Jobs).
Die restlichen Inputs mit deinen Sensoren und Sollwert-Objekten für Dauer, Wasserstand und Trockenheit.
Verknüpfe die Outputs:
Pumpe_Ein_Aus mit dem Objekt, das deine Pumpe schaltet.
Automatik_Timer_Aktiv und Status_Betriebsart optional mit Statusanzeigen.
Passe die Schwellwerte an:
$P_Wasserstand_Schwelle_OK und $P_Bodentrockenheit_Schwelle_Trocken müssen auf deine Gegebenheiten und Sensoren angepasst werden. Achte auch darauf, ob die Comparator-Logik (größer/kleiner gleich) zu deinen Sensoren passt!
Teste die Funktionen:
Manueller Modus: Lässt sich die Pumpe mit $I_Manuell_Start_Stop ein- und ausschalten? Stoppt ein laufender Automatik-Timer, wenn du manuell einschaltest?
Automatik Modus:
Aktiviere $I_Automatik_Ein_Aus.
Stelle sicher, dass die Bedingungen für Wasserstand und Trockenheit so sind, dass die Automatik starten sollte.
Simuliere den $I_Trigger_Automatik_Start (z.B. durch manuelles Setzen des verbundenen Objekts).
Läuft die Pumpe für die eingestellte $I_Bewae_Dauer_min?
Wird der Timer korrekt gestoppt, wenn $I_Automatik_Ein_Aus während des Laufs deaktiviert wird?
Wir hoffen, dieser überarbeitete Entwurf hilft dir weiter! Gib uns gerne Feedback, ob es damit besser klappt oder wo es noch hakt. Das Triggered-Modul, das Matthias (ms20de) erwähnt hat, könnte auch eine elegante Lösung für die Unterscheidung der Trigger-Quellen sein, falls du das noch feingranularer brauchst.
Viele Grüße,
Georg (eib-eg) & die unterstützende AI
Zusätzliche Tipps für Frank (als "Zuckerl" direkt im Beitrag oder als Antwort):
Tipp zur Comparator-Logik: "Denk daran, dass bei den Comparatoren der gewählte Modus (z.B. 3 für >=) entscheidend ist. Wenn deine Sensoren andersherum funktionieren (z.B. niedriger Wert = trocken), musst du den Modus oder die Logik anpassen. Schau dir dazu auch Tipp 11 in unserer großen Referenzdatei an – eib-eg kann dir sicher den Link geben."
Tipp zum externen Trigger: "Der Input $I_Trigger_Automatik_Start ist der Schlüssel für deinen zeitgesteuerten Start. Stelle sicher, dass dieser zuverlässig um 4 Uhr (oder wann immer du möchtest) einen kurzen Impuls (TRUE) bekommt. Ein Cron-Job im Timberwolf Server ist dafür ideal."
Tipp zur Fehlersuche: "Wenn etwas nicht wie erwartet funktioniert, schau dir die Werte der internen $Calc_ Variablen über den Debug-Modus der Logikzelle an oder lege sie testweise auf Ausgänge. Das hilft enorm, den Fehler einzugrenzen. Und vergiss nicht den $Error? Output!"
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.