I want to share my solution for this scenario—maybe I’m not the only one facing it.
I have an electric garage door that is Wi-Fi enabled and integrated into Home Assistant via MQTT as a cover. Unfortunately, it doesn’t support cloud integration. I wanted an Apple CarPlay integration that allows me to open the door conveniently when coming home from more than 100 meters away.
The requirements were:
- Cloud-enabled, so I don’t need to be on my home network or use a VPN.
- No Apple HomeKit, since I don’t have a HomeKit gateway, which is required for cloud functionality.
I found that Shelly Cloud is free and CarPlay-enabled
. Here’s what I did: I used a Shelly 2.5 (or any device with two relays) and integrated it into Home Assistant. It doesn’t need to be wired to anything—it acts solely as a broker for the free Shelly Cloud.
The first relay is for the opening/closing the door as a button to be tapped in carplay, the second relay is an indicator weather the garage door is opened or closed.
I created two automations:
- Garage Door Toggle: This automation toggles the garage door using the cover service when pressed. It also updates the second relay according to the door state. Simple as that—I now have a button to open or close the door and an indicator showing the current door status in CarPlay.
- Relay Status Correction: This automation handles the second relay, correcting the status if it’s accidentally switched manually.
Any suggestions for alternative solutions or feedback are welcome!
alias: garage door broker 2.5
description: ""
triggers:
- trigger: state
entity_id:
- cover.garage_door_garage_door
to:
- open
id: open
- trigger: state
entity_id:
- cover.garage_door_garage_door
to:
- closed
id: closed
- trigger: state
entity_id:
- switch.shellyswitch25_4c7525335e56_channel_1
to:
- "on"
id: toggled
conditions: []
actions:
- choose:
- conditions:
- condition: trigger
id:
- toggled
sequence:
- action: cover.toggle
metadata: {}
data: {}
target:
entity_id: cover.garage_door_garage_door
- conditions:
- condition: trigger
id:
- open
sequence:
- action: switch.turn_on
metadata: {}
data: {}
target:
entity_id: switch.shellyswitch25_4c7525335e56_channel_2
- conditions:
- condition: trigger
id:
- closed
sequence:
- action: switch.turn_off
metadata: {}
data: {}
target:
entity_id: switch.shellyswitch25_4c7525335e56_channel_2
mode: single
Door status indicator:
alias: Garagentor Broker 2.5 helper
description: ""
triggers:
- trigger: state
entity_id:
- switch.shellyswitch25_4c7525335e56_channel_2
to:
- "on"
id: "on"
- trigger: state
entity_id:
- switch.shellyswitch25_4c7525335e56_channel_2
to:
- "off"
id: "off"
conditions: []
actions:
- choose:
- conditions:
- condition: trigger
id:
- "on"
sequence:
- delay:
hours: 0
minutes: 0
seconds: 0
milliseconds: 500
- if:
- condition: state
entity_id: cover.garage_door_garage_door
state:
- closed
then:
- action: switch.turn_off
metadata: {}
data: {}
target:
entity_id: switch.shellyswitch25_4c7525335e56_channel_2
- conditions:
- condition: trigger
id:
- "off"
sequence:
- delay:
hours: 0
minutes: 0
seconds: 0
milliseconds: 500
- if:
- condition: state
entity_id: cover.garage_door_garage_door
state:
- open
then:
- action: switch.turn_on
metadata: {}
data: {}
target:
entity_id: switch.shellyswitch25_4c7525335e56_channel_2
mode: single

