That's what I found as well. It appears that this is the details behind that post.
http://yannipang.com/blog/ryobi-garage-door-api/
With the java script apps on a device like a raspberry pi, you could trigger to run those commands with a project call OmniThing which allows you to execute any command line command from the device itself.
Alternatively, if you want to solder to a car remote, I would recommend a project call Hubduino along with an ESP8266 board. This allows you to implement a timed-relay device that automatically closes then opens the relay to simulate the button being pressed. That would be a LOT cheaper than a mimo or Qubino device. But if you are going to choose between those two, I would definitely choose the Qubino. The mimo has a lot of issues from what I've read. I guess it depends on what the inside of the remote looks like and how expensive the remote is (should you ruin it by soldering to it).
EDIT: Oh, i saw the post in the ST forum that you were talking about. I would try the JS script along with this driver based on the DTH linked in the post.
/*
* Author: Justin Dybedahl
* Ryobi GDO200 Device Handler
* v1.2.1 Modified by @Projectskydroid
*/
preferences {
section("Internal Access"){
input "email", "text", title: "Email Address",required: true
input "pass","text", title: "Password",required:true
input "apikey", "text", title: "API Key",required: true
input "doorid", "text", title: "Garage Door ID",required: true
input "internal_ip", "text", title: "Internal IP", required: true
input "internal_port", "text", title: "Internal Port (default is 3042)", required: true
}
}
metadata {
definition (name: "Ryobi Garage Door", namespace: "madj42", author: "Justin Dybedahl") {
capability "Actuator"
capability "Door Control"
capability "Garage Door Control"
capability "Switch"
capability "Sensor"
capability "Polling"
capability "Momentary"
capability "Relay Switch"
capability "Refresh"
capability "battery"
}
attribute "switch", "string"
attribute "switch2", "string"
command "on"
command "off"
command "open"
command "close"
}
def poll() {
refresh()
}
def refresh() {
getStatus()
}
def parse(String description){
//log.debug "Parse called"
def msg = parseLanMessage(description)
if (msg.body.startsWith("status:")) {
def batstatus = msg.body.split(':')[3]
def doorstatus = msg.body.split(':')[2]
def lightstatus = msg.body.split(':')[1]
if (batstatus == "255") {
sendEvent(name: "battery", value: 0)
} else if (batstatus == null) {
sendEvent(name: "battery", value: 0)
} else if (batstatus == 'NA') {
sendEvent(name: "battery", value: 0)
} else {
sendEvent(name: "battery", value: batstatus)
}
if (lightstatus == "false") {
//log.debug "Light OFF"
sendEvent(name: "switch2", value: "off")
} else if (lightstatus == "true") {
//log.debug "Light ON"
sendEvent(name: "switch2", value: "on")
}
if (doorstatus == "0") {
//log.debug "Door Closed"
sendEvent(name: "door", value: "closed")
} else if (doorstatus == "1") {
//log.debug "Door Open"
sendEvent(name: "door", value: "open")
} else if (doorstatus == "2") {
//log.debug "Door Closing"
sendEvent(name: "door", value: "closing")
} else if (doorstatus == "3") {
//log.debug "Door Opening"
sendEvent(name: "door", value: "opening")
}
}
}
def on() {
def result = new hubitat.device.HubAction(
method: "GET",
path: "/?name=lighton&doorid=${doorid}&apikey=${apikey}&email=${email}&pass=${pass}",
headers: [
HOST: "${internal_ip}:${internal_port}"
]
)
sendHubCommand(result)
sendEvent(name: "switch2", value: "on")
getStatus()
log.debug "Turning light ON"
}
def off() {
def result = new hubitat.device.HubAction(
method: "GET",
path: "/?name=lightoff&doorid=${doorid}&apikey=${apikey}&email=${email}&pass=${pass}",
headers: [
HOST: "${internal_ip}:${internal_port}"
]
)
sendHubCommand(result)
sendEvent(name: "switch2", value: "off")
getStatus()
log.debug "Turning light OFF"
}
def open() {
def result = new hubitat.device.HubAction(
method: "GET",
path: "/?name=dooropen&doorid=${doorid}&apikey=${apikey}&email=${email}&pass=${pass}",
headers: [
HOST: "${internal_ip}:${internal_port}"
]
)
sendHubCommand(result)
sendEvent(name: "door", value: "opening")
getStatus()
runIn(15,getStatus)
log.debug "OPENING Garage Door"
}
def close() {
def result = new hubitat.device.HubAction(
method: "GET",
path: "/?name=doorclose&doorid=${doorid}&apikey=${apikey}&email=${email}&pass=${pass}",
headers: [
HOST: "${internal_ip}:${internal_port}"
]
)
sendHubCommand(result)
sendEvent(name: "door", value: "closing")
runIn(5,getStatus)
runIn(25,getStatus)
log.debug "CLOSING Garage Door"
}
def getStatus() {
def result = new hubitat.device.HubAction(
method: "GET",
path: "/?name=status&doorid=${doorid}&apikey=${apikey}&email=${email}&pass=${pass}",
headers: [
HOST: "${internal_ip}:${internal_port}"
])
sendHubCommand(result)
log.debug "Getting Status"
}
private String convertIPtoHex(ipAddress) {
String hex = ipAddress.tokenize( '.' ).collect { String.format( '%02x', it.toInteger() ) }.join()
//log.debug "IP address entered is $ipAddress and the converted hex code is $hex"
return hex
}
private String convertPortToHex(port) {
String hexport = port.toString().format( '%04x', port.toInteger() )
//log.debug hexport
return hexport
}
def updated() {
if (!state.updatedLastRanAt || now() >= state.updatedLastRanAt + 5000) {
state.updatedLastRanAt = now()
log.debug "Executing 'updated()'"
runIn(3, "updateDeviceNetworkID")
}
else {
// log.trace "updated(): Ran within last 5 seconds so aborting."
}
}
def updateDeviceNetworkID() {
log.debug "Executing 'updateDeviceNetworkID'"
def iphex = convertIPtoHex(internal_ip).toUpperCase()
def porthex = convertPortToHex(internal_port).toUpperCase()
device.setDeviceNetworkId(iphex + ":" + porthex)
}
I took out the tiles and converted physicalgraph to hubitat. Have no idea if this will work but it's a place to start.