Ja, kann ich bestätigen... Ich bin da auch gleich einen ganzen Haufen Fallen getreten...
Angefangen mit einer vergessenen Zuordnung, über ein falsches Vorzeichen bis hin zu einem Problem mit einer Variablen, die unbedingt als Long definiert sein muss, weil die angegebenen Zeiten sonst (dank Zahlenraum...) innerhalb der Berechnung zu Nanosekunden negativ werden...
Egal...
Hier die nächste Version

aber es gibt noch etwas zu beachten, und zwar muss beim Item Proxy_Store_Essen unbedingt über die Metadaten des Items autoupdate=false gesetzt werden (sonst wird der Status des Items durch den jeweiligen Befehl gesetzt, das darf keinesfalls sein...)
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 Proxy_Store_Essen received command
then
logDebug("store","Rule gestartet mit Befehl {}",receivedCommand)
var Integer iPos = 0
if(Proxy_Store_Essen.state instanceof Number)
iPos = (Proxy_Store_Essen.state as Number).intValue // Ermittle Ist-Position
logDebug("store","Aktuelle Position {}",iPos)
switch(receivedCommand) {
case UP : {
Store_WohnenEssen.sendCommand(UP) // Bei Aufwärts-Befehl sende UP
bStoreDir = false // Merke Fahrtrichtung
lStoreStart = now.toInstant.toEpochMilli // Merke Startzeit
logDebug("store","UP erkannt, Starte Messung ({})",lStoreStart)
}
case DOWN : {
Store_WohnenEssen.sendCommand(DOWN) // Bei Abwärts-Befehl sende DOWN
bStoreDir = true // Merke Fahrtrichtung
lStoreStart = now.toInstant.toEpochMilli // Merke Startzeit
logDebug("store","DOWN erkannt, Starte Messung ({})",lStoreStart)
}
case STOP : {
logDebug("store","STOP erkannt, Berechne {} - {}",now.toInstant.toEpochMilli, lStoreStart)
Store_WohnenEssen.sendCommand(STOP) // Bei Stopp-Befehl sende STOP
if(lStoreStart === null)
return;
val Long lDiff = now.toInstant.toEpochMilli - lStoreStart // Errechne Fahrtzeit
var Integer iPosNew
if(bStoreDir) { // Abhängig von der Fahrtrichtung
iPosNew = iPos + (lDiff/iStoreUp*100).intValue // Bestimme neue Position
} else {
iPosNew = iPos - (lDiff/iStoreDown*100).intValue // Bestimme neue Position
}
logDebug("store","Diff ohne Begrenzung: {} Pos: {} Pos neu: {}", lDiff, iPos, iPosNew)
if(iPosNew < 0) iPosNew = 0 // Bei unterschreiten auf 0 begrenzen
if(iPosNew > 100) iPosNew = 100 // Bei überschreiten auf 100 begrenzen
logDebug("store","Diff: {} Pos: {} Pos neu: {}", lDiff, iPos, iPosNew)
Proxy_Store_Essen.postUpdate(iPosNew) // Schreibe neue Position
}
default : { // Befehl ist eine Zahl
iSoll = (receivedCommand as Number).intValue // Bestimme Sollposition
logDebug("store","Positionsfahrt erkannt ({} %)", iSoll)
val Integer iMove = (iSoll - iPos).intValue // Bestimme Teilstrecke
var Long iTime = 0 // Initialisiere Variable
logDebug("store","aktuelle Position {} %, Fahrt {}", iPos, iMove)
if(iMove < 0) { // Aufwärts
iTime = -(iStoreUp * iMove).intValue // Errechne Fahrtdauer
logDebug("store","Aufwärts Fahrt {}", iTime)
Store_WohnenEssen.sendCommand(UP) // Starte Fahrt
} else if(iMove > 0) { // Abwärts
iTime = (iStoreDown * iMove).intValue // Errechne Fahrtdauer
logDebug("store","Abwärts Fahrt {}", iTime)
Store_WohnenEssen.sendCommand(DOWN) // Starte Fahrt
}
logDebug("store","Strecke von {} % nach {} % = {} % ({} nSec)", iPos, iSoll, iMove, iTime*10000)
tStore?.cancel // lösche Timer, falls vorhanden
tStore = createTimer(now.plusNanos(iTime*10000),[ // Starte Timer für Stopp-Befehl
Store_WohnenEssen.sendCommand(STOP) // Stoppe Fahrt
Proxy_Store_Essen.postUpdate(iSoll) // setze neue Position
])
}
}
end
Es gibt noch einen weiteren Knackpunkt... Bekommst Du über das Binding mit, wenn der Motor abschaltet? Das wäre ganz interessant, wenn man die Fahrt über UP/DOWN startet aber nicht selbst stoppt. Könnte man aber auch noch integrieren...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet