Here is the code for the device handler. I copied your first post in a text editor then made the volume code adjustment. If I only have the set volume in the piston, there is no sound at all. I added a 5 sec wait but still no change in the volume.
EDIT: I am running GAR 3.31
/*
metadata {
definition (name: “Google Home Assistant Relay v3”, namespace: “ryan780”, author: “Ryan780”) {
capability “Actuator”
capability “Notification”
command “mute”
command “unmute”
command “stop”
command “muteDevice”, [“string”]
command “unmuteDevice”, [“string”]
command “stopDevice”, [“string”]
command “castContent”, [“string”,“string”,“string”]
command “setDeviceVolume”, [“string”,“number”]
}
tiles(scale: 2) {
valueTile(“main”, “------”, width: 2, height: 2) {
state “val”, label:’-----’, defaultState: true
}
}
preferences {
input(name: “serverIP”, type: “string”, title:“Server IP Address”, description: “Enter IP Address of your Assistant Relay Server”, required: true, displayDuringSetup: true)
input(name: “serverPort”, type: “string”, title:“Server Port”, description: “Enter Port of your Assistant Relay Server (defaults to 3000)”, defaultValue: “3000”, required: true, displayDuringSetup: true)
input(name: “user”, type: “string”, title:“Assistant Relay Username”, description: “Enter the username for this device”, defaultValue: “”, required: false, displayDuringSetup: true)
input(name: “defaultDevice”, type: “string”, title:“Display Device IP or Name”, description: “Enter the IP address or name of your dispplay device”, required: false)
}
}
def installed() {
updated()
}
def updated() {
}
def initialialized(){
updated()
}
def parse(String description) {
//if (logEnable) log.debug “Parsing ${description}”
}
def speak(message) {
message = message.replaceAll("%20", " “)
message = message.replace(“Å”, “\u00C5”)
message = message.replace(“å”, “\u00E5”)
message = message.replace(“Ä”, “\u00C4”)
message = message.replace(“ä”, “\u00E4”)
message = message.replace(“Ö”, “\u00D6”)
message = message.replace(“ö”, “\u00F6”)
message = message.replace(“Ø”, “\u00D8”)
message = message.replace(“Æ”, “\u00C6”)
message = message.replace(“æ”, “\u00E6”)
message = message.replace(“ø”, “\u00F8”)
def myJSON = “”
if(message.startsWith(”[CC]")){
message = message.minus("[CC]")
if (user) {
myJSON = “{ “command”: “{message}\",\"user\": \"{user}” }”
} else {
myJSON = “{ “command”: “{message}\" }"
}
}
else if(message.startsWith("[CCC]")){
message = message.minus("[CCC]")
if (user) {
myJSON = "{ \"command\": \"{message}”,“user”: “{user}\",\"converse\": \"true\" }"
} else {
myJSON = "{ \"command\": \"{message}”,“converse”: “true” }”
}
}
else if(message.startsWith("[P]")){
message = message.minus("[P]")
if (user) {
myJSON = “{ “preset”: “{message}\",\"user\": \"{user}” }”
} else {
myJSON = “{ “preset”: “{message}\" }"
}
}
else {
if (user) {
myJSON = "{ \"command\": \"{message}”,“user”: “{user}\",\"broadcast\": \"true\" }"
} else {
myJSON = "{ \"command\": \"{message}”,“broadcast”: “true” }”
}
}
httpPostJSON(myJSON)
}
def deviceNotification(message) {
speak(message)
}
def httpPostJSON(myJSON) {
try {
if (logEnable) log.debug “Sending {myJSON} to {serverIP}:{serverPort}"
def headers = [:]
headers.put("HOST", "{serverIP}:{serverPort}")
headers.put("Content-Type", "application/json")
def method = "POST"
def path = "/assistant"
def result = new physicalgraph.device.HubAction(
method: method,
path: path,
body: myJSON,
headers: headers
)
return result
} catch (Exception e) {
log.error "Error = {e}”
}
}
def muteDevice(castDevice){
log.debug “Muting {castDevice}."
def message = "Mute {castDevice}”
def myJSON = “{ “command”: “{message}\",\"user\": \"{user}” }”
httpPostJSON(myJSON)
}
def mute(){
if(defaultDevice){
log.debug “Muting default device.”
muteDevice(defaultDevice)
}else{
log.warn “No default device speficied. Sepcify device in command parameter or driver properties.”
}
}
def unmuteDevice(castDevice){
log.debug “Unmuting {castDevice}."
def message = "Unmute {castDevice}”
def myJSON = “{ “command”: “{message}\",\"user\": \"{user}” }”
httpPostJSON(myJSON)
}
def unmute(){
if(defaultDevice){
log.debug “Unmuting default device.”
unmuteDevice(defaultDevice)
}else{
log.warn “No default device speficied. Sepcify device in command parameter or driver properties.”
}
}
def castContent(castDevice, type, source){
log.debug “Casting {source} of {type} to {castDevice}"
def myJSON = "{ \"type\": \"{type}”,“source”: “{source}\",\"device\": \"{castDevice}” }"
try {
if (logEnable) log.debug “Sending {myJSON} to {serverIP}:{serverPort}"
def headers = [:]
headers.put("HOST", "{serverIP}:{serverPort}")
headers.put("Content-Type", "application/json")
def method = "POST"
def path = "/cast"
def result = new physicalgraph.device.HubAction(
method: method,
path: path,
body: myJSON,
headers: headers
)
return result
} catch (Exception e) {
log.error "Error = {e}”
}
}
def stopDevice(castDevice){
log.debug “Stopping {castDevice}"
def myJSON = "{ \"device\": \"{castDevice}” }"
try {
if (logEnable) log.debug “Sending {myJSON} to {serverIP}:{serverPort}"
def headers = [:]
headers.put("HOST", "{serverIP}:{serverPort}")
headers.put("Content-Type", "application/json")
def method = "POST"
def path = "/cast/stop"
def result = new physicalgraph.device.HubAction(
method: method,
path: path,
body: myJSON,
headers: headers
)
return result
} catch (Exception e) {
log.error "Error = {e}”
}
}
def stop(){
stopDevice(defaultDevice)
}
def uninstalled(){
}
def setDeviceVolume(castDevice, value){
log.debug “Setting volume of {castDevice} to {value}.”
def message = “Set volume of {castDevice} to {value} percent.”
def myJSON = “{ “command”: “{message}\",\"user\": \"{user}” }”
httpPostJSON(myJSON)
}