Ich möchte über FHEMWEB einem Thermostat eine neue Soll-Temperatur mitteilen. Ich stelle mir ein Klapp-Runter-Menü mit vorgegebenen Temperaturen vor - aus denen ich auswählen kann.
Ich habe verstanden, dass das mit DOIF (setList, readingList), geht. Einfache DOIF kann ich auch. Allerdings scheitere ich hier schon am Verständnis: Bei DOIF wird zuerst ja was getestet. Ich habe aber garnichts zum testen. Ich will einfach nur eine neue Temperatur auswählen.
Gegeben ist:
Thermostat_Gaestezimmer ZWave xxxxxxxx xx
Vermittels
set Thermostat_Gaestezimmer desired-temp 14
sende ich dem Thermostaten den Befehl, die Solltemperatur auf 14°C zu stellen, das geht fein.
Nun möchte ich gern ein Klapp-Runter-Menü haben, welches mir drei verschiedene Soll-Temperaturen anbietet, ich kann dann eine auswählen usw. Also sagen wir mal: 14, 18, 21.
Alle veröffentlichten Beispiele sind überfrachtet mit zig zu testenden Nebenbedingungen (Uhrzeit et al) - das will ich alles nicht. Und damit werden die Beispiele so kompliziert, dass ich nichts verstehe.
Wäre bitte jemand so freundlich, mir ein vollständiges Beispiel für diese scheinbar leichte Aufgabe 14, 18, 21 zu zeigen? Das würde mir sehr helfen.
Hallo curt,
Du willst es einfach, Du meinst DOIF ist einfach ::)
Gaaanz Basic Vorschlag:
define setTemperatur dummy
attr setTemperatur setList desired-temp:14,18,21
define n_setTemperatur notify setTemperatur set Thermostat_Gaestezimmer $EVENT
Gruß Otto
Du musst ein userreading im DOIF anlegen. Dann kannst du auf dieses triggern. und du kannst für dieses eine liste definieren aus der du deine Temperatur auswählst. Durch das auswählen der Temperatur wird das userreading geändert und es erzeugt ein Event auf welches DOIF triggert.
Auf einen Dummy kannst du verzichten da DOIF alle Funktionen eines Dummy auch beherrscht.
Evtl. ist das noch hilfreich: https://wiki.fhem.de/wiki/DOIF/Ein-_und_Ausgabe_in_FHEMWEB_und_Tablet-UI_am_Beispiel_einer_Schaltuhr
Zitat von: Eistee am 01 Oktober 2020, 09:11:37
Du musst ein userreading im DOIF anlegen. Dann kannst du auf dieses triggern. und du kannst für dieses eine liste definieren aus der du deine Temperatur auswählst.
Wärst Du bitte so freundlich, mir da an Hand des kleinen Temperaturproblems als Beispiel zu zeigen?
setreading <DOIFname> desired-temp 14.0
attr <DOIFname> readingList desired-temp
attr <DOIFname> setList desired-temp:14,18,21
Benutzung im DOIF:
[$SELF:desired-temp]
DOIF ([$SELF:desired-temp] > 25)(set Thermostat_Gaestezimmer desired-temp [$SELF:desired-temp], set $SELF desired-temp 14)
@amenomade [$SELF:desired-temp] > 25 - der löst doch nie aus? Und wenn Du < nimmst triggert er doch selbst nochmal? Gut ohne do always nur einmal, aber dann sowieso nie wieder? Aber ich habe jetzt nur drüber nachgedacht und nicht probiert. Vielleicht sehe ich nicht alles. ;)
Zitat von: Otto123 am 02 Oktober 2020, 10:18:59
@amenomade [$SELF:desired-temp] > 25 - der löst doch nie aus? Und wenn Du < nimmst triggert er doch selbst nochmal? Gut ohne do always nur einmal, aber dann sowieso nie wieder? Aber ich habe jetzt nur drüber nachgedacht und nicht probiert. Vielleicht sehe ich nicht alles. ;)
ja, das Beispiel ist nicht besonders sinnvoll, aber demonstriert zumindest, dass man auf das Reading triggern bzw. abfragen kann
im Perl-Modus könnte man z.B. zu der setList definieren:
DOIF {fhem_set("Thermostat_Gaestezimmer desired-temp ".[$SELF:desired-temp])}
hier wird auf Änderung des eigenen Readings getriggert und gleichzeitig das Thermostat gesetzt, ähnlich wie bei dem notify nur dass hier beides (Eingabe und Änderung) in einem Modul stattfindet.
PS. Wenn man etwas mehr will, kann man auch sowas in einem Modul unterbringen: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Visualisierung_und_Steuerung_von_Raumtemperaturen
Zitat von: Damian am 02 Oktober 2020, 11:20:28
ja, das Beispiel ist nicht besonders sinnvoll, aber demonstriert zumindest, dass man auf das Reading triggern bzw. abfragen kann
Genau. Das war der einzige Sinn meines Beispiels.
Entschuldigt bitte: Kurz vor der vmtl. 2. Corona-Welle machte ich nochmal Kurzurlaub. Da hätte ich zwar auf mein FHEM zugreifen können, aber ich traute mich nicht: Wenn da was schief geht ...
Ich bin fürchterlich dumm, ich merke das immer wieder. Wenn ich meine alten (seit 2017 dabei) fragenden Beiträge so lese ... meine Fresse. - Ok, ich bin jetzt auch wieder dumm.
Würde das folgende Konstrukt denn gehen? Habe ich das richtig verstanden?
defmod mein_doif DOIF ([$SELF:desired-temp] < 30)(set Thermostat_Gaestezimmer desired-temp [$SELF:desired-temp], set $SELF desired-temp 14)
setreading mein_doif desired-temp 14.0
attr mein_doif readingList desired-temp
attr mein_doif setList desired-temp:14,18,21
attr mein_doif Room Heizung
Oder habe ich da mal wieder was falsch verstanden?
* Ist das "kleiner 30" grundsätzlich richtig?
* Muss ich da irgendwie noch ein do always reinmanschen (und falls ja: Warum?)
Moin,
warum nimmst Du nicht den Vorschlag vom "DOIF Chef", sondern den, wo drei Leute gesagt haben der ist nicht sinnvoll sondern nur zur Demonstration?
Wenn Du das machst wie Du jetzt zeigst und da noch ein do always rein machst, brauchst Du mMn nichts weiter zu tun - da heizt der Rechner mit FHEM deine Bude von ganz alleine :o
Das gibt ne Schleife: "wenn ich kleiner 30 bin dann setze mich selbst auf 14 und triggere mich wieder" -> rennt im Kreis.
Edit: nach einem Test rennt es nicht im Kreis ;)
Mein unwesentlicher Vorschlag: Ersetze Deinen Code hinter DOIF durch den von Damian. Ich verstehe ihn nur ansatzweise, aber wenn DOIF so funktioniert (Damian wirds wissen) dann ist es so. ;)
Gruß Otto
Hallo curt,
ich hab mal was gebastelt, hier als raw um es direkt einzufügen:
defmod di_Thermostat_Gaestezimmer DOIF ([$SELF:"SollGaeste"])\
(set Thermostat_Gaestezimmer desired-temp [$SELF:SollGaeste])
attr di_Thermostat_Gaestezimmer do always
attr di_Thermostat_Gaestezimmer event-on-change-reading SollGaeste
attr di_Thermostat_Gaestezimmer readingList SollGaeste
attr di_Thermostat_Gaestezimmer room Test
attr di_Thermostat_Gaestezimmer setList SollGaeste:14,18,21
attr di_Thermostat_Gaestezimmer stateFormat gewaehlt: SollGaeste
attr di_Thermostat_Gaestezimmer webCmd SollGaeste
etwas Erklärung dazu:
setList SollGaeste:14,18,21 erzeugt die Möglichkeit, ein Reading SollGaeste mit einem der 3 Werte zu füllen
readingList SollGaeste legt eben dieses Reading an.
webCmd SollGaeste erzeugt das Dropdown Menü zur Auswahl im FHEMWEB
stateFormat ändert den STATE des DOIF. Kannst du auch weglassen
Das DOIF triggert auf den EVENT "SollGaeste". Diesen Trigger gibt es immer, wenn im Dropdown ein anderer Wert gewählt wird. Daraufhin wird das Reading SollGaeste geändert und dann der Inhalt dieses Readings an den Thermostaten geschickt.
doAlways muss gesetzt sein, sonst klappts nur einmal
event-on-change-Reading SollGaeste sorgt dafür, das von DOIF keine weiteren Events im System erzeugt werden.
Das Ganze ist ein DOIF im DOIF-Modus. Das Beispiel von Damian ist im DOIF-Perl-Modus. Es sollte klar sein, was man verwendet und dann nicht mischen! (z.B. do always gibts im DOIF-Perl-modus nicht!
@Otto:
ZitatErsetze Deinen Code hinter DOIF durch den von Damian. Ich verstehe ihn nur ansatzweise, aber wenn DOIF so funktioniert (Damian wirds wissen) dann ist es so
durch den ersten Satz würde er die beiden DOIF-Modi mischen -> nicht gut.
den 2ten Satz kann ich Dir gar nicht glauben, wenn ich überlege, was ich schon hilfreiches Deinerseits gelesen haben. Zur Erklärung gibts 2 Stellen aus der Commandref:
ZitatEin DOIF-Block wird ausgeführt, wenn dieser bedingt durch Ereignis- und Zeittrigger in eckigen Klammern innerhalb des Blocks, getriggert wird.
ZitatEreignis-/Zeittrigger sind intern Perlfunktionen, daher können sie an beliebiger Stelle im Perlcode angegeben werden, wo Perlfunktionen vorkommen dürfen,
Viel Erfolg!
Zitat von: Sany am 08 Oktober 2020, 14:16:00
@Otto: durch den ersten Satz würde er die beiden DOIF-Modi mischen -> nicht gut.
den 2ten Satz kann ich Dir gar nicht glauben, wenn ich überlege, was ich schon hilfreiches Deinerseits gelesen haben. Zur Erklärung gibts 2 Stellen aus der Commandref:
Wieso würde er da was mischen? Damians Code ist doch sauber Perl? Der wird doch durch setreading sowie attr readingList, setList und room nicht gemischt?
Aber ich sollte mich raushalten, ich hab es nicht getestet. Wenn Du sagst es ist so - kann sein: Dann hab ich grundlegend was nicht verstanden und werde mich in Zukunft aus DOIF Fragen besser raushalten.
Deine Zitate belegen für mich nicht, dass es keine Schleife gibt. Aber das probier ich gleich mal aus ;)
Edit: Ok es ergibt keine Schleife mit do always. 8)
So habe ich getestet:
Variante curt
defmod mein_doif DOIF ([$SELF:desired-temp] < 30)(set Thermostat_GaestezimmerT desired-temp [$SELF:desired-temp], set $SELF desired-temp 14)
attr mein_doif readingList desired-temp
attr mein_doif room Heizung
attr mein_doif setList desired-temp:14,18,21
attr mein_doif do always
defmod Thermostat_GaestezimmerT dummy
attr Thermostat_GaestezimmerT readingList desired-temp
attr Thermostat_GaestezimmerT room Heizung
Variante Damian
defmod mein_doif DOIF {fhem_set("Thermostat_GaestezimmerT desired-temp ".[$SELF:desired-temp])}
deleteattr mein_doif do
Läuft beides :) ohne Zusatzheizung(Schleife)
Gruß Otto
@Otto: mit mischen meinte ich, wenn er in seinem begonnenen DOIF (DOIF-Modus) mit Attributen dann in der DEF DOIF-Perl schreibt bleiben seine Attribute ja stehen, und auch wenn sie nix bewirken (ist nur ein Annahme, ungeprüft) stehen sie da und verwirren den nächsten, der sich das anschaut. Sollten sie die Funktion beeinträchtigen umso schlimmer. Also ein DOIF entweder im DOIF-Modus oder im Perl-Modus beginnen und dann nicht wechseln.
Zu Deinen Tests: in Variante curt statt ([$SELF:desired-temp] < 30)
einfach auf den Event triggern ([$SELF:"desired-temp"])
und in der Ausführung kann man das , set $SELF desired-temp 14
weglassen. Durch setList und readingList mit dem gleichen Namen wird das Reading bei Änderung über das Auswahlfeld gesetzt und triggert das DOIF. Das ist eigentlich genau mein Beispiel, nur habe ich das Reading SollGaeste genannt, um es lesbarer zu machen.
Gruß und schönen Abend!
Drum prüfe wenn Du behauptest :)
https://fhem.de/commandref_DE.html#DOIF_Attribute_Perl_Modus
ZitatDer Modus eines definierten DOIF-Devices wird automatisch aufgrund der Definition vom Modul erkannt (FHEM-Modus beginnt mit einer runden Klammer auf)
habs geprüft. hab ich auch in etwa so geschrieben: ZitatAlso ein DOIF entweder im DOIF-Modus oder im Perl-Modus beginnen und dann nicht wechseln
Wichtig ist hier "beginnen";-)
Wenn Du testen möchtest:
defmod testDOIF DOIF ([08:00])\
(set lamp on)\
DOELSE\
(set lamp off)
attr testDOIF do always
attr testDOIF wait 10
ein lupenreines DOIF-Modus DOIF, mit Attributen do und wait. Die gibt es beide nicht im Perl-Modus.
Wenn Du dieses DOIF nun änderst: die DEF ersetzen durch z.B.
init {
set_Reading("Hallo","Test");
}
dann hast Du ein DOIF im Perl-Modus, die Attribute do und wait sind aber immer noch da, allerdings nicht in der Attribut-Auswahl zu finden.
Internals:
CFGFN
DEF init {
set_Reading("Hallo","Test");
}
FUUID 5f7f68b5-f33f-da6d-ca20-fbacc169f73d000c
MODEL Perl
NAME testDOIF
NOTIFYDEV global
NR 760
NTFY_ORDER 50-testDOIF
STATE initialized
TYPE DOIF
VERSION 22913 2020-10-04 21:46:02
READINGS:
2020-10-08 21:32:10 Hallo Test
2020-10-08 21:32:10 block_init executed
2020-10-08 21:32:10 mode enabled
2020-10-08 21:32:10 state initialized
Regex:
accu:
attr:
wait:
0:
10
condition:
0
set_Reading("Hallo","Test");
helper:
DEVFILTER ^global$
NOTIFYDEV global
globalinit 1
last_timer 0
sleeptimer -1
perlblock:
0 init
init 0
uiTable:
Attributes:
do always
wait 10
@curt: Klappts denn jetzt wie gewünscht?
@sany irgendwie bist Du komisch: Siehe mein Code
Zitatdeleteattr mein_doif do
und wait hatte ich nicht eingesetzt.
In der letzten Frage von curt gab es beide Attribute nicht. Ich weiß nicht was Du hier konstruieren willst. :o
Zitat von: Sany am 08 Oktober 2020, 14:16:00
Hallo curt,
ich hab mal was gebastelt, hier als raw um es direkt einzufügen:
....
Viel Erfolg!
@Sani
Es ist nicht nur so, dass Dein Beispiel wunderbar funktioniert. Es ist auch so, dass ich nun (ansatzweise) verstehe, wie DOIF funktioniert. Ich bin Dir sehr dankbar, wenn ich könnte, würde ich Dir meinen golden angemalten Papp-Orden "Freundlicher Helfer des Tages" umhängen: Danke!
Wie es immer so ist: Ein gelöstes Problem bekommt in dieser Sekunde Kinder ... ich habe zwei neue Fragen:
1) Ich habe eine readingsgroup Heizwerte, da werden alle Thermostaten dargestellt. Das sieht derzeit so aus:
define Heizungswerte readingsGroup <%sani_heating>,<Act>,<Soll>,<Ist>,< > .*:FILTER=modelId=0148-0003-0001:valve,desiredTemp,temperature,thermostatMode,battery
Da wäre ja nun schön, wenn ich dieses schöne DOIF mit integrieren könnte - wie macht man das denn?
@Damian
Du hast doch in Deinem Avatar diese schöne Anzeige und hattest mir per PN erklärt, wie das im attr gehen kann. Doofe Frage: Wie könnte ich das denn hier (zwei Temperaturen) integrieren? Vermutlich nicht direkt im DOIF, aber irgendwie schon in der readingsgroup ... nur: Wie?
Danke für eure Langmut mit mir.
P.S: @Otto123
Erst jetzt gelesen ... Du bist immer so fürchterlich schnell und setzt so viel bei anderen voraus ... das macht es (wenigstens mir) schwer. Ist da für mich was relevant? Sprich: Muss ich da noch was zusätzlich integrieren? Oder leistest Du Dir "nur" einen akademischen Streit mit @sany?
Zitat von: curt am 09 Oktober 2020, 01:38:37
Du hast doch in Deinem Avatar diese schöne Anzeige und hattest mir per PN erklärt, wie das im attr gehen kann. Doofe Frage: Wie könnte ich das denn hier (zwei Temperaturen) integrieren? Vermutlich nicht direkt im DOIF, aber irgendwie schon in der readingsgroup ... nur: Wie?
Wie schon geschrieben, handelt es sich um SVG-Widgets, die direkt im jeweiligen DOIF über das DOIF-Attribut uiTable nutzbar sind. Damit kannst du alle Informationen, die irgendwo in FHEM gespeichert sind, über die Angabe [<Device>:<Reading>] darstellen. Du brauchst keine weiteren Module oder Dummys, siehe https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#SVG-uiTable-Funktionen.
Zitat von: curt am 09 Oktober 2020, 01:38:37
P.S: @Otto123
Erst jetzt gelesen ... Du bist immer so fürchterlich schnell und setzt so viel bei anderen voraus ... das macht es (wenigstens mir) schwer. Ist da für mich was relevant? Sprich: Muss ich da noch was zusätzlich integrieren? Oder leistest Du Dir "nur" einen akademischen Streit mit @sany?
Alles gut. Ich habe immer gedacht ich erkläre es umfassend - aber nun bin ich fürchterlich, schnell und nicht relevant. Streiten will ich mich schon gar nicht ;D
Gruß Otto
Ach manno :( @Otto123
Natürlich bist Du nicht fürchterlich. Ich schrieb was ganz anderes, lies bitte nochmal.
Vielleicht hast Du auch etwas Zeit für mich:
Ich möchte diese DOIF in eine readingsgroup integrieren. Leider weiß ich nicht ob das geht und wie das gehen könnte. Schau mal bitte den Screenshot, es geht um die Tabelle unten, das ist die readingsgroup. Da wäre ja ganz schön, wenn für jeden Eintrag, also jeden Thermostaten so ein Klapp-Runter-Menü (also das zugehörige DOIF) ganz rechts in der Tabelle stehen würde.
Die readingsgroup sieht so aus ():
define Heizungswerte readingsGroup < >,<Ventil>,<Soll>,<Ist>,<Modus>,<Batterie>,<doif> .*:FILTER=modelId=0148-0003-0001:valve,desiredTemp,temperature,thermostatMode,battery,di_.*
attr Heizungswerte nameStyle style="color:blue"
attr Heizungswerte room 10 Heizung
attr Heizungswerte sortby 1
attr Heizungswerte valueFormat {valve => "%.0f\%",desiredTemp => "%.1f",temperature => "%.1f"}
Und ich habe nun acht DOIF, für jeden Thermostaten eine, so sieht das derzeit aus:
define di_Thermostat_Wohnzimmer DOIF ([$SELF:"SollWohnzimmer"])\
(set Thermostat_Wohnzimmer desired-temp [$SELF:SollWohnzimmer];; sleep 3;; set Thermostat_Wohnzimmer desired-temp [$SELF:SollWohnzimmer];; sleep 3;; get Thermostat_Wohnzimmer setpoint)
attr di_Thermostat_Wohnzimmer do always
attr di_Thermostat_Wohnzimmer event-on-change-reading SollWohnzimmer
attr di_Thermostat_Wohnzimmer readingList SollWohnzimmer
attr di_Thermostat_Wohnzimmer room 10 Heizung
attr di_Thermostat_Wohnzimmer setList SollWohnzimmer:8,17,18,19,20,21,21.5,22,22.5,23
attr di_Thermostat_Wohnzimmer stateFormat gewaehlt: SollWohnzimmer
attr di_Thermostat_Wohnzimmer webCmd SollWohnzimmer
Ich hatte da bei der readingsgroup ganz hinten di_.* hingeschrieben. Aber das war wohl zu naiv gedacht.
Wie geht es richtig?
He da war ein Grinsgesicht dahinter, ich habe es schon richtig gelesen ;D
Ich bin für DOIF und Readinsgroup nicht so der McGyver ;) aber:
Dein define für die RG enthält dies .*:FILTER=modelId=0148-0003-0001:valve,desiredTemp,temperature,thermostatMode,battery
Das bedeutet nimm jedes Device (.*) welches dem Filter modelId entspricht und dann dort die Readings valve usw.
Da kannst Du nicht einfach mit Komma getrennt die Namen deiner DOIFs dahinter setzen (di_.*) da kannst Du nur ein weiters Reading von der Gruppe Geräte in deinem Filter nehmen!
Was Du dahinter setzen willst ist eine setList und kein Reading, das passt schon vom Namen her nicht.
Allerdings glaube ich, ich habe sowas schon mit einer RG als Lösungsansatz gesehen, aber das hat dann mit deinem DOIF nichts zu tun. Ich bin da aber nicht sicher, kann sein da täusche ich mich.
Gruß Otto
Zitat von: Otto123 am 11 Oktober 2020, 14:37:38
He da war ein Grinsgesicht dahinter, ich habe es schon richtig gelesen ;D
Erschreck mich nicht immer so! Ich dachte ernsthaft, Du wärst beleidigt.
Zitat von: Otto123 am 11 Oktober 2020, 14:37:38
Dein define für die RG enthält dies .*:FILTER=modelId=0148-0003-0001:valve,desiredTemp,temperature,thermostatMode,battery
Das bedeutet nimm jedes Device (.*) welches dem Filter modelId entspricht und dann dort die Readings valve usw.
Das ist klar.
Zitat von: Otto123 am 11 Oktober 2020, 14:37:38
Da kannst Du nicht einfach mit Komma getrennt die Namen deiner DOIFs dahinter setzen (di_.*) da kannst Du nur ein weiters Reading von der Gruppe Geräte in deinem Filter nehmen!
Die Namenskonvention ist (bei mir) identisch. Meine Hoffnung war, dass .* dann auch das zuständige DOIF matcht.
Zitat von: Otto123 am 11 Oktober 2020, 14:37:38
Was Du dahinter setzen willst ist eine setList und kein Reading, das passt schon vom Namen her nicht.
Ich finde mehrere Beiträge, die ich so lesen will, dass das geht. Die Aussage allein nutzt aber wenig. Und leider ist die FHEM-Gemeinde eher nicht so freigiebig mit Beispielen ... wenn wir eins hätten, wäre ich einen großen Schritt weiter.
Hallo curt,
ich denke Du hast (mindestens) 2 Möglichkeiten:
1. deine ReadingsGroup verwenden: schau mal im Wiki readingsgroup:
https://wiki.fhem.de/wiki/ReadingsGroup#Heizungsteuerung_f.C3.BCr_HM_Wand-_und_Heizk.C3.B6rperthermostate (https://wiki.fhem.de/wiki/ReadingsGroup#Heizungsteuerung_f.C3.BCr_HM_Wand-_und_Heizk.C3.B6rperthermostate)
hier mal im Code nach <sollsetz> suchen und die commadref zu readingsgroup, Stichwort "commands" zu Rate ziehen. Ich würde mal behaupten, das ist genau was Du willst (und das DOIF wird wohl gar nicht gebraucht, da die DropDown Auswahl in der Readingsgroup gemacht wird.
2. DOIF. Ich weiss nicht, wie gut Du Dich damit auskennst, aber Damian hat DOIF so vielfältig erweitert, dass das alles in einem einzigen DOIF geht.
Stichworte: uiTable,Template und Perl-Modus. In Deinem Fall geht es ja um eine Tabelle für die Heizungsthermostaten. Im Prinzip stehen in jeder Zeile die verschiedenen Werte sowie die Eingabemöglichkeit. Also brauchst Du die [Device:Reading] definitionen der Werte und ein Select-Widget für die Auswahl.
Dann noch ein Array mit den verschiedenen Thermostatnamen füttern und per FOR-Schleife die Tabelle erzeugen lassen.
3. bestimmt gibts noch mehr....
Falls Du mit DOIF im Perlmodus und uiTable noch nichts am Hut hast, dann kannst Du das ja mit der Readingsgroup mal versuchen. Falls Du DOIF-mäßig schon vorbelastet bist dann würde ich es mit DOIF machen, gerade mit Templates, Generalisierung und uiTable bist Du maximal flexibel. Es ist aber nicht unbedingt die leichteste Übung, da reinzukommen. Aber mit den ersten Erfolgen kommt der Spaß am weitermachen.
Viel Erfolg!