Hi there,
i´m currently struggling to optimize some of my rules with complex if checks.
The checks are pretty much the same over some of my rules and always bother me.
What i want to achieve:
I´m currently using two methods to check for presence: iCloud location and WiFi connection
As the iCloud binding sometimes has problems to keep the location updated, i tried to add a check before using the information.
The outcome is used to shutdown motion detection for cameras or let an Echo Dot welcome someone who´s coming home.
I already thought about a more global way to check the iCloud timestamp but didn´t had a good solution in mind.
I know that using values inside of if statements isn´t a good idea, but i didn´t had any better solution as i´m no developer.
I´m happy for every idea that makes this rule simplier or even change it completly, e.g. more globally to make it easier to use in multiple rules.
Current rule:
val String ruleIdentifier = "AlarmOff"
rule "Alarmanlage abschalten"
when
Item itmTuerschloss changed from CLOSED to OPEN
then
// Checking iCloud timestamps
val timeCheck = new DateTime(now().minusHours(1).toString)
val lastUpdateM = new DateTime(iPMichael_LastUpdate.state.toString)
val lastUpdateJ = new DateTime(iPJohanna_LastUpdate.state.toString)
val updateM = (lastUpdateM.isBefore(timeCheck))
val updateJ = (lastUpdateJ.isBefore(timeCheck))
// Checking iCloud and
val JohannaHomeiP = (iPJohanna_Home.state == ON)
val JohannaHomeFB = (fbJohanna.state == OPEN)
var JohannaHome = (NULL)
val MichaelHomeiP = (iPMichael_Home.state == ON)
val MichaelHomeFB = (fbMichael.state == OPEN)
var MichaelHome = (NULL)
if(updateJ)
{
JohannaHome = JohannaHomeFB
logInfo(ruleIdentifier, "\nJohanna: Only using WiFi")
}
else
{
JohannaHome = (JohannaHomeiP || JohannaHomeFB)
logInfo(ruleIdentifier, "\nJohanna: Using iCloud and WiFi")
}
if(updateM)
{
MichaelHome = MichaelHomeFB
logInfo(ruleIdentifier, "\nMichael: Only using WiFi")
}
else
{
MichaelHome = (MichaelHomeiP || MichaelHomeFB)
logInfo(ruleIdentifier, "\nMichael: Using iCloud and WiFi")
}
val AlarmsystemON = (itmAlarmsystem.state == ON)
val AlarmsystemOFF = (itmAlarmsystem.state == OFF)
if(((JohannaHome == true) || (MichaelHome == true)) && AlarmsystemOFF)
{
echoFlur_TTS.sendCommand('Cameras turned off')
logInfo("AlarmInfo", "Alarmsystem wasn´t armed, just turning off cameras.")
}
if(((JohannaHome == true) || (MichaelHome == true)) && AlarmsystemON)
{
echoFlur_TTS.sendCommand('Alarmsystem disabled!')
itmAlarmsystem.postUpdate(OFF)
logInfo("AlarmOFF", "Alarmsystem was disabled, someone is at home.")
}
end
kind regards
Michael
- Platform information:
- Hardware: Raspberry Pi 4 Model B Rev 1.1 - 4GB
- OS: Raspbian GNU/Linux 10 (buster) (latest raspbian image)
- Java Runtime Environment:
- openjdk version “1.8.0_222”
- OpenJDK Runtime Environment (Zulu8.40.0.178-CA-linux_aarch32hf) (build 1.8.0_222-b178)
- OpenJDK Client VM (Zulu8.40.0.178-CA-linux_aarch32hf) (build 25.222-b178, mixed mode, Evaluation)
- openHAB version: 2.4.0-1