Logitech Harmony Ultimate & Smart Control Hub library

Hallo,

Anhand der online verfügbaren Anweisungen und der inoffiziellen und noch unvollständigen Protokoll Beschreibung, habe ich eine Library mit Funktionen zur Kommunikation mit dem Harmony Ultimate Hub gebastelt.
Damit ist es möglich, die Daten des Hubs und der verbundenen FB in IPS rein zu bekommen und auch Aktivitäten und Apparate über den Hub aus IPS raus zu schalten.

Das ganze ist noch etwas Experimentell. Der XMPP Server im Hub reagiert nicht ganz wie in den Links oben beschrieben. Das könnte an unterschiedlichen Versionen liegen. Daher bin ich sehr an Feedback interessiert.

Die Authentifizierung erfolgt in 2 Schritten. Zuerst muss ein User-spezifischer Token beim myharmony Server angefordert werden. Damit ist dann ein einloggen im XMPP Server möglich. Die Anmeldung beim Server sollte normalerweise in 2 Phasen durchgeführt werden, einmal als Gast und dann als authentifizierter User. Irgendwie ist aber die Kommunikation schon als Gast möglich.

Voraussetzungen sind ein schon konfigurierter Hub und daher auch ein myharmony Account.

Installation:

  • Wie üblich muss zuerst ein Client Socket angelegt werden mit der IP des Hubs und Port 5222.
  • Kategorie in IPS anlegen (z.B. „Harmony“)
  • Lehres Skript in der Kategorie anlegen und den Inhalt des Skripts Harmony_Read.ips.php hinein kopieren (Zip-Datei im Anhang).
  • Register-Variable anlegen und auf den Client Socket verbinden. Harmony_Read Skript als Target ID setzen.
  • Harmony_XMPP.ips.php library (Zip-Datei) in das Skript Verzeichnis kopieren.
  • Harmony_XMPP.ips.php library editieren und darin die Client Socket Instance ID ($HARMONY_CLIENT_INSTANCE_ID) und myharmony Email (login) und Passwort angeben. Die IP wird nicht gebraucht.
  • in der Harmony Kategorie ein zweites Skript anlegen und Harmony_Init reinkopieren.

Ausführung:
Das Harmony_Init Skript oder die Harmony_init() Funktion sollten am besten vom IPS_Startup aus ausgeführt werden. Die Authentifizierung ist anscheinend nur ein mal nötig.

Die Harmony_formatConfig() Funktion kann dann hilfreich sein, um die IDs der Aktivitäten, Befehle und „Devices“ ausfindig zu machen. Vorher ist unbedingt ein Harmony_getConfig() nötig, um die Config in eine Datei zu schreiben. Die IDs werden unbedingt gebraucht und die aus dem Konfiguration-Output direkt zu lesen kann zur Verzweiflung führen. Ich habe an der Format Funktion lange gearbeitet :wink:
Der nächste Schritt wäre automatisch damit eine FB im WF aufzubauen.

Beispiele:



Harmony_getConfig();          // request configuration from Server and format it

Harmony_sendCommand("13831264", "PowerOff"); // TV Samsung - Off
Harmony_startActivity(-1);	// Switch all devices from current activity off ("off" button)


Bekannte Probleme:

  • Die Verbindung zum Client Socket wird häufig unterbrochen. Keine Ahnung warum. Befehle dann noch einmal senden. Das Skript prüft aber, ob das Socket in IPS offen ist und öffnet es ggf.
  • Manche Befehle werden mehrmals im Config output gelistet
  • Wann läuft der User Token aus?..

Viel Spaß damit,

Zapp

Harmony_v07.zip (8.94 KB)

Harmony_Variables.png

Moin Zapp,

danke schonmal für deine Arbeit. Kann es kaum erwarten bis das Hub da ist :0) Melde mich dann wieder.

Ciao

Andreas

Changelog:

  • XMPP_getPayload() gibt jetzt ein Array zurück mit Message Typ (startActivityFinished, notify,…), die betroffene Activity ID und Error Codes. Damit kann in IPS eine Aktion getriggert werden, wenn eine Aktivität gestartet wird. Das Harmony_Read skript wurde mit einem Beispiel angepasst.
  • Harmony_processIQ() startet nun automatisch Harmony_formatConfig() wenn die Antwort des Servers komplett angekommen ist. Damit ist jetzt nur mehr Harmony_getConfig() gebraucht (einmal ausführen reicht oder nach jeder Änderung der Config mit dem myharmony Tool). Die Aktivitäten werden in eine IPS String Variable gespeichert.
  • Harmony_getActivityFromId($id) gibt den Namen einer Aktivität anhand der ID zurück. Beispiel im Read Skript. Harmony_getConfig() muss einmal vorher ausgeführt sein.

Gruß
Zapp

So das gute Stück ist da :0)

Ich teste mal weiter ;0)

Danke

Andreas

So laufen tut das ganze …

Bei mir wird der Socket aber auch ständig getrennt und wieder verbunden. Werde die Frage mal an anderer Stelle stellen. Vielleicht hat einer ne Idee. Ist schon nervig.

Im Log habe ich auch regelmäßige diese Fehlermeldung

Wenn ich die Init ausführe kommt die Fehlermeldung

Notice:  Undefined variable: id in [Geräte\Elektrogeräte\Harmony\Harmony_XMPP] on line 279

Der Token und die Config wird aber angelegt.

Ist das schlimm ?!

Hallo Andreas,

Danke für die Rückmeldung. Die Meldungen sind nicht kritisch. Deine Logging Einstellungen sind etwas sensibler als bei mir. Ich werde es in der nächsten Version korrigieren.

Leider konnte ich auch noch nicht rausfinden, warum das Socket getrennt wird. Ich müsste diese Woche mehr Zeit zum testen haben.

Gruß

Zapp

Hallo,

Ich habe die Verbindung des Sockets in den letzten Tagen geloggt. Die Verbindung trennt sich nach exakt einer Minute und wird dann nach 10-12 Sekunden im Durchschnitt wieder aufgesetzt. Ich denke daher, dass der XMPP Server die Verbindung regelmäßig trennt und IPS diese danach wieder aufsetzt. Das kann daran liegen, dass der XMPP Server eine Verbindung als Gast nicht länger als eine Minute zulässt. Oder er erwartet regelmäßig ein Ping.

Ich habe jedoch einen Fehler in meinem Code zur Authentifizierung gefunden und bekomme jetzt eine ID zurück. Diese scheint jedoch keine Session ID zu sein. Ein einloggen als authentifizierter User mit dem Session Token sollte das Verbindungsproblem lösen. Es ist jedoch relativ schwer das ganze zu testen, da bei jedem falschen Befehl anscheinend der Server die Verbindung trennt. Ich suche weiter.

Gruß

Zapp

Moin,

genau das habe ich auch festgestellt. Nach einer Minute Trennung … und dann nach 10-12 Sekunden im Durchschnitt wieder verbunden. Das mit dem Gastzugang hört sich gut an. Hab ich auch schon dran gedacht. Leider verstehe ich von dem Code nix :0( Du kriegst das aber bestimmt hin :0) !!

Das der Client nach einem fehlerhaften Befehl blockt kann ich übrigens auch bestätigen.

Danke schonmal für deine Mühe
Wenn ich irgendwie helfen kann sag bescheid, auch wenns nur zum testen ist ;0)

Gruß

Andreas

Hi,
ich finde die Idee mit einer Harmony auch sehr interessant - somit denke ich an eine Anschaffung.

Was ich noch nicht verstehe ist, ob ich auch Funktionen in IPS seitens der Harmony ansteuern kann? Also z.B. Rollo hoch oder runter - leider sehe ich diese nicht in Beispielscripten. Auch würde mich interessieren ob ich denn auch Dinge wie z.B. die Außentemperatur im Display anzeigen kann.

Danke für eine kurze Rückmeldung.

Enno

Hallo Enno,

ich sehe keine Möglichkeit selbst Infos in die Harmony zu pushen.

Verblüffend ist die Integration in der TVDigital Apo: dort kann mann mit Klick auf ein Sender im EPG den Kanal wählen und eine FB mit Tasten einblenden. Cool gemacht!

Danke! Was mir noch fehlt ist eine Erkenntnis zum Thema Spreche ich ein Script in IPS von der Harmony aus an? Ich müsste ja auf diese Knöpfe anlegen und diese irgendwie mit einer Script ID in IPS matchen?

PS: Ich habe noch keine Harmony … somit fehlt mir evtl. ein wenig Wissen.

Ich dachte eher an den umgekehrten Weg: IPS steuert Harmony. Theoretisch könnte man über ein IR-Receiver am IPS-Rechner aber auch diesen Weg beschreiten, hört sich aber steinig an.

Gesendet von meinem iPhone mit Tapatalk

Also erstmal wäre es primär die Steuerung von IPS durch die Harmony … der Rückkanal wäre cool aber Luxus :-).

Somit noch die Frage nach dem wie?

Passt jetzt nicht 100%, ich benutze dafür (steuern von IPS mit der Harmony) den FS20 Manager von hier: crazy-hardware.de - This website is for sale! - crazy hardware Resources and Information.

Habe ich lange vor IPS gekauft (glaub so 2007) und läuft immer noch. Meine Version hat noch viel Handarbeit bei der Einrichtung, funktioniert dann aber problemlos (sollte inzwischen aber einfacher gehen).

In IPS richtet man eine FS20 Fernbedienung ein, bedienen kann man sie mit jeder angelernten IR Fernbedienung (in meinem Fall ne Harmony 895).

Viele Grüße
Martin

Hallo,

Das kann ich nur bestätigen. Die Harmony Fernbedienung ist doch nur ein Sender, entweder mit IR oder per RF über den Hub. Kommunikation vom PC aus ist nur zum Hub möglich und der sendet auch keine Daten zur Harmony FB rauf.

Steuern von IPS mit der Harmony sollte aber über den Hub theoretisch möglich sein. Es kann z.B. eine Custom IPS Aktivität eingerichtet werden. Eine Notification kommt dann in IPS beim starten der Aktivität an. Leider ist das Protokoll nicht bekannt und mit den Skripten und der Library kann IPS zur Zeit nur mitbekommen, wenn eine Aktivität gestartet wurde, nicht aber wenn eine bestimmte Taste der FB gedrückt wurde. Das Protokoll sollte das aber irgendwie unterstützen können.

Gruß
Zapp

WP_20131116_011 (180x320).jpg

Danke für das Feedback. Leider ist die dann keine gute Option als Ersatz für die 19 Tasten FB.

Hallo !

Erst einmal vielen Dank für deine Scripte und deine Arbeit daran !
Ich versuche mich gerade daran dies auch bei mir zum laufen zu bekommen.

Erhalten jedoch nach dem ausführen des Scriptes „Harmony_init“ folgende Meldung.
(Speziell die Meldung mit dem fehlenden Token bereitet mir Kopfzerbrechen)



Notice:  Undefined property: stdClass::$GetUserAuthTokenResult in C:\IP-Symcon\scripts\Harmony_XMPP.ips.php on line 265

Notice:  Trying to get property of non-object in C:\IP-Symcon\scripts\Harmony_XMPP.ips.php on line 265

Warning:  Cannot auto-convert to String from Variant. Error: Could not convert variant of type (Null) into type (String) in C:\IP-Symcon\scripts\Harmony_XMPP.ips.php on line 188
-> ERROR: No Auth Token!


Der Socket verbindet zumindest erfolgreich.

Ein Tipp für mich ? Wenn ich das Problem beseitigt bekommen, habe ich bestimmt noch 1…2 Fragen. Denn hier wird schon etwas mehr als das „IPS Anfänger“ Wissen gebraucht :wink:

Danke
Gruß Christian

Habe mich mit dem Skript etwas beschäftigt
Erstmal danke für die gute arbeit :slight_smile:

Das Problem das sich der Socket immer trennt kann man mit folgendem Befehl temporär lösen


include("Harmony_XMPP.ips.php");
CSCK_SetOpen($ID/*[Client Socket Hub]*/, true);
IPS_ApplyChanges($ID/*[Client Socket Hub]*/);
Harmony_sendCommand("ID", "Befehl"); 
CSCK_SetOpen($ID/*[Client Socket Hub]*/, true);
IPS_ApplyChanges($ID/*[Client Socket Hub]*/);

Somit wird vor und nach dem Behel der Socket verbunden.
Bei mir hat es erstmal geholfen.

Gruß

Xackery

Das Problem liegt anscheinend bei der Anfrage nach dem Token beim myharmony.com Server. Kannst Du mal in deinen IPS Logs nachsehen, ob da eine Meldung kommt mit ERROR: Curl failed? Hast Du am Anfang der Harmony_XMPP.ips.php dein myharmony login und passwort angegeben?

Danke Xackery. Das scheint in der Tat erst mal temporär zu helfen. Ich hatte das nicht probiert, da ich dachte der Server würde eine Verbindung in der getrennten Phase nicht zulassen. Ich hatte bei mir zum Testen die Sende-Funktion erweitert, damit noch einmal gesendet wird, sobald sich das Socket wieder verbunden hat. Dein Ansatz ist natürlich besser. Ich werde das im Skript integrieren und eine neue Version hoch laden.

Gruß

Zapp

Danke Dir Zapp ! Ich hab noch mal genau hingeschaut… da war ein Leerzeichen im Benutzerfeld. :o Fehler Meinerseits.
Nun hab ich ein Token. Morgen schaue ich dann wie´s weiter geht.