Rule um TV einzuschalten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

fly
Beiträge: 11
Registriert: 9. Feb 2018 23:00
Answers: 0

Re: Rule um TV einzuschalten

Beitrag von fly »

Code: Alles auswählen

// import org.openhab.core.library.types.*
import java.util.Calendar
// import java.util.Date
import java.util.TimeZone
 
rule "PIR - Bewegung im Haus wurde erkannt"
when
    Item PIR received update
    
then
    var local_time = java::util::Calendar::getInstance(TimeZone::getTimeZone("Europe/Berlin"))
    postUpdate(PRAESENZ_PIR, new DateTimeType(local_time))
       

end

rule "anwesend"

when 
	Item anwesend changed to ON

then	

        Wohnzimmer_Target.postUpdate(20)
        Wohnzimmer_Target.sendCommand(20)
        sendCommand(Steckdose, ON)
        sendCommand(Steckdose2, ON)
        sendCommand(fboxWifi24, ON)
        sendCommand(fboxWifi50, ON)
        // sendCommand(anwesend, OFF)
end

rule "abwesend"

when 
	Item anwesend changed to OFF

then	

        Wohnzimmer_Target.postUpdate(10)
        Wohnzimmer_Target.sendCommand(10)
        sendCommand(Steckdose, OFF)
        sendCommand(fboxWifi24, OFF)
        sendCommand(fboxWifi50, OFF)

end

rule "WLAN"

when 
	Item fboxWifi24 changed to ON

then	

        sendCommand(fboxWifi50, ON)
      
end

// rule "Wakeup"

// when 
//	    Time cron "0 00 07 ? * MON-FRI "  
// then

// callScript("dimmlight")

// end


 rule "Runterregeln"

when     Item Balkontuer1 changed to OPEN

then          

         Temp_Buero_set_TEMP.postUpdate(Wohnzimmer_Target.state)   // Wohnzimmer_Target.state   
         sendCommand(Wohnzimmer_Target, 6)
 end  


rule "Anheizen"  

when    
          Item Balkontuer1 changed to CLOSED

then      

              // sendCommand(Wohnzimmer_Target, (Temp_Buero_set_TEMP.state as DecimalType)) 
              Wohnzimmer_Target.sendCommand(Temp_Buero_set_TEMP.state as Number)

end

rule "IR"

when
    Item IR7 received update
then
    switch IR7.state {
        case "0x5EA138C7": 
           
        TV.sendCommand(transform("MAP","IR.map",0))
     
       
   }
end

rule "Test"
when
    Item TV1 received update
then
            
  TV.sendCommand(transform("MAP","IR.map",0))
    
      
end

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

Re: Rule um TV einzuschalten

Beitrag von udo1toni »

Also, das ist die ganze Datei... Aber sei's drum. Ein paar Anmerkungen...

Das eine ist die Formatierung, es ist sinnvoll, sich anzugewöhnen, Rules sauber zu formatieren, das hilft, den Code zu lesen.

Das zweite sind die sendCommand(String,String) und postUpdate(String,String) Actions, die solltest Du wenn immer möglich vermeiden. Es gibt Konstrukte, da ist es einfacher, die Action zu verwenden (wenn der Name des Items nicht feststeht, sondern als String berechnet wird), aber normalerweise ist die Action nicht sinnvoll.
Der Unterschied zwischen Action und Methode ist, dass die Methoden Item.sendCommand(Command) und Item.postUpdate(State) nicht ausschließlich Strings als Parameter akzeptieren. Das kann zum Problem werden.

Ansonsten machst Du Dir das Leben unnötig schwer. Beispielsweise die 1. Rule, die einen Zeitstempel speichert. Wenn Du das Item persistierst, kannst Du den Zeitstempel einfach auslesen. Für den aktuellen Status geht das sogar ohne Persistence. Voraussetzung ist natürlich, dass Systemzeit und Zeitzone korrekt gesetzt sind :) Falls Du also eine "falsche" Uhrzeit erhältst, solltest Du die Ursache bekämpfen (Systemzeit anpassen und evtl. openHAB zwingen, diese Zeit zu verwenden), statt der Symptome.

Statt zwei Rules, bei denen die eine den Change auf ON triggert und die andere den Change auf OFF triggert, bietet es sich an, eine Rule zu verwenden, die nur auf changed triggert und anschließend im then-Teil zu entscheiden, was zu tun ist.

Code: Alles auswählen

/*
// import org.openhab.core.library.types.*
import java.util.Calendar
// import java.util.Date
import java.util.TimeZone

rule "PIR - Bewegung im Haus wurde erkannt"
when
    Item PIR received update
then
    var local_time = java::util::Calendar::getInstance(TimeZone::getTimeZone("Europe/Berlin"))
    PRAESENZ_PIR.postUpdate(new DateTimeType(local_time))
end
*/

rule "Anwesenheit"
when
    Item anwesend changed
then
    if(anwesend.state == ON) {
        Wohnzimmer_Target.sendCommand(20)
        Steckdose.sendCommand(ON)
        Steckdose2.sendCommand(ON)
        fboxWifi24.sendCommand(ON)
        fboxWifi50.sendCommand(ON)
    } else {
        Wohnzimmer_Target.sendCommand(10)
        Steckdose.sendCommand(OFF)
        fboxWifi24.sendCommand(OFF)
        fboxWifi50.sendCommand(OFF)
    }
end

rule "WLAN"
when 
    Item fboxWifi24 changed to ON
then
    fboxWifi50.sendCommand(ON)
end

rule "Frostschutz"
when
    Item Balkontuer1 changed
then
    if(Balkontuer1.state == OPEN) {
        Temp_Buero_set_TEMP.postUpdate(Wohnzimmer_Target.state as Number)   // Wohnzimmer_Target.state
        Wohnzimmer_Target.sendCommand(6)
    } else {
        Wohnzimmer_Target.sendCommand(Temp_Buero_set_TEMP.state as Number)
    }
end

rule "IR"
when
    Item IR7 received update
then
    switch IR7.state {
        case "0x5EA138C7": 
            TV.sendCommand(0)
   }
end

rule "Test"
when
    Item TV1 received update
then
    TV.sendCommand(0)
end
Ich habe die Regeln nicht weiter getestet. Es gibt aber ein paar wichtige Regeln. z.B. sollte man, wenn man auf einen Status zugreift, der dann als Zahl verwendet wird, den Status auch explizit nach Number casten (... as Number), aber Vorsicht! Es könnte auch sein, dass der Status eines Number Items keine gültige Zahl enthält, dann löst das Type Casting eine Null Pointer Exception aus. Es ist also besser, vorher zu testen, ob der Typ passt, das geht mit if(Item.state instanceof Number). In der vorliegenden Regel "Frostschutz" ist das allerdings nicht ganz so einfach, denn was soll die Rule tun, wenn kein gültiger Wert vorliegt? (Das gilt aber auch für Deine Version).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

fly
Beiträge: 11
Registriert: 9. Feb 2018 23:00
Answers: 0

Re: Rule um TV einzuschalten

Beitrag von fly »

Vielen Dank für die Hilfe, jetzt funktioniert es!

Antworten