Logitech Harmony Hub Modul [Testversion]

WICHTIG:
Durch ein automatisches Firmware Update auf 4.15.206 wird der Zugang von externen Systemen, wie auch IP-Symcon, zu einem Logitech Hub durch Logitech selber geblockt.
[i]Nähere Infos zum Update auf 4.15.206[/i]

Ab Firmware 4.15.250 ist es notwenig explizit Enable XMPP zu aktivieren damit der Logitech Hub extern durch Ip-Symcon gesteuert werden kann.

Siehe auch
[b][i]Update to accessing Harmony Hub’s local API via XMPP[/i][/b]

Ich benutzte schon seit längerer Zeit die Skripte von Zapp für das Anzeigen von Aktivitäten des Logitech Harmony Hub und das Senden von Befehlen.

Auf Grundlage der Arbeit und der Scripte von Zapp sowie der Diskussionen aus diesem Thread
Logitech Harmony Ultimate & Smart Control Hub library
habe ich mir mal die Skripte so angepasst und erweitert um ein Modul für den Logitech Harmony Hub zu erstellen.

Das ganze ist sicher noch ausbau fähig, in Zukunft wird hoffentlich mit Anpassungen der Logitech API dann noch mehr möglich sein.

Installation
Voraussetzung:

  • IP-Symcon 4.x
  • Logitech Harmony Hub im gleichen Netzwerk wie IP-Symcon
  • Konfigurierter Logitech Harmony Hub mit angelegten Aktionen und Geräten
  • Zugangsdaten für MyHarmony

Das Modul unter Kern Instanzen Modules mit der URL


https://github.com/Wolbolar/IPSymconHarmony

hinzufügen.

Danach IP-Symcon 4.x eine Instanz hinzufügen (CTRL+1).
Hier nun als Hersteller Logitech eingeben und Logitech Harmony Hub auswählen.

Harmony-Hub-1.png

Im dem sich öffnenden Fenster zunächst bei Erstinstallation folgende Dinge auswählen:


Harmony-Form-2.png

1
Haken bei Öffnen setzten. Dies ist notwendig damit der I/O Instanz später aktiv ist.

2
IP Adresse des Logitech Harmony Hub eintragen

3
Port bleibt unverändert auf 5222

4
Email Adresse (entspricht Anmeldename) für MyHarmony

5
Passwort für MyHarmony

6
Vorher ist in IP Symcon eine Kategorie anlegen. Diese ist hier auszuwählen. Unter dieser Kategorie werden die Geräte Instanzen angelegt.

7
Hier einen Haken setzten. Wird in einer späteren Version entfernt. Die Variablen CommandOut und IOIN zeigen die ein- und ausgehenden Daten an.

8
Optional Wenn diese Option gewählt wird werden für jede Befehlsgruppe eines Logitech Harmony Geräts eine Variable zum Schalten aus dem Webfront angelegt. VORSICHT: Diese Option sollte nur gewählt werden wenn noch ausreichend Variablen in IP-Symcon verfügbar sind oder die Variablenanzahl unbegrenzt ist, da eine hohe Anzahl an Variablen je nach angelernten Geräten im Harmony Hub verbraucht werden kann.

9
Optional Dies Option kann gewählt werden als Alternative oder Ergänzung zu 8. Es werden für jedes Gerät im Harmony Hub ein Skript zum schalten des Befehls angelegt.

Nach dem Druck auf Übernehmen wird zunächst der User Auth Token für den Logitech Harmony Hub abgefragt und in IP-Symcon abgelegt. Wenn das Abrufen des User Auth Token erfolgreich war kann mit Schritt 10 und 11 vorgefahren werden.

10
Nachdem der User Auth Token vorhanden ist kann auf Konfiguration auslesen geklickt werden. Es dauert einen Moment nach vollständigem Empfang vom Logitech Harmony Hub wird die Konfiguration in IP-Symcon in der Variable Harmony Config abgespeichert. Wenn sich etwas an den Geräten im Logitech Harmony Hub ändert ist die Konfiguration erneut auszulesen.

11
Sobald die Konfiguration ausgelesen wurde kann auf Setup Harmony gedrückt werden.
Abhängig von der optionalen Auswahl 8 und 9 werden nun die Instanzen, Skripte und Variablen angelegt.

Im Webfront sieht das z.B. dann so aus:

Es lassen sich über das Webfront oder die Skripte dann Befehle absetzten. Die Aktivität wird im Webfront angezeigt.
Sobald ein Gerät oder Harmony Fernbedienung eine Harmony Aktivität auslöst wird diese auch in IP-Symcon aktualisiert.
Die aktuelle Aktivität wird in der Variable Harmony Activity, diese liegt unter dem Logitech Harmony Splitter, angezeigt. Es wird automatisch ein Link unter der oben gewählten Kategorie zu dieser Variable angelegt.

Die Variablennamen und die Bezeichnung der Befehle werden so angelegt wie diese von der Bezeichnung im Harmony Hub hinterlegt sind. Für jede angelegte Variable wird auch das Beschreibungsfeld genutzt, hier steht der eigentliche Befehl drinnen der an den Harmony Hub gesendet wird. Daher darf das Beschreibungsfeld der Variable nicht geändert werden. Die Bezeichnung der Variable sowie die Befehlsnamen die im Variablenprofile der Variable hinterlegt sind können individuell vom Nutzer angepasst werden. Dabei darf nur nicht die Reihenfolge im Variablenprofil verändert werden.

Wem die vorgebende Anordnung durch den Harmony Hub nicht gefällt, der kann auch den Haken bei 8 weglassen. Es werden dann keine Variablen angelegt. Diese können dann später individuell von Hand angelegt werden. Dabei ich dann zunächst mit der Funktion
LHD_GetCommands(integer $InstanceID);
zu schauen welche Befehle für das Gerät zur Verfügung stehen. Dies Befehle können dann nach Belieben auf Variablen mit dem entsprechenden Variablenprofil verteilt werden. Das Variablenprofil muss für den Typ Integer sein, die Namen der Befehle im Variablenprofil können individuell gewählt werden. Wichtig ist das Beschreibungsfeld der Variable entsprechend der Reihenfolge im Variablenprofil mit den tatsächlichen Befehlsnamen, die von der Funktion LDH_GetCommands ausgegeben wurde, zu befüllen. Wenn das Profil erstellt wurde kann dann die Variable angelegt werden.


$InsID = 44015 /*[Geräte\Heimkino\Harmony\Harmony Geräte\Amazon Fire TV]*/; // ObjektID des Harmony Geräts
$VarIdent = "Navigation"; //Ident
$VarName = "Navigation"; //Name
$profiledevicename = "FireTV"; // Gerätename
$profilegroupname = "Navigation"; //Commandogruppe
$Profilname =  "LogitechHarmony.".$profiledevicename.".".$profilegroupname;
$descriptionjson = '["DirectionDown","DirectionLeft","DirectionRight","DirectionUp","OK"]' ;
$varid = LHD_SetupVariable($InsID, $VarIdent, $VarName, $Profilname); //Letzter Parameter ist der vergebene Profilname
IPS_SetInfo($varid, $descriptionjson);

In dem Beispiel würde eine Variable angelegt die den Namen Navigation hat und die Befehle „DirectionDown“,„DirectionLeft“,„DirectionRight“,„DirectionUp“,„OK“ enthält. Diese sind in der gleichen Reihenfolge im selbst erstellten Variablenprofil beginnend bei 0 (DirectionDown) bis 4 (Ok) hinterlegt. Die Beschreibung $descriptionjson ist im JSON Format anzugeben.

Zusätzliche Funktionen:


HarmonyHub_getCurrentActivity(integer $InstanceID);

Parameter $InstanceID ObjektID des Harmony Hub Splitters
Fordert eine manuelle Aktualisierung der Aktivität in IP-Symcon an. Die Aktivität wird in der Variable Harmony Activity abgelegt.

Liest alle verfügbaren Aktivitäten des Logitech Harmony Hub aus und gibt einen Array zurück.


HarmonyHub_GetAvailableAcitivities(integer $InstanceID);

Parameter $InstanceID ObjektID des Harmony Hub Splitters

Beispiel:


$activities = HarmonyHub_GetAvailableAcitivities(44523 /*[Logitech Harmony Hub]*/);
print_r($activities);

Liest alle verfügbaren Device IDs des Logitech Harmony Hub aus und gibt einen Array zurück.


HarmonyHub_GetHarmonyDeviceIDs(integer $InstanceID);

Parameter $InstanceID ObjektID des Harmony Hub Splitters

Beispiel:


$devices = HarmonyHub_GetHarmonyDeviceIDs(44523 /*[Logitech Harmony Hub]*/);
print_r($devices);

Schaltet auf die gewünschte Logitech Harmony Hub Aktivität


HarmonyHub_startActivity(integer $InstanceID, integer $activityID);

Parameter $InstanceID ObjektID des Harmony Hub Splitters Parameter $activityID ID der Harmony Aktivität, verfügbare IDs können über HarmonyHub_GetAvailableAcitivities ausgelesen werden

Liest die verfügbaren Funktionen des Geräts aus und gibt diese als Array aus


LHD_GetCommands(integer $InstanceID);

Parameter $InstanceID ObjektID des Harmony Hub Geräts

Beispiel:


$commands = LHD_GetCommands(44015 /*[Geräte\Heimkino\Harmony\Harmony Geräte\Amazon Fire TV]*/);
print_r($commands);

Hier wird auf die Instanz verwiesen von der man die Befehle auslesen will hier Amazon Fire TV.

Sendet einen Befehl an den Logitech Harmony Hub


LHD_Send(integer $InstanceID, string $Command);

Parameter $InstanceID ObjektID des Harmony Hub Geräts
Parameter $Command Befehl der gesendet werden soll, verfügbare Befehle werden über LHD_GetCommands ausgelesen.

Wer einzelne Tastendrücke einer Harmony Remote nutzen will um damit Aktionen in IP-Symcon auszulösen kann dies unter Hinzunahme von FHEM lösen. Eine Anleitung wie dies geht findet man hier:
Logitech Harmony Hub Modul [Testversion] - Seite 7

Da es ab IP-Symcon 4.1 auch einen Multicast Socket gibt könnt man diesen Umweg über FHEM wohl in Zukunft nicht mehr brauchen. Eine Umstellung des Moduls auf Funktionen die erst ab 4.1 verfügbar sind wird es aber erst in Zukunft geben.

Vielen Dank - dieses Modul hat mir bislang sehr gefehlt - ich werde mal testen!

Vielen Dank auch von mir, ich habe ebenfalls schon länger auf sowas gewartet.
Bis jetzt läuft es sehr gut bei mir.

Anbei noch ein kleines Beispiel wie man eigene Skripte bei einer Aktion des Harmony Hub startet z.B. Steckdose einschalten.

Zunächst ein Skript anlegen und Code einfügen


$activities = HarmonyHub_GetAvailableAcitivities(44523 /*[Logitech Harmony Hub]*/);
print_r($activities);

Die ObjektID muss auf den Logitech Harmony Hub Splitter verweisen. Dann auf Ausführen drücken. Im Skriptausgabefenster steht nun der Array der die Aktion als Schlüssel enthält und die ID der Aktion als Wert.


Array
(
    [Film FTV Leinwand] => 11746407
    [Amazon Prime] => 11697675
    [Küche] => 11738612
    [Film anschauen] => 12491805
    [AppleTV] => 11697760
    [Wohnzimmer] => 11738662
    [Spielen] => 16188673
    [PowerOff] => -1
    [TV Leinwand] => 11768391
    [Fernsehen] => 11697506
    [Film Leinwand] => 12491850
)

Wenn beim Harmony Hub eine Aktion ausgeführt wird aktualisiert sich automatisch auch der Wert der Variable Harmony Activity in IP-Symcon. Wenn also PowerOff ausgeführt wird ist der Wert -1, in dem Beispiel oben wäre der Wert bei Fernsehen 11697506. Im Webfront steht dann Fernsehen, da dem Wert ein Variablenprofil zugewiesen ist. Anhand der Skriptausgabe ist also jetzt bekannt welcher Wert für welche Aktivität des Harmony Hub steht.

Die kann man nun nutzten um einerseits einfach eine Aktion über Skript auszulösen.
Beispiel Fernsehen aus obiger Ausgabe


HarmonyHub_startActivity(44523 /*[Logitech Harmony Hub]*/, 11697506);

Beispiel PowerOff


HarmonyHub_startActivity(44523 /*[Logitech Harmony Hub]*/, -1);

Anderseits kann man jetzt auch einfach auf eine Aktion ein Ereignis erfolgen lassen.

Dazu ein Skript anlegen


$Status = GetValue(22137 /*[Logitech Harmony Hub\Harmony Activity]*/);

    if ($Status == - 1)
    {
       IPS_RunScript(33089 /*[Geräte\Heimkino\Harmony\Funktionen\Power Off ]*/);
       IPS_LogMessage("Logitech Harmony Hub", "Power Off ausführen");
    }
    elseif($Status == 11746407) //Film FTV Leinwand
    {
       IPS_RunScript(15173 /*[Geräte\Heimkino\Harmony\Funktionen\Amazon Fire TV auf Leinwand]*/);
       IPS_LogMessage("Logitech Harmony Hub", "Film FTV Leinwand ausführen");
    }
    elseif($Status == 11697675) //Amazon Prime
    {
       IPS_RunScript(43129 /*[Geräte\Heimkino\Harmony\Funktionen\Amazon Fire TV auf TV]*/);
       IPS_LogMessage("Logitech Harmony Hub", "Amazon Prime ausführen");
    }

In dem Skript wird bei dem jeweiligen Wert jeweils ein anderes Skript gestartet. In dem jeweils anderen Skript steht dann drinnen was zusätzlich passieren soll wenn diese Aktion gestartet wird z.B. eine Steckdose anschalten.

Jetzt markieren wir das Skript noch mit der rechten Maustaste und gehen auf Objekt hinzufügen -> Ereignis hinzufügen
Hier wählen wir Auslösendes Ereignis. Als Variable wählen wir Harmony Activity unterhalb des Logitech Harmony Splitters. Als Auslöser bei Variablenaktualisierung. Jetzt wird dann jedes mal wenn sich eine Aktivität ändert das Skript aufgerufen. Dies schaut welcher Wert denn aktuell vorliegt um dann das passende weitere Skript, das Aktionen wie z.B. Steckdose oder Licht einschalten ausführen soll, zu starten.

Hallo Fonzo,

danke für das super Modul. Funktioniert soweit ganz gut. Nur bekomme ich beim Harmony-Taste drücken immer folgende Fehlermeldung:

18.06.2016 14:51:59*| FlowHandler*| Kann Daten nicht zur Instanz #54365 weiterleiten: <br />
<b>Notice</b>:  Undefined index: activityId in <b>D:\IP-Symcon\modules\IPSymconHarmony\Harmony Hub\module.php</b> on line <b>574</b><br />

Super Modul! Teste auch gerade fleißig…
Danke!

Ich habe mal ein Update hochgeladen.
Neu ist die Funktion


HarmonyHub_getDiscoveryInfo(integer $id);

Parameter $id ist die ObjektId des Harmony Hub Splitters. Die Funktion liest zur Zeit die Firmwareversion und den Hub Namen aus und schreibt diese in Variablen beim Harmony Hub Splitter. Die Funktion ist auch über die Testumgebung verfügbar.

Tritt der Fehler auch nach dem Update noch auf?

Erstes Feedback:

  1. Nach dem ersten Befehl per Skript auf ein Device funktionierte meine Fernbedienung(Smart Control) nicht mehr. Ich musste neu pairen, nun läuft sie auch nach einer Skriptausführung.

  2. Beim ausführen von einem Skript (zb Taste OK meiner Vu Solo2) kommt ein Warnung:

18.06.2016 18:10:18*| FlowHandler*| Kann Daten nicht zur Instanz #47378 weiterleiten: <br />
<b>Warning</b>: Objekt mit Ident IOIN wurde nicht gefunden in <b>C:\Program Files (x86)\IP-Symcon\scripts__ipsmodule.inc.php</b> on line <b>36</b><br />
<br />
<b>Warning</b>: Variable #0 existiert nicht in <b>C:\Program Files (x86)\IP-Symcon\modules\IPSymconHarmony\Harmony Hub\module.php</b> on line <b>474</b><br />

Teste weiter, aber erster Eindruck ist Mega! Danke für das Modul

Ja, der Fehler ist noch da. Die Variable „Harmony Activity“ ändert sich dann auch immer auf „Power Off“.

Irgendwie sind auch nicht alle Variablen gefüllt:

Bisher authentifiziert sich das Modul als guest, das kann bei den neusten Firmware Versionen ab 4.x des Harmony Hub wohl für Probleme sorgen auf Device Ebene. Das wird aber noch umgestellt auf Authentifizierung auf uuid. Muss aber noch getestet werden bevor das Einzug hält.

Danke fürs Feedback, nur so lassen sich auch Fehler finden und ausbessern.
Das hört sich für mich ihm ersten Moment unerklärlich an. Kannst Du mal schauen ob im Konfigurationsformular Debug angekreuzt ist und ob die Variable IOIN unterhalb des Harmony Hub Splitters existiert. Wenn ja dann beende mal den IP-Symon Diensr lösche die Datei _generated.inc.php im scripts Ordner von IP-Symcon und starte danach den IP-Symcon Dienst wieder neu. Dann schau noch mal ob der Fehler immer noch auftritt.

Die Variablen müssen auch nicht alle gefüllt sein ein Teil davon sind auch Hilfsvariablen.
Variablen die gefüllt sein müssen sind:

  • User Auth Token
  • Harmony Config

Wenn Du in der Testumgebung auf
Update Harmony Info
drückst sollte auch die Variable Firmware Version und Harmony Hub Name befüllt werden.

Kannst Du mir noch mal die Zeile der Fehlermeldung sagen die im Meldungsfenster erscheint.

Hier bitte:

18.06.2016 19:38:42*| FlowHandler*| Kann Daten nicht zur Instanz #54365 weiterleiten: <br />
<b>Notice</b>:  Undefined index: activityId in <b>D:\IP-Symcon\modules\IPSymconHarmony\Harmony Hub\module.php</b> on line <b>579</b><br />

Speziell bei der VU Solo2 würde ich diese eher über das Netzwerk steuern, sofern diese an das Netzwerk angeschlossen ist, und nicht über den Harmony Hub. Dafür kannst Du eines der Enigma Module benutzten, die sollten an sich auch mit VU funktionieren.

Danke, in welchem Zusammenhang tritt das nochmal auf? Wenn Du auf der Harmony Remote eine Taste oder Aktion betätigst? Kannst Du mal den Logitech Harmony Hub unter I/O Instanzen öffnen und dort auf Debug drücken. Es öffnet sich ein Debug Fenster dort unten Links den Haken bei HEX Ansicht entfernen. Dann führe mal das durch was den Fehler auslöst.
Wahrscheinlich kommt dann im Debug Fenster eine Meldung RECEIVED. Kopiere diese dann mal mit der rechten Maustaste und In Zwischenablage kopieren (Text) die Meldung hier ins Forum.

Das hört sich für mich ihm ersten Moment unerklärlich an. Kannst Du mal schauen ob im Konfigurationsformular Debug angekreuzt ist und ob die Variable IOIN unterhalb des Harmony Hub Splitters existiert.

Debug ist nicht angekreuzt, Variable IOIN nicht vorhanden. Trotzdem die Sachen machen?

Speziell bei der VU Solo2 würde ich diese eher über das Netzwerk steuern, sofern diese an das Netzwerk angeschlossen ist, und nicht über den Harmony Hub. Dafür kannst Du eines der Enigma Module benutzten, die sollten an sich auch mit VU funktionieren.

Ich nutzte zur Steuerung das (auch geile) Enigmamodul, nur zum Test deines Harmonymoduls habe ich die ok Taste vom Receiver gewählt :slight_smile:

Gruß

Nee, bei Tastendruck (z.B. Ch+/Ch-).

<message content-length="189"/><LF><message from="HarmonyOne_Pop@qa1.com" to="ab903454-7bee-4410-9eea-bb5355bb667e"><event xmlns="connect.logitech.com" type="control.button?pressType"><![CDATA[type=short]]></event></message>

Bei Aktionen ist alles o.k.

<message content-length="722"/><LF><message from="HarmonyOne_Pop@qa1.com" to="ab903454-7bee-4410-9eea-bb5355bb667e"><event xmlns="connect.logitech.com" type="connect.stateDigest?notify"><![CDATA[{"sleepTimerId":-1,"configVersion":123,"activityId":"18245704","errorCode":"200","syncStatus":0,"time":1466274954,"stateVersion":358,"tzOffset":"7200","mode":3,"hubSwVersion":"4.9.40","deviceSetupState":[],"tzoffset":"7200","isSetupComplete":true,"contentVersion":97,"wifiStatus":1,"discoveryServer":"https:\/\/svcs.myharmony.com\/Discovery\/Discovery.svc","activityStatus":2,"runningActivityList":"18280440","tz":"CET-1CEST,M3.4.0,M10.5.0\/3","activitySetupState":false,"updates":[],"hubUpdate":false,"sequence":false,"accountId":"7653098"}]]></event></message>

Danke das erklärt die Fehlermeldung ich passe das an. Melde mich sobald Update zur Verfügung steht.

Spitze! Danke

Mache mal bitte den Haken bei Debug weg, gehe dann auf Übernehmen. Dann den Haken wieder bei Debug setzten und Übernehmen. Dann schau noch mal ob die Variable IOIN angelegt wurde. Ich muss mir das nochmal anschauen warum die anscheinend nicht korrekt angelegt wird.

So,

debug war ja aus. Ich habe dann Debug angeschaltet, Variable wurde erstellt. Keine Warnung mehr. Debug ausgeschaltet, immer noch keine Warnung, also hier alles paletti. (Befehl funktionierte ja die ganze Zeit, nur ist jetzt die Warnung weg)

Merci