Ankündigung

Einklappen
Keine Ankündigung bisher.

HomeMatic Funk-Fenster-Drehgriffkontakt (076789 / HM-Sec-RHS) einbinden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    HomeMatic Funk-Fenster-Drehgriffkontakt (076789 / HM-Sec-RHS) einbinden

    Hallo!

    Ich arbeite mich weiter in die Tiefen von openHAB vor. Mein nächstes HomeMatic Produkt das ich einbinden möchte ist ein Funk-Fenster-Drehgriffkontakt (HM-Sec-RHS). Dieser hat laut HomeMatic Datenpunkt-Definition drei States:
    • 0 = CLOSED (Standard)
    • 1 = TILTED
    • 2 = OPEN

    Im Unterschied zum 4er Funktaster von HomeMatic (HM-PBI-4-FM), bei dem die unterschiedlichen Tastendrücke als Parameter übergeben werden. (Siehe hierzu den Beitrag von Siva) Wird beim HM-Sec-RHS ein Status übergeben. Den frage ich über ein Number Item in der .items Datei ab:
    Code:
    Number HM_Sec_RHS_GaesteWC "Fenster Gäste WC" {homematic="address=LEQ0123456, channel=1, parameter=STATE"}
    Als Rückmeldung bekomme ich die Werte 0, 1 & 2. Hierzu dann in der .rules Datei folgendes hinterlegt und schon ist der HomeMatic Funk-Fenster-Drehgriffkontakt eingebunden:
    Code:
    rule "GaesteWC offen"
    when
    	Item HM_Sec_RHS_GaesteWC changed to 2
    then
    	var String command = script + "Das Fenster ist offen"
    	executeCommandLine(command)		
    	sendCommand(hue1, OFF)
    end	
    
    rule "GaesteWC gekippt"
    when
    	Item HM_Sec_RHS_GaesteWC changed to 1
    then
    	var String command = script + "Das Fenster ist gekippt"
    	executeCommandLine(command)
    	sendCommand(hue1, ON)
    end
    
    rule "GaesteWC zu"
    when
    	Item HM_Sec_RHS_GaesteWC changed to 0
    then
    	var String command = script + "Das Fenster ist geschlossen"
    	executeCommandLine(command)
    	sendCommand(hue1, OFF)
    end
    Ich hab somit mein openHAB auch schon zum Sprechen bekommen. Hier hat mir auch Sivas Beitrag auf den Sprung gebracht und ich habe folgendes Script eingebunden.

    Natürlich macht es wie oben gezeigt keinen Sinn sofort nach dem Fenster öffnen zu sagen "Das Fenster ist offen". Sinnvoll wäre es jedoch nach 5 Minuten. Hier habe ich jetzt auch gegooglet und bin auf folgendes gestossen:

    Item loops with delay

    Ich verstehe jedoch den Syntax von "now.plusSeconds(i)" nicht. Kann mir da jemand auf die Sprünge helfen?

    Über die Dokumentation von Xtend bin ich leider auch nicht weiter gekommen.

    Vielen Dank!

    #2
    So, ich hab jetzt noch etwas rumgespielt. Meine Rules sehen so aus und es scheint zu funktionieren:

    Code:
    var Timer FensterTimer = null
    
    rule "GaesteWC offen"
    when
    	Item HM_Sec_RHS_GaesteWC changed to 2
    then
    	FensterTimer = createTimer(now.plusMinutes(5)) [|
     	 	var String command = script + "Das Fenster ist seit 5 Minuten offen"
    		executeCommandLine(command)
    	
    		sendCommand(hue1, ON)
    		sendCommand(Color_1, "0,100,100") // Farbe rot
    	]
    	sendCommand(hue1, ON)
    	sendCommand(Color_1, "120,100,100") // Farbe grün			
    end	
    
    rule "GaesteWC gekippt"
    when
    	Item HM_Sec_RHS_GaesteWC changed to 1
    then
    	FensterTimer = createTimer(now.plusMinutes(7)) [|
    	var String command = script + "Das Fenster ist seit 7 Minuten gekippt"
    	executeCommandLine(command)
    
    	sendCommand(hue1, ON)
    	sendCommand(Color_1, "240,100,100") // Farbe blau
    	]
    	sendCommand(hue1, ON)
    	sendCommand(Color_1, "120,100,100") // Farbe grün
    end
    
    rule "GaesteWC zu"
    when
    	Item HM_Sec_RHS_GaesteWC changed to 0
    then
    	FensterTimer.cancel
    	var String command = script + "Das Fenster ist geschlossen"
    	executeCommandLine(command)
    	sendCommand(hue1, OFF)
    end
    Ist das so richtig oder kann man das besser machen?

    Gibt es ne Möglichkeit die Sprachausgabe jede Minute zu wiederholen, so lange das Fenster offen ist?

    Auch möchte ich die Philips Hue eigentlich nicht ausschalten, wenn das Fenster wieder zu ist, sondern in den Ausgangszustand zurückversetzen. Dafür müsste ich aber vorher den Status abfragen und in einer (mehrerer) Variablen zwischenspeichern. Kann mir jemand sagen, wie das geht?

    (Ich komme aus der Arduino-Welt (C++) und hab hier wohl noch viel zu lernen. Ich muss sagen, die Dokumentation von Xtend finde ich nicht wirklich übersichtlich. Zu dem Timer-Befehlen hab ich dort gar nichts gefunden.)

    Kommentar


      #3
      Zitat von Ion Beitrag anzeigen
      Ist das so richtig oder kann man das besser machen?
      Das ist so noch nicht ganz richtig: was passiert, wenn jemand das Fenster kippt, nach 2 Minuten ganz öffnet, und nach weiteren 2 Minuten wieder schließt?

      Da du den ersten Timer nicht gecancelt hast, wird er dich trotzdem volllabern.
      DistKV, Home Assistant, 1wire, KNX, Python, Asterisk, SMD-Lötkolben

      Kommentar


        #4
        Hi,

        es sollte, so wie du es dir vorgestellt hast, funktionieren abgesehen von dem Fehler, was Smurf genannt hat. Ich hätte da eine kleine Verbesserung. Es wird ein wenig unübersichtlich, wenn du für jedes Fenster 3 Regeln definieren würdest.

        Code:
        var Timer FensterTimer = null
        
        rule "GaesteWC offen"
        when
            Item HM_Sec_RHS_GaesteWC received command
        then
            switch receivedCommand {
                case 0: {
                    logDebug("Fenster", "Fenster zu", null)
                    if(FensterTimer != null) {
                        FensterTimer.cancel
                        FensterTimer = null
                    }
                    var String command = script + "Das Fenster ist geschlossen"
                    executeCommandLine(command)
                    sendCommand(hue1, OFF)
                }
                case 1: {
                    logDebug("Fenster", "Fenster gekippt", null)
                    if(FensterTimer != null) {
                        FensterTimer.cancel
                    }
                    FensterTimer = createTimer(now.plusMinutes(7)) [|
                        var String command = script + "Das Fenster ist seit 7 Minuten gekippt"
                        executeCommandLine(command)
                    
                        sendCommand(Color_1, HSBType::BLUE)
                    ]
                    sendCommand(Color_1, HSBType::GREEN)
                }
                case 2: {
                    logDebug("Fenster", "Fenster offen", null)
                    if(FensterTimer != null) {
                        FensterTimer.cancel
                    }
                    FensterTimer = createTimer(now.plusMinutes(5)) [|
                          var String command = script + "Das Fenster ist seit 5 Minuten offen"
                        executeCommandLine(command)
                    
                        sendCommand(Color_1, HSBType::RED)
                    ]
                     sendCommand(Color_1, HSBType::GREEN)
                }
                default: {
                    // Fensterzustand ?
                    logDebug("Fenster", "Fenster ?", null)
                }
            }
        end
        Ausprobiert habe ich den Code nicht. Es kann also Fehler enthalten. Das Einschalten der HUE-Lampe habe ich weggelassen. Ich glaube, dass es beim Setzten einer neuen Farbe automatisch mit an geht.

        Noch besser wäre es, wenn du eine Gruppe für alle Fenster definieren würdest:
        Code:
        Group:Contact:OR(OPEN, CLOSED)    Verschluss    "Verschluss [(%d)]"        <contact>    (Alles,Status)
        
        Contact HM_Sec_RHS_GaesteWC "Fenster Gäste WC [MAP(de.map):%d]" <contact> (Verschluss) {homematic="address=LEQ0123456, channel=1, parameter=STATE"}
        Du kannst dann die Gruppe abfragen, ob irgend ein Fenster offen ist und dann entsprechend die Lampe einschalten. Du ersparst dir dann eine menge Regeln.

        Kommentar

        Lädt...
        X