Seite 1 von 1

#1 Anwesenheitssimulation

Verfasst: So 24. Apr 2016, 08:07
von BBL
Hallo,

ich habe für mein Haus eine Anwesenheitssimulation geschrieben, die ich gerne teilen möchte. Vielleicht hilft dem einen oder anderen dieses Beispiel bei einer ähnlichen Aufgabenstellung.

Im Vorfeld habe ich alle Items von Lampen, die ich simulieren möchte, zu einer Gruppe zusammengefasst.
Mit Rolläden kann man das genauso machen, in meinem Fall ging es aber nur um 3 Stück, die steuere ich einzeln an.

Hier ist das Regelwerk dazu, inline kommentiert:

Code: Alles auswählen

import org.openhab.core.library.types.*
import org.openhab.model.script.actions.Timer

// Regeln fuer die Anwesenheitssimulation

var int Presence_MinTime = 120  // Mindestleuchtdauer in Sek.
var int Presence_MaxTime = 1200 // Maximalleuchtdauer in Sek.

// Schalte die Lichter der Gruppe gPS zwischen 6 und 23 Uhr zufaellig
rule LightsPresenceSimulation
when
   Time cron "0 */10 6-22 * * ?"
then
   // nur, wenn es draussen dunkel ist
   var int lux = Integer::parseInt(Lux_Outside.state.toString)
   if ((Presence.state == ON) && (lux < 20)) {
      // nur in 50% der Faelle
      if ((new java.util.Random).nextInt(2) == 1) {
          
          // waehle eine Dauer
         var int randomTime = (new java.util.Random).nextInt(Presence_MaxTime - Presence_MinTime) + Presence_MinTime
         // suche eine Lampe aus der Gruppe aus
         var int randLightIndex = (new java.util.Random).nextInt(gPS.members.size)
         logInfo("org.openhab","Switching light ON for " + randomTime + "s: " + gPS.members.get(randLightIndex).name
         sendCommand(gPS.members.get(randLightIndex), ON)
         // Timer zum wieder ausschalten
         createTimer(now.plusSeconds(randomTime)) [|
             logInfo("org.openhab","Switching light OFF: " + gPS.members.get(randLightIndex).name)
             sendCommand(gPS.members.get(randLightIndex), OFF)
              ]
      }
   }
end

// Fahre die Rolladen im OG abends zu unterschiedlichen Zeiten nach 20 Uhr runter
rule Presence_RS_OG_Down
when
   Time cron "0 0 20 * * ?"
then
   if (Presence.state == ON) {
      // KiZi: in den naechsten 30min runter
      createTimer(now.plusMinutes( (new java.util.Random).nextInt(30) )) [|
         sendCommand(RS_OG_KZ, DOWN)
      ]

      // SchlaZi: in den naechsten 90..120min runter
      createTimer(now.plusMinutes(90 + (new java.util.Random).nextInt(30) )) [|
         sendCommand(RS_OG_SZL, DOWN)
         sendCommand(RS_OG_SZR, DOWN)
      ]
 
   }
end

// Fahre die Rolladen im OG morgens zu unterschiedlichen Zeiten ab 7 Uhr hoch
rule Presence_RS_OG_UP
when
   Time cron "0 0 7 * * ?"
then
   if (Presence.state == ON) {
      // KiZi: in den naechsten 30min hoch
      createTimer(now.plusMinutes( (new java.util.Random).nextInt(30) )) [|
         sendCommand(RS_OG_KZ, UP)
      ]

      // SchlaZi: in den naechsten 60min hoch
      createTimer(now.plusMinutes( (new java.util.Random).nextInt(60) )) [|
         sendCommand(RS_OG_SZL, UP)
         sendCommand(RS_OG_SZR, UP)
      ]
   }
end