As requested here are my rules:
//-----------------------------------------------------------------------------------------------------------------------------------------------------------
// Luigi
//-----------------------------------------------------------------------------------------------------------------------------------------------------------
Switch Luigi_Do_Start "Reinigung starten" { autoupdate="false"}
Switch Luigi_Do_Charge "Ladestation suchen" { autoupdate="false"}
Switch Luigi_UpdateStatus "Update Status"
String Luigi_Status "Status [%s]" (gMyOpenHAB)
String Luigi_Batterie "Batterie [%s]"
String Luigi_LastClean "Letzte Reinigung [%s]"
Number Luigi_LastClean_Dauer "Dauer letzte Reinigung [%.1f min]" (gInitializeZero)
Number Luigi_Fade_Anzahl "Luigi Fade Anzahl [%d]" (gInitializeZero)
Switch cWohnzimmerLuigiAutoStart "Automatische Reinigung" (gInitializeOn,gConfig)
Switch cWohnzimmerLuigiStartAbwesend "Automatische Reinigung nur bei Abwesenheit" (gInitializeOn,gConfig)
Number cWohnzimmerLuigiAutoStartTime "Start der Reinigung [%d Uhr]" (gInitializeZero)
With the following rules I get the current status and also do the scheduling:
// Imports
import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*
import org.joda.time.*
import java.util.regex.Matcher
import java.util.regex.Pattern
import java.util.Date
import java.text.SimpleDateFormat
//Global Variables
var Number ReinigungStart = 0
var boolean ReinigungsAusfuehren = false
//Luigi-Status über das Netzwerk aktualisieren
rule "Luigi update Status"
when
Item Luigi_UpdateStatus received update ON
then
val String status_raw = sendHttpGetRequest( "http://192.168.0.10:6260/status.html")
if( status_raw == null) {
logWarn( "Wohnzimmer", String::format( "%15s | offline!", "Luigi"))
Luigi_Status.postUpdate( "Offline")
Luigi_Batterie.postUpdate( "Offline")
return false
}
//logDebug( "Wohnzimmer", String::format( "%15s | http:\n%s\n", "Luigi", status_raw))
val Pattern pattern_status = Pattern::compile( ".*<b>Robot-state</b>: <status>(.+)</status>.*")
val Pattern pattern_batterie = Pattern::compile( ".*<b>Batt-Perc</b>: <batterie>(.+)</batterie>.*")
val Pattern pattern_reinigung = Pattern::compile( ".*<b>Last-Clean</b>: <lastclean>(\\d+)/(\\d+)/(\\d+)/(\\d+)/(\\d+).+</lastclean>.*")
var Matcher matcher_status = pattern_status.matcher( status_raw)
var Matcher matcher_batterie = pattern_batterie.matcher( status_raw)
var Matcher matcher_reinigung = pattern_reinigung.matcher( status_raw)
matcher_status.find()
matcher_batterie.find()
matcher_reinigung.find()
val int count_status = matcher_status.groupCount()
val int count_batterie = matcher_batterie.groupCount()
val int count_reinigung = matcher_reinigung.groupCount()
var boolean ok = true;
if( count_status != 1) {
logWarn( "Wohnzimmer", String::format( "%15s | Groupcount status doesn't match! (%i)", "Luigi", count_status))
ok = false
}
if( count_batterie != 1) {
logWarn( "Wohnzimmer", String::format( "%15s | Groupcount batterie doesn't match! (%i)", "Luigi", count_batterie))
ok = false
}
if( count_reinigung != 5) {
logWarn( "Wohnzimmer", String::format( "%15s | Groupcount reinigung doesn't match! (%i)", "Luigi", count_reinigung))
ok = false
}
var boolean request_refresh = true
if( ok) {
val String neu_status = matcher_status.group(1)
val String neu_batterie = matcher_batterie.group(1) + " %"
val String neu_reinigung = String::format( "%s.%s.%s %s:%s", matcher_reinigung.group(3), matcher_reinigung.group(2), matcher_reinigung.group(1), matcher_reinigung.group(4), matcher_reinigung.group(5))
logInfo( "Wohnzimmer", String::format( "%15s | Status: %s", "Luigi", neu_status))
logInfo( "Wohnzimmer", String::format( "%15s | Batterie: %s", "Luigi", neu_batterie))
logInfo( "Wohnzimmer", String::format( "%15s | Reinigung: %s", "Luigi", neu_reinigung))
if( Luigi_Status.state != neu_status) Luigi_Status.postUpdate(neu_status)
if( Luigi_Batterie.state != neu_status) Luigi_Batterie.postUpdate(neu_batterie)
if( Luigi_LastClean.state != neu_status) Luigi_LastClean.postUpdate(neu_reinigung)
//Dauer live berechnen (in min)
if( ReinigungStart != 0) {
val Number dauer = (DateTimeUtils::currentTimeMillis() - ReinigungStart) / 60000
logInfo( "Wohnzimmer", String::format( "%15s | Dauer: %.1f min", "Luigi", dauer))
if( Luigi_LastClean_Dauer.state != dauer) Luigi_LastClean_Dauer.postUpdate( dauer)
}
if( neu_status == "CHARGING") {
request_refresh = false
ReinigungStart = 0
}
}
else {
//Ausgabe der http-Antwort
logWarn( "Wohnzimmer", String::format( "%15s | http:\n%s\n", "Luigi", status_raw))
}
//Wenn wir saugen ƶfter anfragen
if( request_refresh) {
createTimer( now.plusSeconds(30)) [|
Luigi_UpdateStatus.postUpdate(ON)
]
}
return false
end
rule "Luigi Pushover notifications"
when
Item Luigi_Status changed
then
val String ist = Luigi_Status.state.toString()
val String war = previousState.toString()
if( ist == "Offline" && war != "Offline") {
var String output = String::format( "[%1$td.%1$tm %1$tH:%1$tM:%1$tS]: Luigi offline!", new Date())
pushover( output, 1)
return false
}
if( ist != "Offline" && war == "Offline") {
var String output = String::format( "[%1$td.%1$tm %1$tH:%1$tM:%1$tS]: Luigi back online!", new Date())
pushover( output, 0)
return false
}
end
rule "Luigi starten"
when
Item Luigi_Do_Start received command ON
then
ReinigungStart = DateTimeUtils::currentTimeMillis()
var String output = String::format( "[%1$td.%1$tm %1$tH:%1$tM:%1$tS]: Luigi automatische Reinigung start!", new Date())
pushover( output, 0)
logInfo( "Wohnzimmer", String::format( "%15s | Reinigung startet!", "Luigi"))
val String http_return = sendHttpGetRequest( "http://192.168.0.10:6260/json.cgi?%7B%22COMMAND%22%3A%22CLEAN_START%22%7D")
logDebug( "Wohnzimmer", String::format( "%15s | http:\n%s\n", "Luigi", http_return))
createTimer( now.plusSeconds(10)) [|
Luigi_UpdateStatus.postUpdate(ON)
]
end
rule "Luigi Ladestation"
when
Item Luigi_Do_Charge received command ON
then
logInfo( "Wohnzimmer", String::format( "%15s | Ladestation wird gesucht!", "Luigi"))
val String http_return = sendHttpGetRequest( "http://192.168.0.10:6260/json.cgi?%7b%22COMMAND%22:%22HOMING%22%7d")
logDebug( "Wohnzimmer", String::format( "%15s | http:\n%s\n", "Luigi", http_return))
end
rule "Luigi Startzeit Change"
when
Item cWohnzimmerLuigiAutoStartTime changed
then
//Damit das Autoinitialize geht
val Number startzeit = cWohnzimmerLuigiAutoStartTime.state as DecimalType
if( startzeit < 1) {
cWohnzimmerLuigiAutoStartTime.postUpdate( 11)
return false
}
logInfo( "Wohnzimmer", String::format( "%15s | Automatische Reinigung um %.0f Uhr", "Luigi", startzeit.floatValue()))
end
rule "Luigi Automatische Reinigung"
when
Time cron "0 0 * * * ?"
then
Luigi_UpdateStatus.postUpdate(ON)
if( cWohnzimmerLuigiAutoStart.state != ON) return false
if( now.getHourOfDay() == cWohnzimmerLuigiAutoStartTime.state as DecimalType) {
ReinigungsAusfuehren = true
logDebug( "Wohnzimmer", String::format( "%15s | Reinigungswunsch", "Luigi"))
}
if( ReinigungsAusfuehren) {
//Ab 22 uhr wird nicht mehr gesaugt
if( now.getHourOfDay() == 22) {
ReinigungsAusfuehren = false
return false
}
//Nur reinigen, wenn niemand da ist (keine Bewegung)
val DateTime lastmovement_flur = new DateTime((ts_Flur_Schlafzimmertuere_Alarm.state as DateTimeType).calendar.timeInMillis)
val DateTime lastmovement_wohn = new DateTime((ts_Flur_Wohnungstuere_Alarm.state as DateTimeType).calendar.timeInMillis)
val DateTime lastmovement_balkon = new DateTime((ts_Wohnzimmer_Balkontuere_Alarm.state as DateTimeType).calendar.timeInMillis)
if( lastmovement_flur.plusMinutes(45).isAfter(now) ||
lastmovement_wohn.plusMinutes(45).isAfter(now) ||
lastmovement_balkon.plusMinutes(45).isAfter(now)) {
if( cWohnzimmerLuigiStartAbwesend.state == ON) {
logInfo( "Wohnzimmer", String::format( "%15s | Bewegung -> verschiebe automatische Reinigung", "Luigi"))
return false
}
}
Thread::sleep(2000)
ReinigungsAusfuehren = false
if( Luigi_Status.state == "Offline") logInfo( "Wohnzimmer", String::format( "%15s | Automatische Reinigung entfaellt (Offline)", "Luigi"))
else {
logInfo( "Wohnzimmer", String::format( "%15s | Automatische Reinigung!", "Luigi"))
Luigi_Do_Start.sendCommand(ON)
//Fades erneut anzeigen
Luigi_Fade_Anzahl.postUpdate(0)
}
}
end