jalmeroth / pymusiccast

MIT License
12 stars 10 forks source link

Additional Zones not found using AV Controller with MultiZone MusicCast #2

Closed buzz-b closed 6 years ago

buzz-b commented 6 years ago

Hi,

Firstly thanks for writing this great component. I'm looking forward to getting it working on my home config.

The issue is that your component only picks up the main zone of my YAmaha AV Recevier RX-A2070. I've got two Zones configured at the moment, with a 3rd on the way. All can be controlled with the Yamaha Mobile MusicCast App, so I know the setup is ok.

Below are some DeviceInfo responses for you (inc Zone2), please let me know what else you need. I did see that the current Yamaha Receiver Component looks for multi-zone AV's, by performing a zone loop, and Add_Device in HASS. You may be able to use some of that code (if you can?).

By the way, my use for this is more about turning on off the right zone, and changing a preset tuner station. So if you need somewhere to start that would be fantastic. I can test the code for you as much as you need.

Hope this all helps?

Thanks, Andy...

http:///YamahaExtendedControl/v1/system/getDeviceInfo {"response_code":0,"model_name":"RX-A2070","destination":"A","device_id":"00A0DEFD2FF5","system_id":"07F85DF3","system_version":1.07,"api_version":1.19,"netmodule_version":"1626 ","netmodule_checksum":"D9231566","operation_mode":"normal","update_error_code":"00000000"}

http:///YamahaExtendedControl/v1/system/getFeatures {"response_code":0,"system":{"func_list":["wired_lan","wireless_lan","wireless_direct","network_standby","network_standby_auto","bluetooth_standby","bluetooth_tx_setting","hdmi_out_1","hdmi_out_2","airplay","disklavier_settings","remote_info","network_reboot"],"zone_num":4,"input_list":[{"id":"pandora","distribution_enable":true,"rename_enable":false,"account_enable":true,"play_info_type":"netusb"},{"id":"spotify","distribution_enable":true,"rename_enable":false,"account_enable":false,"play_info_type":"netusb"},{"id":"tidal","distribution_enable":true,"rename_enable":false,"account_enable":true,"play_info_type":"netusb"},{"id":"deezer","distribution_enable":true,"rename_enable":false,"account_enable":true,"play_info_type":"netusb"},{"id":"airplay","distribution_enable":false,"rename_enable":false,"account_enable":false,"play_info_type":"netusb"},{"id":"mc_link","distribution_enable":false,"rename_enable":true,"account_enable":false,"play_info_type":"netusb"},{"id":"server","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"netusb"},{"id":"net_radio","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"netusb"},{"id":"bluetooth","distribution_enable":true,"rename_enable":false,"account_enable":false,"play_info_type":"netusb"},{"id":"usb","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"netusb"},{"id":"tuner","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"tuner"},{"id":"av1","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"av2","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"av3","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"av4","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"av5","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"av6","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"av7","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"audio1","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"audio2","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"audio3","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"phono","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"v_aux","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"},{"id":"main_sync","distribution_enable":true,"rename_enable":true,"account_enable":false,"play_info_type":"none"}]},"zone":[{"id":"main","func_list":["power","sleep","volume","mute","sound_program","pure_direct","enhancer","tone_control","dialogue_level","signal_info","prepare_input_change","link_control","link_audio_delay"],"input_list":["pandora","spotify","tidal","deezer","airplay","mc_link","server","net_radio","bluetooth","usb","tuner","av1","av2","av3","av4","av5","av6","av7","audio1","audio2","audio3","phono","v_aux"],"sound_program_list":["munich","vienna","amsterdam","freiburg","royaumont","chamber","village_vanguard","warehouse_loft","cellar_club","roxy_theatre","bottom_line","sports","action_game","roleplaying_game","music_video","recital_opera","standard","spectacle","sci-fi","adventure","drama","mono_movie","enhanced","2ch_stereo","9ch_stereo","surr_decoder","straight"],"tone_control_mode_list":["manual"],"link_control_list":["speed","standard","stability"],"link_audio_delay_list":["audio_sync","lip_sync"],"range_step":[{"id":"volume","min":0,"max":161,"step":1},{"id":"tone_control","min":-12,"max":12,"step":1},{"id":"dialogue_level","min":0,"max":3,"step":1}]},{"id":"zone2","zone_b":false,"func_list":["power","sleep","volume","mute","enhancer","tone_control","prepare_input_change","link_control"],"input_list":["pandora","spotify","tidal","deezer","airplay","mc_link","server","net_radio","bluetooth","usb","tuner","av1","av2","av3","av4","av5","av6","av7","audio1","audio2","audio3","phono","v_aux","main_sync"],"tone_control_mode_list":["manual","auto","bypass"],"link_control_list":["speed","standard","stability"],"range_step":[{"id":"volume","min":0,"max":161,"step":1},{"id":"tone_control","min":-12,"max":12,"step":1}]},{"id":"zone3","func_list":["power","sleep","volume","mute","enhancer","tone_control","prepare_input_change"],"input_list":["pandora","spotify","tidal","deezer","airplay","mc_link","server","net_radio","bluetooth","usb","tuner","av1","av2","av3","av4","audio1","audio2","audio3","phono","v_aux","main_sync"],"tone_control_mode_list":["manual","auto","bypass"],"range_step":[{"id":"volume","min":0,"max":161,"step":1},{"id":"tone_control","min":-12,"max":12,"step":1}]},{"id":"zone4","func_list":["power","sleep","prepare_input_change"],"input_list":["av1","av2","av3","av4","av5","av6","av7","v_aux"]}],"tuner":{"func_list":["fm","dab"],"range_step":[{"id":"fm","min":87500,"max":108000,"step":50}],"preset":{"type":"separate","num":40}},"netusb":{"func_list":["recent_info","play_queue","mc_playlist"],"preset":{"num":40},"recent_info":{"num":40},"play_queue":{"size":200},"mc_playlist":{"size":200,"num":5},"net_radio_type":"airable","pandora":{"sort_option_list":["recent","alphabet"]}},"distribution":{"server_zone_list":["main","zone2"]},"ccs":{"supported":true}}

http:///YamahaExtendedControl/v1/netusb/getPlayInfo {"response_code":0,"input":"net_radio","play_queue_type":"system","playback":"stop","repeat":"off","shuffle":"off","play_time":0,"total_time":0,"artist":"","album":"","track":"","albumart_url":"","albumart_id":7262,"usb_devicetype":"unknown","auto_stopped":false,"attribute":16777219,"repeat_available":[],"shuffle_available":[]}

http:///YamahaExtendedControl/v1/main/getStatus {"response_code":0,"power":"standby","sleep":0,"volume":130,"mute":false,"max_volume":161,"input":"audio1","distribution_enable":true,"sound_program":"surr_decoder","pure_direct":false,"enhancer":true,"tone_control":{"mode":"auto","bass":0,"treble":0},"dialogue_level":0,"link_control":"standard","link_audio_delay":"audio_sync","disable_flags":0}

http:///YamahaExtendedControl/v1/system/getLocationInfo {"response_code":0,"id":"5bd222d8e6de48b3bf8f7fb133774da5","name":"HomeTheater","zone_list":{"main":true,"zone2":true,"zone3":false,"zone4":false}}

http:///YamahaExtendedControl/v1/zone2/getStatus {"response_code":0,"power":"standby","sleep":0,"volume":103,"mute":false,"max_volume":161,"input":"tuner","distribution_enable":true,"enhancer":true,"tone_control":{"mode":"auto","bass":0,"treble":0},"link_control":"standard","disable_flags":0}

jalmeroth commented 6 years ago

Thanks for the details, @buzz-b. I will check that out and see what we can get from it.

jalmeroth commented 6 years ago

With the three samples I got now, it should be possible to support multiple zones. 👍 I already started to work on that, but it will probably take some time as I have to rethink the whole application model and life is happening right now. I will keep you posted.

jalmeroth commented 6 years ago

I started to lay-out how I think this needs to be implemented: https://docs.google.com/drawings/d/1lLkhp3DnnWveGOkYMYcoyAkuhEmwNPn_iJbiJ2nf3EI/edit.

As we are querying getLocationInfo, I am wondering if we should use the name attribute or stick to the name that was configured in HASS. Any opinions on this?

buzz-b commented 6 years ago

Hi,

Funny you should ask that as I thought the same thing. My suggestion is to provide an optional zone name override parameter in config.yaml thus providing the best of both worlds.

Thanks, Andy...

Sent from my mobile, please excuse the shortness of this message.

On 13 Oct 2017, at 03:14, Jan Almeroth notifications@github.com wrote:

I started to lay-out how I think this needs to be implemented: https://docs.google.com/drawings/d/1lLkhp3DnnWveGOkYMYcoyAkuhEmwNPn_iJbiJ2nf3EI/edit.

As we are querying getLocationInfo, I am wondering if we should use the name attribute or stick to the name that was configured in HASS. Any opinions on this?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.

jalmeroth commented 6 years ago

@buzz-b ok, that sounds reasonable to me. Thank you!

Meanwhile I made some progress implementing the new design. One thing that is not yet clear to me yet, is what a linked devices will report once e.g. the volume-level changes. Could you do me a favour and enable debugging for the pymusiccast-module in your configuration.xml like this:

logger:
  default: info
  logs:
    pymusiccast: debug

After restarting hass, debug-messages should appear in your logs. Change the volume of your zones and look for messages like this: [pymusiccast.helpers] received message: b'{"main":{"volume":91},"device_id":"<deviceId>"}'

Is it always the same deviceId (main) reporting this change? Or is it the deviceId of each device?

jalmeroth commented 6 years ago

Thinking about the naming-override: Isn't the friendly_name of customize exactly that? 🤔

buzz-b commented 6 years ago

Yes it is, good point, so use that, as I have used that in my config so we can test. Also, I haven't quite had the time to do your debug request yet, but it will get done soon, thanks. By the way, to get around the issue at the moment I edited the init.py and renamed main to zone2 in relevant spots. Hey presto I have my main requirement working.

Thought I'd better let you know, in case you pick that up in the logs.

Thanks...

buzz-b commented 6 years ago

Hi Jan,

I've setup the dubugging now, but didn't have time to wait for it to refresh. so while I'm on that subject.... is there a way to update the status of the Device, the scan / polling intervals are quite wide apart, so using scripts or automation (or waiting for it to register the power on) means the data is old, so I'd like to trigger a refresh, or not have to wait 5-10mins for the card to catcghup?

Thanks, Andy...

buzz-b commented 6 years ago

Got it eventually....

A turn on, volume change, and turn off, sorry all I had time for tonight: last digit appears to have changed

2017-10-17 00:12:30 INFO (MainThread) [homeassistant.core] Bus:Handling <Event call_service[L]: service_data=entity_id=media_player.hometheatre, service=turn_on, service_call_id=1969837712-6, domain=media_player> 2017-10-17 00:19:55 INFO (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: new_state=<state media_player.hometheatre=on; source=tuner, friendly_name=HomeTheatre, volume_level=0.37888198757763975, supported_features=22973, media_content_type=music, source_list=['tuner', 'pandora', 'spotify', 'tidal', 'deezer', 'airplay', 'mc_link', 'server', 'net_radio', 'bluetooth', 'usb', 'av1', 'av2', 'av3', 'av4', 'av5', 'av6', 'av7', 'audio1', 'audio2', 'audio3', 'phono', 'v_aux', 'main_sync'], is_volume_muted=False @ 2017-10-17T00:19:55.245782+08:00>, entity_id=media_player.hometheatre, old_state=<state media_player.hometheatre=off; friendly_name=HomeTheatre, supported_features=22973 @ 2017-10-17T00:11:55.285333+08:00>> 2017-10-17 00:20:57 INFO (MainThread) [homeassistant.core] Bus:Handling <Event call_service[L]: service_data=entity_id=media_player.hometheatre, volume_level=0.15, service=volume_set, service_call_id=1969837712-7, domain=media_player> 2017-10-17 00:21:16 INFO (MainThread) [homeassistant.core] Bus:Handling <Event call_service[L]: service_data=entity_id=media_player.hometheatre, service=turn_off, service_call_id=1969837712-8, domain=media_player>

jalmeroth commented 6 years ago

Hi Andy,

thanks for your efforts, but it looks like you are not seeing the right messages yet.

INFO (MainThread) [homeassistant.core] is a Info message coming from module homeassistant.core. I need to see the actual UDP events coming in from your Yamaha device. If you activate the DEBUG logging as mentioned above you should see DEBUG messages coming from [pymusiccast.helpers] module as soon as any state (volume, power, input, etc.) changes.

Might your patch be the problem here? Would it be possible to setup a second instance of homeassistant for testing? I could share the current development branch for testing?

buzz-b commented 6 years ago

Hi Jan,

I did a grep for DEBUG (or just pymusiccast) out of homeassistant.log, and have got the below messages. I can see from this why I have so much of a delay with the status and some of my code given the update status only fires every 480 secs, that's way too long for me, can you make that a parameter at all?, do you want me to raise that in a separate issue? I assume that is on line 144 of your code, I might try and reduce that to 60 for my environment. This unit gets used daily. might be nice to reduce it to every 30secs when device is on, but make every 2mins when off, something like that anyway, and parameterize those.

2017-10-17 22:36:00 DEBUG (Thread-192) [pymusiccast] {"link_control": "standard", "disable_flags": 0, "mute": false, "enhancer": true, "tone_control": {"mode": "auto", "bass": 0, "treble": 0}, "distribution_enable": true, "sleep": 0, "input": "tuner", "volume": 102, "power": "standby", "response_code": 0, "max_volume": 161} 2017-10-17 22:36:00 DEBUG (Thread-192) [pymusiccast] update status: firing again in 480 seconds 2017-10-17 22:36:00 DEBUG (Thread-192) [pymusiccast] Power: standby 2017-10-17 22:36:00 DEBUG (Thread-192) [pymusiccast] Input: tuner 2017-10-17 22:36:00 DEBUG (Thread-192) [pymusiccast] Volume: 102 / Max: 161 2017-10-17 22:36:00 DEBUG (Thread-192) [pymusiccast] Mute: False 2017-10-17 22:44:00 DEBUG (Thread-193) [pymusiccast] {"link_control": "standard", "disable_flags": 0, "mute": false, "enhancer": true, "tone_control": {"mode": "auto", "bass": 0, "treble": 0}, "distribution_enable": true, "sleep": 0, "input": "tuner", "volume": 102, "power": "standby", "response_code": 0, "max_volume": 161} 2017-10-17 22:44:00 DEBUG (Thread-193) [pymusiccast] update status: firing again in 480 seconds 2017-10-17 22:44:00 DEBUG (Thread-193) [pymusiccast] Power: standby 2017-10-17 22:44:00 DEBUG (Thread-193) [pymusiccast] Input: tuner 2017-10-17 22:44:00 DEBUG (Thread-193) [pymusiccast] Volume: 102 / Max: 161 2017-10-17 22:44:00 DEBUG (Thread-193) [pymusiccast] Mute: False 2017-10-17 22:52:00 DEBUG (Thread-194) [pymusiccast] {"link_control": "standard", "disable_flags": 0, "mute": false, "enhancer": true, "tone_control": {"mode": "auto", "bass": 0, "treble": 0}, "distribution_enable": true, "sleep": 0, "input": "tuner", "volume": 102, "power": "standby", "response_code": 0, "max_volume": 161} 2017-10-17 22:52:00 DEBUG (Thread-194) [pymusiccast] update status: firing again in 480 seconds 2017-10-17 22:52:00 DEBUG (Thread-194) [pymusiccast] Power: standby 2017-10-17 22:52:00 DEBUG (Thread-194) [pymusiccast] Input: tuner 2017-10-17 22:52:00 DEBUG (Thread-194) [pymusiccast] Volume: 102 / Max: 161 2017-10-17 22:52:00 DEBUG (Thread-194) [pymusiccast] Mute: False

I powered it on....

2017-10-17 22:57:27 DEBUG (Thread-18) [pymusiccast] {"response_code": 0} 2017-10-17 23:00:00 DEBUG (Thread-195) [pymusiccast] {"link_control": "standard", "disable_flags": 0, "mute": false, "enhancer": true, "tone_control": {"mode": "auto", "bass": 0, "treble": 0}, "distribution_enable": true, "sleep": 0, "input": "tuner", "volume": 81, "power": "on", "response_code": 0, "max_volume": 161} 2017-10-17 23:00:00 DEBUG (Thread-195) [pymusiccast] update status: firing again in 480 seconds 2017-10-17 23:00:00 DEBUG (Thread-195) [pymusiccast] Power: on 2017-10-17 23:00:00 DEBUG (Thread-195) [pymusiccast] Input: tuner 2017-10-17 23:00:00 DEBUG (Thread-195) [pymusiccast] Volume: 81 / Max: 161 2017-10-17 23:00:00 DEBUG (Thread-195) [pymusiccast] Mute: False

I used your HASS Card on the main GUI to lower the volume...

2017-10-17 23:05:43 DEBUG (Thread-17) [pymusiccast] {"response_code": 0} 2017-10-17 23:08:00 DEBUG (Thread-196) [pymusiccast] {"link_control": "standard", "disable_flags": 0, "mute": false, "enhancer": true, "tone_control": {"mode": "auto", "bass": 0, "treble": 0}, "distribution_enable": true, "sleep": 0, "input": "tuner", "volume": 32, "power": "on", "response_code": 0, "max_volume": 161} 2017-10-17 23:08:00 DEBUG (Thread-196) [pymusiccast] update status: firing again in 480 seconds 2017-10-17 23:08:00 DEBUG (Thread-196) [pymusiccast] Power: on 2017-10-17 23:08:00 DEBUG (Thread-196) [pymusiccast] Input: tuner 2017-10-17 23:08:00 DEBUG (Thread-196) [pymusiccast] Volume: 32 / Max: 161 2017-10-17 23:08:00 DEBUG (Thread-196) [pymusiccast] Mute: False

I made the change to your interval scan, and now have this output.

pymusiccast_grep_debug.txt

Let me know if you need more....

Andy...

jalmeroth commented 6 years ago

Hi Andy,

thanks again for your input/effort. Unfortunately this is still not what I was looking for. The good news is, that it seems to be an issue not only you are experiencing, as #1 is sounding very similar.

Could you describe your setup (hass-, python-, os-version, etc.), so I can try to debug, why the UDP-connection is not established correctly? Are you running any firewalls or networks filters on incoming connections?

Regarding the interval: normally, a refresh of every 480 seconds (8 Min.) should be sufficient, because this is only to keep the UDP-connection alive. The (obviously missing) UDP-connection would deliver change-events instantaneous. So I don't see any reason to lower this interval, but parametrisation is already foreseen.

buzz-b commented 6 years ago

I'm running ufw on pii, python 3.5, hass 54.

I can remove ufw tomorrow to see if that's working (i'm assuming so), but I'm not getting any other issues from other sensors. It's bed time here (well past actually), so I'll get back to you within 24hrs about ufw testing.

Thanks, Andy...

On Wed, Oct 18, 2017 at 12:29 AM, Jan Almeroth notifications@github.com wrote:

Hi Andy,

thanks again for your input/effort. Unfortunately this is still not what I was looking for. The good news is, that it seems to be an issue not only you are experiencing, as #1 https://github.com/jalmeroth/pymusiccast/issues/1 is sounding very similar.

Could you describe your setup (hass-, python-, os-version, etc.), so I can try to debug, why the UDP-connection is not established correctly? Are you running any firewalls or networks filters on incoming connections?

Regarding the interval: normally, a refresh of every 480 seconds (8 Min.) should be sufficient, because this is only to keep the UDP-connection alive. The (obviously missing) UDP-connection would deliver change-events instantaneous. So I don't see any reason to lower this interval, but parametrisation is already foreseen.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/jalmeroth/pymusiccast/issues/2#issuecomment-337278045, or mute the thread https://github.com/notifications/unsubscribe-auth/AfIWZ863IAopbawhyDURDOAY6BiU_k5wks5stNXUgaJpZM4PyjsB .

jalmeroth commented 6 years ago

Sleep tight, Andy.

(Meanwhile, I will make sure interval_seconds will become a new option in config.yaml)

buzz-b commented 6 years ago

Hi Jan,

DEBUG File attached with UDP packets now included, now that I've allowed UDP from my amp on the Pii firewall.

Hope this helps...

Andy... pymusiccast_grep_debug.txt

jalmeroth commented 6 years ago

Perfect, that's exactly the info I was looking for! I will analyse the logs and push an update soon.

(With the UDP-connection established, you should see all changes right away… Right?)

buzz-b commented 6 years ago

Yes, getting good updated info now thanks

Sent from my mobile, please excuse the shortness of this message.

On 19 Oct 2017, at 01:28, Jan Almeroth notifications@github.com wrote:

Perfect, that's exactly the info I was looking for! I will analyse the logs and push an update soon.

(With the UDP-connection established, you should see all changes right away… Right?)

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.

jalmeroth commented 6 years ago

FYI: I pushed an update last Friday: https://github.com/home-assistant/home-assistant/pull/9968

buzz-b commented 6 years ago

Cool, I’ll give it a go tonight and let you know.

Thanks...

Sent from my mobile, please excuse the shortness of this message.

On 24 Oct 2017, at 01:46, Jan Almeroth notifications@github.com wrote:

FYI: I pushed an update last Friday: home-assistant/home-assistant#9968

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.

buzz-b commented 6 years ago

hmmm, might have over estimated my abilities Jan, not being a developer (well not in this decade anyway ;) ) how on earth do I just download your updated Github updates. I've just updated homeassistant to 56.2 to make sure I'm at latest, now how do I get your component updates please.

Thanks, and apologies for user support here, but can't test your updates with this info. and I can't find any general instructions around it.

jalmeroth commented 6 years ago

Hi Andy,

no worries, it's a bit tricky and all depending on your setup. There's a guide on how to setup the development environment for HASS: https://home-assistant.io/developers/development_environment/. Once this has been set-up, you can follow along this guide to checkout my Pull-Request locally and merge it into your dev-branch: https://help.github.com/articles/checking-out-pull-requests-locally/

Or you wait until the PR has been accepted and a new version ships. 😊

Jan

On Wed 25. Oct 2017 at 10:57, buzz-b notifications@github.com wrote:

hmmm, might have over estimated my abilities Jan, not being a developer (well not in this decade anyway ;) ) how on earth do I just download your updated Github updates. I've just updated homeassistant to 56.2 to make sure I'm at latest, now how do I get your component updates please.

Thanks, and apologies for user support here, but can't test your updates with this info. and I can't find any general instructions around it.

— You are receiving this because you commented.

Reply to this email directly, view it on GitHub https://github.com/jalmeroth/pymusiccast/issues/2#issuecomment-339262690, or mute the thread https://github.com/notifications/unsubscribe-auth/AD-JHL93Mb-bHnGOKGMjWM5ptTdjDr0sks5svvgCgaJpZM4PyjsB .

buzz-b commented 6 years ago

Thanks Jan, Think I might wait until it's in general release. hopefully that won't take too long. I can't be bothered setting up a diff dev config.

I've got a new request for you to think about, but I'll raise a separate request for that one. I'd like to change to preset tuner stations, via my Alexa.

jalmeroth commented 6 years ago

FYI: my latest PR has been merged into dev and will be released soon.

jalmeroth commented 6 years ago

0.57 has been released today. Happy testing!

buzz-b commented 6 years ago

Awesome, I’ll download it today, test and let you know.

Thanks again...

Sent from my mobile, please excuse the shortness of this message.

On 5 Nov 2017, at 03:23, Jan Almeroth notifications@github.com wrote:

0.57 has been released today. Happy testing!

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.

buzz-b commented 6 years ago

Testing complete, this request can now be closed off, Thanks jan.. Much appreciated.

jalmeroth commented 6 years ago

Thank you!