Legrand Nuvo multi-room audio support

Hi afvoltolini,

Looks like the integration is failing when trying to create a SourceMask object to represent the list of source inputs each of the Nuvo zones is permitted to use. The Nuvo serial protocol returns a decimal number between 0-63 to represent the binary bitmask of the permitted 6 source inputs, but your Nuvo appears to have returned 255, which is very odd. 255 would only be a valid number if the Nuvo had 8 source inputs - your Nuvo has the standard 6 inputs?

Make sure you don’t have anything else trying other than the integration trying to speak to the Nuvo over the serial line at the same time - contention on the line will cause very odd values to appear in responses.

Does the integration fail with this SourceMask error message every time you try it, or does it fail at different points with errors?

To get a clearer idea I really need to see a full log from Home Assistant with debug logging enabled for nuvo_serial integration - this has the query/response output of the integration talking to the Nuvo.

Try adding this to configuration.yaml and restarting HA:

logger:
  default: info
  logs:
    nuvo_serial: debug

You can try pasting the log at https://privatebin.at/ but the file may be too big - either filter the log file with lines containing nuvo or use something like dropbox.

1 Like

Hi @sprocket-9, thanks for the attention of your answer!

My Nuvo has the 6 standard inputs. I reinstalled Home Assistant on a new virtual machine to test if there could be any connection conflicts, but I got the same error.
Failures always happen at the same point, “255 is not a valid SourceMask”, and the value is always the same “255”.

Here’s the full log:

I’ve had a look at the log and it’s not a connection conflict, the responses are nice and clean.

Your Nuvo really is returning 255 for the list of sources Zone 1 is permitted to use:

2022-04-27 21:48:55 DEBUG (MainThread) [nuvo_serial.message] MSGCLASSIFIER: Process received message: b'#ZCFG1,ENABLE1,NAME"Zone 1",SLAVETO0,GROUP0,SOURCES255,XSRC0,IR2,DND0,LOCKED0,SLAVEEQ0\r\n'

This should be a number between 0-63, 255 is a invalid value.

Your Essentia G is running firmware 2.66 the same as my Grand Concerto model so it’s not that, and there are others in this thread successfully using the integration with Essentia G’s so it’s not a problem with the integration and Essentias. I think it’s a quirk with the configuration of your particular unit that’s got into a weird state.

Things to try:

Has the unit been powered up for a long time? Try removing power cord for a minute then power back on and try again - maybe the firmware does some internal configuration validation at startup and will correct the value.

Use the Nuvo Windows configuration software:

  1. Change the list of permitted sources for Zone 1
  2. Save
  3. Change back to original list
  4. Save
  5. Try integration again.
    If it fails, check the log to see if it failed on Zone 1 again and not one of the other zones.

If that doesn’t work try a “factory reset”. It’s a long time since I used it, but IIRC the Nuvo software allows you to load a default configuration into the unit, which should overwrite anything invalid with the current configuration.

1 Like

I used Nuvo’s software for Windows and loaded a factory reset config file into the device. Then I removed all the sources available from all zones except source 1. With that I was able to install the integration. Then I re-enabled the other sources and reinstalled the integrationand now everything is working perfectly.
Thanks a lot @sprocket-9 for the help!

1 Like

I have the Nuvo Simplese NV-A4D.
Is there anyway to control it with RS-232 using USB to RS-232 cable?

So far I have used IR, but with no discrete power on/off it is often out of sync

If anyone can help please. This is the last step in moving from Control4 to HA. Pls help?

There’s a new v2.0.0-beta.1 release of the integration which contains some breaking changes I’ve listed here: Releases · sprocket-9/hacs-nuvo-serial · GitHub

It will require to download the beta in HACS then delete/reinstall the integration in HA before the new device/entity hierarchy will show correctly - just installing this beta version over the existing version will not work it seems.

The reinstall should recreate the existing entity_ids though, so no lovelace configuration changes are needed. Any automations using page_on/off or all_off will need tweaked to use the switch/button entity instead, as these service names have been removed.

If anyone is up for trying it, to get beta releases showing up in HACS I had to follow this: https://hacs.xyz/docs/faq/beta/

Do flag up any issues you find :slight_smile:

I’ve been meaning to post this for awhile, but I’ve been working on enhancing the original code that was published for the “9600 baud” Nuvos. It supports my Essentia D currently,and creates number entities for bass and treble, switches for group sourcing and volume reset, as well as a binary sensor for override.

I was also able to make the code listen for updates instead of polling the Nuvo, but currently I just put them in memory, as I have yet to figure out how to push the updates to HA.

Anyway, @staxza, I could probably get this to work with your Simplese as it’s very similar. You should be able to hook up a USB to RS232 converter, but it looks like the serial port on the Simplese is a headphone jack? If so I doubt it would be difficult to make a cable exposing the 3 pins needed.

If you do have it connected to RS232 already, could you send me the output of *VER?

1 Like

Hi Brian. Sorry, just trying to understand. I have a Nuvo NV-E6DMS (Essentia D). So have you modified sprocker-9’s code to work with your Essentia D? I guess the simple question is what do I need to do to get my Essentia D integrated to HA?

Hi Steve. I just modified the original code that was published back a couple of years ago. I think sproket-9 took the same code and really did an amazing job turning it into something great for use with the higher end Nuvos. This is much less complex and much less well written, and I do not claim to be a programmer at all! However, I was able to add a callback this week, so it now does update immediately when a button is pressed on the keypads, as well as a version check for the Essentia D or Simplese.

I’ve never published anything to github before but I’ll try to get it out there today. I was on HA 2022.4 until this morning as I was being lazy facing all of the breaking changes. I’ll make sure it works or fix it for 2022.9 and try to put it out there today. I’ll keep you updated.

Here is my first try at ever publishing anything. This should control Nuvo Essentia D and possible Simplese amplifiers. Hopefully it will work for somebody who could make use of it. Here is the link on Github. Let me know if there are any questions or problems.

Great work, Brian! Thank you! Great effort for your first GitHub release. Much better instructions than 95% of the releases I’ve seen.

We’re on holidays for a week so unlikely to get a chance to test until the end of next week. I’ll report my experience once I do.

Hey Brian. How have you used the integration? I’d love some inspiration if you’ve got any screenshots of your dashboards or similar. I’m thinking I’ll have a dedicated tablet somewhere in the family room for the family to control sources and zones as well as run it on our phones. That’s as far as I’ve thought it through.

Great job on getting this released! I know the effort it takes to keep hammering away at something and getting your head around all the HA developer docs is a steep learning curve :+1:

1 Like

The snapshot only seems to work on the zones that are switched on

Bit of a delayed reply :grinning: There was indeed a bug in restoring a zone that was Off when snapshot. It’s fixed now and will be in the next release of the integration.

EXPERIMENTAL! support for media_player.join/unjoin services to group zones together. Designed to work with mini-media-player’s speaker groups but that card requires changes to support these new services before it will work with the Nuvo - more details to follow if and when that happens.

The changes to mini-media-player (MMP) went in a while back but I never did document how it works, so here’s a few notes from memory on how I implemented speakergroups for the Nuvo:

  • Only one global speaker group is supported as the HA join/unjoin API is very simple
  • Uses Nuvo groups under the hood
  • Uses the concept of a zone media_player being a group_controller
  • Source changes by group_controller are synced to group_members
  • Volume/Mute changes by group_controller are synced to group_members
  • Volume changes to a group_member zone are local to that zone
    • A subsequent change to the volume of the group_controller will change the local zone volume:
      • Change using a volume slider which calls set_volume_level will resync volumes
      • Change using volume up/down button will also up/down local volume, so local offset from group_controller will remain
  • Power on/off changes by group_controller are synced to group_members
  • If the group_controller LEAVES a group, the group is DISBANDED and all group_member zones are switched OFF
  • MMP LEAVE and UNGROUP buttons do the same thing for the group_controller
  • MMP LEAVE for a group_member removes the zone from the group and switches it OFF
  • MMP speaker_group.supports_master option is supported and MUST be TRUE (which is the default)
  • MMP speaker_group.sync_volume option is not supported, but is implicitly TRUE in the nuvo speakergroups implementation
  • MMP speaker_group.entities.volume_offset option is not supported
  • MMP platform option: use media_player

Think that’s about it. So it’s kind of a hybrid approach of Nuvo Groups and Party mode designed to be driven by MMP, but the media_player.join/unjoin services will work too as this is what MMP uses under the hood.

The MMP docs envisage a speaker_group object being under each MMP card, allowing any zone to be chosen as the group_controller. This probably makes sense if you have zone keypads and want to dynamically use a real zone as the group_controller.

My own method is:

  • Define only one MMP card which contains a speaker_group object
  • The main entity: being an unused non-physical Nuvo zone which I’ve named media_player.group_controller for convenience.
  • The real physical zones are listed under the speaker_group.entities: key to allow selection as group_members.
  • This set up allows the “virtual” media_player.group controller to be used for source and global volume changes, with local zone volume changes done via their own existing MMP card.

I’ve been using it for over a year and works well enough for my needs. Yep it is a very opinionated way to implement it, but that’s necessary when you have to come up with something that works for the Nuvo, the HA join/unjoin services and MMP frontend :man_shrugging:

Give it a whirl if you’re feeling adventurous :slight_smile:

2 Likes

Hi sprocket-9. I asked Brian the same question but I’ll ask it of you and anyone else on this thread. I’d love to see some screenshots of how you implement this at your home, if you wouldn’t mind. Not only do I lack your programming skills, I similarly lack the knowledge and inspiration to implement it to its fullest potential. I found this thread with the simple ambition to have a cheap tablet with a dashboard the family can use to choose sources and zones and control volume/bass/treble for the Nuvo Essentia E6DM. We also have 4 speakers in one area so ideally combining 2 zones as a single group would be great.

Hopefully it will work well for you. sproket-9 has put together, in my opinion, an awesome way to use the Nuvos. The mini media player entity with the pulldown card works great and allows you to modify the settings. I might try to document it on the github page with the appropriate entities if he doesn’t mind me copying his idea. Since we have those pesky DIP switches, I have an automation that runs on HA startup to re-set any settings I want to keep, so in case the Nuvo loses power and it reverts back to the DIP switches, you can push any changes back to it automatically. Something that would automatically save those to a database and put them back would be nice, but way over my head at the moment.

In HA, automations is where the Nuvo, and the paging service in particular, is really cool in my opinion. I know smart speakers are all the rage today, but the Nuvo excels at this and even puts you back to what you were listening to beforehand. I have a sound card on one zone dedicated to the Pandora integration and also use it to play any alerts, etc. I have the security system going through HA, and even an HA automation to have the Nuvo play one heck of a siren if needed haha! Much better than a small smart speaker! I also have scripts where I can press a button to play Pandora in a few rooms at a preset volume, for one example. The possibilities are really endless. Our Nuvos lack all the cool features but you can still make them do quite a bit with the help of HA.

Back to the dashboard, In a few rooms I have Amazon Fire tablets on their stands that are always on, and a dedicated page per room with “quick entries” that include stuff like the Nuvo. Although we still use IR remotes a lot too really for just simple stuff. The tablets are probably overkill really though. Don’t know I would bother with that again.

On the keypad side, a couple things I thought I might try to add to the integration in the future in an “All Off Recall.” Since the All Off button is just right there, sometimes, someone might hit it by accident (ok, maybe ME). I think it would be nice if you could just press it again and have it restore all zones to their power state before the button was pressed.
Another option I thought of would be to use the 6 source buttons to fire off automations if they were pressed when the zone is off. They can’t be used when the zone is on of course, but could be used, for example, to turn on zones and start a media player, or for something totally not related, like press source 1 button to turn off the room lights after you turned off the zone.

Thank you! This is nothing compared to the complex Grand series that you have managed, somehow, to totally integrate every feature. That is way way over my head. It’s been fun learning though, and I think I only restarted HA a couple thousand times testing everytime I changed a line of code haha.

I might try to document it on the github page with the appropriate entities if he doesn’t mind me copying his idea

I don’t mind at all, copy and use whatever you need.

It’s been fun learning though, and I think I only restarted HA a couple thousand times testing everytime I changed a line of code haha.

Yeah that restart and check the log for the latest ERROR messages loop really gets to be a drag sometimes :laughing:

I was on HA 2022.4 until this morning as I was being lazy facing all of the breaking changes. I’ll make sure it works or fix it for 2022.9 and try to put it out there today.

Don’t know if you’re already doing this but if you develop your component within a clone of the HA core repository, they’ve set up a LOAD of git pre-commit hooks which tests you code for compliance, does auto fixes and gives deprecation HA api warnings etc. It’s extremely useful but also a bit annoying at times as it’s very stringent!

1 Like

Hi Stevan,

Brian has given some good tips and looks to be planning on adding some dashboard layout in his component README soon.

To give you a flavour of what I use see the README for my component: hacs-nuvo-serial/README.md at main · sprocket-9/hacs-nuvo-serial · GitHub

HA allows so many options for dashboard layout, it’s extremely flexible - just start off basic and try small tweaks to find what works for you. I soon moved away from using the graphical layout and used hand edited .yaml files. This gives even more flexibility but also adds to the complexity :man_shrugging: Look into dashboards and views in the HA documentation - a view is like a tab on a dashboard where you could have a view per room/Nuvo zone for example.

1 Like