Regel von Openhab 3.5 auf 4.0 ändern
-
- Beiträge: 123
- Registriert: 5. Jan 2020 14:26
Re: Regel von Openhab 3.5 auf 4.0 ändern
Moin. Erst einmal Danke.
Ich werde mich heute Abend mal damit beschäftigen.
Ein paar Fragen dazu:
* Welche Sprache ist es?
* Muss man dazu eine Erweiterung (Automation) installieren?
Ich kann bei mir als Sprache (Skriptart) wählen:
* Blockly
* ECMAScript (ECMA - 262 Edition 5.1) Bedingt durch die Nashorn Erweiterung
* Rule DSL (v1)
Ich werde mich heute Abend mal damit beschäftigen.
Ein paar Fragen dazu:
* Welche Sprache ist es?
* Muss man dazu eine Erweiterung (Automation) installieren?
Ich kann bei mir als Sprache (Skriptart) wählen:
* Blockly
* ECMAScript (ECMA - 262 Edition 5.1) Bedingt durch die Nashorn Erweiterung
* Rule DSL (v1)
-
- Beiträge: 489
- Registriert: 30. Apr 2021 13:13
Re: Regel von Openhab 3.5 auf 4.0 ändern
Mit Blockly in ECMAScript 262 Edition 11erzeugt und leicht nachpolliert.
Solltest auch beide ECMAScript-Versionen gleichzeitig installieren können.
Solltest auch beide ECMAScript-Versionen gleichzeitig installieren können.
-
- Beiträge: 123
- Registriert: 5. Jan 2020 14:26
Re: Regel von Openhab 3.5 auf 4.0 ändern
Muss man, damit man Blockly nutzen kann, eine Java Automation in openHAB installieren?
Ich bekomme selbst bei dem einfachsten Blockly Skripts folgende Fehlermeldung im log:
Ich bekomme selbst bei dem einfachsten Blockly Skripts folgende Fehlermeldung im log:
Code: Alles auswählen
[ERROR] [ipt.internal.ScriptEngineManagerImpl] - ScriptEngine for language 'application/javascript' could not be found for identifier: 850f53da-7fd2-4478-b0c6-346e71e683f1
- udo1toni
- Beiträge: 15247
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Regel von Openhab 3.5 auf 4.0 ändern
In openHAB4.0 verwendet Blockly GraalVM/JS (wie auch immer...), das ist das JavaScript Scripting ohne weitere Information im Namen (also ohne Nashorn), bzw. ECMAScript 2022+, wenn Du Rules erzeugst, ist das ECMAScript 262 Edition 11
Die JavaScript Engine (Nashorn) verwendet ECMAScript 5.1, wenn Du Rules erstellst heißt das ECMA - 262 Edition 5.1
Hier mal die Code Ansicht von einer UI Rule, welche je eine Action mit den beiden Versionen enthält:
Nur bei dem Script mit der ID 2 bietet openHAB aus dem Script Editor heraus an, das Script mittels Blockly zu erstellen (in OH4.1.0 M2)
Die ID 3 ist direkt aus der UI heraus als Blockly Script erzeugt.
Die JavaScript Engine (Nashorn) verwendet ECMAScript 5.1, wenn Du Rules erstellst heißt das ECMA - 262 Edition 5.1
Hier mal die Code Ansicht von einer UI Rule, welche je eine Action mit den beiden Versionen enthält:
Code: Alles auswählen
configuration: {}
triggers: []
conditions: []
actions:
- inputs: {}
id: "1"
configuration:
type: application/javascript;version=ECMAScript-5.1
type: script.ScriptAction
- inputs: {}
id: "2"
configuration:
type: application/javascript
type: script.ScriptAction
- inputs: {}
id: "3"
configuration:
blockSource: <xml xmlns="https://developers.google.com/blockly/xml"></xml>
type: application/javascript
script: ""
type: script.ScriptAction
Die ID 3 ist direkt aus der UI heraus als Blockly Script erzeugt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 123
- Registriert: 5. Jan 2020 14:26
Re: Regel von Openhab 3.5 auf 4.0 ändern
Das heißt indirekt das etwas bei mir nicht richtig installiert ist, wenn Blockly bei mir eine Fehlermeldung wirft? Es scheinst das dieses …
Erst wenn ich ECMAScript 5.1 zusätzlich auswähle, verschwindet die Fehlermeldung. Der generierte Code ist dann aber auch völlig anders.
bei mir nicht funktioniert.
Erst wenn ich ECMAScript 5.1 zusätzlich auswähle, verschwindet die Fehlermeldung. Der generierte Code ist dann aber auch völlig anders.
- udo1toni
- Beiträge: 15247
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Regel von Openhab 3.5 auf 4.0 ändern
Wenn Du openHAB4 nutzt, sollte Blockly die neue Engine verwenden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 123
- Registriert: 5. Jan 2020 14:26
Re: Regel von Openhab 3.5 auf 4.0 ändern
Macht es leider nicht. Zumindest nicht Stand Allone. Deshalb ja die Frage, ob ich da zwingend zusätzlich etwas installieren muss.
Bin gerade unterwegs. Ich muss zuhause mal schauen ob ich dieses GraalVM/JS irgendwie einbinden kann.
Bin gerade unterwegs. Ich muss zuhause mal schauen ob ich dieses GraalVM/JS irgendwie einbinden kann.
-
- Beiträge: 489
- Registriert: 30. Apr 2021 13:13
Re: Regel von Openhab 3.5 auf 4.0 ändern
der Wechsel ist hier beschrieben. Habe gerade das nachträgliche Installieren der neuen JS-Version unter Settings/Automation/JavaScript Scripting getestet - hier läufts.
-
- Beiträge: 123
- Registriert: 5. Jan 2020 14:26
Re: Regel von Openhab 3.5 auf 4.0 ändern
Ja. Das hatte ich schon gelesen.
Ich ging davon aus, wenn man das von openHAB empfohlene Blockly verwenden will, das man nichts zusätzlich installieren muss. Wie es aussieht, muss man aber JS Scripting Addon manuell installieren.
Bzw. hat dies nicht richtig funktioniert beim Upgrade von 3.5 auf 4.0
Ich ging davon aus, wenn man das von openHAB empfohlene Blockly verwenden will, das man nichts zusätzlich installieren muss. Wie es aussieht, muss man aber JS Scripting Addon manuell installieren.
Bzw. hat dies nicht richtig funktioniert beim Upgrade von 3.5 auf 4.0
-
- Beiträge: 123
- Registriert: 5. Jan 2020 14:26
Re: Regel von Openhab 3.5 auf 4.0 ändern
Das Nachinstallieren von Settings/Automation/JavaScript Scripting hat geholfen. Jetzt funktionieren auch von Haus aus mit Blockly erstellte Skripte.
Das einzige was noch nicht funktioniert, ein einzelnes Backslash in einen String über Blockly einzubinden.
Alexa braucht für ein Befehl in der Sprachausgabe eine Markierung von \Befehl\.
Wenn ich in Blockly ein \ schreibe wird automatisch ein \\ daraus.
Ich habe es jetzt händisch ohne Blockly gelöst:
Das einzige was noch nicht funktioniert, ein einzelnes Backslash in einen String über Blockly einzubinden.
Alexa braucht für ein Befehl in der Sprachausgabe eine Markierung von \Befehl\.
Wenn ich in Blockly ein \ schreibe wird automatisch ein \\ daraus.
Ich habe es jetzt händisch ohne Blockly gelöst:
Code: Alles auswählen
/* ECMAScript-11 Part (GraalJS) */
var ausgabeText = '';
var nameTimer = 'FensterTimer';
var timerZeitMinuten = 15;
var temperatur = 17;
function fTimerCode() {
if (items.getItem('OpenWindows').numericState > 0 && items.getItem('SensEgg58_Temperatur').numericState < temperatur) {
ausgabeText = '';
if (((time.ZonedDateTime.now()).hour()) >= 19 || ((time.ZonedDateTime.now()).hour()) <= 6) ausgabeText += '<amazon:effect name="whispered"> ';
if (items.getItem('FensterkontaktBadezimmer_Wert1').state == 'OPEN') ausgabeText += 'Bad <break time =\"200ms\"/>';
if (items.getItem('FensterkontaktBalkon_Wert1').state == 'OPEN') ausgabeText += 'Balkon <break time =\"200ms\"/>';
if (items.getItem('FensterkontaktSchlafzimmer_Wert1').state == 'OPEN') ausgabeText += 'Schlafen<break time =\"200ms\"/>';
if (items.getItem('FensterkontaktBuro_Wert1').state == 'OPEN') ausgabeText += 'Niki <break time =\"200ms\"/>';
if (items.getItem('FensterkontaktKinderzimmer_Wert1').state == 'OPEN') ausgabeText += 'Kinder <break time =\"200ms\"/>';
if (items.getItem('FensterkontaktWohnzimmer_Wert1').state == 'OPEN') ausgabeText += 'Wohnen <break time =\"200ms\"/>';
if (items.getItem('FensterkontaktKuche_Wert1').state == 'OPEN') ausgabeText += 'Küche <break time =\"200ms\"/>';
ausgabeText += 'Fenster schließen';
if (((time.ZonedDateTime.now()).hour()) >= 19 || ((time.ZonedDateTime.now()).hour()) <= 6) ausgabeText += '</amazon:effect>';
console.info(ausgabeText);
if (((time.ZonedDateTime.now()).hour()) <= 21 && ((time.ZonedDateTime.now()).hour()) >= 8) items.getItem('EchoNici_Sprich').sendCommand(ausgabeText);
items.getItem('EchoWohnen_Sprich').sendCommand(ausgabeText);
items.getItem('EchoKuche_Sprich').sendCommand(ausgabeText);
items.getItem('EchoBad_Sprich').sendCommand(ausgabeText);
if (cache.private.exists(nameTimer)) cache.private.get(nameTimer).reschedule(time.ZonedDateTime.now().plusMinutes(timerZeitMinuten));
}
}
if (items.getItem('SensEgg58_Temperatur').numericState < temperatur) {
if (cache.private.exists(nameTimer) === false || cache.private.get(nameTimer).hasTerminated()) {
cache.private.put(nameTimer, actions.ScriptExecution.createTimer(nameTimer, time.ZonedDateTime.now().plusMinutes(timerZeitMinuten), function () {
fTimerCode();
}));
} else {
cache.private.get(nameTimer).reschedule(time.ZonedDateTime.now().plusMinutes(timerZeitMinuten));
};
}