Car Presence
I have been using MQTT Car Presence with OH for a couple of months. One main problem I had to solve was the timing/order MQTT messages are received to have the functionality I wanted. See [Asynchronous Events to Synchronous Event](http://Async to Sync tutorial). This must be setup before using the example below.
MQTT Car presence follows the Home Assistant MQTT protocol. In this example, I use the Things that are created by the OpenHAB MQTT binding but manually define the Items. All logic is done in Jython.
Items
//
Group gVehicles "Vehicles" (gContext)
//
Group gCars "Cars" (gVehicles)
//
Group CAR_AudiQ7 (gAsync_to_Sync_Aggregator) {Async_Time=".5"}
Switch CAR_AudiQ7_Online_Switch "Audi Q7 Online" (gCars,Car_AudiQ7) {channel="mqtt:homeassistant_AudiQ7:Queen:AudiQ7:AudiQ7_5Fbinary_5Fsensor#sensor",Async_Time="300"}
Number CAR_AudiQ7_WIFI_Signal_Strength "Audi Q7 Signal" (gCars,Car_AudiQ7) {channel="mqtt:homeassistant_AudiQ7_2Dsignal:Queen:AudiQ7_2Dsignal:AudiQ7_2Dsignal_5Fsensor#sensor"}
Number CAR_AudiQ7_Uptime_Seconds "Audi Q7 Uptime" (gCars,Car_AudiQ7) {channel="mqtt:homeassistant_AudiQ7_2Duptime:Queen:AudiQ7_2Duptime:AudiQ7_2Duptime_5Fsensor#sensor"}
Switch CAR_AudiQ7_At_Home "Audi Q7 At Home" (gCars)
Switch CAR_AudiQ7_Sync_Switch (gAsync_to_Sync_Proxy_Switches)
//
Group CAR_SubaruOutback (gAsync_to_Sync_Aggregator) {Async_Time=".5"}
Switch CAR_SubaruOutback_Online_Switch "Outback Q7 Online" (gCars,CAR_SubaruOutback) {channel="mqtt:homeassistant_SubaruOutback:Queen:SubaruOutback:SubaruOutback_5Fbinary_5Fsensor#sensor",Async_Time="300"}
Number CAR_SubaruOutback_WIFI_Signal_Strength "Outback Signal" (gCars,CAR_SubaruOutback) {channel="mqtt:homeassistant_SubaruOutback_2Dsignal:Queen:SubaruOutback_2Dsignal:SubaruOutback_2Dsignal_5Fsensor#sensor"}
Number CAR_SubaruOutback_Uptime_Seconds "Outback Uptime" (gCars,CAR_SubaruOutback) {channel="mqtt:homeassistant_SubaruOutback_2Duptime:Queen:SubaruOutback_2Duptime:SubaruOutback_2Duptime_5Fsensor#sensor"}
Switch CAR_SubaruOutback_At_Home "Outback At Home" (gCars)
Switch CAR_SubaruOutback_Sync_Switch (gAsync_to_Sync_Proxy_Switches)
Jython
@rule ("AudiQ7 online")
@when ("Item CAR_AudiQ7_Sync_Switch changed to ON")
def audi_in_sync (event):
uptime = int(ir.getItem("CAR_AudiQ7_Uptime_Seconds").state.toString())
signal = int(ir.getItem("CAR_AudiQ7_WIFI_Signal_Strength").state.toString())
if ir.getItem("CAR_AudiQ7_Online_Switch").state==ON:
events.sendCommand(ir.getItem("CAR_AudiQ7_At_Home"),ON)
if uptime > 60000: #been running for 1 min before getting ON therefore assume car arriving
if ir.getItem("EX_Garage_DoubleDoor_Sensor").state == CLOSED:
events.sendCommand (ir.getItem ("EX_Garage_OperateDoubleDoor_Button"), ON)
@rule ("AudiQ7 offline")
@when ("Item CAR_AudiQ7_Online_Switch changed to OFF")
def audi_offline (event):
uptime = int(ir.getItem("CAR_AudiQ7_Uptime_Seconds").state.toString())
signal = int(ir.getItem("CAR_AudiQ7_WIFI_Signal_Strength").state.toString())
if signal < -70:# if signal < -70 when turning off, assume car is leaving
events.sendCommand(ir.getItem("CAR_AudiQ7_At_Home"),OFF)
#close garage door if its open and not currently moving
if ir.getItem("EX_Garage_DoubleDoor_Sensor").state == OPEN:
if ir.getItem("EX_Garage_DoubleDoor_Moving_Switch").state == OFF: # make sure not closing
events.sendCommand (ir.getItem ("EX_Garage_OperateDoubleDoor_Button"), ON)
else:
events.sendCommand(ir.getItem("CAR_AudiQ7_At_Home"),ON)
@rule ("SubaruOutback online")
@when ("Item CAR_SubaruOutback_Sync_Switch changed to ON")
def subaru_in_sync (event):
uptime = int(ir.getItem("CAR_SubaruOutback_Uptime_Seconds").state.toString())
signal = int(ir.getItem("CAR_SubaruOutback_WIFI_Signal_Strength").state.toString())
if ir.getItem("CAR_SubaruOutback_Online_Switch").state==ON:
events.sendCommand(ir.getItem("CAR_SubaruOutback_At_Home"),ON)
if uptime > 60000: #been running for 1 min before getting ON therefore assume car arriving
if ir.getItem("EX_Garage_SingleDoor_Sensor").state == CLOSED:
events.sendCommand (ir.getItem ("EX_Garage_OperateSingleDoor_Button"), ON)
@rule ("SubaruOutback offline")
@when ("Item CAR_SubaruOutback_Online_Switch changed to OFF")
def subaru_offline (event):
uptime = int(ir.getItem("CAR_SubaruOutback_Uptime_Seconds").state.toString())
signal = int(ir.getItem("CAR_SubaruOutback_WIFI_Signal_Strength").state.toString())
if signal < -70:# if signal < -70 when turning off, assume car is leaving
events.sendCommand(ir.getItem("CAR_SubaruOutback_At_Home"),OFF)
#close garage door if its open and not currently moving
if ir.getItem("EX_Garage_SingleDoor_Sensor").state == OPEN:
if ir.getItem("EX_Garage_SingleDoor_Moving_Switch").state == OFF: # make sure not closing
events.sendCommand (ir.getItem ("EX_Garage_OperateSingleDoor_Button"), ON)
else:
events.sendCommand(ir.getItem("CAR_SubaruOutback_At_Home"),ON)