HEOS VD und Wecker - How to

Da Denon nun eine stabile Verbindung der HEOS Multiroom Lautsprecher anbietet (endlich) wäre für den einen oder anderen die benutzerdefinierte Steuerung interessant. Fokus war das von Fibaro mitgelieferte VD zu ersetzen und wesentliche Funktionen zu unterstützen - zB. Playlisten/Sender Auswahl. Zusätzlich wurde ein custom „Wecker“ über das VD umgesetzt.

Dies soll keine „out of the box“ Lösung darstellen sondern die Konfiguration ist mit einem geringfügigen manuellen Aufwand verbunden.

Virtual Devices:

  • VD Steuerung (pro HEOS, inkl. Stereo)
  • Wecker Steuerung und Szene
  • Globale Variablen zur Steuerung der PL/Sender / Uhrzeit

Voraussetzung:

  • HEOS und Sender und PL sind eingerichtet und auf dem letzten Firmwarestand (HEOS APP)
  • Telnet Zugriff HEOS (
  • CLI PDF– bzw. HEOS Befehle
Einschränkungen:
- PL Abfrage erfolgt manuell und nicht über Skript - Änderung an der Netzwerkquelle (Musikserver) führt zu Fehler (desync) in der Playlist

OPTIONEN:

  • Steuerung VD über Wecker
  • Steuerung VD über Fernbedienung und sonstige Bedienelemente (The Button,etc.)

Bei Interesse wird der Beitrag erweitert.

cheers

Hi,
Also Interesse besteht, nur wo ist das Script?

Liebe Grüße

Nachdem ein gewisses Interesse besteht werde ich eine Kurzanleitung mit Beispielen für meine selbstgebaute Lösung geben.
Es ist etwas Einarbeitung nötig und LUA Erfahrung ist hilfreich - also keine VD Export/ Import Lösung.

Beispiele für Virtuelle Devices - Player und Wecker Oberfläche.
HEOS Befehle: (Vollständige Dokumentation kann bei Denon Support angefragt werden oder alternativ über Google Suche findet sich ältere Dokumentation)

WICHTIGE VARIABLEN zu den HEOS Befehlen:
pid = Player_ID
(Nummer des Players – bzw. des HEOS Lautsprecher)

sid= Source_ID
(bezeichnet den Eingang am gewählten Player)

cid= Container_ ID
(hier PLAYLIST_ID – bezeichnet die gespeicherte Playlist )

mid=media_ID
(hier RADIO_ID – beinhaltet eindeutige Nummer eines Titels bzw. Radiosenders)

Befehlsliste:

PLAY:
heos://player/set_play_state?pid=PLAYERID&state=play/n

Toogle Mute:
heos://player/toggle_mute?pid=PLAYERID/n

STOP:
heos://player/set_play_state?pid=PLAYERID&state=stop/n

MUTE ON:
heos://player/set_mute?pid=PLAYERID&state=on/n

MUTE OFF:
heos://player/set_mute?pid=PLAYERID&state=off/n

VOLUME Down – UP
heos://player/volume_down?pid=PLAYERID&step=1/n
heos://player/volume_up?pid=PLAYERID &step=1/n

Abfrage HEOS VOLUME
heos://player/get_volume?pid=PLAYERID/n

VOLUME Custom Value
heos://player/set_volume?pid=PLAYERID&level=20/n
Anmerkung: Lautstärke auf bestimmen Wert festlegen z.B. „Normallautstärke 20“

Previous / Next TRACK
heos://player/play_next?pid=PLAYERID&state=stop\n
Anmerkung: Vorheriger Track: play_previous

Player STOP
heos://player/play_previous?pid= PLAYERID&state=stop/n

Radiosender wählen
heos://browse/play_stream?pid= PLAYERID&sid=1028&mid= RADIO_ID/n
Anmerkung: sid=1028 (Source_ID ist immer Radiosender Favoriten)

Playlist wählen
heos://browse/add_to_queue?pid= PLAYERID&sid=1025&cid=PLALYLISTID&aid=4/n
Anmerkung: Sid=1025 (Source_ID ist immer für gespeicherte Playlisten gleich)
Anmerkung2: aid=4/n --> neue Playlist wird vollständig übernommen und alle Titel abgespielt

HEOS Neu starten
“heos://system/reboot/n”
Anmerkung: Bei mehreren HEOS Systemen bzw. in Stereo Paar ist jeder HEOS / IP einzeln zu rebooten

VD_HEOS_Pic.jpg

Beschreibung LUA Code „PLAY“ Button für das Virtuelle Device :

1) Abfrage und Festlegung der IP Adresse und Port des Virtuellen Devices – sollte zentraler HEOS Lautsprecher sein

2) TCP Verbindung HEOS und Übergabe HEOS Befehl PLAY
-> Decode Rückgabewert und Ausgabe über Fibaro Debug (z.B. „Success“)
-> HEOS Befehle müssen immer mit „/n“ abgeschlossen werden Beispiel 2 ist FALSCH (siehe Befehlsliste)

3) Label Beschriftung „PLAY Success“

-> Abfrage aktuelle Uhrzeit und Beschriftung „PLAY Uhrzeit und Datum“

Beispielcode_ButtonPlay.jpg

Vorschlag für den Ablauf und Vorbereitung:

  1. Erstellen der Musik – Playlisten auf der HEOS Plattform (APP)
  2. Erstellen der Sender Favoriten mittels HEOS APP (Deezer, etc., müssen zwingend HEOS Favoriten sein)
  3. HEOS Account Informationen
  4. Abfrage der Relevanten HEOS IDs
    4.1. Player-ID aller HEOS Geräte mittels „Putty“ abfragen
    heos://player/get_players
    Anmerkung: Resultat ist ein String der Informationen über alle verbundenen HEOS ausgiebt z.B: “name”: "HEOS7 ", “pid”: 1826070333, “model”: “HEOS 7”, “version”: “1.382.80”, “ip”: “192.168.1.31”, “network”: “wifi”, “lineout”: 0

4.2. Abfrage der HEOS Playlisten /Musiklisten (Login erforderlich)
heos://system/sign_in?un=USERNAME&pw=PASSWORT
heos://browse/get_music_sources
heos://browse/browse?sid=1025

4.3. Abfrage der Favoriten (Radiosender)
heos://system/sign_in?un=USERNAME&pw=PASSWORT
heos://browse/browse?sid=1028

5. Virtual Device Erstellen:
Eigenschaften: IP –Adresse zentraler HEOS-Lautsprecher
Port: 1255
Empfehlung: Steuerung der einzelnen HEOS Systeme über einen zentralen HEOS (optimaler WLAN Empfang) . Die Lautsprecher bzw. Stereo Paare werden ebenfalls über die PLAYER IDs gesteuert und nicht über die IP Adresse.

Beispiel Playlist MIX – Button Virtual Device:

local selfID   = fibaro:getSelfId()
local address  = fibaro:getValue(selfID, "IPAddress");
local port     = fibaro:getValue(selfID, "TCPPort");
local tcpSocket     = Net.FTcpSocket(address, port);
local PL = fibaro:getGlobal("PL4")

-- PLAYER STARTEN
tcpSocket:setReadTimeout(5000);
tcpSocket:write("heos://player/set_play_state?pid=1826070392&state=play\n");
fibaro:sleep(180);

-- LOGIN USER
tcpSocket:setReadTimeout(5000);
tcpSocket:write("heos://system/sign_in?un=USER&pw=PASSWORT\n");
fibaro:debug("LOGIN");
fibaro:sleep(1000);

-- Playlist zu Queue 
tcpSocket:setReadTimeout(5000);
tcpSocket:write("heos://browse/add_to_queue?pid=1826070392&sid=1025&cid="..PL.."&aid=4\n");
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label2.value", "Mix 1 ");
local currentTime = os.date("%c");
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label34.value", "MIX 1 " ..currentTime );
fibaro:debug("Mix");
fibaro:sleep(900);

-- LOGOUT
tcpSocket:setReadTimeout(5000);
tcpSocket:write("heos://system/sign_out\n");
fibaro:debug("sign out");
fibaro:sleep(150)

-- Globale Variable setzen (aktive Playlist)
fibaro:setGlobal("HEOS7PL", "19")

Beispiel für Wecker Virtual Device – BUTTON ZEIT AUF 05:00 Arbeitswoche, Globale Variable setzen:
Button Weckzeit um 5:00 Morgens über Globale Variable und Label für Weckzeit.

fibaro:setGlobal("harbeit", "05");
fibaro:setGlobal("marbeit", "00");
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label1.value", "05:00" );

Szene für das Ansprechen des Players über Szenen z.B. Wecker (Beispiel Szene „Wecker Arbeit“ auf Autostart) erstellen.
Diese 1. Szene fragt jede Minute die Weckzeit ab, wenn diese getriggert wird wird eine 2. Szene für den Weckablauf ausgeführt

--[[
%% autostart
%% properties
%% events
%% globals
--]]

local sourceTrigger = fibaro:getSourceTrigger();

function tempFunc()
local currentDate = os.date("*t");
local larbeit = fibaro:getGlobal("harbeit") .. ":" .. fibaro:getGlobal("marbeit")
local startSource = fibaro:getSourceTrigger();
if (
 ( ((currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == larbeit )))
then
      fibaro:startScene(208);
	 fibaro:startScene(193);
      fibaro:debug("Szenen Wecker gestartet Zeit:" ..larbeit);
 
end

setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
     fibaro:debug("larbeit:" ..larbeit);
	fibaro:startScene(208);
-- Wecker Szene  Heos Küche

	fibaro:startScene(193);
-- Wecker Szene HEOS Schlafzimmer

     fibaro:debug("different trigger");
end

end

Die 2. Szene (z.B. Szene Nr. 208) spricht das Virtuelle Device an und führt den gewünschten Ablauf aus.

–> Wecker UNMUTE und PLAY
–> auf gewünschte “Startlautstärke” stellen (Vorgabe Button VD)
–> Playlist und Radio gewünschte Zeit abspielen
–> Lautstärke laufend erhöhen
–> Wenn nicht manuell beendet - Wecker läuft bestimmte Zeit weiter und wird danach gestoppt

Das Ansprechen des Virtuellen Devices kann über unterschiedliche Geräte erfolgen.
Ich habe es umgesetzt für: Fibaro Swipe, BUTTON und ZWave.ME Remote Control


--[[
%% autostart
%% properties
%% events
%% globals
--]]

-- 300 Heos 7 Virtuelles Device

fibaro:call(300, "pressButton", "7");
		fibaro:debug("Unmute")
		fibaro:sleep(5*1000);

--Play virtual Device 1x
fibaro:call(300, "pressButton", "3")
		fibaro:debug("PLAY Virtual Device")
		fibaro:sleep(10*1000);

--Play virtual Device 2x (alternativ)
fibaro:call(300, "pressButton", "3")
		fibaro:debug("PLAY Virtual Device")
		fibaro:sleep(10*1000);

--Lautstärke auf 15 setzen
-- Volume 15 Virtual Device
		fibaro:call(300, "pressButton", "12")
		fibaro:debug("Set 15 Virtual Device")
		fibaro:sleep(3*1000);

-- Playlist Wecker - spiele Playlist für  5 min
fibaro:call(300, "pressButton", "17")
	fibaro:debug("Set Wecker")
	fibaro:sleep(300*1000); --300

		
-- Wechsel auf Radiosender OE3
fibaro:call(300, "pressButton", "13")
		fibaro:debug("Set OE3")		
		fibaro:sleep(300*1000);  --300

-- Solange Lautstärke 25 nicht erreicht lautstärke erhöhen
local oldVolume=15;
    while
	 oldVolume < 26  	
	
 	do
    --Virtual Device
  	fibaro:call(300, "pressButton", "9") 
  	fibaro:debug(oldVolume);

  -- Wie lange soll die Lautstärke erhöht werden
  	fibaro:sleep (330*1000); -- 300
	oldVolume = oldVolume+1  
  end

-- Heos 7 Warten und Lautstärke zurücksetzen

	-- Reset Volume Virtual Device auf 15

	fibaro:call(300, "pressButton", "12")
		fibaro:debug("Set 15 Virtual Device")
		fibaro:sleep(5*1000);

-- Wie lange soll der Wecker/Radio weiterspielen nach Lautstärkenerhöhung
fibaro:sleep (900*1000); --900

-- Wecker/ Radio beenden - Virtual Device STOP
fibaro:call(300, "pressButton", "5")
fibaro:debug("stop")
fibaro:sleep (5*1000);

@GS
Vielen Dank für Deine Mühen.
Ich hätte, als HEOS-Nutzer, auch ein gewisses Interesse den ein oder anderen Amp oder Link in meine Automatisierung mit einzubinden - hatte bis jetzt aber nichts mit virtuellen Devices und LUA zu tun (habe in früheren Zeiten komplexen Assembler-Code für 8086 und später 68k-Assembler und danach noch für Motorolas HC-MPUs geschrieben um selbstentwickelte Hardware “zum Leben zu erwecken”) - kann aber leider mit dem Input (mangels Erfahrung/Wissen über VDs und LUA (Syntax, Struktur, periphere Systemumgebung) wenig anfangen. :frowning:

Ich müsste mir erst relativ zeitintensiv Basiswissen aneignen. Seit ich verheiratet bin habe ich leider nicht mehr viel Zeit für “autodidaktische Eigenbrötlerei”. :wink:
Habe bis jetzt nur (mit wenig Zeitaufwand) Hezungs- und Lichtsteuerung (per Blockszenen und den vorgegebenen Steuerungen) umgesetzt.

Ich hätte da schon verstärktes Interesse. Wenn sich mal ein “längeres Freizeitfenster” ergeben sollte, werde ich mal versuchen meine Wissenslücke im der Fibaro-Umgebung zu verkleinern. :wink:

Denons CLI-Protokoll zur Steuerung von HEOS und netzwerkfähigen Denon/Marantz-Receivern per IP hatte ich mir vor einiger Zeit schon mal angesehen (PDF einfach ergoogelt): Auf einer mir besser bekannten “Ablaufsteuerungsumgebung” könnte ich mit diesen offen gehandelten Informationen auch meine HEOS-Amps und Links steuern - aber leider (noch) nicht mit der HC2.
Aber mal sehen, was die Zukunft noch so bringt … :slight_smile:

Viele Grüße,
Stefan

Hi,

das ganze sieht genau nachdem aus was ich suche (Danke schon mal dafür). Leider bin ich nicht so fit in dem ganzen. Kannst du mir erklären wie ich über putty den string bekomme?

vielen dank schon mal im voraus