I wanted to share some observations about the Garadget Binding and help others who use this device.
The items file example described in the binding https://www.openhab.org/addons/bindings/garadget1/ is a great starting point.
Since I have two doors instead of one, I used that to get it to work for two doors:
garadget.items
Group Garadget
Group UI
String door1 "Garage Door [%s]" <rollershutter> (Garadget,UI) { garadget="<[330028001447373033383530#door1]" }
// A Contact item supports open and closed, but a Garadget doorStatus_status can be:
// closed, open, closing, opening, stopped
// (as documented here: https://github.com/Garadget/firmware#door-states-status)
String doorStatus_status_door1 "Door Status [%s]" <garagedoor> (Garadget,doorStatus,UI) { garadget="<[330028001447373033383530#doorStatus_status]" }
String doorStatus_time_door1 "Last Change [%s ago]" <clock> (Garadget,doorStatus,UI) { garadget="<[330028001447373033383530#doorStatus_time]" }
// Send the doorState item commands like ZERO, HUNDRED, UP, DOWN, ON, OFF, STOP, or "open", "closed" or "stop".
Rollershutter doorState_door1 "Control" <rollershutter> (Garadget,UI) { garadget=">[330028001447373033383530#setState],<[330028001447373033383530#doorStatus_status]" }
Number doorStatus_sensor_door1 "Reflection [%d %%]" <sun> (Garadget,doorStatus,UI) { garadget="<[330028001447373033383530#doorStatus_sensor]" }
Number doorConfig_srt_door1 "Threshold [%d %%]" <battery> (Garadget,doorStatus,UI) { garadget="<[330028001447373033383530#doorConfig_srt]" }
Number doorStatus_signal_door1 "Signal [%d dB]" <battery> (Garadget,doorStatus,UI) { garadget="<[330028001447373033383530#doorStatus_signal]" }
String last_app_door1 "Last App [%s]" (Garadget) { garadget="<[330028001447373033383530#last_app]" }
String last_ip_address_door1 "Last IP Address [%s]" (Garadget) { garadget="<[330028001447373033383530#last_ip_address]" }
DateTime last_heard_door1 "Last Heard [%1$tm/%1$td %1$tH:%1$tM]" <clock> (Garadget) { garadget="<[330028001447373033383530#last_heard]" }
Number product_id_door1 "Product ID [%d]" (Garadget) { garadget="<[330028001447373033383530#product_id]" }
Switch connected_door1 "Connected [%s]" (Garadget) { garadget="<[330028001447373033383530#connected]" }
String doorStatus_door1 "Door Status [%s]" (Garadget) { garadget="<[330028001447373033383530#doorStatus]" }
String doorConfig_door1 "Door Config [%s]" (Garadget) { garadget="<[330028001447373033383530#doorConfig]" }
Number doorConfig_ver_door1 "Version [%.1f]" (Garadget) { garadget="<[330028001447373033383530#doorConfig_ver]" }
Number doorConfig_rdt_door1 "Sensor Scan Interval [%d ms]" (Garadget) { garadget="<[330028001447373033383530#doorConfig_rdt]" }
Number doorConfig_mtt_door1 "Door Moving Time [%d ms]" (Garadget) { garadget="<[330028001447373033383530#doorConfig_mtt]" }
Number doorConfig_rlt_door1 "Button Press Time [%d ms]" (Garadget) { garadget="<[330028001447373033383530#doorConfig_rlt]" }
Number doorConfig_rlp_door1 "Delay betw Presses [%d ms]" (Garadget) { garadget="<[330028001447373033383530#doorConfig_rlp]" }
Number doorConfig_srr_door1 "Sensor reads [%d]" (Garadget) { garadget="<[330028001447373033383530#doorConfig_srr]" }
Number doorConfig_aot_door1 "Open Timeout Alert [%d min]" (Garadget) { garadget="<[330028001447373033383530#doorConfig_aot]" }
Number doorConfig_ans_door1 "Night time alert start [%d min from midnight]" (Garadget) { garadget="<[330028001447373033383530#doorConfig_ans]" }
Number doorConfig_ane_door1 "Night time alert end [%d min from midnight]" (Garadget) { garadget="<[330028001447373033383530#doorConfig_ane]" }
String netConfig_door1 "Net Config [%s]" (Garadget) { garadget="<[330028001447373033383530#netConfig]" }
String netConfig_ip_door1 "IP Address [%s]" (Garadget) { garadget="<[330028001447373033383530#netConfig_ip]" }
String netConfig_snet_door1 "Subnet [%s]" (Garadget) { garadget="<[330028001447373033383530#netConfig_snet]" }
String netConfig_gway_door1 "Gateway [%s]" (Garadget) { garadget="<[330028001447373033383530#netConfig_gway]" }
String netConfig_mac_door1 "MAC address [%s]" (Garadget) { garadget="<[330028001447373033383530#netConfig_mac]" }
String netConfig_ssid_door1 "SSID [%s]" (Garadget) { garadget="<[330028001447373033383530#netConfig_ssid]" }
// send the setConfig item commands like "ans=1200|ane=420" to set night time alert to 8pm-7am, for example.
String setConfig_door1 "Garage Door 1 Config [%s]" (Garadget) { garadget=">[330028001447373033383530#setConfig],<[330028001447373033383530#doorConfig]" }
Switch doorStatus_status_door1_timer_10 (doorStatusTimers){expire="10m,command=OFF"}
Switch doorStatus_status_door1_timer_30 (doorStatusTimers){expire="20m,command=OFF"}
String door2 "Garage Door [%s]" <rollershutter> (Garadget,doorStatus,UI) { garadget="<[2b0027001447373033383530#door2]" }
// A Contact item supports open and closed, but a Garadget doorStatus_status can be:
// closed, open, closing, opening, stopped
// (as documented here: https://github.com/Garadget/firmware#door-states-status)
String doorStatus_status_door2 "Door Status [%s]" <garagedoor> (Garadget,doorStatus,UI) { garadget="<[2b0027001447373033383530#doorStatus_status]" }
String doorStatus_time_door2 "Last Change [%s ago]" <clock> (Garadget,doorStatus,UI) { garadget="<[2b0027001447373033383530#doorStatus_time]" }
// Send the doorState item commands like ZERO, HUNDRED, UP, DOWN, ON, OFF, STOP, or "open", "closed" or "stop".
Rollershutter doorState_door2 "Control" <rollershutter> (Garadget,doorStatus,UI) { garadget=">[2b0027001447373033383530#setState],<[2b0027001447373033383530#doorStatus_status]" }
Number doorStatus_sensor_door2 "Reflection [%d %%]" <sun> (Garadget,doorStatus,UI) { garadget="<[2b0027001447373033383530#doorStatus_sensor]" }
Number doorConfig_srt_door2 "Threshold [%d %%]" <battery> (Garadget,doorStatus,UI) { garadget="<[2b0027001447373033383530#doorConfig_srt]" }
Number doorStatus_signal_door2 "Signal [%d dB]" <battery> (Garadget,doorStatus,UI) { garadget="<[2b0027001447373033383530#doorStatus_signal]" }
String last_app_door2 "Last App [%s]" (Garadget) { garadget="<[2b0027001447373033383530#last_app]" }
String last_ip_address_door2 "Last IP Address [%s]" (Garadget) { garadget="<[2b0027001447373033383530#last_ip_address]" }
DateTime last_heard_door2 "Last Heard [%1$tm/%1$td %1$tH:%1$tM]" <clock> (Garadget) { garadget="<[2b0027001447373033383530#last_heard]" }
Number product_id_door2 "Product ID [%d]" (Garadget) { garadget="<[2b0027001447373033383530#product_id]" }
Switch connected_door2 "Connected [%s]" (Garadget) { garadget="<[2b0027001447373033383530#connected]" }
String doorStatus_door2 "Door Status [%s]" (Garadget) { garadget="<[2b0027001447373033383530#doorStatus]" }
String doorConfig_door2 "Door Config [%s]" (Garadget) { garadget="<[2b0027001447373033383530#doorConfig]" }
Number doorConfig_ver_door2 "Version [%.1f]" (Garadget) { garadget="<[2b0027001447373033383530#doorConfig_ver]" }
Number doorConfig_rdt_door2 "Sensor Scan Interval [%d ms]" (Garadget) { garadget="<[2b0027001447373033383530#doorConfig_rdt]" }
Number doorConfig_mtt_door2 "Door Moving Time [%d ms]" (Garadget) { garadget="<[2b0027001447373033383530#doorConfig_mtt]" }
Number doorConfig_rlt_door2 "Button Press Time [%d ms]" (Garadget) { garadget="<[2b0027001447373033383530#doorConfig_rlt]" }
Number doorConfig_rlp_door2 "Delay betw Presses [%d ms]" (Garadget) { garadget="<[2b0027001447373033383530#doorConfig_rlp]" }
Number doorConfig_srr_door2 "Sensor reads [%d]" (Garadget) { garadget="<[2b0027001447373033383530#doorConfig_srr]" }
Number doorConfig_aot_door2 "Open Timeout Alert [%d min]" (Garadget) { garadget="<[2b0027001447373033383530#doorConfig_aot]" }
Number doorConfig_ans_door2 "Night time alert start [%d min from midnight]" (Garadget) { garadget="<[2b0027001447373033383530#doorConfig_ans]" }
Number doorConfig_ane_door2 "Night time alert end [%d min from midnight]" (Garadget) { garadget="<[2b0027001447373033383530#doorConfig_ane]" }
String netConfig_door2 "Net Config [%s]" (Garadget) { garadget="<[2b0027001447373033383530#netConfig]" }
String netConfig_ip_door2 "IP Address [%s]" (Garadget) { garadget="<[2b0027001447373033383530#netConfig_ip]" }
String netConfig_snet_door2 "Subnet [%s]" (Garadget) { garadget="<[2b0027001447373033383530#netConfig_snet]" }
String netConfig_gway_door2 "Gateway [%s]" (Garadget) { garadget="<[2b0027001447373033383530#netConfig_gway]" }
String netConfig_mac_door2 "MAC address [%s]" (Garadget) { garadget="<[2b0027001447373033383530#netConfig_mac]" }
String netConfig_ssid_door2 "SSID [%s]" (Garadget) { garadget="<[2b0027001447373033383530#netConfig_ssid]" }
// send the setConfig item commands like "ans=1200|ane=420" to set night time alert to 8pm-7am, for example.
String setConfig_door2 "Garage Door 2 Config [%s]" (Garadget) { garadget=">[2b0027001447373033383530#setConfig],<[2b0027001447373033383530#doorConfig]" }
Switch doorStatus_status_door2_timer_10 (doorStatusTimers){expire="10m,command=OFF"}
Switch doorStatus_status_door2_timer_30 (doorStatusTimers){expire="20m,command=OFF"}
The door status reported by the binding can vary depending on how you open the door and I think also the brand of opener.
It will go one of two ways:
- from opening to open, or
- from closed to open.
Someone more experienced can probably write this more efficiently, but the below rules worked for me in both conditions.
For my example, I will send an email (specifically, an email-to-SMS text for Verizon) if either door is still open after 10 minutes, and send another notice if still open after 30 minutes.
Even though the Garadget app lets you assign one email address, it does not let you assign more than one (or a different one to each door), nor does it allow you to use a email-to-SMS text address (at least it did not accept mine).
So, by using this rule format with the email action, the binding will let you send notification to as many addresses or phone numbers you wish. Note that using this method is a bit slower than if you use Pushover and/or the Gardget app notification. In my case, the difference was less than one minute longer. So, if you are going for 10 minutes, you might want to set your timer for 9 minutes instead.
garadget.rules
var Timer door1OpenTimer = null
var Timer door2OpenTimer = null
val int timeoutMinutes = 30
rule "Garage Door 1 Left Open for 10 minutes first"
when
Item doorStatus_status_door1 changed from closed to open
then
if (door1OpenTimer === null) {
door1OpenTimer = createTimer(now.plusMinutes(10)) [|
door1OpenTimer = null
if (doorStatus_status_door1.state.toString =="open"){
logInfo("Garage Door 1", "The garage door for the Camry has been left open for 10 minutes. Message texted to owner.")
sendMail("5127775689@vtext.com", " ", "The garage door for the Camry has been left open for 10 minutes.")
}
]
}
end
rule "Garage Door 1 Left Open for 10 minutes second"
when
Item doorStatus_status_door1 changed from opening to open
then
if (door1OpenTimer === null) {
door1OpenTimer = createTimer(now.plusMinutes(10)) [|
door1OpenTimer = null
if (doorStatus_status_door1.state.toString =="open"){
logInfo("Garage Door 1", "The garage door for the Camry has been left open for 10 minutes. Message texted to owner.")
sendMail("5127775689@vtext.com", " ", "The garage door for the Camry has been left open for 10 minutes.")
}
]
}
end
rule "Garage Door 1 Left Open for 30 minutes first"
when
Item doorStatus_status_door1 changed from closed to open
then
if (door1OpenTimer === null) {
door1OpenTimer = createTimer(now.plusMinutes(timeoutMinutes)) [|
door1OpenTimer = null
if (doorStatus_status_door1.state.toString =="open"){
logInfo("Garage Door 1", "The garage door for the Camry has been left open for 30 minutes. Message texted to owner.")
sendMail("5127775689@vtext.com", " ", "The garage door for the Camry has been left open for 30 minutes.")
}
]
}
end
rule "Garage Door 1 Left Open for 30 minutes second"
when
Item doorStatus_status_door1 changed from opening to open
then
if (door1OpenTimer === null) {
door1OpenTimer = createTimer(now.plusMinutes(timeoutMinutes)) [|
door1OpenTimer = null
if (doorStatus_status_door1.state.toString =="open"){
logInfo("Garage Door 1", "The garage door for the Camry has been left open for 30 minutes. Message texted to owner.")
sendMail("5127775689@vtext.com", " ", "The garage door for the Camry has been left open for 30 minutes.")
}
]
}
end
rule "Garage Door 2 Left Open for 10 minutes first"
when
Item doorStatus_status_door2 changed from closed to open
then
if (door2OpenTimer === null) {
door2OpenTimer = createTimer(now.plusMinutes(10)) [|
door2OpenTimer = null
if (doorStatus_status_door2.state.toString =="open"){
logInfo("Garage Door 2", "The garage door for the Corolla has been left open for 10 minutes. Message texted to owner.")
sendMail("5125550123@vtext.com", " ", "The garage door for the Corolla has been left open for 10 minutes.")
}
]
}
end
rule "Garage Door 2 Left Open for 10 minutes second"
when
Item doorStatus_status_door2 changed from opening to open
then
if (door2OpenTimer === null) {
door2OpenTimer = createTimer(now.plusMinutes(10)) [|
door2OpenTimer = null
if (doorStatus_status_door2.state.toString =="open"){
logInfo("Garage Door 2", "The garage door for the Corolla has been left open for 10 minutes. Message texted to owner.")
sendMail("5125550123@vtext.com", " ", "The garage door for the Corolla has been left open for 10 minutes.")
}
]
}
end
rule "Garage Door 2 Left Open for 30 minutes first"
when
Item doorStatus_status_door2 changed from closed to open
then
if (door2OpenTimer === null) {
door2OpenTimer = createTimer(now.plusMinutes(timeoutMinutes)) [|
door2OpenTimer = null
if (doorStatus_status_door2.state.toString =="open"){
logInfo("Garage Door 2", "The garage door for the Corolla has been left open for 30 minutes. Message texted to owner.")
sendMail("5125550123@vtext.com", " ", "The garage door for the Corolla has been left open for 30 minutes.")
}
]
}
end
rule "Garage Door 2 Left Open for 30 minutes second"
when
Item doorStatus_status_door2 changed from opening to open
then
if (door2OpenTimer === null) {
door2OpenTimer = createTimer(now.plusMinutes(timeoutMinutes)) [|
door2OpenTimer = null
if (doorStatus_status_door2.state.toString =="open"){
logInfo("Garage Door 2", "The garage door for the Corolla has been left open for 30 minutes. Message texted to owner.")
sendMail("5125550123@vtext.com", " ", "The garage door for the Corolla has been left open for 30 minutes.")
}
]
}
end
Being new to openHAB, I welcome any improvements you can offer to this sample code!