[PORT] LG Smart TV Discovery 2012+

@yototogblo It does not, I need the log message to be able to implement it. My TV doesn't operate the same way and I don't see that message ever.

This would be great and reduce the load on the hub. I believe every time websocket fails to connect (it retries for 30s), an error is thrown on HE thus causing slowdowns. This would fix all of that. However, not sure if the error I'm getting below is different from the reconnect failures and is further aggravating the slowdowns for me. Seems like it might be different since it's an interrupt error vs a failed to connect error:
WebSocketInterface.SocketSendThread - InterruptedException during WebSocket thread: sendQueue.take {} java.lang.InterruptedException.

Just curious, what's the rationale behind this logic? Why not keep the delay as fixed?

Yup, that sounds like a bad idea. People would think their TVs are possessed.

Would go ahead and test it out again and send the logs over. Cheers and Merry Christmas!

Here's the log message:
dev:2602019-12-25 11:44:47.860 am debughandler_getForegroundAppInfo: got: [subscribed:true, appId:, returnValue:true, windowId:, processId:]

dev:2602019-12-25 11:44:47.849 am debugparseWebsocketResult: {"type":"response","id":"getForegroundAppInfo","payload":{"subscribed":true,"appId":"","returnValue":true,"windowId":"","processId":""}}

Just a heads up, I moved the power off logic for mine into the getForegroundAppInfo method and now it works fine. Only issue is if the TV is powered off (reported instantly) and then powered back on before a websocket timeout failure is registered, the power and switch stay in the "off" state. I'm thinking best way to deal with that might be to send a power on event every time a websocketresult is received (so in the "parse" method). What do you think? Want to make a change now but once you make your final edits, will update my code.

Also, why are 3 of the same messages received every 20ms each time a change is made?

dev:2602019-12-25 01:27:18.046 pm debughandler_getForegroundAppInfo: got: [subscribed:true, appId:com.webos.app.hdmi4, returnValue:true, windowId:, processId:]

dev:2602019-12-25 01:27:18.040 pm debugparseWebsocketResult: {"type":"response","id":"getForegroundAppInfo","payload":{"subscribed":true,"appId":"com.webos.app.hdmi4","returnValue":true,"windowId":"","processId":""}}

dev:2602019-12-25 01:27:17.989 pm debughandler_getForegroundAppInfo: got: [subscribed:true, appId:com.webos.app.hdmi4, returnValue:true, windowId:, processId:]

dev:2602019-12-25 01:27:17.984 pm debugparseWebsocketResult: {"type":"response","id":"getForegroundAppInfo","payload":{"subscribed":true,"appId":"com.webos.app.hdmi4","returnValue":true,"windowId":"","processId":""}}

dev:2602019-12-25 01:27:17.952 pm debughandler_getForegroundAppInfo: got: [subscribed:true, appId:com.webos.app.hdmi4, returnValue:true, windowId:, processId:]

dev:2602019-12-25 01:27:17.948 pm debugparseWebsocketResult: {"type":"response","id":"getForegroundAppInfo","payload":{"subscribed":true,"appId":"com.webos.app.hdmi4","returnValue":true,"windowId":"","processId":""}}

Thanks

Just gave this a go but doesn't discover ethier of the 2 lg tv i have. Mediarenderer connect can see them on the other hand. No idea why it's not working.

@asj not sure what's going on but I'm getting multiple subscriptions and lots of logging happening for the same event.

Here's my logging of my volume:

dev:2602019-12-26 11:18:26.063 am debugSending: {"id":"audio_getStatus","type":"subscribe","uri":"ssap://audio/getStatus"} storing callback: audio_getStatus

dev:2602019-12-26 11:15:08.676 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.673 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.631 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.628 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.576 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.572 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.524 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.520 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.492 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.489 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.465 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.462 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.439 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.436 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.417 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.407 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.383 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.380 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.357 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.354 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.331 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.328 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.295 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.261 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.226 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.224 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.199 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.196 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.163 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.160 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.136 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.133 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.107 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.104 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.082 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.079 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:08.036 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:08.033 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.943 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.939 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.866 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.863 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.769 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.752 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.694 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.691 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.665 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.662 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.622 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.619 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.595 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.592 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.552 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.549 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.523 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.520 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.465 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.461 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.398 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.395 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.368 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.317 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.270 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.255 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.219 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.216 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.177 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.174 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.124 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.118 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.081 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.078 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.056 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.046 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:07.015 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:07.011 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.978 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.975 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.946 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.943 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.902 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.899 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.857 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.810 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.780 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.776 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.750 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.747 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.722 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.719 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.707 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.694 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.665 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.663 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.640 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.636 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.613 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.610 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.588 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.583 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.560 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.557 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.530 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.527 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.503 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.500 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.462 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.459 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.418 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.415 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.371 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.368 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.073 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.070 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.051 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.048 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:06.014 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:06.011 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:05.985 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:05.982 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:05.958 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:05.955 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:05.930 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:05.926 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:05.872 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:05.870 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:05.840 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:05.837 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:05.059 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:05.056 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:05.032 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:05.029 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:05.000 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:04.997 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:04.974 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:04.971 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:04.753 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:04.749 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:04.724 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:04.722 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:04.688 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:04.686 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:15:04.646 am debughandler_audio_getStatus: got: [changed:[volume], returnValue:true, cause:volumeDown, volumeMax:100, scenario:mastervolume_ext_speaker_arc, volume:0, action:changed, supportvolume:false, active:false, mute:false]

dev:2602019-12-26 11:15:04.643 am debugparseWebsocketResult: {"type":"response","id":"audio_getStatus","payload":{"changed":["volume"],"returnValue":true,"cause":"volumeDown","volumeMax":100,"scenario":"mastervolume_ext_speaker_arc","volume":0,"action":"changed","supportvolume":false,"active":false,"mute":false}}

dev:2602019-12-26 11:14:58.375 am debughandler_audio_getStatus: got: [returnValue:true, volumeMax:100, ringtonewithvibration:true, scenario:mastervolume_ext_speaker_arc, hac:false, subscribed:true, volume:0, action:requested, supportvolume:false, ringer switch:true, slider:false, active:false, mute:false]

@yototogblo First, turn off debug logging. It's very verbose so it's easy to diagnose errors, but not meant for normal operation.

It's 1 message being logged as it passes through different functions and transformed as it goes. You'll see first ones are printing json, then groovy objects, and the handler is printing what it got.

Thanks for the log! A little odd, but I can handle that easy enough, and as you point out the old driver code is functional with it.

Agreed, but it also makes RM4 rules easier to write. For example a command like "Turn on Andrew's Netflix" would be:

  • If not on
  • Turn On
  • Wait for physical on
  • Run Netflix
  • Click right things
  • Profit

With queuing you could avoid the wait, and having it explain it to everyone writing rules. But then they'd also think their TV is possessed...:hear_no_evil: :see_no_evil: :speak_no_evil:

The logic is TV/Network has a hiccup retry the connection quickly so no one notices. Would be fun to get a metric seeing how often this happens. I'm guessing it's almost never.

Thanks for your response.

In the example I posted, it was all the same message and only going through once. In fact, every event had 3 messages logged. It appeared I had 3 different subscriptions going on at the same time. My issue is this is very likely to cause slowdowns in the hub (which I've already seen). When I power down, it goes through the exact same code about 10 times at times. Somehow, the subscriptions seem to be broken and oversubscribing to the same events over and over (instead of every 10 mins).

It's the same story with the audio_getStatus handler. Somehow, it now has a ton of subscriptions to the same audio status. It's the exact same line of code it's going through over and over. It's parseWebsocketResults each time (72 times in a 4 seconds interval). There's something wrong here. @cybrmage code didn't have this issue and I also believe your earlier code didn't.

Okay, figured out the issue in your code:

On line 498, you're scheduling a subscription and running that every 10 minutes. As such, you keep subscribing over and over to the same events and the longer the code runs, the more the subscriptions and the more the slowdowns in the hub. In mine, I created a poll function (similar to the original code) that requests vs subscribes and I'm running that every 10 minutes

@asj Also, just another heads up, your descriptive text logging is called "txtEnable" but in the code, you're using "txtEnabled" so it doesn't log them. Cheers

@yototogblo I was worried about the 10 minute timer on the subscriptions, it's copied from the older driver. Quick testing seemed to imply it wasn't resulting in multiple subscriptions, but that appears to be wrong, I'll fix it up.

And that's for the logging fix. I slammed that in there from other code/style and obviously ended up with a typo, doh!

The old code wasn't actually doing multiple subscriptions. It was calling a polling method that did requests. I believe you changed that to be recursive which caused the issue

I've cleaned up the LG WebOS driver with the most egregious erros you found @yototogblo

I also fixed up the input list handling @joetlawson . Turns out I had a bug in your version which didn't create a list with external inputs like HDMI, and merged this in. (it does if you click home() but that left over testing code, oops!)

Updated here:

Thanks for the update. I actually already made all the changes I need to mine but some things for you to consider:

  1. Power down is sending "" instead of off. The issue we had with blank is likely to reoccur where Hubitat gives it the old value on refresh. Probably need to change it back to "off".
  2. There's a race condition if power down occurs and then the TV turns on again before the websocket fails. This can also occur when updating apps on the TV because for some reason, for a split microsecond, the TV would send nulls in appID and processID and your handler would think it's off. Your device handler would leave the device as off even though the input would change.
    To fix, you need something that turns it back on when an event is received while the device is off. @cybrmage's code uses rResp to deal with this and I added that to mine also.
  3. It appears you got rid of polling completely. Don't know if it's needed but for me, I added a polling method that's scheduled every 10 mins (same way as @cybrmage's code).

Can send you my updated code if that'd help.

Cheers

@asj Thank you so much for putting so much time into this sir. I really appreciate it and all the support you provided my friend.

1 Like

Just a comment here from the peanut gallery .. kudos to both of you and anyone else involved in working on this. I'm anxious to give it another try soon. Thought you'd want to know there are lurkers following this thread that appreciate what you are doing. [Edit: OK, at least two. :-)]

6 Likes

Can you send me a screen shot of the device event stream showing this? The code does a sendPowerEvent("off"...) which is the same as "on" etc. I'd like to see what the description reads.

Thanks for pointing that out, but rResp is a poor solution for what's effectively a synchronization issue. There should be a common handler for "off" handling and this should be consistent no mater if the web socket closed due to a timeout/error or if notified. Localizing all the code together will make consistent handling of events, and I'll update my driver.

There's no need to poll the TV. Websockets opened by the hubitat already do ping/pong's on something like a 30s interval, so there's no point moving data every 10 mins from what I can tell.

Sorry, I meant sending "" for channelName isn't of "off"

It's actually more a problem for "on" handling rather than "off" handling. Right now, it's assuming it only needs to turn on when a websocket connection is restored. It also needs to handle cases when the TV was turned off and then back on before the websocket failed.

Ah, that was an intentional change. channelName is "annoying" since there isn't one when the TV is off, so it shouldn't have a value. You can't use null since it doesn't propagate well, or isn't useable by RM4 or something when I tested it. But I don't like using "off" since that's a valid string, while it's unlikely to have a channel called "off" it's also possible. I'm kind of loathed to use a sentinel value and depend on it. (though "" isn't much better)

What problems is empty channelName causing? If you're using it for on/off detection shouldn't you use power on/off?

Hopefully as I wait for NY tonight I can spend some time fixing up the socket/power reporting. Maybe that'll keep me awake. :slight_smile:

Just a reminder :slight_smile:

See above. I'm not using it for on/off detection.