NAD 7050

Moderator: leecollings

Post Reply
robhuls
Posts: 29
Joined: Monday 23 March 2015 19:20
Target OS: Raspberry Pi / ODroid
Domoticz version: beta
Location: Zwolle
Contact:

NAD 7050

Post by robhuls »

I have created rudimentary support for the NAD 7050 Amplifier:
https://www.domoticz.com/wiki/NAD7050
If you happen to have one, give it a try. The main reason for me was that the Android App stopped working with the release of Android Nougat, so I had to get off the couch to set the volume ;)
anne
Posts: 8
Joined: Saturday 10 December 2016 23:25
Target OS: Linux
Domoticz version:
Contact:

Re: NAD 7050

Post by anne »

Thanks a lot for sharing the NAD7050 code!

I had to make some minor changes to get the scripts to work with python 3.5.2. Among others the hex decode method has changed between version 2 and 3, the print syntax is changed and the ord() call is not needed anymore. I have included the modified scripts below.

Thanks,

Regards, Anne

--
NADOnOff.py becomes:

Code: Select all

#!/usr/bin/python
 
TCP_IP = '<IP of your NAD7050>'
TCP_PORT = 50001
BUFFER_SIZE = 1024
 
import socket
import sys, time
import codecs

def send(MESSAGE):
    MESSAGE = codecs.decode(MESSAGE, "hex_codec")
 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send(MESSAGE)
    s.close()
 
def turnOff():
    send("0001020900")
 
def turnOn():
    send("0001020901")
 
def setVol(n):
    send("00010204"+(hex(int(n))[2:]).zfill(2))
 
if sys.argv[1]=="on":
    print ('Turning on')
    turnOn()
else:
    print ('Turning off')
    turnOff()
and NADVolume.py:

Code: Select all

#!/usr/bin/python
 
TCP_IP = '<IP of your NAD7050>'
TCP_PORT = 50001
BUFFER_SIZE = 1024
 
import socket
import sys, time
import codecs

def send(MESSAGE):
    MESSAGE = codecs.decode(MESSAGE, "hex_codec") 

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send(MESSAGE)
    s.close()
 
def getSetVol(delta): #Fuck yeah magic numbers
    MESSAGE = "000102020b000102020400010202060001020207000102020800010202050001020209000102020a000102020c0001020203000102020d00010207000001020800000102020b000102020400010202060001020207000102020800010202050001020209000102020a000102020c0001020203000102020d00010207000001020800"
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send(codecs.decode(MESSAGE, "hex_codec"))
    counter = 0
    while True:
        x = s.recv(1024)
        for a in x:
            if counter==11:
                z = a
                s.send(codecs.decode("00010204"+(hex(int(z+delta))[2:]).zfill(2), "hex_codec"))
                s.close()
                return z
            counter += 1
 
if sys.argv[1]=="up":
    getSetVol(6)        
elif sys.argv[1]=="down":
    getSetVol(-6)
anne
Posts: 8
Joined: Saturday 10 December 2016 23:25
Target OS: Linux
Domoticz version:
Contact:

Re: NAD 7050

Post by anne »

Hi,

I have captured the command strings for the input selection on the amplifier. I have modified the NADVolume script so it first collects the current input and you can use the 'push button on' to cycle through the inputs.

Next I'll look at a better option to control the amplifier, the 'Selector' option with a button set or menu would be a start I guess. Next step would be a more media-player like control with the on/off and volume added :-)

Regards, Anne

Code: Select all

#!/usr/bin/python

TCP_IP = '<insert your NAD7050 IP>'
TCP_PORT = 50001
BUFFER_SIZE = 1024

import socket
import sys, time
import codecs

def send(MESSAGE):
    MESSAGE = codecs.decode(MESSAGE, "hex_codec")

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send(MESSAGE)
    s.close()
         
# CMD strings for each input 
#0001020300 - Coax 1
#0001020301 - Coax 2
#0001020302 - Opt 1
#0001020303 - Opt 2
#0001020304 - Computer
#0001020305 - Stream
#0001020306 - Dock
#0001020307 - BT
 
def SelectInput(delta): # magic numbers -> initial string captured in Wireshark
    MESSAGE = "000102020b000102020400010202060001020207000102020800010202050001020209000102020a000102020c0001020203000102020d00010207000001020800000102020b000102020400010202060001020207000102020800010202050001020209000102020a000102020c0001020203000102020d00010207000001020800"
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send(codecs.decode(MESSAGE, "hex_codec"))
    counter = 0
    while True:
        x = s.recv(1024)
        for a in x:
            if counter==46:
                    z = InputMinMax(a,delta)
                    s.send(codecs.decode("00010203"+(hex(int(z+delta))[2:]).zfill(2), "hex_codec"))
                    s.close()
                    return z
            counter += 1

def InputMinMax(a,delta):
# if last input is reached (BT), go back to first (Coax 1) on the next 'up' command. This way you can cycle through the inputs in Domoticz
    if (a+delta) == 8: 
        z = -1
        return z
    elif (a+delta) == -1: 
        z = 8
        return z
    else:
        z = a
        return z

if sys.argv[1]=="up":
    SelectInput(1)        
elif sys.argv[1]=="down":
    SelectInput(-1)
robhuls
Posts: 29
Joined: Monday 23 March 2015 19:20
Target OS: Raspberry Pi / ODroid
Domoticz version: beta
Location: Zwolle
Contact:

Re: NAD 7050

Post by robhuls »

Thanks for the updates, I forgot to subscribe to the topic so I did not notice your response until now. Supporting source switching was high on my wishlist!

I moved the lua scripts into domoticz itself (setup -> more options -> events and then select lua instead of blockly) and merged them, so I updated the wiki to reflect this. I remember that it is also possible to directly use python scripts when you build domoticz from source, but I just use the standard beta releases.

I used python2 because it still seems to be the default on domoticz, but I have been using python3 for my paid job for years, so we might as well finally go for it here too, after all these years :-). I switched my own installation and also adapted the wiki. You are not running the standard raspbian (which is still in 3.4 and not 3.5)?
anne
Posts: 8
Joined: Saturday 10 December 2016 23:25
Target OS: Linux
Domoticz version:
Contact:

Re: NAD 7050

Post by anne »

Hi Rob,

Nice! I wasn't aware of the python 2/3 change, I cloned the git repository when I started with domoticz and I guess it came with Python 3 ;-)

In the meantime I made a Selector switch for the NAD in which you can turn it on/off and directly select the input, with a separate dimmer switch to control the volume (I then picked up a Homey, spent a couple of frustrating nights wondering whether I should return it until I figured it's actually pretty cool but completely different from domoticz, with a different learning curve... I have not yet gotten around to connecting homey with domoticz to control the NAD amplifier...).

Anyway, the Selector switch is pretty useful.
Domoticz - Mozilla Firefox 2016-12-29 11.15.34.png
Domoticz - Mozilla Firefox 2016-12-29 11.15.34.png (15.66 KiB) Viewed 3445 times
As to the volume dimmer switch I made a script that takes a direct value for the volume, but I still need to tweak the volume mapping (0 - 100 to the NAD logarithmic -90 + 10 or something like that) to cover the entire range. A function is needed, I haven't gotten around to that. I'll sort it out and post it.

The following screenshot shows how I setup the Selector switch:
Domoticz - Mozilla Firefox 2016-12-29 11.30.55.png
Domoticz - Mozilla Firefox 2016-12-29 11.30.55.png (182.34 KiB) Viewed 3445 times
Here's the input selector script (I called it 'NADSelectDirect.py'). Any of the 8 inputs can be selected/added, I only use four:

Code: Select all

#!/usr/bin/python
 
TCP_IP = '<insert IP NAD D7050>'
TCP_PORT = 50001
BUFFER_SIZE = 1024
  
import socket
import sys, time
import codecs

def send(MESSAGE):
    MESSAGE = codecs.decode(MESSAGE, "hex_codec")

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send(MESSAGE)
    s.close()
         
#0001020300 - Coax 1
#0001020301 - Coax 2
#0001020302 - Opt 1
#0001020303 - Opt 2
#0001020304 - Computer
#0001020305 - Stream
#0001020306 - Dock
#0001020307 - BT

def select(n):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    z=0
    n=z+1
    s.send(codecs.decode("00010203"+(hex(int(n))[2:]).zfill(2), "hex_codec"))
    s.close()

def turnOn():
    send("0001020901")

if sys.argv[1]=="0":
    print ('Selecting Coax 1 input')
#    turnOn()
    send("0001020300")
#    select(0)        
elif sys.argv[1]=="1":
    print ('Selecting Coax 2 input')
#    turnOn()
    send("0001020301")
elif sys.argv[1]=="2":
    print ('Selecting Optical 1 input')
#    turnOn()
    send("0001020302")
elif sys.argv[1]=="3":
    print ('Selecting Optical 2 input')
#    turnOn()
    send("0001020303")
elif sys.argv[1]=="4":
    print ('Selecting Computer input')
#    turnOn()
    send("0001020304")
elif sys.argv[1]=="5":
    print ('Selecting Stream input')
#    turnOn()
    send("0001020305")
elif sys.argv[1]=="6":
    print ('Selecting Dock input')
#    turnOn()
    send("0001020306")
elif sys.argv[1]=="7":
    print ('Selecting BT input')
#    turnOn()
    send("0001020307")
The script is called from a bash wrapper script called NADSelector.sh:

Code: Select all

#!/bin/bash

python /opt/domoticz/scripts/python/NADSelectDirect.py "$@"
I have done the same thing for the on/off python script. There may be a nicer way of calling the scripts I am not aware of, but it works :)

Regards, Anne
robhuls
Posts: 29
Joined: Monday 23 March 2015 19:20
Target OS: Raspberry Pi / ODroid
Domoticz version: beta
Location: Zwolle
Contact:

Re: NAD 7050

Post by robhuls »

I just started making that, great work! I will copy your approach and then update the wiki.
anne
Posts: 8
Joined: Saturday 10 December 2016 23:25
Target OS: Linux
Domoticz version:
Contact:

Re: NAD 7050

Post by anne »

Hi Rob,

I just had a look at the Volume. I am not entirely happy with it, although the dimmer swich now does control the entire range (0 - 192 in the volume script), the steps are small on the low end of the dimmer scale, and relatively big on the high end of the scale, but I guess it's good enough. More often than not I use the volume control in the Spotify or iPeng app.

Here's the volume dimmer switch:
Domoticz - Mozilla Firefox 2016-12-29 12.03.55.png
Domoticz - Mozilla Firefox 2016-12-29 12.03.55.png (15.73 KiB) Viewed 3442 times
The lua script script_device_NADVolume.lua:

Code: Select all

commandArray = {}
if (devicechanged['NADVolume']) then
        if (devicechanged['NADVolume']=='Off') then
                DomValue = 0;
        else
                DomValue = otherdevices_svalues['NADVolume'];
        end
         --    print ("Dimmer value= "..DomValue);
                CalcValue = (2*DomValue);
                os.execute('python /opt/domoticz/scripts/python/NADVolumeDimmer.py '..CalcValue..'&')
         --     print("Volume value= "..CalcValue);
end
return commandArray
~
And the volume script NADVolumeDimmer.py:

Code: Select all

#!/usr/bin/python
 
TCP_IP = '<insert IP NAD D7050>'
TCP_PORT = 50001
BUFFER_SIZE = 1024
 
import socket
import sys, time
import codecs

def send(MESSAGE):
    MESSAGE = codecs.decode(MESSAGE, "hex_codec") 

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send(MESSAGE)
    s.close()
 
def getSetVol(delta): # Wireshark capture initial strings
    MESSAGE = "000102020b000102020400010202060001020207000102020800010202050001020209000102020a000102020c0001020203000102020d00010207000001020800000102020b000102020400010202060001020207000102020800010202050001020209000102020a000102020c0001020203000102020d00010207000001020800"
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send(codecs.decode(MESSAGE, "hex_codec"))
    counter = 0
    while True:
        x = s.recv(1024)
        for a in x:
            if counter==11:
                z = a
                s.send(codecs.decode("00010204"+(hex(int(delta))[2:]).zfill(2), "hex_codec"))
                s.close()
                return z
            counter += 1

v = sys.argv[1]

getSetVol(v)
As a sidenote, last week suddenly Spotify connect stopped working... Airplay was fine, but Spofity connect only worked intermittently. I thought I had broken the amplifier, I did a reset, downgrade, upgrade, no difference. In the end it turned out Spotify had an issue on their end, many people had the same problem with all kinds of Spotify devices! :o Fortunately Spofity addressed the issue and everything has been fine since :)

Anyway, I guess it can't hurt to insert the usual disclaimer, use at your own risk, etc ;-)
anne
Posts: 8
Joined: Saturday 10 December 2016 23:25
Target OS: Linux
Domoticz version:
Contact:

Re: NAD 7050

Post by anne »

Controlling the NAD through the rest API turns out to be trivial :D

If you look up the IDX of the NAD7050Control device you can use it in the following URL's to control the NAD amplifier through the rest API:

Code: Select all

NAD off
http://<domoticz-ip>:8080/json.htm?type=command&param=switchlight&idx=<ID of NAD7050Control device>&switchcmd=Set%20Level&level=0

NAD on
http://<domoticz-ip>:8080/json.htm?type=command&param=switchlight&idx=<ID of NAD7050Control device>&switchcmd=Set%20Level&level=10

Input Squeezebox
http://<domoticz-ip>:8080/json.htm?type=command&param=switchlight&idx=<ID of NAD7050Control device>&switchcmd=Set%20Level&level=20

Input DVD
http://<domoticz-ip>:8080/json.htm?type=command&param=switchlight&idx=<ID of NAD7050Control device>&switchcmd=Set%20Level&level=30

etc.
As to the volume, setting a value directly can be done like this:

Code: Select all

http://<domoticz-ip>:8080/json.htm?type=command&param=switchlight&idx=<ID of NADVolumeControl device>&switchcmd=Set%20Level&level=66
Or using the NADSofter / NADLouder devices:

Code: Select all

http://<domoticz-ip>:8080/json.htm?type=command&param=switchlight&idx=<ID of NADLouder device>&switchcmd=On
robhuls
Posts: 29
Joined: Monday 23 March 2015 19:20
Target OS: Raspberry Pi / ODroid
Domoticz version: beta
Location: Zwolle
Contact:

Re: NAD 7050

Post by robhuls »

I did a total rewrite of the code making it much simpler, you can find the new one on the wiki page. I cannot upload the two pictures, I think the boss himself is updating the back-end (I saw some things change during the day). It seems to me that the magic number is not required.
anne
Posts: 8
Joined: Saturday 10 December 2016 23:25
Target OS: Linux
Domoticz version:
Contact:

Re: NAD 7050

Post by anne »

Hi Rob,

Nice! :)

I have changed my setup to use your script, it is indeed much cleaner.

As a sidenote, the 'standby function' of the NAD D7050 does nothing but change the LED to amber... Power consumption remains at 15W :?

It does have an 'auto shutoff' feature, but for some reason the setting is automatically turned off at some point... And once the 'auto shutoff' does kick in, the device is unreachable, so the mode is quite useless. I have connected it to a power plug with a standby-killer flow to shut it down when in standby mode for a while.

Thanks,

Regards, Anne
anne
Posts: 8
Joined: Saturday 10 December 2016 23:25
Target OS: Linux
Domoticz version:
Contact:

Re: NAD 7050

Post by anne »

Hi Rob,

I have made a Homey app for the D7050, and in the process I figured out (most of) the remaining switches, see below. Mute is obviously a useful addition, but being able to control the power saving options can be useful as well. It's strange that the power saving settings are not preserved after a restart, however you can easily configure the power saving options whenever you start the device. The only snag is that the proper power saving option, 'Eco standby' means the amplifier can only be switched on by a button press or via IR.

I have also found the switches to poll the various states (on/standby, source, volume, mute, power saving options), see below.

Regards, Anne

Code: Select all

# standby / on
0001020900 - standby
0001020901 - on
# Standby - 'Network standby' (No powersaving at all) and 'Eco mode' (uses 1W, but can only wake up by button press or IR). NB: it seems these settings are not preserved after poweroff
00010208000001020208 - auto shutoff disabled
00010208010001020208 - auto shutoff enabled
00010207000001020207 - power save disabled
00010207010001020207 - power save enabled
# Network standby
00010208010001020208 - auto shutoff enabled
00010207000001020207 - power save disabled
# Eco standby
00010208010001020208 - auto shutoff enabled
00010207010001020207 - power save enabled

# inputs/sources
0001020300 - Coax 1
0001020301 - Coax 2
0001020302 - Opt 1
0001020303 - Opt 2
0001020304 - Computer
0001020305 - Stream
0001020306 - Dock
0001020307 - BT

0001020203 - poll inputs
0001020209 - poll standby/on state (response: 0001020900 (standby) / 0001020901 (on)
0001020400 - 00010204c8 Volume
0001020400 - volume (min, -90dB)
00010204c8 - volume (max, 10dB)
0001020204 - poll volume
0001020a01 - mute
0001020a00 - unmute
000102020a - poll mute/unmute. Response not muted 0001020a00, muted 0001020a01

Discovery: 224.0.0.251 bonjour/mDNS, UDP port 5353.
robhuls
Posts: 29
Joined: Monday 23 March 2015 19:20
Target OS: Raspberry Pi / ODroid
Domoticz version: beta
Location: Zwolle
Contact:

Re: NAD 7050

Post by robhuls »

Nice, the real off mode works well, a bit of a shame that it does not have wake-up on wlan. Thanks for the information.
anne
Posts: 8
Joined: Saturday 10 December 2016 23:25
Target OS: Linux
Domoticz version:
Contact:

Re: NAD 7050

Post by anne »

Indeed, and that the 'none-power save' standby uses a full 15W :-/

I have long been confused about the auto shutoff / power save options. I have now figured out that the confusion is caused by the iPhone app disabling both options whenever you use it :roll:

I guess you can use the 12V trigger input to wake up the amp... ;)
Post Reply

Who is online

Users browsing this forum: No registered users and 0 guests