Logitech Harmony Hub Modul [Testversion]

Da ist wohl ein Schreibfehler in HarmonyDiscovery_[b]Dicover/b.

Hi,
jau jetzt wo Du es schreibst ist es mir auch afgefallen. Das stammt noch aus der Version vom Web-Store nicht von der aktuellen Version. Ist also schon behoben.

Ralf

Hi,
wird ein Script aufgerufen wenn sich eine Aktion/Aktivität geändert hat?
Wäre ne nette Sache. Intern dürfte es sowas geben da die Splitter-Variablen sehr schnell reagieren.

Ralf

Standardmäßig wird kein bestimmtes Skript aufgerufen wenn sich eine Aktion bzw. Aktivität geändert hat.

Du kannst aber auf das Skript, das Du ausführen willst, einfach ein Ereignis legen, um das Skript auszulösen wenn ein bestimmter Wert (Harmony Aktion) angenommen wird.

Alternativ nimmst ein einziges Skript für einen Logitech Hub und legst in dem Skript fest welche weiteren Skripte bei einer bestimmten Harmony Aktion aufgerufen werden sollen. Dazu wird ebenfalls ein Ereigniss genutzt bei Variablenaktualisierung, es löst also immer aus, wenn sich etwas ändert. Wenn nur ein einziges Skript getriggert wird, wird die eigentliche Festlegung, was dann passieren soll innerhalb des Skripts geprüft.

Dazu kannst Du in so einem Skript anhand des Variablenprofils prüfen welche Harmony Aktion zum Zeitpunkt der Variablenänderung vorhanden ist und dann passend etwas ausführen.

Beispiel für ein Skript, das durch ein Ereignis bei Variablenaktualisierung aufgerufen wird:


$activity = GetValueFormatted(17644 /*[Logitech Harmony Hub Elite Wohnzimmer\Harmony Activity]*/); 
if($activity == "Power Off")
{
    IPS_RunScript(12345); // ruft Skript 12345 auf 
    IPS_LogMessage("Logitech Harmony Hub", "Power Off ausführen"); 
}
if($activity == "Fernsehen")
{
    IPS_RunScript(23456); // ruft Skript 23456 auf
    IPS_LogMessage("Logitech Harmony Hub", "Fernsehen wurde gestartet"); 
}


Die Werte auf die geprüft wird, entsprechen dem Variablenprofil der Variable Harmony Activity, bzw. den Namen, die für die Aktion vergeben worden sind.

Hi,
danke das hilft weiter.

Ralf

Hi,
Hier mal der Grund der Frage. Ich will das die NEEO mit den Harmonies in sync sind wenn mal eine Aktion mit der Harmony-Fernbedienung/-App gestartet wird. Die Scripte sind recht einfach:

<?php
$activity = GetValue(28736); // vom Harmony-Splitter
switch ($activity){
    case 36541749:  // SZ1 TV ohne
        $InstanceID = 55531;
        SetValue(22028, $InstanceID);
        NEEO_StartRecipe($InstanceID); 
        break;
    case 19904521:  // SZ1 Fire TV-1
        $InstanceID = 44064;
        SetValue(22028, $InstanceID);
        NEEO_StartRecipe($InstanceID); 
        break;
    case 19904523:  // SZ1 Kodi-1
        $InstanceID =28485;
        SetValue(22028, $InstanceID);
        NEEO_StartRecipe($InstanceID); 
        break;
    case 19904525:  // SZ1 Sonos
        $InstanceID =24738;
        SetValue(22028, $InstanceID);
        NEEO_StartRecipe($InstanceID); 
        break;
    case -1:        // power off
        $InstanceID = GetValue(22028);
        NEEO_EndRecipe($InstanceID); 
        break;
}
?>

Am Anfang hole ich mir die Nummer der Aktion von der Harmony. Diese speichere ich dann in einer Variablen last_activity damit ich am Ende auch ein EndRecipe schicken kann. In der Switch-Konstruktion werden Harmony-Aktionen in NEEO-Rezepte übersetzt.

Ist ganz witzig das so aus der NEEO eine Harmony-Fernbedienung wird wenn es mal alles läuft.

Ralf

Du must in dem Fall nur aufpassen das der Brain in irgendeinem Schrank liegt, also keinen IR Sichtkontakt zu dem Gerät besitzt in dem der Brain platziert ist. So kannst Du diesen dann zwar per WLAN erreichen, was Du aber natürlich bei dem Konstrukt vermeiden musst ist das der NEEO Brain dann nochmals IR Befehle sendet, die von dem Gerät empfangen werden, denn diese wurden ja schon von dem Harmony Hub verschickt. Aber grundsätzlich sollte das wohl gehen, denn der Brain ist ja nur an einem Ort, während die Harmony Hubs über das Haus verteilt sind. Insofern müstest Du dann von NEEO aus jeden Harmony Hub schalten können bzw. anders herum auch ein NEEO Rezept starten können, sobald eine Harmony Aktion ausgelöst wurde. Somit werden dann also die Harmony Hubs die IR/Bluetooth Gateways für die NEEO Remote.

Hi Fonzo,
mein Brain ist jetzt der Untersetzer für Echo im Flur wo er keinen Schaden anrichten kann:-)

Ralf

Im Beta Branch ist nun auch zum Testen IP-Symcon Fake Roku enthalten. Dies dient dazu einzelne Tastendrücke einer Harmony Remote auszuwerten und dann durch diese Tastendrücke Geräte aus IP-Symcon zu schalten. Dies ist eine Ergänzung bzw. Ersatz zu dem Weg die Tastendrücke aus FHEM an IP-Symcon weiterzuleiten. Mit der Version ist es nun möglich das IP-Symcon selber ein emuliertes Roku Gerät zur Verfügung stellt und die Tastendrücke dann auswertet.

Wer das ausprobiert sollte, würde ich mich über Rückmeldung freuen, damit dies gegebenenfalls auch in den master Branch übernommen werden kann.

  1. Kurze Verständnisfrage, IPS 5.1 hat mir gesagt das es eine Shop Version vom Addon gibt es aber wegen lokalen Änderungen nicht aktualisiert werden konnte. Also habe ich das Addon unter Module gelöscht und dort wieder erstellt, selbes Problem.
    Dann habe ich es wieder gelöscht und im Shop nach dem Addon gesucht und es von dort installiert. Auf den ersten Blick scheint alles noch zu funktionieren. War das so korrekt gewesen ?

  2. Bei der Installation wurde gefragt ob man ein Discovery Modul installieren will, das habe ich mit Ja beantwortet aber k.A. wozu das zusätzlich gut sein soll ?

  3. Ich habe leider immer noch das Problem das Befehle um die 3 mal gesendet werden, bei Lautstärke ja nicht ganz so schlimm aber der Rest macht das System leider nicht nutzbar. Im Debug sieht man den Befehl nur einmal, ab un dzu mal gibt es noch anderen Traffic, ich vermute mal das ist dann der Login.

Was mich auch etwas wundert, ich dachte die XMPP API ist nur lokal, wenn ich mir die Meldung im Debug ansehe geht das aber an Logitech (habe noch nicht weiter in den Code geschaut)

05.05.2019, 13:58:45 |             TRANSMIT | <iq type='get' id='EDIT'><oa xmlns='connect.logitech.com' mime='vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction'>action={"type"::"IRCommand","deviceId"::"1234567890","command"::"ChannelDown"}:status=press</oa></iq>

Wo finde ich denn Infos zu der API ? Google war nicht wirklich hilfreich. Dann schaue ich selber mal ob ich was finden kann.

EDIT: OK das mit der URL verwirrt nur, wird aber nicht da hin gesendet.

Meine Vermutung dafür das mehrere Kanäle übersprungen werden vermute ich jetzt in der Länge der Aussendung, also wenn ich die Kanaltaste länger drücke überspringt der Hub auch ein paar Kanäle, da es ja beim Absetzen nicht wirklich ein long press gibt wartet der Hub evtl auf eine Art „Stop Command“ ? Bzw Connection Closed ? Also das man mit dem Senden fertig ist ? Das würde es auch erklären das ich mit der Original Harmony auch mal solche Hänger habe das wenn ich durch den FireTV navigiere das der dann auch wenn man die Taste los lässt noch einige Einträge weiter geht.

Wegen den Wiederholungen, habe da jetzt mal bei FHEM nachgefragt, die sagten

wenn das passiert sind meist die widerholungseinstellungen für das gerät falsch/zu hoch.

Habe dann mal das FHEM Modul installiert und da funktioniert es mittels:

set hub command 1234567890 ChannelDown
set hub command 1234567890 ChannelUp

so wie es soll

Jetzt stellt sich nur noch die Frage wo man die Wiederholungseinstellungen findet :smiley:

EDIT: müsste in IPS dann wohl das hier sein

		$iqString = "<iq id='7725179067' type='render' from='" . $identity . "'><oa xmlns='connect.logitech.com' mime='vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction'>status=press:action={\"command\"::\"$command\",\"type\"::\"IRCommand\",\"deviceId\"::\"$deviceID\"}:timestamp=0</oa></iq>";
		$this->SendDebug("Logitech Harmony Hub", "Sending: " . $iqString, 0);
		$this->XMPP_Send($iqString);
		IPS_Sleep(100);
		$iqString = "<iq id='7725179067' type='render' from='" . $identity . "'><oa xmlns='connect.logitech.com' mime='vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction'>status=release:action={\"command\"::\"$command\",\"type\"::\"IRCommand\",\"deviceId\"::\"$deviceID\"}:timestamp=100</oa></iq>";
		$this->SendDebug("Logitech Harm

Es ist wohl das beste die Instanzen zu lassen wie wie sind, dann das Modul unter der Instanz Modules zu löschen und anschließend wieder über den Modul Store zu installieren. So sollte an sich alles funktionieren.

Das dient dazu die Einrichtung zu vereinfachen. Bisher hat man die IP-Adresse des Harmony Hub angegeben. Bei mehreren Harmony Hubs musste weiterhin darauf geachtet werden das der passende IO verknüpft ist. Mit der Discovery Instanz sollte sich die Einrichtung vereinfachen. Erstens muss man die IP Adresse nicht mehr wissen, zweitens wird die UUID ausgelesen, die ist pro Hub eindeutig, die IP Adresse kann sich aber mal ändern, und drittens kümmert sich die Discovery Instanz darum, dass der Konfigurator mit dem passenden Harmony Hub verknüpft wird.

Ich bin mir des Problems bei Dir bewusst, kann das aber bisher nicht bei mir nachstellen, und wie Du sagst scheint laut Debug ja auch nur einmal gesendet zu werden. Was da genau bei Dir passiert wüste ich auch gerne um das beheben zu können.

Das tut diese auch, es wird nur lokal kommuniziert.

Es gibt keine offiziellen Infos zur der Kommunikation von Logitech, die Kommunikation wurde nie offen gelegt, das war auch der Grund warum dies letztes Jahr kurzfristig wegen „Sicherheitsproblemen“ abgeschaltet worden ist, weil es Logitech anscheinend nicht gepasst hat das IP-Symcon, oder inzwischen auch viele andere Software, den Harmony Hub so ansteuern. Das ganze wurde in Handarbeit von zap für IP-Symcon geschrieben.
Die Ursprünge bzw. das was bekannt ist findest Du hier beschrieben.

Nutzt denn FHEM aktuell noch XMPP oder haben die nicht schon auf Websocket umgestellt?

XMPP

https://raw.githubusercontent.com/mhop/fhem-mirror/master/fhem/FHEM/37_harmony.pm

Bei pearl wird das hier gemacht

     my $duration = $param_h->{duration};
    return "duration musst be numeric" if( defined($duration) && $duration !~ m/^([\d.-])+$/ );
    $duration = 0.1 if( !$duration || $duration < 0 );
    $duration = 5 if $duration > 5;

    Log3 $name, 4, "$name: sending $action->{command} for ${duration}s for ". harmony_labelOfDevice($hash, $action->{deviceId} );

    my $payload = "status=press:action={'command'::'$action->{command}','type'::'$action->{type}','deviceId'::'$action->{deviceId}'}:timestamp=0";
    harmony_sendEngineRender($hash, "holdAction", $payload);
    select(undef, undef, undef, ($duration));
    $payload = "status=release:action={'command'::'$action->{command}','type'::'$action->{type}','deviceId'::'$action->{deviceId}'}:timestamp=".$duration*1000;
    harmony_sendEngineRender($hash, "holdAction", $payload);

habe da auch schon versucht in der module.php das
IPS_Sleep(100);
raus zu nehmen bzw das timestamp=100 zu verändern mit dem Result das ich einmal die Meldung kam das es zu viele gleichzeitige Scripte gibt :smiley:

in FHEM scheint
$param_h->{duration};
nicht gesetzt zu sein, also sollte 0.1 greifen was dann 100 als TimeOut sein müsste

Ich habe jetzt wo ich den Code ja kenne nochmal ins Log geguckt, dort müssen ja theoretisch 2 Einträge auftauchen, einmal für status=press welcher kommt und einmal für status=release welcher nicht im Log auftaucht. Evtl geht dann das Send Script ins Exit wenn er fertig ist und somit wird der 2. Befehl gar nicht mehr gesendet. k.a. wo ich die SendDataToParent finde

Problem gefunden, habe an der falschen Stelle (Action) gesucht

In Zeile 990 / 991 findest Du

$iqString = "<iq type='get' id='5e518d07-bcc2-4634-ba3d-c20f338d8927-2'><oa xmlns='connect.logitech.com' mime='vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction'>action={\"type\"::\"IRCommand\",\"deviceId\"::\"$DeviceID\",\"command\"::\"$Command\"}:status=press</oa></iq>";
				$this->XMPP_Send($iqString);

darunter muss das hier rein

$iqString = "<iq type='get' id='5e518d07-bcc2-4634-ba3d-c20f338d8927-2'><oa xmlns='connect.logitech.com' mime='vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction'>action={\"type\"::\"IRCommand\",\"deviceId\"::\"$DeviceID\",\"command\"::\"$Command\"}:status=release</oa></iq>";
				$this->XMPP_Send($iqString);

evtl noch mit dem Timestamp oder dem Sleep aber so gehts bei mir

EDIT: hier die komplette Funktion angepasst

	protected function sendcommand($DeviceID, $Command, $BluetoothDevice)
	{
		if ($this->ReadAttributeBoolean("HarmonyInSession")) {
			if ($BluetoothDevice == true) {
				$this->sendcommandAction($DeviceID, $Command);
			} else {
				$iqString = "<iq type='get' id='5e518d07-bcc2-4634-ba3d-c20f338d8927-2'><oa xmlns='connect.logitech.com' mime='vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction'>action={\"type\"::\"IRCommand\",\"deviceId\"::\"$DeviceID\",\"command\"::\"$Command\"}:status=press:timestamp=0</oa></iq>";
				$this->XMPP_Send($iqString);

				IPS_Sleep(100);
				$iqString = "<iq type='get' id='5e518d07-bcc2-4634-ba3d-c20f338d8927-2'><oa xmlns='connect.logitech.com' mime='vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction'>action={\"type\"::\"IRCommand\",\"deviceId\"::\"$DeviceID\",\"command\"::\"$Command\"}:status=release:timestamp=100</oa></iq>";
				$this->XMPP_Send($iqString);

			}
		} else // Open Stream
		{
			$this->XMPP_OpenStream();
			IPS_Sleep(500); // wait for auth success
			if ($BluetoothDevice == true) {
				$this->sendcommandAction($DeviceID, $Command);
			} else {
				$iqString = "<iq type='get' id='5e518d07-bcc2-4634-ba3d-c20f338d8927-2'><oa xmlns='connect.logitech.com' mime='vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction'>action={\"type\"::\"IRCommand\",\"deviceId\"::\"$DeviceID\",\"command\"::\"$Command\"}:status=press:timestamp=0</oa></iq>";
				$this->XMPP_Send($iqString);

				IPS_Sleep(100);
				$iqString = "<iq type='get' id='5e518d07-bcc2-4634-ba3d-c20f338d8927-2'><oa xmlns='connect.logitech.com' mime='vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction'>action={\"type\"::\"IRCommand\",\"deviceId\"::\"$DeviceID\",\"command\"::\"$Command\"}:status=release:timestamp=100</oa></iq>";
				$this->XMPP_Send($iqString);
			}
		}

	}

musste auch noch in den ReLogIn Part rein … puh schwere Geburt :smiley: :smiley: :smiley:

Problem nach Update auf IPS 5.1 verschwunden. :slight_smile:

Grüße
galleto

Vielen Dank, dass Du Dir das näher angeschaut hast und das Problem offensichtlich gefunden hast.

Ich habe das mal im Beta Branch im Modul Store ergänzt. Ich würde mich freuen wenn Du mal auf den Beta Branch wechseln könntest und Rückmeldung gibst ob das jetzt bei Dir funktioniert. Wenn ja, kann man dann die Änderung so in die Stable übernehmen.

Kein Problem, wir sind hier ja alle ein Team und helfen uns gegenseitig :stuck_out_tongue:
Bin auf BETA und funktioniert :slight_smile:

Jetzt kann ich dann auch endlich anfangen eine Virtuelle Fernbedienung nach zu bauen incl Kanal Direktwahl um den WAF zu steigern :smiley:

muss die Buttons nur noch irgendwie vernünftig anordnen, also nicht nur untereinander

Am einfachsten geht so was mit Programmen wie NEO oder IPSStudio.

Im Webfront von IP-Symcon musst Du halt eine HTMLBox nutzten ein Beispiel dafür findest du unter Tastenfeld / Navigationswippe / dynamische Webseiten im Webfront darstellen.