Car Presence

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)

  
3 Likes