Seite 2 von 3
Re: Regel von Openhab 3.5 auf 4.0 ändern
Verfasst: 23. Okt 2023 06:44
von N1d45
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)
Re: Regel von Openhab 3.5 auf 4.0 ändern
Verfasst: 23. Okt 2023 13:29
von Harka
Mit Blockly in ECMAScript 262 Edition 11erzeugt und leicht nachpolliert.
Solltest auch beide ECMAScript-Versionen gleichzeitig installieren können.
Re: Regel von Openhab 3.5 auf 4.0 ändern
Verfasst: 28. Okt 2023 09:37
von N1d45
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:
Code: Alles auswählen
[ERROR] [ipt.internal.ScriptEngineManagerImpl] - ScriptEngine for language 'application/javascript' could not be found for identifier: 850f53da-7fd2-4478-b0c6-346e71e683f1
Re: Regel von Openhab 3.5 auf 4.0 ändern
Verfasst: 28. Okt 2023 11:35
von udo1toni
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:
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
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.
Re: Regel von Openhab 3.5 auf 4.0 ändern
Verfasst: 28. Okt 2023 12:44
von N1d45
Das heißt indirekt das etwas bei mir nicht richtig installiert ist, wenn Blockly bei mir eine Fehlermeldung wirft? Es scheinst das dieses …
udo1toni hat geschrieben: ↑28. Okt 2023 11:35
…
Blockly GraalVM/JS (wie auch immer...),
…
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.
Re: Regel von Openhab 3.5 auf 4.0 ändern
Verfasst: 28. Okt 2023 14:20
von udo1toni
Wenn Du openHAB4 nutzt, sollte Blockly die neue Engine verwenden.
Re: Regel von Openhab 3.5 auf 4.0 ändern
Verfasst: 28. Okt 2023 15:03
von N1d45
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.
Re: Regel von Openhab 3.5 auf 4.0 ändern
Verfasst: 28. Okt 2023 16:19
von Harka
der Wechsel ist
hier beschrieben. Habe gerade das nachträgliche Installieren der neuen JS-Version unter Settings/Automation/JavaScript Scripting getestet - hier läufts.
Re: Regel von Openhab 3.5 auf 4.0 ändern
Verfasst: 28. Okt 2023 16:29
von N1d45
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
Re: Regel von Openhab 3.5 auf 4.0 ändern
Verfasst: 29. Okt 2023 10:22
von N1d45
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:
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));
};
}