Zeitabhängige Steuerungen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Luemmelpaeppi
Beiträge: 21
Registriert: 20. Mär 2020 09:46
Answers: 0

Zeitabhängige Steuerungen

Beitrag von Luemmelpaeppi »

Hallo ich komme nicht weiter und hoffe das die Community helfen kann.
Ich komme so langsam an den Punkt, das mein Openhab 2 langsam wird und es eine gewisse Zeit braucht bis es sich durch die Regeln gearbeitet hat und etas schaltet. Ich würde mich gern an Openhab 3 ran wagen und meine erste Frage ist es, macht es Sinn weiter in DSL zu schreiben oder sich auf ein der beiden alternativen zu konzentrieren? Ich habe Variablen und Werte die in mehreren .rules Daten zubinden sind. Kann man die auch zentralisieren? Also das man die nicht in jeder .rules Datei neu schreibt sondern das diese am Anfang der Datei abgerufen wird? Ich habe in OH3 mich mal an die GUI Regelerstellung gesetzt und frage mich, wie ich da mit den Variablen arbeiten kann oder gibt es die Möglichkeit die Variablen "Auszulagern" als Items und ich dann den Wert der Items abrufe?

Mein aktueller Code für ein Bewegungsmelder, das dieser das Licht an und nach einer Zeit wieder ausmacht aus OH2

Code: Alles auswählen

var String Color_Global = "30,64,100"
var Timer Bath_Timer = null

rule "Automation Light Bathroom"
when 
        Item MotionSensorPresence_Bath1 changed to ON or
        Item MotionSensorPresence_Bath2 changed to ON
then
        if(Automation_03.state == ON)
        {
        GLight_Bath_Ceiling_Color.sendCommand(Color_Global)
        Bath_Timer?.cancel
    Bath_Timer = createTimer(now.plusMinutes(1), [|
        GLight_Bath_Ceiling_Color.sendCommand(OFF) 
    ])      
        }
end
Mit 4 weiteren Regeln habe ich das bisher so gesteuert, dass das Licht zu unterschiedlichen Zeiten gedimmt wird.

Wie kann mit dem Befehl GLight_Bath_Ceiling_Color.sendCommand(Color_Global) die Werte aus einer ITEM Datei beziehen ? Da bekomme ich aktuell einen Fehler.

[internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Rules-1' failed: An error occurred during the script execution: Could not invoke method: org.openhab.core.model.script.actions.BusEvent.sendCommand(org.openhab.core.items.Item,java.lang.Number) on instance: null in Rules

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

Re: Zeitabhängige Steuerungen

Beitrag von udo1toni »

Was soll denn Color_Global sein? ist das ein Item? Dann müsstest Du mindestens den Status verwenden, also Color_Global.state. Eventuell ist Color_Global.state.toString notwendig.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Luemmelpaeppi
Beiträge: 21
Registriert: 20. Mär 2020 09:46
Answers: 0

Re: Zeitabhängige Steuerungen

Beitrag von Luemmelpaeppi »

Hey Udo, früher war Color_Global eine Variable habe es jetzt in ein Item verwandet. Dieser wird jetzt 4mal durch zeitabhängige Regeln verändert. Soweit funktioniert es auch alles super. Danke für den Tipp =)

Luemmelpaeppi
Beiträge: 21
Registriert: 20. Mär 2020 09:46
Answers: 0

Re: Zeitabhängige Steuerungen

Beitrag von Luemmelpaeppi »

Kann mir jemand helfen?
Ich möchte gerne das erst der Timer gestartet wird, wenn beide Sensoren "OFF" melden. Dieser soll aber unterbrochen werden, wenn wieder eine Bewegung in der Zeit in die der Timer läuft bemerkt wird und dann von vorne starten wenn beide Sensoren "OFF" melden.

Mein Code ( In Javascript geschrieben):

Code: Alles auswählen

var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);
var ScriptExecution = Java.type("org.openhab.core.model.script.actions.ScriptExecution");
var ZonedDateTime   = Java.type("java.time.ZonedDateTime");

var Bath_Timer;

if (itemRegistry.getItem('MotionSensorPresence_Bath1').getState() == 'ON' || itemRegistry.getItem('MotionSensorPresence_Bath1').getState() == 'ON') {
  events.sendCommand('GLight_Bath_Ceiling_Color', itemRegistry.getItem('varColor_Global').getState());
  logger.info('Bewegung im Bad erkannt');
  /* if (Bath_Timer.timer != undefined) {
  Bath_Timer.timer.cancel();
  Bath_Timer.timer = undefined;
}*/
}
if (itemRegistry.getItem('MotionSensorPresence_Bath1').getState() == 'OFF' && itemRegistry.getItem('MotionSensorPresence_Bath1').getState() == 'OFF') {
    Bath_Timer = ScriptExecution.createTimer(ZonedDateTime.now().plusSeconds(45), function(){
       events.sendCommand('GLight_Bath_Ceiling_Color', 'OFF'); 
       Bath_Timer = null;
});
}

harteknut
Beiträge: 235
Registriert: 3. Dez 2019 08:21
Answers: 9

Re: Zeitabhängige Steuerungen

Beitrag von harteknut »

Mit JavaScript kenn ich mich nicht aus, habe aber ein bisschen Rule-Erfahrung, damit ein paar Hinweise:
- Wenn Du den Timer mit den von Dir beschriebenen Bedingungen starten und abbrechen willst, würde ich die beiden Switches in eine Switch-Group (mit „:OR(ON, OFF) packen. Dann reicht es, den Status dieses Items zu überwachen.
- Um die Rule zu starten, benötigst Du ein Trigger-Ereignis, da reicht das „if-Statement“ nicht aus. Ich würde „when Item gGruppe changed from OFF to ON“ wählen
- Den Timer kannst Du als Variable anlegen, dann kannst Du ihn mit der einen Rule starten und mit einer anderen abbrechen.

Antworten