Hi everyone.
Some weeks ago I literally broke my SD card of my Raspi 3 without having backups. #lesson-learned
So I set everything up again and created some rules which I want to share with you.
Problems:
- My coffee machine needs some time to start/heat up.
- It turns into standby after some time and needs a button press to reactivate. The standby preventing the start/heat up.
Idea:
- I add a power plug (Sonoff S26 with Tasmota) to turn it on from my bed.
- I turn off the coffee machine after amount of time to prevent standby.
Approche:
- Two timers
- turning it off
- send notification via Echo device
- Reschedule/prolong timers if I send again an ON command
- Stop both timers when machine is turned off manually.
Code: coffeetimer.rule
import org.openhab.core.model.script.ScriptServiceUtil
val Echo_Location = "Kitchen" // Kitchen / Bed_Room / Bath_Room / Floor
val Echo_Vol = 20
var long ausZeit = 15 // time to turn off
var long warnungZeit = 5 // time to warn before turning of
var long verlaengerungZeit = 10 // time when timer is extended
var Timer TimerKaffeemaschinenAus = null
var Timer TimerKaffeemaschinenWarnung = null
rule "Kaffeemaschinen command"
when
Item KaffeemaschinePowerSwitch received command or
Item KaffeemaschinePowerSwitch changed
then
// early return if diff is negative or zero
if(ausZeit <= warnungZeit) {
logError("rule.Kaffee", "ausZeit <= warnungZeit")
return;
}
if(verlaengerungZeit <= warnungZeit) {
logError("rule.Kaffee", "verlaengerungZeit <= warnungZeit")
return;
}
val warnungDiffZeit = ausZeit - warnungZeit
val verlaengerungDiffZeit = verlaengerungZeit - warnungZeit
val Echo_TTS = ScriptServiceUtil.getItemRegistry.getItem("Echo_" + Echo_Location + "_TTS") as GenericItem
val Echo_TTS_Vol = ScriptServiceUtil.getItemRegistry.getItem("Echo_" + Echo_Location + "_TTS_Vol") as GenericItem
if(receivedCommand !== null && KaffeemaschinePowerSwitch.state.toString === receivedCommand.toString) {
if(receivedCommand === ON) {
logDebug("rule.Kaffee", "command AGAIN " + receivedCommand.toString)
if (TimerKaffeemaschinenAus !== null) {
logInfo("rule.Kaffee", "Timer erneuert: plus " + verlaengerungDiffZeit.toString)
TimerKaffeemaschinenAus.reschedule(now.plusMinutes(verlaengerungDiffZeit))
}
if (TimerKaffeemaschinenWarnung !== null) {
logInfo("rule.Kaffee", "Warnung erneuert: plus " + verlaengerungDiffZeit.toString)
TimerKaffeemaschinenWarnung.reschedule(now.plusMinutes(verlaengerungDiffZeit))
} else {
TimerKaffeemaschinenWarnung = createTimer(now.plusMinutes(warnungDiffZeit), [ |
logInfo("rule.Kaffee", "Warnung abgelaufen: nach " + warnungZeit.toString)
var previousVol = Echo_TTS_Vol.state as Number
Echo_TTS_Vol.sendCommand(Echo_Vol)
Echo_TTS.sendCommand('<speak>Noch ' + warnungZeit + ' Minuten.</speak>')
Echo_TTS_Vol.sendCommand(previousVol)
])
logInfo("rule.Kaffee", "Warnung erstellt: für " + warnungDiffZeit.toString)
}
}
}
if(newState !== null) {
logDebug("rule.Kaffee", "change " + newState.toString)
if(newState === ON) {
if (TimerKaffeemaschinenAus !== null) {
logInfo("rule.Kaffee", "Timer erneuert: plus " + verlaengerungZeit.toString)
TimerKaffeemaschinenAus.reschedule(now.plusMinutes(verlaengerungZeit))
var previousVol = Echo_TTS_Vol.state as Number
Echo_TTS_Vol.sendCommand(Echo_Vol)
Echo_TTS.sendCommand('<speak>Plus ' + verlaengerungZeit + ' Minuten.</speak>')
Echo_TTS_Vol.sendCommand(previousVol)
} else {
TimerKaffeemaschinenAus = createTimer(now.plusMinutes(ausZeit), [ |
logInfo("rule.Kaffee", "Timer abgelaufen: nach " + ausZeit.toString)
KaffeemaschinePowerSwitch.sendCommand(OFF)
])
logInfo("rule.Kaffee", "Timer erstellt: für " + ausZeit.toString)
var previousVol = Echo_TTS_Vol.state as Number
Echo_TTS_Vol.sendCommand(Echo_Vol)
Echo_TTS.sendCommand('<speak>' + ausZeit + ' Minuten.</speak>')
Echo_TTS_Vol.sendCommand(previousVol)
}
if (TimerKaffeemaschinenWarnung !== null) {
logInfo("rule.Kaffee", "Warnung erneuert: plus " + verlaengerungDiffZeit.toString)
TimerKaffeemaschinenWarnung.reschedule(now.plusMinutes(verlaengerungDiffZeit))
} else {
TimerKaffeemaschinenWarnung = createTimer(now.plusMinutes(warnungDiffZeit), [ |
logInfo("rule.Kaffee", "Warnung abgelaufen: nach " + warnungDiffZeit.toString)
var previousVol = Echo_TTS_Vol.state as Number
Echo_TTS_Vol.sendCommand(Echo_Vol)
Echo_TTS.sendCommand('<speak>Noch ' + warnungZeit + ' Minuten.</speak>')
Echo_TTS_Vol.sendCommand(previousVol)
])
logInfo("rule.Kaffee", "Warnung erstellt: für " + warnungDiffZeit.toString)
}
} else if(newState === OFF) {
logInfo("rule.Kaffee", "- - - - - - - - - - - - -")
if (TimerKaffeemaschinenAus !== null) {
logInfo("rule.Kaffee", "Timer cancled")
TimerKaffeemaschinenAus.cancel
TimerKaffeemaschinenAus = null
}
if (TimerKaffeemaschinenWarnung !== null) {
logInfo("rule.Kaffee", "Warnung cancled")
TimerKaffeemaschinenWarnung.cancel
TimerKaffeemaschinenWarnung = null
}
logInfo("rule.Kaffee", "- - - - - - - - - - - - -")
}
}
end
I know, it looks a bit messy, bit this comes with the problem that the rule received no command when the button of the power plug is pressed manually.
If someone has an any suggestions for improvement I will really appreciate!