Nein, das geht nicht, jedenfalls nicht so.
Zwei Möglichkeiten:
1. Du kopierst beiden Rules komplett so, wie sie sind in eine Textdatei und speicherst diese im Konfigurationsverzeichnis in dem Verzeichnis rules\ ab, der Dateiname muss als Endung zwingend .rules lauten, was davor steht, ist im Prinzip egal, aber ich würde es nicht ausreizen wollen. Am besten nimmst Du was einfaches, z.B. einschaltdauer.rules (man beachte die Kleinbuchstaben - möglichst einfach). In der UI entfernst Du die Rules restlos.
Die beiden Rules sollten umgehend in der UI unter den Rules gelistet werden.
2. Du änderst die Rules passend ab, so dass sie für die UI korrekt sind. Wichtig dabei: es handelt sich um zwei Rules. Der Teil zwischen when und then muss in der UI als when-Teil eingetragn werden, der Teil zwischen then und end kommt als Code in die Action der Rule. Ein Problem, um was wir uns dann noch kümmern müssen, ist die globale Variable, bzw. man wird das Problem dann anders lösen.
Nehmen wir an (Du hast den Namen leider bisher nicht erwähnt), Dein Number:Time Item heißt
BadlichtED (für EinschaltDauer). Die erste Rule (hier als Code-Ansicht in der UI):
Code: Alles auswählen
configuration: {}
triggers:
- id: "1"
configuration:
time: 00:00:01
type: timer.TimeOfDayTrigger
conditions: []
actions:
- inputs: {}
id: "2"
configuration:
type: application/vnd.openhab.dsl.rule
script: BadlichtED.postUpdate(0)
type: script.ScriptAction
Diese Rule triggert eine Sekunde nach 0 Uhr und setzt das Item
BadlichtED auf 0. Alternativ kannst Du als Trigger auch Time cron angeben, aber über TimeOfDay ist es ebenfalls super einfach. Du könntest bei dieser Rule auch auf den Code komplett verzichten und stattdessen einfach direkt dem Item den Wert 0 zuweisen (es gibt dafür eine eigene Action)
Die zweite Rule:
Code: Alles auswählen
configuration: {}
triggers:
- id: "1"
configuration:
itemName: NEGBadLicht
type: core.ItemStateChangeTrigger
conditions: []
actions:
- inputs: {}
id: "2"
configuration:
type: application/vnd.openhab.dsl.rule
script: if(newState == OFF) {
var Integer iSeconds = BadlichtED.state as Number
val bis = Badlicht.previousState(false).timestamp.zonedDateTime.toInstant.toEpochMilli
val von = Badlicht.previousState(true).timestamp.zonedDateTime.toInstant.toEpochMilli
val dauer = ((bis - von)/1000).intValue
iSeconds += dauer
BadlichtED.poistUpdate(iSeconds)
}
type: script.ScriptAction
Die Rule liest nun die Zeitstempel aus, zu denen die letzten Änderungen des Status stattgefunden haben. false nimmt dabei das letzte Update, true nimmt das letzte Update, bei dem ein Wechsel stattgefunden hat.
Eventuell vertue ich mich dabei gerade... Es gibt aber weiter Möglichkeiten, zum "vorletzten" Statuswechsel zu kommen, probiere erst mal diese Variante (nur für den Fall, dass Du keine Textdateien verwenden willst... die Rules oben werden sicher funktionieren).
In der UI gibt es meines Wissens für die DSL noch keine Möglichkeit, Werte über den Lauf der Rule hinaus aufzubewahren. Man könnte höchstens ein Number Item dafür verwenden. Aber theoretisch müsste es über die Persistence Daten ebenso gehen, ganz ohne Hilfsvariablen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet