Ich habe ein Problem, das eine Regel, die in 3.4 funktionierte, jetzt in 4.0 nicht mehr funktioniert. (Eigentlich zwei Regeln, aber erst einmal die eine Baustelle)
Es ist eine Regel, die eine Sprachausgabe auf Amazon Echos steuert, falls ich die Fenster beim Lüften vergesse zu schließen.
Über einen Timer soll nach 10 Minuten, wiederholend auf weitere 10 Minuten, auf den Echos ausgegeben werden, welche Fenster geschlossen werden sollen.
Die Ausgabe auf die Echos, habe ich schon erfolgreich angepasst. Sie funktioniert auch, wenn ich alles was mit Zeit und Timer zu tun hat, auskommentiere. Leider finde ich nicht die Information, wahrscheinlich weil ich gar nicht so richtig weiß wo und nach was ich suchen soll, im Netz nicht, wie ich es anpassen soll.
Im Moment sieht der Code noch so aus, der nicht funktioniert.
Code: Alles auswählen
var scriptExecution = Java.type('org.openhab.core.model.script.actions.ScriptExecution');
var zdt = Java.type('java.time.ZonedDateTime');
var text = ''; // Text den Alexa ausgibt
var temperatur = 25; // Außentemperatur, die unterschritten sein muss, um das Skript auszuführen
var timerZeitMinuten = 10; // Zeit in Minuten, die der Timer laufen soll
if (typeof this.timers === 'undefined') {
this.timers = [];
}
function fTimerCode() { // Code nach ablauf des Timers
if (OpenWindows.state > 0 // Wenn Fenster noch offen
&& SensEgg58_Temperatur.state < temperatur) { // UND wenn Temperatur noch unterschritten
text = '';
if (zdt.now().getHour() >= 20 || zdt.now().getHour() <= 5){
text = text + '<amazon:effect name="whispered"> ';
EchoKuche_SprichLautstarke.sendCommand(30);
EchoWohnen_SprichLautstarke.sendCommand(30);
}
if (FensterkontaktBadezimmer_Wert1.state == 'OPEN') text = text + 'Bad <break time =\"200ms\"/>';
if (FensterkontaktBalkon_Wert1.state == 'OPEN') text = text + 'Balkon <break time =\"200ms\"/>';
if (FensterkontaktSchlafzimmer_Wert1.state == 'OPEN') text = text + 'Schlafzimmer <break time =\"200ms\"/>';
if (FensterkontaktBuro_Wert1.state == 'OPEN') text = text + 'Niki <break time =\"200ms\"/>';
if (FensterkontaktKinderzimmer_Wert1.state == 'OPEN') text = text + 'Kinder <break time =\"200ms\"/>';
if (FensterkontaktWohnzimmer_Wert1.state == 'OPEN') text = text + 'Wohnen <break time =\"200ms\"/>';
if (FensterkontaktKuche_Wert1.state == 'OPEN') text = text + 'Küche <break time =\"200ms\"/>';
text = text + 'Fenster schließen';
if (zdt.now().getHour() >= 20 || zdt.now().getHour() <= 5) text = text + '</amazon:effect>';
if (zdt.now().getHour() <= 21 && zdt.now().getHour() >= 8) { // Wenn im Zeitfenster
EchoNici_Sprich.sendCommand(text); // Ausgabe Echo Nici
}
EchoWohnen_Sprich.sendCommand(text); // Ausgabe Echo Wohnen
EchoKuche_Sprich.sendCommand(text); // Ausgabe Echo Küche
EchoBad_Sprich.sendCommand(text); // Ausgabe Echo Bad
EchoKuche_SprichLautstarke.sendCommand(20);
EchoWohnen_SprichLautstarke.sendCommand(20);
if (typeof this.timers['FensterTimer'] !== 'undefined') { // Wenn Timer nicht das gleiche wie undefinierd
this.timers['FensterTimer'].reschedule(zdt.now().plusMinutes(timerZeitMinuten)); // Starte Timer neu
}
}
//}
if (SensEgg58_Temperatur.state() < temperatur) { // Nur ausführen, wenn Außentemperatur unter (Damit nicht Timer unnötig erstellt werden und die Lautstärke unnötig geändert wird)
if (typeof this.timers['FensterTimer'] === 'undefined' || this.timers['FensterTimer'].hasTerminated()) { // Wenn der Timer nicht definiert oder abgelaufen
this.timers['FensterTimer'] = scriptExecution.createTimer(zdt.now().plusMinutes(timerZeitMinuten), fTimerCode) // Erstelle einen Timer und führe Funktion aus
}
else {
this.timers['FensterTimer'].reschedule(zdt.now().plusMinutes(timerZeitMinuten)); // Setzt den Timer neu, wenn der Rule Trigger erneut auslöst und Bedingung (Temperatur) oben erfüllt ist
}
}
Code: Alles auswählen
// var scriptExecution = Java.type('org.openhab.core.model.script.actions.ScriptExecution');
// var zdt = Java.type('java.time.ZonedDateTime');
var text = ''; // Text den Alexa ausgibt
var temperatur = 25; // Außentemperatur, die unterschritten sein muss, um das Skript auszuführen
var timerZeitMinuten = 10; // Zeit in Minuten, die der Timer laufen soll
/* if (typeof this.timers === 'undefined') {
this.timers = [];
} */
// function fTimerCode() { // Code nach ablauf des Timers
if (OpenWindows.state > 0 // Wenn Fenster noch offen
&& SensEgg58_Temperatur.state < temperatur) { // UND wenn Temperatur noch unterschritten
text = '';
/* if (zdt.now().getHour() >= 20 || zdt.now().getHour() <= 5){
text = text + '<amazon:effect name="whispered"> ';
EchoKuche_SprichLautstarke.sendCommand(30);
EchoWohnen_SprichLautstarke.sendCommand(30);
} */
if (FensterkontaktBadezimmer_Wert1.state == 'OPEN') text = text + 'Bad <break time =\"200ms\"/>';
if (FensterkontaktBalkon_Wert1.state == 'OPEN') text = text + 'Balkon <break time =\"200ms\"/>';
if (FensterkontaktSchlafzimmer_Wert1.state == 'OPEN') text = text + 'Schlafzimmer <break time =\"200ms\"/>';
if (FensterkontaktBuro_Wert1.state == 'OPEN') text = text + 'Niki <break time =\"200ms\"/>';
if (FensterkontaktKinderzimmer_Wert1.state == 'OPEN') text = text + 'Kinder <break time =\"200ms\"/>';
if (FensterkontaktWohnzimmer_Wert1.state == 'OPEN') text = text + 'Wohnen <break time =\"200ms\"/>';
if (FensterkontaktKuche_Wert1.state == 'OPEN') text = text + 'Küche <break time =\"200ms\"/>';
text = text + 'Fenster schließen';
/* if (zdt.now().getHour() >= 20 || zdt.now().getHour() <= 5) text = text + '</amazon:effect>';
if (zdt.now().getHour() <= 21 && zdt.now().getHour() >= 8) { // Wenn im Zeitfenster
EchoNici_Sprich.sendCommand(text); // Ausgabe Echo Nici
} */
EchoWohnen_Sprich.sendCommand(text); // Ausgabe Echo Wohnen
EchoKuche_Sprich.sendCommand(text); // Ausgabe Echo Küche
EchoBad_Sprich.sendCommand(text); // Ausgabe Echo Bad
EchoKuche_SprichLautstarke.sendCommand(20);
EchoWohnen_SprichLautstarke.sendCommand(20);
/* if (typeof this.timers['FensterTimer'] !== 'undefined') { // Wenn Timer nicht das gleiche wie undefinierd
this.timers['FensterTimer'].reschedule(zdt.now().plusMinutes(timerZeitMinuten)); // Starte Timer neu
} */
}
//}
/* if (SensEgg58_Temperatur.state() < temperatur) { // Nur ausführen, wenn Außentemperatur unter (Damit nicht Timer unnötig erstellt werden und die Lautstärke unnötig geändert wird)
if (typeof this.timers['FensterTimer'] === 'undefined' || this.timers['FensterTimer'].hasTerminated()) { // Wenn der Timer nicht definiert oder abgelaufen
this.timers['FensterTimer'] = scriptExecution.createTimer(zdt.now().plusMinutes(timerZeitMinuten), fTimerCode) // Erstelle einen Timer und führe Funktion aus
}
else {
this.timers['FensterTimer'].reschedule(zdt.now().plusMinutes(timerZeitMinuten)); // Setzt den Timer neu, wenn der Rule Trigger erneut auslöst und Bedingung (Temperatur) oben erfüllt ist
}
} */
Edit: Und hier noch der Code, der mit 3.5 noch funktioniert hat.
Code: Alles auswählen
var scriptExecution = Java.type('org.openhab.core.model.script.actions.ScriptExecution');
var zdt = Java.type('java.time.ZonedDateTime');
var text = ''; // Text den Alexa ausgibt
var temperatur = 15; // Außentemperatur, die unterschritten sein muss, um das Skript auszuführen
var timerZeitMinuten = 10; // Zeit in Minuten, die der Timer laufen soll
if (typeof this.timers === 'undefined') {
this.timers = [];
}
function fTimerCode() { // Code nach ablauf des Timers
if (itemRegistry.getItem('OpenWindows').getState() > 0 // Wenn Fenster noch offen
&& itemRegistry.getItem('SensEgg58_Temperatur').getState() < temperatur) { // UND wenn Temperatur noch unterschritten
text = '';
if (zdt.now().getHour() >= 19 || zdt.now().getHour() <= 6) text = text + '<amazon:effect name="whispered"> ';
if (itemRegistry.getItem('FensterkontaktBadezimmer_Wert1').getState() == 'OPEN') text = text + 'Bad <break time =\"200ms\"/>';
if (itemRegistry.getItem('FensterkontaktBalkon_Wert1').getState() == 'OPEN') text = text + 'Balkon <break time =\"200ms\"/>';
if (itemRegistry.getItem('FensterkontaktSchlafzimmer_Wert1').getState() == 'OPEN') text = text + 'Schlafzimmer <break time =\"200ms\"/>';
if (itemRegistry.getItem('FensterkontaktBuro_Wert1').getState() == 'OPEN') text = text + 'Niki <break time =\"200ms\"/>';
if (itemRegistry.getItem('FensterkontaktKinderzimmer_Wert1').getState() == 'OPEN') text = text + 'Kinder <break time =\"200ms\"/>';
if (itemRegistry.getItem('FensterkontaktWohnzimmer_Wert1').getState() == 'OPEN') text = text + 'Wohnen <break time =\"200ms\"/>';
if (itemRegistry.getItem('FensterkontaktKuche_Wert1').getState() == 'OPEN') text = text + 'Küche <break time =\"200ms\"/>';
text = text + 'Fenster schließen';
if (zdt.now().getHour() >= 19 || zdt.now().getHour() <= 6) text = text + '</amazon:effect>';
if (zdt.now().getHour() <= 21 && zdt.now().getHour() >= 8) { // Wenn im Zeitfenster
events.sendCommand('EchoNici_Sprich', text); // Ausgabe Echo Nici
}
events.sendCommand('EchoWohnen_Sprich', text); // Ausgabe Echo Wohnen
events.sendCommand('EchoKuche_Sprich', text); // Ausgabe Echo Küche
events.sendCommand('EchoBad_Sprich', text); // Ausgabe Echo Bad
if (typeof this.timers['FensterTimer'] !== 'undefined') { // Wenn Timer nicht das gleiche wie undefinierd
this.timers['FensterTimer'].reschedule(zdt.now().plusMinutes(timerZeitMinuten)); // Starte Timer neu
}
}
}
if (itemRegistry.getItem('SensEgg58_Temperatur').getState() < temperatur) { // Nur ausführen, wenn Außentemperatur unter (Damit nicht Timer unnötig erstellt werden)
if (typeof this.timers['FensterTimer'] === 'undefined' || this.timers['FensterTimer'].hasTerminated()) { // Wenn der Timer nicht definiert oder abgelaufen
this.timers['FensterTimer'] = scriptExecution.createTimer(zdt.now().plusMinutes(timerZeitMinuten), fTimerCode) // Erstelle einen Timer und führe Funktion aus
}
else {
this.timers['FensterTimer'].reschedule(zdt.now().plusMinutes(timerZeitMinuten)); // Setzt den Timer neu, wenn der Rule Trigger erneut auslöst und Bedingung (Temperatur) oben erfüllt ist
}
}