Rules Probleme

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

fmmephisto

Rules Probleme

Beitrag von fmmephisto »

Hallo zusammen,

Ich stehe mit diesen Rules in OpenHAB wirklich auf Kriegsfuß.

Ich habe einen Türkontakt für die Haustür, eine HUE Lampe Farbig und einen Point, der ON/OFF ist (zeigt an, ob die Alarmanlage an oder aus ist).
Verstanden habe ich: Trigger ist der Auslöser. Also sage ich: Wenn der Türkontakt auf „OPEN“ geht.

Dann soll ein Script ausgeführt werden. Habe mich mit Blockly, ECMA und DSL versucht. Aber ich bin zu dumm für sowas. :-)
Es soll nämlich nun der Status des POINT abgefragt werden. Wenn der ON ist, soll die Lampe rot leuchten und nach 5 Sekunden aus gehen.
Wenn der POINT OFF ist, soll die Lampe grün leuchten und nach 5 Sekunden ausgehen

Also sieht mein Script in DSL so aus:

if (Zustand_Alarmanlage == ON) {
Alarm_Light_Farbe.sendCommand("358,100,100")
} else {
Alarm_Light_Farbe.sendCommand("110,100,100")
}
end

Thread::sleep(5000)
Alarm_Light_Farbe.sendCommand("OFF")

Leider macht die Rule gar nichts.
Ich finde auch keine ordentliche Anleitung im Netz, wie man DSL programmiert. Die tollen Videos machen alles andere, nicht das was ich brauche.
Dass was dort gezeigt wird, kann ich auch…
Klar… ich kann zwei Rules bauen:

1. Rule:
WHEN Trigger ist der Türkontakt = OPEN

THEN Script
Alarm_Light_Farbe.sendCommand("358,100,100")
Thread::sleep(5000)
Alarm_Light_Farbe.sendCommand("OFF")

BUT ONLY IF Zustand_Alarmanlage == ON

2. Rule:
WHEN Trigger ist der Türkontakt = OPEN

THEN Script
Alarm_Light_Farbe.sendCommand("110,100,100")
Thread::sleep(5000)
Alarm_Light_Farbe.sendCommand("OFF")

BUT ONLY IF Zustand_Alarmanlage == OFF


Aber es kann ja nicht im Sinne des Erfinders sein, dass man im Script keine If then else Anweisung einbauen kann, oder?
Ich habe noch kein Script im internet gefunden…. Ist das wirklich so kompliziert?

Ich brauche doch eigentlich zum Programmieren meiner Regeln nur folgendes:
- auslesen von items (items.messagetext in Java kann ich, verstehe nicht, warum man sowas kompliziertes wie „ itemRegistry.getItem('RST2_Heizkorperthermostat_Windfang_Luftfeuchtigkeit').getState“ verwenden muss… Das Ergebnis ist das gleiche…)

- schreiben in items (events.sendCommand('Laden_EQA', OFF); in Java kann ich)

- if then else Sätze

- Timer (geht wie oben beschrieben in Java und DSL)

- Versand von Mails/WhatsApp/Nachrichten (das kann ich in Java)

Wo kann man die Grundsätze von Rules und Scripten mal lernen? Wie gesagt, die Tutorials könnte ich alle selber machen, die bringen mich nicht weiter. Vielleicht finde ich auch nicht die richtigen. Das Problem ist, deutschsprachiges Material zu finden. Das ist nur was für Engländer und Amerikaner…. Daher bin ich froh, dass das Forum hier deutsch spricht.

Danke an alle… :-)
von Harka » 8. Jan 2023 21:15
Hi,
viele Wege führen nach Rom. Die Regel von oh73 in JavaScript sieht so aus.

Code: Alles auswählen

var scriptExecution = Java.type('org.openhab.core.model.script.actions.ScriptExecution');

var zdt = Java.type('java.time.ZonedDateTime');

if (typeof this.timers === 'undefined') {
  this.timers = [];
}


if (itemRegistry.getItem('Zustand_Alarmanlage').getState() == 'ON') {
  events.sendCommand('Alarm_Light_Farbe', '358,100,100');
} else if (itemRegistry.getItem('Zustand_Alarmanlage').getState() == 'OFF') {
  events.sendCommand('Alarm_Light_Farbe', '110,100,100');
}
if (typeof this.timers['tAlarmPeriod'] === 'undefined' || this.timers['tAlarmPeriod'].hasTerminated()) {
  this.timers['tAlarmPeriod'] = scriptExecution.createTimer(zdt.now().plusSeconds(5), function () {
    events.sendCommand('Alarm_Light_Farbe', 'OFF');
    })
}
Hier musst Du noch als Auslöser When Türkontakt change to OPEN auswählen.

PS: ist mit Blockly erstellt. Wenn Du dort rechts unten klickst wechselt Du in die Code-Ansicht. Habe ich anfangs auch nur genutzt um Bausteine für JavaScript zu erstellen. Nach einiger Gewöhnung ist Blockly gar nicht mehr so "komisch" und wird auch mit jedem Update besser. JavaScript ist wohl nur wegen Blockly bei OH als Scriptsprache dabei. Für Hilfe im Forum ist DSL aber noch das Beste.
AlarmFarbe.jpg
Gehe zur vollständigen Antwort

Locke
Beiträge: 251
Registriert: 14. Apr 2020 11:35
Answers: 3
Wohnort: bei Hamburg

Re: Rules Probleme

Beitrag von Locke »

fmmephisto hat geschrieben: 8. Jan 2023 16:58

Hi fmmephisto,
ich probiere mich auch gerade in Blockly aus, deshalb ohne Garantie das es so funktioniert.
Das wäre meine Idee es zu versuchen.
Kannst ja mal den Code bei Blockly einfügen und testen.

Denke mal das sich noch wer mit Erfahrung melden wird.

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: TEST_Tuerkontakt
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      blockSource: <xml xmlns="https://developers.google.com/blockly/xml"><block
        type="controls_if" id="F}F^`y[dA,{(n^U9Yi9J" x="270" y="169"><mutation
        elseif="1"></mutation><value name="IF0"><block type="logic_operation"
        id="P-j*y?Q*s}FMPzr6g,q2"><field name="OP">AND</field><value
        name="A"><block type="logic_compare" id="aVzUvik-?S@@Lv+qA3-?"><field
        name="OP">EQ</field><value name="A"><block type="oh_getitem_state"
        id="PpT;{P@h.fn4*`xoDvKR"><value name="itemName"><shadow type="oh_item"
        id="5W(D;Jk(#`9U2_fyQ?lx"><field
        name="itemName">TEST_Tuerkontakt</field></shadow></value></block></value><value
        name="B"><block type="text" id="g6EXM;/Y@B2o.Ho84hM,"><field
        name="TEXT">OPEN</field></block></value></block></value><value
        name="B"><block type="logic_compare" id="cBUk|@wCFh+d0ZvE3ngf"><field
        name="OP">EQ</field><value name="A"><block type="oh_getitem_state"
        id="g^g_Rt~?AIMnSEbG`=z%"><value name="itemName"><shadow type="oh_item"
        id=".ip7|?9-s$+Aa!!aV8#i"><field
        name="itemName">TEST_Zustand_Alarmanlage</field></shadow></value></block></value><value
        name="B"><block type="text" id="ml+(+3uVCEAPmXJhTg@?"><field
        name="TEXT">ON</field></block></value></block></value></block></value><statement
        name="DO0"><block type="oh_event" id="=dG2yB8QjZ#dXYIQ|VsQ"><field
        name="eventType">sendCommand</field><value name="value"><shadow
        type="text" id="vX;WR~Eaa0bBM_D}tQMg"><field
        name="TEXT">value</field></shadow><block type="oh_color_to_hsb"
        id="FY3*+YtbnepgPSll;aSK"><value name="hexColor"><shadow
        type="colour_picker" id=",Le9Q`vOkCE*J@F.*7OP"><field
        name="COLOUR">#ff0000</field></shadow></value></block></value><value
        name="itemName"><shadow type="oh_item" id="B2gTM1,OC4S0UCeUM{Gz"><field
        name="itemName">TEST_Alarm_Light_Farbe</field></shadow></value><next><block
        type="oh_sleep" id="?,XyK2Srv*2D%yb]gcgX"><field
        name="milliseconds">5000</field><next><block type="oh_event"
        id="KY=ns`H2{[a@}eCHDvq*"><field
        name="eventType">sendCommand</field><value name="value"><shadow
        type="text" id="N|J6rT:j@v^Dr.0u/z{/"><field
        name="TEXT">OFF</field></shadow></value><value name="itemName"><shadow
        type="oh_item" id="1cP.h;{MV`h^TiNwJwC{"><field
        name="itemName">TEST_Alarm_Light_Farbe</field></shadow></value></block></next></block></next></block></statement><value
        name="IF1"><block type="logic_operation"
        id="7``Lb?ERbfl@=ioXk8N$"><field name="OP">AND</field><value
        name="A"><block type="logic_compare" id="g.lxFGpDR77xZhW]OQ(x"><field
        name="OP">EQ</field><value name="A"><block type="oh_getitem_state"
        id="u1Ixk/jpoY;#K=RG%mA."><value name="itemName"><shadow type="oh_item"
        id="aCgq5S}^Wr0dp0b]UE{#"><field
        name="itemName">TEST_Tuerkontakt</field></shadow></value></block></value><value
        name="B"><block type="text" id="#OT}OvjU$U.l?Dm,hWH,"><field
        name="TEXT">OPEN</field></block></value></block></value><value
        name="B"><block type="logic_compare" id="fvd!_dz:HGofgs7po%)S"><field
        name="OP">EQ</field><value name="A"><block type="oh_getitem_state"
        id="1CH//pOM,q-BntX0go+$"><value name="itemName"><shadow type="oh_item"
        id="u%tHtPW:WYsJ7onjM]=K"><field
        name="itemName">TEST_Zustand_Alarmanlage</field></shadow></value></block></value><value
        name="B"><block type="text" id="$,UXYzsE61-s({wsy2m_"><field
        name="TEXT">OFF</field></block></value></block></value></block></value><statement
        name="DO1"><block type="oh_event" id="rVWb:@CQS[+/M))Vva!R"><field
        name="eventType">sendCommand</field><value name="value"><shadow
        type="text"><field name="TEXT">value</field></shadow><block
        type="oh_color_to_hsb" id="[5^3.I@;4hfB%U$^Swh:"><value
        name="hexColor"><shadow type="colour_picker"
        id="4xsR,IT|bKn=ZF#0;ooo"><field
        name="COLOUR">#33cc00</field></shadow></value></block></value><value
        name="itemName"><shadow type="oh_item" id="j+!NTTP}`v@2[vnPSHH9"><field
        name="itemName">TEST_Alarm_Light_Farbe</field></shadow></value><next><block
        type="oh_sleep" id="sa8n2_DS9FK$nkl.?JMc"><field
        name="milliseconds">5000</field><next><block type="oh_event"
        id="n,LG;inm{Cps,[zML`C]"><field
        name="eventType">sendCommand</field><value name="value"><shadow
        type="text" id="Ktw/LR_MEwoOzrh5J|qF"><field
        name="TEXT">OFF</field></shadow></value><value name="itemName"><shadow
        type="oh_item" id="cJn#b9!O.94V.#E~@JJh"><field
        name="itemName">TEST_Alarm_Light_Farbe</field></shadow></value></block></next></block></next></block></statement></block></xml>
      type: application/javascript
      script: >
        function colorHexToHSB (hexColor) {
          var rgb = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hexColor);
          if (!rgb) return '';
          var r = parseInt(rgb[1], 16) / 255, g = parseInt(rgb[2], 16) / 255, b = parseInt(rgb[3], 16) / 255;
          var v = Math.max(r, g, b), n = v - Math.min(r, g, b);
          var h = n === 0 ? 0 : n && v === r ? (g - b) / n : v === g ? 2 + (b - r) / n : 4 + (r - g) / n;
          return [60 * (h < 0 ? h + 6 : h), v && (n / v) * 100, v * 100].join(',');
        }


        var thread = Java.type('java.lang.Thread')



        if (itemRegistry.getItem('TEST_Tuerkontakt').getState() == 'OPEN' && itemRegistry.getItem('TEST_Zustand_Alarmanlage').getState() == 'ON') {
          events.sendCommand('TEST_Alarm_Light_Farbe', colorHexToHSB('#ff0000'));
          thread.sleep(5000);
          events.sendCommand('TEST_Alarm_Light_Farbe', 'OFF');
        } else if (itemRegistry.getItem('TEST_Tuerkontakt').getState() == 'OPEN' && itemRegistry.getItem('TEST_Zustand_Alarmanlage').getState() == 'OFF') {
          events.sendCommand('TEST_Alarm_Light_Farbe', colorHexToHSB('#33cc00'));
          thread.sleep(5000);
          events.sendCommand('TEST_Alarm_Light_Farbe', 'OFF');
        }
    type: script.ScriptAction
thnx
____Sven_________________________________________________________________________________________
System 1, Raspberry Pi 4, 4GB RAM, openHAB 2.5.10 / System 2, Raspberry Pi 4, 2GB RAM, openHAB 3.3.0 /
System 3, Raspberry Pi 4, 2GB RAM, openHAB 4.0.2 / System 4 (Testsystem), Raspberry Pi 4, 2GB RAM, openHAB 4.1.1 / System 5, (als NAS) Raspberry PI 4, 4 GB RAM, openmediavault 6.8.0-1 (Shaitan)

fmmephisto

Re: Rules Probleme

Beitrag von fmmephisto »

Hallo Sven!

Vielen Dank für Deine Mühe.
Echt klasse. Leider verstehe ich das ganze nicht wirklich…. Das was da so alles drin steht…. OMG.

Probiere es gerade mit meinen Programmierkenntnissen aus anderen Programmiersprachen.
Wie gesagt: Blockly ist nichts für mich, da ich mit dieser Logik null klarkomme. Ich versuche mich aktuell in JavaScript.

Ich finde es toll, wenn man 3 verschiedene Möglichkeiten hat, in OpenHAB rules anzulegen. Blockly scheidet aus, da ich mit dieser Art zu programmieren nicht im geringsten arbeiten kann. Bleibt nur noch DSL oder JAVA…. Da ich im Netz mehr über JAVA finde als über DSL versuche ich es lieber damit.

Mal schauen, ob noch jemand helfen kann oder ob ich meinen Fehler selbst finde. :-)

Danke und einen schönen Abend Richtung Hamburg!!!

Gruß
Frank

Locke
Beiträge: 251
Registriert: 14. Apr 2020 11:35
Answers: 3
Wohnort: bei Hamburg

Re: Rules Probleme

Beitrag von Locke »

HiFrank,
ist ok wenn Du es lieber per DSL machst.
Zum Testen könntest Du ja den Code einfach mal in eine neue Regel einfügen und Dir dann anschauen/testen mit Blockly.
thnx
____Sven_________________________________________________________________________________________
System 1, Raspberry Pi 4, 4GB RAM, openHAB 2.5.10 / System 2, Raspberry Pi 4, 2GB RAM, openHAB 3.3.0 /
System 3, Raspberry Pi 4, 2GB RAM, openHAB 4.0.2 / System 4 (Testsystem), Raspberry Pi 4, 2GB RAM, openHAB 4.1.1 / System 5, (als NAS) Raspberry PI 4, 4 GB RAM, openmediavault 6.8.0-1 (Shaitan)

oh73
Beiträge: 302
Registriert: 7. Mär 2021 14:49
Answers: 1

Re: Rules Probleme

Beitrag von oh73 »

Hallo,
ich hab meine Rules alle in DSL,
ist gar nicht so schwer, wenn man die Grundbegriffe kapiert hat.

hier mal mein Vorschlag für deine Rule,

Code: Alles auswählen

var Timer Alarm = null			// Timer auf null setzen

rule "Alarm"

when 
	Item Türkontakt changed			// sicher ob Umlaut in dem Itemname? würde ich nicht machen!
then
	if (Zustand_Alarmanlage.state == ON) {
		Alarm_Light_Farbe.sendCommand("358,100,100")		
	} else {
		Alarm_Light_Farbe.sendCommand("110,100,100")
	}
	Alarm?.cancel
		Alarm = createTimer(now.plusSeconds(5), [
			Alarm_Light_Farbe.sendCommand(OFF)		
		])
	Alarm = null	
end
bei dem sendCommand Befehl für die Farbe weiß ich nicht ob die Anführungszeichen rein müssen oder dürfen?
OH 4.3.0 auf HP 26o G1 Dm Mini Pc mit MX_Linux

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

Re: Rules Probleme

Beitrag von int5749 »

fmmephisto hat geschrieben: 8. Jan 2023 19:28
Mal schauen, ob noch jemand helfen kann oder ob ich meinen Fehler selbst finde. :-)
Dann versuche ich mal etwas zu unterstützen, auch wenn dies sicher noch optimiert werden kann. Ich habe auch noch alles zu 100% in DSL und Blockly ist auch hfür mich nix. Gerade weil es dort auch Einschränkungen gibt, welche nur über DSL zu lösen sind und schon wäre es ein Mix aus beiden.

Code: Alles auswählen

var Timer tAlarmPeriod = null // Variablen müssen ganz oben in der *.rules Datei stehen

rule "Alarmanlage"      // Eine DSL Rule braucht einen Namen
when                    // Eine DSL-Rules muss getriggert werden
    Item TriggerItem_notwendig_zB_Türkontakt changed to OFF
then                    // wenn getriggert, dann ..
    if (Zustand_Alarmanlage == ON) {
        Alarm_Light_Farbe.sendCommand("358,100,100")
    } else {
        Alarm_Light_Farbe.sendCommand("110,100,100")
    }
	tAlarmPeriod?.cancel								// timer beenden, falls vorhanden
    tAlarmPeriod = createTimer(now.plusSeconds(5),[|    // Starte 5s Timer
        Alarm_Light_Farbe.sendCommand("OFF")
    ])
end                     // Eine DSL Rules hat eine ENDE
Wichtig ist der Rahmen einer DSL Rule
- Name
- Trigger
- Aktion

Und bitte keinen ThreadSleep, dies legt Dein System entsprechend schlafen. Da nur begrenzte Anzahl an Threads gleichzeitig laufen können, blockierst Du so Dein System. Besser sind hier Timer.

Habe ich auch schmerzlich gelernt, da mit ThreadSleep schon einiges an Kummer bereitet hatte ;-)

VG

Edith: Da war @oh73 schneller :lol: Aber der Weg scheint ja ähnlich zu sein.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

fmmephisto

Re: Rules Probleme

Beitrag von fmmephisto »

Hi zusammen!

Vielen Dank euch allen.
Ich denke, dass ich die Logiken auch drauf habe. Es ist immer die Frage der Syntax. Ohne zu wissen, wie man if then schleifen baut, wie man die Objekte (hier items/Points) abfragt bzw. wie man Daten dort hineinschreibt, wie ein Timer gebaut wird kann ich so logisch vorgehen und wissen was ich will bis der Arzt kommt. Es bringt halt nur nichts.

Habe jetzt schon viel gelernt (auch wenn es DSL ist, was ich nicht wollte!!!! :-)

1. Variablen immer am Anfang definieren (Gut… kenn ich aus den anderen Sprachen auch. Frage: was für Variablenarten gibt es denn im DSL (hier ist ja nur TIMER genannt)
2. man braucht noch einen Namen (((( ich mache das doch beim Anlegen der Rule… wieso muss ich das hier nochmal reinschreiben???)
3. Trigger…. Okay.. den trage ich doch auch über die UI ein…. Wieso muss der jetzt im Script übernommen werden? Oder ist das ein anderer?

Irgendwie verwirrt ihr mich nochmehr als vorher?

Da ich die Mail/Whatsapp/Mitteilungen OpenHAB schon in Java kann, würde ich gerne die Scripte auch in Java schreiben.
Da trage ich den Trigger übrigens auch über die UI ein…. Ich brauche nur die Syntax von den IF THEN und den Timer….

Java und DSL ist doch wieder unterschiedlich und ich will jetzt nicht 2 Sprachen lernen. Das verwirrt noch viel mehr.

Kann mir jemand sagen, wie ich einen Timer in JavaScript anspreche?

Danke und Gruß
Frank

fmmephisto

Re: Rules Probleme

Beitrag von fmmephisto »

Vielleicht habe ich mich auch falsch ausgedrückt:

Ich schreibe meine Rules über die UI über „Create Rules“.
Den Namen der Rule, die Trigger und Conditions trage ich dort ein.
Aber die Actions werden im Sript geschrieben. Dort habe dann die Möglichkeit über dieses Blockly, über ECMAScrip (also javascript) und über RULE DSL. Schon wird es verzwickt, da das Script in RULE DSL geschrieben wird. Ich glaube, da muss man nochmal irgendwie mit dem Wording was anpassen. :-) Es ist ja eigentlich ein DSL Script!
Für mich kommt javascript meinen erlernten Sprachen am nächsten.

Ich habe die Vermutung, dass Ihr eure Rules irgendwie mit einem Texteditor schreibt und die dann irgendwie einbaut, oder die Trigger und Conditions über die UI auszuwählen, richtig? Anders machen Eure Aussagen für mich keinen Sinn.

Mag auch daran liegen, dass ich noch nicht so lange bei OpenHAB bin… Alle anderen Programmiersprachen habe ich irgendwie einfacher lernen können, weil es keine OPEN-SOURCE Dinge waren und es ausreichend Lehrmaterial auch in Deutsch gibt. Bei OpenHAB ist das wirklich mühsam und sehr anstrengend für mich.

Aber ich schiebe das einfach mal auf meine Person. :-) :-)

Viele Grüße
Frank

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Rules Probleme

Beitrag von Harka »

Hi,
viele Wege führen nach Rom. Die Regel von oh73 in JavaScript sieht so aus.

Code: Alles auswählen

var scriptExecution = Java.type('org.openhab.core.model.script.actions.ScriptExecution');

var zdt = Java.type('java.time.ZonedDateTime');

if (typeof this.timers === 'undefined') {
  this.timers = [];
}


if (itemRegistry.getItem('Zustand_Alarmanlage').getState() == 'ON') {
  events.sendCommand('Alarm_Light_Farbe', '358,100,100');
} else if (itemRegistry.getItem('Zustand_Alarmanlage').getState() == 'OFF') {
  events.sendCommand('Alarm_Light_Farbe', '110,100,100');
}
if (typeof this.timers['tAlarmPeriod'] === 'undefined' || this.timers['tAlarmPeriod'].hasTerminated()) {
  this.timers['tAlarmPeriod'] = scriptExecution.createTimer(zdt.now().plusSeconds(5), function () {
    events.sendCommand('Alarm_Light_Farbe', 'OFF');
    })
}
Hier musst Du noch als Auslöser When Türkontakt change to OPEN auswählen.

PS: ist mit Blockly erstellt. Wenn Du dort rechts unten klickst wechselt Du in die Code-Ansicht. Habe ich anfangs auch nur genutzt um Bausteine für JavaScript zu erstellen. Nach einiger Gewöhnung ist Blockly gar nicht mehr so "komisch" und wird auch mit jedem Update besser. JavaScript ist wohl nur wegen Blockly bei OH als Scriptsprache dabei. Für Hilfe im Forum ist DSL aber noch das Beste.
AlarmFarbe.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Harka am 8. Jan 2023 21:21, insgesamt 1-mal geändert.

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

Re: Rules Probleme

Beitrag von int5749 »

fmmephisto hat geschrieben: 8. Jan 2023 21:08 Ich habe die Vermutung, dass Ihr eure Rules irgendwie mit einem Texteditor schreibt und die dann irgendwie einbaut, oder die Trigger und Conditions über die UI auszuwählen, richtig? Anders machen Eure Aussagen für mich keinen Sinn.
Richtig, Frank.

Wie oben beschrieben über Visual Studio Code (kostenlos) und alles über "text"-Dateien direkt im Dateisystem.
Änderungen oder auch neue Dateien werden direkt on the fly von openHAB zur Laufzeit eingelesen.

Für mich am übersichtichsten, da ich alles items, things und Rules in Dateien habe und zwischen Systemen (PRod und Test) kopieren kann, oder auch mal schnell für andere anpassen kann ;-)

Es git auch diverse Threads hier zu VS Code ;-)
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Antworten