LDG hat geschrieben: ↑3. Apr 2021 10:44
Guten Morgen,
erstmal zu mir: ich bin Elektroniker und angehender Techniker. Arbeiten tue ich in der Gebäudeautomation aber arbeite hier nur Siemens PX.
Bei mir zuhause habe ich jetzt erst angefangen mit der Wohnungsautomation.
Moin und willkommen im Forum!
LDG hat geschrieben: ↑3. Apr 2021 10:44
Raspberry Pi 4 mit 64GB SD Karte und Openhab V1.6.4 =>Also Openhab3 Oberfläche
~Grummel~ Das geht ja gut los...
Du meinst ziemlich sicher das openHABian Image. openHABian ist eine Scriptsammlung, um openHAB und diverse andere Dinge zu installieren. Für den Raspberry gibt es ein Image, welches das offizielle Raspberry Pi OS lite als Unterbau nutzt und die Scripte schon fertig installiert hat.
LDG hat geschrieben: ↑3. Apr 2021 10:44
Code: Alles auswählen
type: application/javascript
script: |-
var Timer tBewegung = null
rule "BZ BM + Timeout"
then
switch (newState) {
case ON :{
tBewegung?.cancel
if(BZ_Licht.state != ON){
BZ_Licht.sendCommand(ON)
}
}
case OFF :{
tBewegung = createTimer(now.plusSeconds(20), [ |
if(BZ_Licht.state != OFF){
BZ_Licht.sendCommand(OFF)
}
tBewegung = null
])
}
}
end
type: script.ScriptAction
Dein Problem ist hier, dass der Code kein javascript ist. Ein weiteres Problem: Du möchtest einen Timer verwenden. Das geht über die Main UI so nicht.
Du hast nun mehrere Möglichkeiten... Du kannst den Rule-Code durch Java Script ersetzen. Da bin ich dann raus, weil ich bisher nur sehr wenig in Java Script gelöst habe und nicht sattelfest bin

aber es gibt hier durchaus andere Anwender

welche Dir da helfen können.
Das Timer Problem kannst Du lösen, indem Du ein Switch Item, welches ungebunden ist (das ist nur für den Timer zuständig) verwendest. Für dieses Item stellst Du in den Metadaten expire ein, dort kannst Du dann z.B. hinterlegen, dass es ein OFF sendet, wenn der Status des Items nicht OFF ist und mehr als 20 Sekunden nicht aktualisiert wurde. In der Rule setzt Du dieses Item dann bei einem empfangenen OFF (vom Bewegungsmelder) auf ON. Nach 20 Sekunden läuft expire ab und das Item sendet seinerseits ein OFF, welches Du über eine Rule auswerten und zum Abschalten des Lichts verwenden kannst. Nachteil: Die expire Zeit ist fix im Item eingestellt. theoretisch sollte es möglich sein, die Metadaten eines Items durch eine Java Script Rule zu manipulieren, das erscheint mir persönlich aber umständlich
Die einfachste Möglichkeit (in meinen Augen...) ist, die Rule über Textkonfiguration anzulegen. dazu brauchst Du Schreibzugriff auf das Verzeichnis /etc/openhab/rules/, in dem Du dann eine Datei meine.rules anlegst (Name ist egal, Endung muss exakt .rules lauten).
In diese Datei schreibst Du dann die Rule, welche Du ursprünglich in der Main UI eingeben hast, etwa so:
Code: Alles auswählen
var Timer tBewegung = null // globale Variablen müssen vor der 1. Rule definiert werden!
rule "BZ BM + Timeout"
when
Item BZ_BM changed
then
switch(newState) {
case ON :{
tBewegung?.cancel
if(BZ_Licht.state != ON){
BZ_Licht.sendCommand(ON)
}
}
case OFF :{
tBewegung = createTimer(now.plusSeconds(20), [ |
if(BZ_Licht.state != OFF){
BZ_Licht.sendCommand(OFF)
}
tBewegung = null
])
}
}
end
Allerdings kann die switch-case Anweisung hier nicht punkten

es ist also sinnvoll, die Rule etwas anders zu gestalten:
Code: Alles auswählen
var Timer tBewegung = null // globale Variablen müssen vor der 1. Rule definiert werden!
rule "BZ BM + Timeout"
when
Item BZ_BM changed
then
tBewegung?.cancel
if(BZ_BM.state == ON) {
if(BZ_Licht.state != ON)
BZ_Licht.sendCommand(ON)
} else
tBewegung = createTimer(now.plusSeconds(20), [ |
if(BZ_Licht.state != OFF)
BZ_Licht.sendCommand(OFF)
])
end
es ist auch wichtig, den Timer in beiden Fällen zu canceln, falls er existiert, ansonsten kann es theoretisch passieren, dass Du einen marodierenden Timer hast, den Du nicht mehr kontrollieren kannst.