Nein. Du hast noch nicht verstanden, wie die Konfiguration von openHAB funktioniert.
Früher mal... wurde openHAB ausschließlich über Textdateien konfiguriert. Es gab keine UI für die Administration, nur eine UI, um eine Bedienoberfläche zur Verfügung zu stellen.
Seit openHAB2 gibt es aber zusätzlich die Möglichkeit, die Konfiguration über eine "Verwaltungs-UI" vorzunehmen. Und je weiter sich openHAB entwickelt, umso mehr Elemente werden so umgebaut, dass sie auch über die UI konfiguriert werden können.
Es gibt also zwei grundverschiedene Methoden, Rules anzulegen, entweder per Textdatei, oder per UI.
Man kann viele Rules fast unverändert so oder so anlegen, aber eben nur fast. Bei bestimmten Rules geht das überhaupt nicht. Dies hier ist so ein Fall.
Du kannst die Rule, um die Positionsfahrten zu realisieren nicht über die UI anlegen, weil sie einen Timer verwendet.
Gegeben: openHAB läuft auf einem Raspberry PI, verwendet wurde das openHABian Image. Dann gibt es eine Samba Freigabe, die vom Windows PC aus als Netzwerkfreigabe erreichbar ist. User für diese Freigabe ist openhabian mit dem Passwort openhabian (falls es nicht verändert wurde).
Damit sollte es möglich sein, schreibend auf die freigegebenen Verzeichnisse zuzugreifen.
Im Verzeichnis openHAB-conf gibt es ein Unterverzeichnis rules. In diesem Verzeichnis legst Du eine Datei an, z.B. store.rules. Wichtig ist die Endung .rules und der Speicherort, keine Unterverzeichnisse anlegen, kein anderes Verzeichnis nutzen.
ACHTUNG! Der Zeichensatz der Datei ist zwingend UTF-8, bitte für die Umbrüche NICHT <CR>+>LF> verwenden. Am einfachsten erreichst Du das über einen vernünftigen Texteditor wie Notepad++ oder (noch besser) VS Code.
In der Datei store.rules legst Du mindestens die Rule für die Positionsfahrt an:
Code: Alles auswählen
/Globale Variablen und Konstanten immer vor der ersten Rule definieren!
val Integer iStoreUp = 29500 // 29,5 Sekunden aufwärts
val Integer iStoreDown = 27300 // 27,3 Sekunden abwärts
var Timer tStore = null // Timer für Positionsfahrt
var Long lStoreStart = null // Startzeit für UP/DOWN Fahrt
var Boolean bStoreDir = false // Richtung (false = UP)
var Integer iSoll = null // Sollposition
Rule "drive store"
when
Item MeinStore received command
then
val Integer iPos = (MeinStore.state as Number).intValue // Ermittle Ist-Position
switch(receivedCommand) {
case UP : {
StoreControl.sendCommand(UP) // Bei Aufwärts-Befehl sende UP
bStoreDir = false // Merke Fahrtrichtung
lStoreStart = now.toInstant.toEpochMilli // Merke Startzeit
}
case DOWN : {
StoreControl.sendCommand(DOWN) // Bei Abwärts-Befehl sende DOWN
bStoreDir = true // Merke Fahrtrichtung
lStoreStart = now.toInstant.toEpochMilli // Merke Startzeit
}
case STOP : {
StoreControl.sendCommand(STOP) // Bei Stopp-Befehl sende STOP
val Long lDiff = lStoreStart - now.toInstant.toEpochMilli // Errechne Fahrtzeit
val Integer iPosNew = if(bStoreDir) { // Abhängig von der Fahrtrichtung
iPos - (lDiff/iStoreUp*100).intValue // Bestimme neue Position
} else {
iPos + (lDiff/iStoreDown*100).intValue // Bestimme neue Position
}
MeinStore.postUpdate(iPosNew) // Schreibe neue Position
}
default : { // Befehl ist eine Zahl
iSoll = (receivedCommand as Number).intValue // Bestimme Sollposition
val Integer iMove = iSoll - iPos // Bestimme Teilstrecke
var Integer iTime = 0 // Initialisiere Variable
if(iMove < 0) { // Aufwärts
iTime = -(iStoreUp * iMove) // Errechne Fahrtdauer
StoreControl.sendCommand(UP) // Starte Fahrt
} else if(iMove > 0) { // Abwärts
iTime = iStoreDown * iMove // Errechne Fahrtdauer
StoreControl.sendCommand(DOWN) // Starte Fahrt
}
tStore?.cancel // lösche Timer, falls vorhanden
tStore = createTimer(now.plusNanos(iTime*10000),[ // Starte Timer für Stopp-Befehl
StoreControl.sendCommand(STOP) // Stoppe Fahrt
MeinStore.postUpdate(iSoll) // setze neue Position
])
}
}
end
Dabei ersetzt Du jedes Vorkommen von
StoreControl durch das Item, welches tatsächlich den Motor des Store steuert (es sollte sich um ein Rollershutter Item handeln).
Weiterhin ersetzt Du jedes Vorkommen von
MeinStore durch das Proxy Item, welches Du nutzen willst (auch dieses soll vom Typ Rollershutter sein).
Außerdem musst Du die Fahrzeiten für die Auf- und Zufahrt bestimmen und in den beiden globalen Konstanten
iStoreUp und
iStoreDown hinterlegen (in Millisekunden, aber keine Sorge, Du musst nicht auf eine Millisekunde genau messen. Versuche es auf eine halbe Sekunde genau auszumessen, das sollte hinreichend genau sein).
In der UI legst Du nun ein Rollershutter Widget an, mit dem Proxy Item als Steueritem. Nun solltest Du über dieses Widget den Store bedienen können, und zwar inklusive Rückmeldung der Position, sobald der Store einmal vollständig zu- und wieder aufgefahren wurde.
Und nun kannst Du eine zweite Rule anlegen, ob über die UI oder über eine Textdatei ist dann egal, die dem Proxy Item Beim gewünschten Ereignis (Temperatur ist von unter dem Grenzwert auf über dem Grenzwert gestiegen) den Befehl für die gewünschte Position sendet.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet