Ankündigung

Einklappen
Keine Ankündigung bisher.

Anwesenheitssimulation (möglicher Ansatz mit Codebeispiel)

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

    [Codebeispiel] Anwesenheitssimulation (möglicher Ansatz mit Codebeispiel)

    Ich hab mich die letzten Tage über mögliche Anwesenheitssimulationen informiert, aber nie das Richtige für mich gefunden. Der Ansatz mit dem Google Kalender hat mir persönlich nicht gefallen, da ich mein Verhalten nicht "öffentlich" aufzeichnen wollte bzw. auch nicht Befehle von Google Kalender empfangen möchte. Zumindest vorerst mal nicht.

    Auch die im Forum und im Wiki gefunden Möglichkeiten haben mich zwar inspiriert aber nicht vollständig überzeugt.
    Ich hab mir nun selber eine Rule bzw. Funktion geschrieben die mir verschiedene Szenarien simulieren kann. Ohne Konfig gehts natürlich nicht, aber ich denke mit dem Ansatz bin ich doch flexibler und vor allem ist es schneller konfiguriert als wenn ich nur mit lauter einfachen Cron Jobs arbeiten muss. Da würde ich auf die Zufälligkeit verzichten. Deswegen gibt es bei mir nur grobe Startzeitpunkte.

    Ich wollte euch nur bitten mal drüberzu schauen und mir Feedback zu geben. Ev. bin ich ja trotzdem aufm falschen Weg und es gebe eine weit einfachere Möglichkeit.

    Code:
    import org.openhab.model.script.actions.*
    import org.eclipse.xtext.xbase.lib.*
    import java.util.ArrayList
    
    var ArrayList<Timer> presenceTimers = newArrayList
    
    [I]/**
     * Starts an action to a random time and for a specific duration.
     * The timers will be stored to e.g. cancel them whenever you want.
     *
     * timers: list of all timers started, so they can e.g. be canceled.
     *            Have to be handed over due to limitations of visibility within the function
     * action: the name of the action which should be triggered
     * startOffsetRange: is used to generate the random start time
     *                      (e.g. 10 means a resulting value between 0 and 10 minutes)
     * durationRange: is used to generate the random duration range
     *                   (e.g. 30 means a resulting value between 0 and 30 minutes)
     * minimumRange: is used to determine the minimum time (in minutes) for the action
     * commands: consists of the start and stop commands
     *              due to limitations of the Function (which can only contain up to 6 parameters max)
     *              those commands are combined and uses a delimiter '/' to separate them
     *
     */[/I]
    [B]val Functions$Function6 presenceSimulation[/B] = [
        ArrayList<Timer> timers,
        String action,
        Integer startOffsetRange,
        Integer durationRange,
        Integer minimumDuration,
        String commands |
        
        if(triggerSwitch.state == ON)
        {
            var Integer startValue = (Math::random * startOffsetRange).intValue
            var Integer endValue = startValue + (Math::random * durationRange).intValue + minimumDuration
            
            timers.add(createTimer(now.plusMinutes(startValue)) [|
                sendCommand(action,commands.substringBefore("/"))
            ])
            
            timers.add(createTimer(now.plusMinutes(endValue)) [|
                sendCommand(action,commands.substringAfter("/"))
            ])
        }
    ]
    
    [B]rule "Cancel all timers"[/B]
    when
        Item triggerSwitch changed
    then
        if(triggerSwitch.state == OFF)
        {
            presenceTimers.forEach [ timer |
                timer.cancel
            ]
        }
    end
    
    [B]rule "Example 1" [/B]
    when
        Time cron "0 0 20 1/1 * ? *"
    then
        [I]//light between 20-20:20 for 5-20 minutes[/I]
        presenceSimulation.apply(presenceTimers, light.name, 20, 15, 5, "ON/OFF")
    end
    
    [B]rule "Example 2" [/B]
    when
        Time cron "0 0 22 1/1 * ? *"
    then
       [I] //rollershutter between 22-22:30 for 3-25 minutes[/I]
        presenceSimulation.apply(presenceTimers, rollerShutter.name, 30, 22, 3, "DOWN/UP")
    end
    "triggerSwitch", "light" und "rollerShutter" können z.B. beliebige Items sein.

    Ich habs jetzt nur bei mir auf die schnelle mit Hilfe von log outputs getestet. Soweit hat aber alles richtig gestartet bzw. beendet.
    Zuletzt geändert von sheppard; 23.06.2015, 14:56.
Lädt...
X