Ankündigung

Einklappen
Keine Ankündigung bisher.

Nachtschaltung für Kinderzimmer

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

    Nachtschaltung für Kinderzimmer

    Hallo,

    meine kleine Tochter schläft im Hochbett und möchte nachts manchmal ins Elternbett kommen
    Nun hat sie einen Lichtschalter am Bett.
    Sie fürchtet sich aber vor dem dunklen Flur und möchte nachts nicht ihr helles Deckenlicht einschalten.
    Also würde ich gerne eine Logik hinbekommen, dass wenn man nachts den Schalter betätigt im ersten Schritt das Licht im Flur angeht.
    Bei zweimaligem Betätigen schaltet sich erst die Deckenlampe an.
    Beim dritten Betätigen schaltet sich die Deckenlampe wieder aus.
    Das Flurlicht soll außerdem immer nach 5 Minuten wieder aus gehen.

    Ich würde das gerne mit dieser Logik hinbekommen, aber bräuchte Hilfe bei den korrekten openHab-Befehlen:

    Code:
    if (zwischen 22 und 6 Uhr AND letzter Tastendruck vor >1 sec. AND Licht.status=off) {
    	Flurlicht.switch(on);
    	Flurlicht.setTimer(5 min.);	
    } else {
    	Licht.toggle();
    }
    Die Timerfunktionen und die Statusabfrage check ich einfach noch nicht...

    Kann mir jemand helfen?

    Michael

    #2
    Hallo Michael,

    hab mich mal mit deinem Problem beschäftigt aber leider noch einen Fehler in der Regel den ich noch nicht gefunden habe. Es wird immer nur das Licht Kinderzimmer geschaltet. Aber evtl. helfen dir die Befehle weiter um selbst eine Lösung zu finden.

    Folgende Items habe ich angelgt:

    Code:
    Switch Lichtschalter_Kinderzimmer    "Schalter Kinderzimmer"    (Test)
    Switch Licht_Kinderzimmer            "Licht Kinderzimmer"    (Test)
    Switch Licht_Flur                    "Licht Flur"            (Test)
    Number Akt_Stunde                    "Aktuelle Stunde [%d]"    (Test)
    Das Item "Akt_Stunde" ist nur zur Kontrolle ob now.getHourOfDay funktioniert.

    und folgende Regel erstellt:

    Code:
    rule Licht_Kinderzimmer
    when
        Item Lichtschalter_Kinderzimmer changed
    then
        // LichtTimer = createTimer(now.plusSeconds(2)) [|]
        Akt_Stunde.postUpdate(now.getHourOfDay)
        if (now.getHourOfDay >= 22 || now.getHourOfDay <= 6) {
            if (Licht_Flur.state == OFF) {
                Licht_Flur.postUpdate(ON)
                createTimer(now.plusMinutes(1)) [|
                    sendCommand(Licht_OG_Kind1_Licht2,OFF)
                ]
            }
            else if (Licht_Kinderzimmer.state == OFF) {
                Licht_Kinderzimmer.postUpdate(ON)
            }
            else {
                Licht_Kinderzimmer.postUpdate(OFF)
                }               
            }
        if (Licht_Kinderzimmer.state == OFF) {
                Licht_Kinderzimmer.postUpdate(ON)
            }
        else {
                Licht_Kinderzimmer.postUpdate(OFF)
            }
    end
    Gruß
    Pierre

    Kommentar


      #3
      Hallo und Danke, das schaue ich mir morgen direkt an.

      Gesendet von meinem Nexus 10 mit Tapatalk 2

      Kommentar


        #4
        Du solltest vermutlich statt
        Code:
        Licht_Flur.postUpdate(ON)
        besser
        Code:
        Licht_Flur.sendCommand(ON)
        nehmen. Ein "postUpdate" setzt nur (passiv) den Status für ein Item in openHAB. Ein "sendCommand" hingegen schickt ein Kommando (etwas "aktives"!), welches auch auf den KNX Bus als Schaltbefehl hinausgeroutet wird.

        Grüße,
        Kai

        Kommentar


          #5
          hat sich das Problem durch Verwendung von "sendCommand" gelöst?
          Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

          Kommentar


            #6
            Ich werde mich am Donnerstag nochmal mit einem OpenHab-Kollegen dem Problem widmen. So ganz haut es noch nicht hin und die Realisierung des 2-Sekunden-Intervalls klappt noch nicht.
            Wenn es tut, werde ich es hier posten.

            Michael

            Gesendet von meinem Nexus 10 mit Tapatalk 2

            Kommentar


              #7
              Hi,

              Zitat von maddog Beitrag anzeigen
              mit einem OpenHab-Kollegen dem Problem widmen
              ok, kenne ich den auch?

              Gruß,

              Thomas E.-E.
              Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

              Kommentar


                #8
                Mit folgender Rule funktioniert die Kinderzimmerschaltung nun:

                Code:
                rule Licht_Kinderzimmer
                when
                    Item Lichtschalter_Kinderzimmer changed
                then
                	var isInTimerMode = (clickTimer != null)
                	// zwischen 20 Uhr und 6 Uhr bekommt der Schalter eine Spezialfunktion
                    if (now.getHourOfDay >= 20 || now.getHourOfDay <= 6) {
                    	
                    	// beim ersten Tastendruck wird das Flurlicht eingeschaltet
                        if (Steckdose_OG_Flur.state == OFF) {
                            Steckdose_OG_Flur.sendCommand(ON)
                            createTimer(now.plusMinutes(5)) [|Steckdose_OG_Flur.sendCommand(OFF)]
                        }
                        
                		// ab dem zweiten Tastendruck wird das Licht im Kinderzimmer geschaltet
                		if (isInTimerMode && Licht_OG_Sarah_Decke.state == OFF) {
                            Licht_OG_Sarah_Decke.sendCommand(ON)
                        }
                        else {
                        	Licht_OG_Sarah_Decke.sendCommand(OFF)
                        } 
                		// nach 5 Sekunden wird die Funktionsweise des Schalters zurückgesetzt
                		clickTimer = createTimer(now.plusSeconds(5)) [|clickTimer = null]
                	}
                	// zwischen 6 Uhr und 20 Uhr funktioniert der Schalter normal    
                    else if (Licht_OG_Sarah_Decke.state == OFF) {
                    	Licht_OG_Sarah_Decke.sendCommand(ON)
                    }
                    else {
                		Licht_OG_Sarah_Decke.sendCommand(OFF)
                    }
                        
                end
                gibt es eine Möglichkeit, die Aktoren in der Funktion zu deklarieren und dann als Variable zu nutzen?

                Also sinngemäß:

                Code:
                rule
                var zimmerlicht = Licht_OG_Sarah_Decke
                var flurlicht = Steckdose_OG_Flur
                var leuchtdauer = 5
                var reaktionsdauer =5
                ...
                flurlicht.sendCommand(ON)
                clickTimer = createTimer(now.plusSeconds(reaktionsdauer)) [|clickTimer = null]
                end
                Danke euch allen für die Hilfe.

                Kommentar


                  #9
                  Cool, Glückwunsch, dass Du das hinbekommen hast!

                  Hättest Du Lust, dass in unserem Dropbox-Share als Beispiel abzulegen (mit kurzem Inline-Kommentar, was das ganze macht)? Dann lässt es sich zukünftig leichter wiederfinden und verlinken, wenn es ähnliche Fragen gibt.

                  Bzgl. Dropbox-Share siehe https://groups.google.com/forum/?fro...k/aFAIL6liQTEJ.

                  Dein Wunsch mit den Variablen sollte funktionieren - allerdings nur innerhalb einer Regel, nicht als "globale" Variable im Header der Datei. Dass Du nun fragst, verunsichert mich aber - bedeutet das, dass Du es schon probiert hast und es nicht klappt...?

                  Viele Grüße,
                  Kai

                  Kommentar


                    #10
                    Hallo,

                    die Idee mit der Dropbox finde ich gut. Kann im Wiki nicht noch ein Link auf die jeweiligen Files gesetzt werden?
                    Dann existiert ein zentraler Ausgangspunkt von der allgemeine Beschreibung der Regeln bis zur Verlinkung von Beispielen.

                    Gruss Ansgar

                    Kommentar


                      #11
                      Das Problem ist, dass nicht jeder das Wiki bearbeiten kann - von daher wäre ein sprechender Dateiname und ein "Doku-Header" darin wohl die pragmatischste Herangehensweise.

                      Grüße,
                      Kai

                      Kommentar


                        #12
                        Hi Michael,

                        vielleicht kannst du mir hier weiterhelfen:
                        Ich habe mir hier eine entsprechende Regel gebaut, die alle meine Rollos öffnen soll, wenn der Rollo im Zimmer meines Sohnes in der Zeit zwischen 7 Uhr und 9 Uhr geöffnet wird, ansonsten greift eine Sonnenauf- und Untergang Regel, die die Rollos entsprechend hoch und runterfährt. Allerdings habe ich in meiner Regel noch einen Bug, weil jetzt bei jedem Schaltvorgang des Rollos meines Sohnes alle Rollos hochfahren.
                        Hier der Code:
                        Code:
                        rule "oeffne alle Rollaeden wenn Lucas zwischen 6 Uhr und 9 Uhr schon wach ist"
                        when
                                Item Shutter_G1OG_Child changed
                        then
                                if (now.getHourOfDay >= 6 || now.getHourofDay <= 9) {
                                        Shutter_GKG_Kitchen.sendCommand(UP)
                                        Shutter_GKG_Living.sendCommand(UP)
                        
                                        Shutter_GEG_LivingWindow.sendCommand(UP)
                                        Shutter_GEG_LivingBalkon.sendCommand(UP)
                                        Shutter_GEG_Living.sendCommand(UP)
                                        Shutter_GEG_LivingTerrasse.sendCommand(UP)
                                        Shutter_GEG_Toilet.sendCommand(UP)
                                        Shutter_GEG_KitchenEast.sendCommand(UP)
                                        Shutter_GEG_KitchenSouth.sendCommand(UP)
                        
                                        Shutter_G1OG_Bath.sendCommand(UP)
                                        Shutter_G1OG_Parents1.sendCommand(UP)
                                        Shutter_G1OG_Parents2.sendCommand(UP)
                                        Shutter_G1OG_Zimmer1.sendCommand(UP)
                                        Shutter_G1OG_Zimmer2.sendCommand(UP)
                        
                                        Shutter_GDG_Buero.sendCommand(UP)
                                        Shutter_GDG_Buero2.sendCommand(UP)
                                        Shutter_GDG_Zimmer.sendCommand(UP)
                                        Shutter_GDG_Zimmer.sendCommand(UP)
                                }
                        end
                        Sieht jemand den Fehler?

                        Gruß Jan

                        Kommentar


                          #13
                          Hallo Jan,

                          mit
                          Code:
                          when
                                  Item Shutter_G1OG_Child changed
                          reagierst du ja auf jeden Change

                          Statt changed musst du da nur auf den UP-Befehl reagieren.

                          Code:
                          when
                                  Item Shutter_G1OG_Child received command UP
                          Michael

                          Kommentar


                            #14
                            Ja, schon, aber in der Rule steht ja, dass er das nur in der Zeit zwischen 6 Uhr und 9 Uhr ausführen soll. Das ignoriert er einfach.

                            Kommentar


                              #15
                              Ja, das ignoriert er, weil einfach JEDE Zahl entweder >=6 oder <=9 ist, oder? Versuche es mal mit einer &&-Verknüpfung

                              Kommentar

                              Lädt...
                              X