Anwesenheitssimulation durch zufälliges Schalten der Lichter

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

D3ltorohd
Beiträge: 22
Registriert: 7. Apr 2019 19:31

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Beitrag von D3ltorohd »

Die Fragen an dieser Stelle sind also erst mal: Sollen die Läden raumweise verfahren werden? Sollen die Läden innerhalb eines Raums versetzt oder gemeinsam verfahren werden?
Ich hätte es gerne das die Rollos Raumweise fahren, dann aber alle gleichzeitig, dazu hab ich ja auch schon einzelne Gruppen angelegt in denen die Rollos sind. Denke jeden einzeln macht keinen Sinn, würde ja so auch keiner machen. Die sind ja dann immer gekoppelt, meistens. Daher würde pro Raum alle Rollos passen.

So bis auf zwei sind alle Fehler weg, einmal in der zweiten Zeile, da hat er hier irgendwie Probleme, "java.util.concurrent.ThreadLocalRandom)"

und hier das von dir genannte. Was sollte ich hier nun ändern ?

val int randomTime = random.nextInt(80) + 40 // mindestens 40 Sekunden Abstand, höchstens 120 Sekunden
val int randomLaden = random.nextInt(iGroup.size -1) +1

Jetzt ging es natürlich nicht, kann ich davor irgendwie nen Trigger einbauen, das ich das Rule manuell starten kann um es zu testen ?

mad-mike
Beiträge: 402
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Beitrag von mad-mike »

Moin zusammen...

Wie bekomme ich denn die Rule von Beitrag 1 bei mir eingebaut??

Kurz zum Trigger:
Habe einen Shelly welche die Leistung einer Mini PV Anlage misst, und habe eine ITEM -Switch erstellt welche ich erstmal ASTRO gennant habe.

Aktuell habe ich dies so gemacht:

Code: Alles auswählen

triggers:
  - id: "1"
    configuration:
      itemName: shellyplugsb580c9192168178120_SchnittletzteMin
    type: core.ItemStateChangeTrigger
conditions:
  - inputs: {}
    id: "3"
    configuration:
      itemName: shellyplugsb580c9192168178120_SchnittletzteMin
      state: "1"
      operator: <=
    type: core.ItemStateCondition
  - inputs: {}
    id: "4"
    configuration:
      itemName: Astro
      state: ON
      operator: =
    type: core.ItemStateCondition
actions:
  - inputs: {}
    id: "2"
    configuration:
      itemName: Shelly_Relay2
      command: ON
    type: core.ItemCommandAction
Also Wenn draußen aufgrund von Helligkeit keine Leistung mehr erzeugt wird,und Schalter Astro on = geht die Nachtlampe über Shelly Relay 2 AN

Gleiche Rule habe ich noch mal für ""OFF""...

Grundsätzlich funktioniert dies zufrieden Stellend.
Aber So eine Simulation wie In Beitrag 1 kann ich mir auch gut vorstellen... Aber muss dazu sagen, keine Ahnung von diesen Programmierungen.
Habe einfach mal COPY and Paste genutzt, funktioniert aber nicht... muss bestimmt noch die Verknüpfung der Lampen Group einfügen????

Vielleicht kann mir jemand helfen..
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Beitrag von udo1toni »

Punkt 1: Das ist eine DSL Rule, die in einer *.rules Datei gespeichert werden muss. Nicht über die UI eingeben.

Punkt 2: Natürlich musst Du Itemnamen an Deine Gegebenheiten anpassen.

HIer mal eine aktualisierte Fassung der Rule:

Code: Alles auswählen

var Timer RandomLightsTimer = null
val java.util.concurrent.ThreadLocalRandom random = (new java.util.concurrent.ThreadLocalRandom)

rule "Urlaubsmodus / Licht zufällig einschalten"
when
    Time cron "0 */12 7-23 * * ?"
then
    if(AutoHoliday_Light.state != ON)                                                                   // Automatik abgeschaltet?
        return;                                                                                         // Dann Abbruch!
    if(now.isAfter((Sonnenaufgang_Time.state as DateTimeType).calendar.timeInMillis) &&
       now.isBefore((Sonnenuntergang_Time.state as DateTimeType).calendar.timeInMillis))                // Tag?
        return;                                                                                         // Dann Abbruch!
    if((new java.util.Random()).nextInt(2) != 1)                                                        // Licht zufällig einschalten 50/50
        return;                                                                                         // oder auch nicht...

    var Integer randomTime = random.nextInt(360)                                                        // zufälligen Wert bestimmen
    logInfo("randomLight","Neuer Wert Zufallstimer: {} Sekunden.", randomTime)
    RandomLightsTimer = createTimer(now.plusSeconds(randomTime), [ |                                    // Timer erstellen
        var randomLights = random.nextInt(gWohnungLicht.allMembers.size)                                // Bestimme eine Lampe aus der Liste
        var randomLightCurrentState = gWohnungLicht.allMembers.get(randomLights).getStateAs(OnOffType)  // Aktuellen Status als ON/OFF auslesen
        var randomLightNewState = if(randomLightCurrentState != OFF) OFF else ON                        // und Gegenteil bestimmen
        logInfo("randomLight", "Schalte Licht {} von {} zu {}.", gWohnungLicht.allMembers.get(randomLights).name, randomLightCurrentState, randomLightNewState)
        gWohnungLicht.allMembers.get(randomLights).sendCommand(randomLightNewState)                     // Licht umschalten
    ])
end
Die Rule braucht den Schalter AutoHoliday_Light, der zum Deaktivieren der Funktion dient. Weiterhin braucht es die Items Sonnenaufgang_Time und Sonnenuntergang_Time (Namen sind ja sprechend ;) ) Und zu guter Letzt noch eine Gruppe gWohnungLicht, in der alle zu schaltenden Lichter zusammengefasst sind (gleich ob geschaltet oder gedimmt).
Was wo passiert, habe ich im Code dokumentiert.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 402
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Beitrag von mad-mike »

Vielen dank für deine Ergänzung in der Rule.

Ich werde diese mal versuchen komplett durchzuarbeiten und auf meine Gegebenheiten anpassen...


Ich habe bei OH3.1 ja nicht nur die Möglichkeiten von Rules wo ich über die Weboberfläche Trigger und so einstellen kann sondern auch Scipte.
Dann kann ich diese DSL Rule doch hier erstellen oder??
Bildschirmfoto zu 2021-08-24 22-34-54.png
Bildschirmfoto zu 2021-08-24 22-35-07.png
Danke und Gruss
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

mad-mike
Beiträge: 402
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Beitrag von mad-mike »

Ich habe mich da nun Stunden dran Versucht. Aber irgendwie will das einfach nicht...

Kann man so eine Rule nicht mit Blockly machen oder so??

Zum LOG:

Code: Alles auswählen

2021-08-25 20:05:11.760 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'b9fa748a2d' failed: var Timer RandomLightsTimer = null

Code: Alles auswählen

val java.util.concurrent.ThreadLocalRandom random = (new java.util.concurrent.ThreadLocalRandom)

    if((Astro.state != ON)                                                                  // Automatik abgeschaltet?

        return;                                                                                         // Dann Abbruch!

    if((new java.util.Random()).nextInt(2) != 1)                                                        // Licht zufällig einschalten 50/50

        return;                                                                                         // oder auch nicht...

    var Integer randomTime = random.nextInt(360)                                                        // zufälligen Wert bestimmen

    logInfo("randomLight","Neuer Wert Zufallstimer: null Sekunden.", randomTime)

    RandomLightsTimer = createTimer(now.plusSeconds(randomTime), [ |                                    // Timer erstellen

        var randomLights = random.nextInt(zufall.allMembers.size)                                // Bestimme eine Lampe aus der Liste

        var randomLightCurrentState = zufall.allMembers.get(randomLights).getStateAs(OnOffType)  // Aktuellen Status als ON/OFF auslesen

        var randomLightNewState = if(randomLightCurrentState != OFF) OFF else ON                        // und Gegenteil bestimmen

        logInfo("randomLight", "Schalte Licht null von {} zu {}.", gWohnungLicht.allMembers.get(randomLights).name, randomLightCurrentState, randomLightNewState)

        zufall.allMembers.get(randomLights).sendCommand(randomLightNewState)                     // Licht umschalten

    ])

end


So stehts im LOG. Habe mal den Großen Rot markierten teil separat oben eingefügt...

Habe Gruppe Zufall item erstellt. Da sind meine 2 Lampen enthalten...

Habe weiter Astro Teil entfernt?? hoffe ich zumindest.
und die Uhr sollte doch nur begrenzen...

Gruss
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Beitrag von udo1toni »

Ich habe schon nicht ohne Grund geschrieben, dass Du diese Rule nicht über die UI erstellen kannst. Die Rule kann auch nicht in ein Script eingepackt werden.
Die Rule verwendet globale Variablen, das geht weder mit Scripten noch mit UI Rules.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 402
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Beitrag von mad-mike »

Ja okay. Habe in der zwischen zeit auch schon viele Videos angesehen Wegen der Umsetzung...

Nun habe ich also eine Rule erstellt im Editor und diese dann übers Netzwerk auf meinem PI gespeichert...

Im Log habe ich dann nun gefunden:

Code: Alles auswählen

2021-08-26 00:15:03.251 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'meine.rules' has errors, therefore ignoring it: [9,9]: missing ')' at 'return'
die Zeile war Gelb. Schon mal nicht Rot :D :mrgreen:

Nun hab ich also mich nun dran gemacht und das Klammer zu Zeichen noch zu ergänzen...

Dannach kam dann die meldung:

Code: Alles auswählen

2021-08-26 00:17:22.140 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'meine.rules'
Diese Meldung ist Blau... Heisst das, das diese nun aktiv ist?? :?:

Code: Alles auswählen

2021-08-26 00:36:00.675 [INFO ] [penhab.core.model.script.randomLight] - Neuer Wert Zufallstimer: 224 Sekunden.


Habe mal die Zeiten von Beitrag 3 Stark reduziert, und siehe, es funktioniert...

Vielen vielen Dank @udo1toni
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Beitrag von udo1toni »

:) ja, das passiert leider immer wieder mal, dass eine Klammer zu viel oder zu wenig ist. Im passenden Editor wird das auch direkt angemeckert, oder zumindest bekommt man die zugehörige Klammer angezeigt, was dann beim Zählen hilft.
Am sinnvollsten ist es, VSCode zu verwenden, damit hat man die Option, da openHAB Plugin zu nutzen, welches den Editor fast schon zur IDE aufbohrt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 402
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Beitrag von mad-mike »

Moin.

Es funktioniert wirklich gut, und dank dir weiss ich auch, wie man nun Die Rules auf meinem PI speichert. ABER dadurch kann ich keine Rules erstellen, weil einfach das Programmiere wissen fehlt.

Aktuell:

Code: Alles auswählen

var Timer RandomLightsTimer = null
val java.util.concurrent.ThreadLocalRandom random = (new java.util.concurrent.ThreadLocalRandom)

rule "Urlaubsmodus / Licht zufällig einschalten"
when
    Time cron "0 */1 0-23 * * ?"
then
      if((Abwesend.state != ON))                                                                           // Automatik abgeschaltet?
      return;                                                                                              // Dann Abbruch!
      if((new java.util.Random()).nextInt(2) == 1)                                                         // Licht zufällig einschalten 50/50
      return;                                                                                              // oder auch nicht...
      sendCommand(zufall, OFF)                                                                             // Ordner zufall OFF

    var Integer randomTime = random.nextInt(15)                                                             // zufälligen Wert bestimmen
    logInfo("randomLight","Timer: {} Sekunden.", randomTime)
    RandomLightsTimer = createTimer(now.plusSeconds(randomTime), [ |                                         // Timer erstellen
        var randomLights = random.nextInt(zufall.allMembers.size)                                            // Bestimme eine Lampe aus der Liste
        var randomLightCurrentState = zufall.allMembers.get(randomLights).getStateAs(OnOffType)              // Aktuellen Status als ON/OFF auslesen
        var randomLightNewState = if(randomLightCurrentState != ON) ON else OFF                             // und Gegenteil bestimmen
        logInfo("randomLight", "Schalte Licht {} von {} zu {}.", zufall.allMembers.get(randomLights).name, randomLightCurrentState, randomLightNewState)
        zufall.allMembers.get(randomLights).sendCommand(randomLightNewState)                                 // Licht umschalten
    ])
end

JA, der Cron timer ( steht auf 1) und der Random Timer (steht auf 15) habe ich zum testen so klein gesetzt.... Sonst muss ich ewig warten bis was passiert... :D


Wie könnte man denn wohl folgende Änderung vornehmen:
1.
In der Group zufall sollen alle Lampen auf OFF gesetzt werden.
(Habe oben den Ordner auf OFF gesetzt...)

2.
Der Timer soll dann wie oben normal starten, und dann eine Lampe auf ON setzen...
funktioniert. Soll so bleiben

3.
Einen weiteren zufälligen Timer wo dann wieder das zuvor ON auf OFF gesetzt wird,
So wie einen 2ten davon:

Code: Alles auswählen

var Integer randomTime = random.nextInt(*****)    


Wie kann man einen OFF Timer realisieren??
Muss der Ordner jedesmal den OFF Signal bekommen?
Müssen die Status ON/OFF abgefragt werden?? Ist ja alles OFF eigentlich...


Danke und Grüße ;) :)
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Anwesenheitssimulation durch zufälliges Schalten der Lichter

Beitrag von udo1toni »

Die Rule ist anders gedacht :) Wenn es nur darum geht, ein einzelnes Licht aus einer Gruppe Lichter ein- und wieder auszuschalten, ist es das einfachste, dieses Licht einzuschalten und anschließend den Ausschalttimer zu starten, der einfach alle Lichter ausschaltet, die an sind. Wichtig ist dabei natürlich, dass der 2. Timer sicher beendet ist, bevor der nächste zufällige Licht-An-Timer läuft.

Du nutzt die Action sendCommand(Item,Value), was grundsätzlich ok ist. Allerdings kannst Du genauso gut die Methode Item.sendCommand(Value) verwenden, wie das im Rest der Rule der Fall ist. Der Unterschied zwischen beiden Varianten ist, dass die Methode Kenntnis vom benötigten Typ hat und diesen bei Bedarf konvertieren kann. Die Action erwartet immer Strings, was gerne mal schief geht (nicht im vorliegenden Fall).

Was das Ausschalten aller Lichter betrifft, so ist es im Übrigen sinnvoll, den Befehl nur an die Items zu schicken, welche gerade ON sind:

Code: Alles auswählen

zufall.allMembers.filter[i|i.getStateAs(OnOffType)!=OFF].forEach[j|j.sendCommand(OFF)]
Die Zeile ist natürlich wesentlich länger als ein

Code: Alles auswählen

zufall.sendCommand(OFF)
Aber zum einen schaltet nur "meine" Zeile wirklich alle Lichter aus, die in irgendeiner Form in der Gruppe zufall sind (auch solche, die in einer Untergruppe von zufall liegen), zum anderen erzeugt die einfache Zeile stumpf für jedes Item, welches direkter Memeber der Gruppe zufall ist, ein Item.sendCommand(OFF), gleich, ob dieses Item gerade ON ist oder nicht.
"Meine" Zeile sendet den OFF Befehl nur an solche Items, die nicht auf OFF stehen. Dabei berücksichtigt es auch Dimmer korrekt. Wenn also bis auf ein Item alle Items OFF melden, wird auch nur ein OFF Befehl gesendet.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten