Zeitversetzt von zwei Relais

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
LutzTH
Beiträge: 34
Registriert: 22. Feb 2020 18:43

Zeitversetzt von zwei Relais

Beitrag von LutzTH »

Ich habe zwei Relais, welche in einen Abstand von 1 sec., jeweils für 0,5 sec eingeschaltet sind. Hiermit schalte ich im Kühlschrank die Tasten.
Ich schaltet das erste Relais, welches nach 0,5 sec wieder ausgeschaltet wird. Danach wird 1 sec. gewartet und das 2. Relais für 0,5 sec eingeschaltet.

So wie die Rule aufgebaut ist funktioniert es leider nicht. Das 1. Relais schaltet 0,5 sec dann wird es mit einer 1 sec Verzögerung an das 2. Relais übergeben. Dieses schaltet aber 2 mal. Das ist auch im log ersichtlich. Offensichtlich wird ein Wert an die rule. 1.2 übergeben welches dann das 2. Relais nochmals schaltet.

Rule 1.1 ist für das 1. Relais
Rule 1.2 ist für die zeitversetzte Übergabe an Relais 2
Rule. 1.3 ist für das 2. Relais

Was mir jetzt aufgefallen ist, wenn ich openhab neu starte schaltet das 2. Relais kurz.
Wo liegt mein Fehler???
// Rolle für die Ralais, welches im Kühlschrank verbaut ist.
var Timer V_Kuehlschrank_Frost_01 = null
var Timer V_Kuehlschrank_Cold_01 = null
var Timer V_Kuehlschrank_Frost_to_Cold = null

rule "1.1 Kuehlschrank_Frost ON OFF"
when
Item K_Kuehlschrank_Frost received update ON
then
if(V_Kuehlschrank_Frost_01 === null) {
//logInfo("Kuehlschrank_Frost", "Setting to ON/OFF for Frost")
V_Kuehlschrank_Frost_01 = createTimer(now.plusMillis(500), [|
logInfo("Kuehlschrank_Frost", "Setting to ON/OFF for Frost")
//L_Light.postUpdate(OFF)
sendCommand(K_Kuehlschrank_Frost, OFF)
V_Kuehlschrank_Frost_01 = null
])
} else {
//logInfo("L_Dreambox", "Timer rescheduled for L_Dreambox")
// V_Dreambox_01.reschedule(now.plusSeconds(5))
}
end
//########################################################################
rule "1.2 Kuehlschrank_Frost übergibt von Frost to Cold ON"
when
Item K_Kuehlschrank_Frost received update OFF
then
if(V_Kuehlschrank_Frost_to_Cold === null) {
//logInfo("Kuehlschrank_Frost", "Setting to ON/OFF for Frost")
V_Kuehlschrank_Frost_to_Cold = createTimer(now.plusMillis(2000), [|
logInfo("Kuehlschrank_Frost", "Übergabe an coldSwitch")
//L_Light.postUpdate(OFF)
sendCommand(K_Kuehlschrank_Cold, ON)
V_Kuehlschrank_Frost_to_Cold = null
])
} else {
//logInfo("L_Dreambox", "Timer rescheduled for L_Dreambox")
// V_Dreambox_01.reschedule(now.plusSeconds(5))
}
end
//#####################################################################################

rule "1.3 Kuehlschrank_cold ON OFF"
when
Item K_Kuehlschrank_Cold received update ON
then
if(V_Kuehlschrank_Cold_01 === null) {
//logInfo("Kuehlschrank_Frost", "Setting to ON/OFF for Frost")
V_Kuehlschrank_Cold_01 = createTimer(now.plusMillis(500), [|
logInfo("Kuehlschrank_Cold", "Setting to ON/OFF for Cold")
//L_Light.postUpdate(OFF)
sendCommand(K_Kuehlschrank_Cold, OFF)
V_Kuehlschrank_Cold_01 = null
])
} else {
//logInfo("L_Dreambox", "Timer rescheduled for L_Dreambox")
// V_Dreambox_01.reschedule(now.plusSeconds(5))
}
end

Benutzeravatar
udo1toni
Beiträge: 13955
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Zeitversetzt von zwei Relais

Beitrag von udo1toni »

So macht man das ja auch nicht ;)

Du willst eine einfache Ablaufsteuerung. Wird der Vorgang ausgelöst, so läüft ein Programm ab, welches die entsprechenden Zeitabstände einhält. So:

Code: Alles auswählen

var Timer tFridge = null
var Integer iFridge = 0

rule "Kühlschrank steuern"
when
    Item Frostschalter received command
then
    if(tFridge !== null)
        return;
    iFridge = 0
    tFridge = createTimer(now,[|
        iFridge = iFridge + 1
        switch(iFridge) {
            case 1: {
                K_Kuehlschrank_Frost.sendCommand(ON)
                iFridge.reschedule(now.plusMillis(500))
            }
            case 2: {
                K_Kuehlschrank_Frost.sendCommand(OFF)
                iFridge.reschedule(now.plusMillis(1000))
            }
            case 3: {
                K_Kuehlschrank_Cold.sendCommand(ON)
                iFridge.reschedule(now.plusMillis(500))
            }
            case 4: {
                K_Kuehlschrank_Cold.sendCommand(OFF)
                iFridge = null
            }
        }
    ])
end
Du brauchst ein eigenes Steueritem, welches in die UI kommt, um die Rule auszulösen.
Wird dieses Item per Befehl getriggert, so prüft die Rule, ob bereits ein Timer läuft. Ist das der Fall, so wird ide Rule abgebrochen ohne weiteres zu tun.
Läuft noch kein Timer, so wird der Zähler auf 0 gesetzt und anschließend der Timer angelegt, welcher auch sofort startet. Die Rule ist damit beendet.
Nun läuft der Timercode, welcher den Zähler um 1 erhöht und anschließend prüft, welchen Wert der Zählerstand hat. Bei 1 wird Relais 1 eingeschaltet, bei 2 wird es ausgeschaltet, bei 3 wird Relais 2 eingeschaltet, bei 4 wird es ausgeschaltet. Weiterhin wird in den ersten 3 Fällen der Timer erneut geplant, jeweils mit dem entsprechenden Abstand. Im 4. Fall wird der Zeiger auf den Timer noch geleert, damit der Timer für die nächste Ausführung wieder bereit ist.

Eine Rule. ;)

Solltest Du das Ganze auch in umgekehrter Reihenfolge brauchen (um von Cold auf Frost zuschalten), wäre es sinnvoll, dies beides in einer einzigen Rule abzuhandeln und die Reihenfolge vom empfangenen Kommando (ON oder OFF) des UI Schalters abhängig zu machen. Allerdings geht das nicht zuverlässig direkt (das hängt mit dem Timing in openHAB zusammen). Der Aufbau der Rule ist aber ähnlich simpel.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

LutzTH
Beiträge: 34
Registriert: 22. Feb 2020 18:43

Re: Zeitversetzt von zwei Relais

Beitrag von LutzTH »

Vielen Dank für Deine schnelle Antwort. Es gibt halt viele Wege nach Rom. ;-) Und deine Rule ist bei weitem einfacher aufgebaut. Eine virtuellen Schalter habe ich angelegt.
Allerdings funktioniert die Rule nicht. "K_Kuehlschrank_Frost.sendCommand(ON)" wird noch ausgeführt, aber dann stopt das Script. Es werden Fehlermeldungen im log angezeigt, welche ich nicht nachvollziehen kann.
2021-03-07 19:26:10.913 [ERROR] [org.quartz.core.JobRunShell ] - Job DEFAULT.Timer 41 2021-03-07T19:26:10.897+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

<null>.iFridge = <XBinaryOperationImplCustom>

org.eclipse.xtext.xbase.impl.XSwitchExpressionImpl@7bbf92

} ] threw an unhandled Exception:

java.lang.reflect.UndeclaredThrowableException: null

at com.sun.proxy.$Proxy267.apply(Unknown Source) ~[?:?]

at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]

at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [bundleFile:?]

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]

Caused by: org.eclipse.smarthome.model.script.engine.ScriptExecutionException: 'reschedule' is not a member of 'java.lang.Integer'; line 16, column 17, length 39

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:133) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:861) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:231) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:495) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:267) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

... 4 more

2021-03-07 19:26:10.941 [ERROR] [org.quartz.core.ErrorLogger ] - Job (DEFAULT.Timer 41 2021-03-07T19:26:10.897+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

<null>.iFridge = <XBinaryOperationImplCustom>

org.eclipse.xtext.xbase.impl.XSwitchExpressionImpl@7bbf92

} ] threw an exception.

org.quartz.SchedulerException: Job threw an unhandled exception.

at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [bundleFile:?]

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]

Caused by: java.lang.reflect.UndeclaredThrowableException

at com.sun.proxy.$Proxy267.apply(Unknown Source) ~[?:?]

at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]

at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

... 1 more

Caused by: org.eclipse.smarthome.model.script.engine.ScriptExecutionException: 'reschedule' is not a member of 'java.lang.Integer'; line 16, column 17, length 39

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:133) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:861) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:231) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:495) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:267) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

at com.sun.proxy.$Proxy267.apply(Unknown Source) ~[?:?]

at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]

at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

... 1 more
Dann habe ich noch eine weitere Frage. Gibt es in der GUI auch eine Taste als Icon zum Tasten (mit einer Funktion) oder wirklich nur den Switch zum ON/OFF Schalten.
Bild

LutzTH
Beiträge: 34
Registriert: 22. Feb 2020 18:43

Re: Zeitversetzt von zwei Relais

Beitrag von LutzTH »

Was hältst du denn davon. Habe ich gerade gefunden, durch deine Hilfe.
https://community.openhab.org/t/simple- ... -help/6012

Code: Alles auswählen

rule "ON/OFF cold and Frost"
when
Item V_Switch_Frostswitch received command ON
then
K_Kuehlschrank_Frost.sendCommand(ON)
Thread::sleep(500)
K_Kuehlschrank_Frost.sendCommand(OFF)
Thread::sleep(1500)
K_Kuehlschrank_Cold.sendCommand(ON)
Thread::sleep(500)
K_Kuehlschrank_Cold.sendCommand(OFF)
Thread::sleep(500)
V_Switch_Frostswitch.sendCommand(OFF)
end
Zuletzt geändert von LutzTH am 7. Mär 2021 21:13, insgesamt 1-mal geändert.

int5749
Beiträge: 1161
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Zeitversetzt von zwei Relais

Beitrag von int5749 »

LutzTH hat geschrieben: 7. Mär 2021 19:45 Allerdings funktioniert die Rule nicht. "K_Kuehlschrank_Frost.sendCommand(ON)" wird noch ausgeführt, aber dann stopt das Script. Es werden Fehlermeldungen im log angezeigt, welche ich nicht nachvollziehen kann.
Kurze Frage von mir, da ich vermute, dass dies nicht die einzige Regel in der Datei ist.

Code: Alles auswählen

var Timer tFridge = null
var Integer iFridge = 0
Steht gaaaanz oben in der Datei, quasi als erstes? Gerne hinten anderen Definitionen, aber auf jeden Fall vor der ersten Rule?
Dies wäre wichtig.

Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

LutzTH
Beiträge: 34
Registriert: 22. Feb 2020 18:43

Re: Zeitversetzt von zwei Relais

Beitrag von LutzTH »

Es ist die einzige Rule in der Datei. So wie Udo vorgeschlagen.

int5749
Beiträge: 1161
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Zeitversetzt von zwei Relais

Beitrag von int5749 »

LutzTH hat geschrieben: 7. Mär 2021 21:11 Es ist die einzige Rule in der Datei. So wie Udo vorgeschlagen.
OK, da hat sich ein copy/paste Fehler eingeschlichen

Code: Alles auswählen

var Timer tFridge = null
var Integer iFridge = 0

rule "Kühlschrank steuern"
when
    Item Frostschalter received command
then
    if(tFridge !== null)
        return;
    iFridge = 0
    tFridge = createTimer(now,[|
        iFridge = iFridge + 1
        switch(iFridge) {
            case 1: {
                K_Kuehlschrank_Frost.sendCommand(ON)
                tFridge.reschedule(now.plusMillis(500))
            }
            case 2: {
                K_Kuehlschrank_Frost.sendCommand(OFF)
                tFridge.reschedule(now.plusMillis(1000))
            }
            case 3: {
                K_Kuehlschrank_Cold.sendCommand(ON)
                tFridge.reschedule(now.plusMillis(500))
            }
            case 4: {
                K_Kuehlschrank_Cold.sendCommand(OFF)
                tFridge = null
            }
        }
    ])
end
Jetzt kommt es noch darauf an, ob Du unter OH2 oder OH3 arbeitest?? Denn OH3 unterstützt nicht mehr das Joda Zeitformat und kann nicht mehr mit now.plusMillis() arbeiten. Ein Ersatz wäre now.plusSeconds() aber nur mit vollen Sekunden oder, wenn es eine halbe Sekunde sein soll müsste now.plusNanos(500000000) funktionieren
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

LutzTH
Beiträge: 34
Registriert: 22. Feb 2020 18:43

Re: Zeitversetzt von zwei Relais

Beitrag von LutzTH »

Vielen Dank. Ich habe schon vermutet das ein Zeichen fehlt. Ich habe noch 2.5 im Einsatz.

Ich finde aber diese Möglichkeit einfacher oder spricht was dagegen.
rule "ON/OFF cold and Frost"
when
Item V_Switch_Frostswitch received command ON
then
K_Kuehlschrank_Frost.sendCommand(ON)
Thread::sleep(500)
K_Kuehlschrank_Frost.sendCommand(OFF)
Thread::sleep(1500)
K_Kuehlschrank_Cold.sendCommand(ON)
Thread::sleep(500)
K_Kuehlschrank_Cold.sendCommand(OFF)
Thread::sleep(500)
V_Switch_Frostswitch.sendCommand(OFF)
end

Benutzeravatar
udo1toni
Beiträge: 13955
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Zeitversetzt von zwei Relais

Beitrag von udo1toni »

Da spricht sehr viel dagegen. Thread::sleep() macht exakt das, was der Name sagt. Es hält den Thread für die gegebene Zeit an. Dies sind in diesem Fall also 3000 Millisekunden. Das hört sich erst mal nach wenig an, aber openHAB hat insgesamt nur 5 Threads für die Ruleabarbeitung, mit einer einzelnen Rule in diesem Stil kann es also noch einigermaßen laufen, aber wer mit solchem Schmu anfängt, führt das erfahrungsgemäß auch in anderen Rules fort... und dann heißt es plötzlich "Mein System ist so langsam". Also Wehret den Anfängen.

Abgesehen davon gibt es noch einen zusätzlichen Haken, der in "meiner" Rule elegant mit erledigt wird. Meine Rule kann beliebig oft getriggert werden, der Befehl wird aber insgesamt nur einmal ausgeführt (wenn die Trigger im Zeitraum der Ausführungsdauer erfolgen). Die Rule prüf, ob der Timer läuft, ist das der Fall, bricht sie die Bearbeitung sofort ab.
Eine Rule mit Thread::sleep() müsste z.B. ein lock() einbauen, um verhindern, dass sie mehrfach gestartet wird. Allerdings wird das lock() meist so umgesetzt, dass die Rule dann gepuffert wird. Sie wird also zwar nicht zeitgleich mehrfach ausgeführt (was dann dazu führen könnte, dass die Relais munter wild durcheinander schalten, immerhin kann die Rule bis zu 5 mal parallel laufen), aber dafür wird der Ablauf für jeden Trigger ausgeführt, sobald der Lock wieder aufgehoben ist. All das wird über den Timer sehr elegant abgefangen.

iFridge statt tFridge, kleiner Fehler, große Wirkung... ;) Und ich habe das ja schon in einem anderen Thread erwähnt... die eigenen Fehler fallen einem nicht auf, bei anderen sieht man sie sofort... :)

Was übrigens OH3 betrifft: Die Rule läuft (bis auf die geänderten Aufrufe wegen JavaTime statt JodaTime) unverändert, solange sie aus einer *.rules Datei heraus läuft. Das ist essenziell, denn leider stehen nur dort globale Variablen zur Verfügung. Aber da in den ursprünglichen Rules schon plusMillis verwendet wurde, habe ich das mal als OH2-System identifiziert...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

LutzTH
Beiträge: 34
Registriert: 22. Feb 2020 18:43

Re: Zeitversetzt von zwei Relais

Beitrag von LutzTH »

Hallo Udo,

vielen Dank für deine Mühe und deine sehr ausführliche Antwort. Ich habe deine Rule verwendet und auch noch im letzten Case 4 ein OFF für den virtuellen Schalter verwendet. Habe noch keine Möglichkeit gefunden einen normalen Taster auch grafisch abzubilden.
Weiterhin wäre es wünschenswert wenn ich solche Scripte im Vorfeld auch debuggen könnte. Ich glaube es gibt die Möglichkeit im Visual Studio Code. Da werde ich mich mal damit beschäftigen. Ist aber alles immer zeit-aufreibend als Anfänger.

Antworten