TCP/IP Befehle senden um iTach IP2IR, Netzwerkreceiver, etc. zu steuern

Begonnen von BenWend, 29 März 2013, 20:23:57

Vorheriges Thema - Nächstes Thema

BenWend

Hallo,

ich würde meinen iTach IP2IR sowie weitere netzwerkfähige Geräte gerne direkt über FHEM (läuft bei mir auf einem RaspberryPi) ansteuern.

Hierzu möchte ich bei einem "notify" einfach einen Befehl bzw. eine Befehlskette über TCP/IP an das netzwerkfähige Gerät senden.

In meinem Testsetting habe ich es hinbekommen, dass bei Aktivierung des Bewegungsmelders über meinen iTach IP2IR der Befehl "einen Menüpunkt nach rechts" an meinen Apple TV 3 gesendet und ausgeführt wird :o)

Danach stürzt der FHEM Server allerdings ab :o(

Ich poste einfach mal, was ich bisher gemacht habe. Bitte wundert Euch nicht, wenn der Absturz an etwas völlig Trivialem liegt - was ich hoffe. Ich bin absoluter Linux und FHEM Neuling.

Hier das bisherige Vorgehen.

1.) Über die RasperryPi Command Line nodejs installieren:

sudo apt-get install nodejs npm

2.) Auf dem RaspberryPi ein kleines Script schreiben, welches ein TCP/IP Paket sendet. Was da genau gesendet wird, erkläre ich am Ende.    

nano test.js

var net = require('net');
var tcpclient = net.connect(4998, '192.168.178.51', function() { tcpclient.write('sendir,1:2,1,39000,1,1,348,172,21,22,21,63,21,63,21,63,21,22,21,63,21,63,21,63,21,63,21,63,21,63,21,22,21,22,21,22,21,22,21,63,21,63,21,63,21,63,21,22,21,22,21,22,21,22,21,22,21,22,21,63,21,22,21,63,21,22,21,63,21,22,21,63,21,1472,347,87,21,780\r\n');
});


3.) In der fhem.cfg eine Zeile einfügen, die bei Aktivierung eines Sensors/Aktors das unter /home/pi/ liegende test.js ausführt. Danke @fiedel für Deine Unterstützung bei dieser Zeile.

define iTach notify Testaktor:on.* {system("nodejs /home/pi/test.js");;}

Ergebnis bei Aktivierung des Testaktors:

- Der Befehl wird an das iTach IP2IR gesendet, und auf meinem Apple TV geht der Cursor nach rechts.

-Der FHEM Server reagiert danach allerings nicht mehr, sondern stürzt ab. Auch per "putty" komme ich nicht mehr drauf. Es hilft nur ein gepflegtes Stecker ziehen.

Fragen:

- Muss ich evtl. den tcpclient im Script wieder schließen? Wenn ich das Script test.js über die Command Line des RaspberryPi ausführe, komme ich auch nicht wieder zum Prompt zurück. Hierzu muss ich erst Steuerung + C drücken.

- Hat evtl. jemand einen Tipp oder weiß jemand vielleicht eine schon fertige Lösung um mein Vorhaben zu realisieren?

Noch einige Informationen

- 192.168.178.51 ist die Adresse meines iTach IP2IR

- "sendir,1:2,1,39000,1, ..." ist der vom iTach IP2IR angelernte Befehl - also das, was an das netzwerkfähige Gerät gesendet werden soll.

- Die API-Dokumentation für das iTach IP2IR findet sich unter http://www.globalcache.com/files/docs/API-iTach.pdf

- Ich denke, hiermit ist es prinzipiell auch möglich, andere netzwerkfähige Geräte anzusteuern, die über TCP/IP gesteuert werden - ich möchte bspw. gerne meinen netzwerkfähigen Onkyo-Receiver auf diese Weise ansteuern. Onkyo verwendet soweit ich weiß das sog. Integra-Protokoll. Hier suche ich noch eine Dokumentation. Zur Not müsste ich die Befehle, die übers Netzwerk gehen mitsniffen - bisher verwende ich die Software iRule auf einem iPhone zum Ansteuern des Onkyos. iRule sendet die Befehle über das Netzwerk via Integra Protokoll.

Vorher müsste ich allerdings rausfinden, weshalb FHEM nach dem Ausführen von test.js abstürzt.

Vielen Dank und schöne Grüße

Ben

BenWend

Hallo,

ich habe jetzt mal versucht, den Client mit

tcpclient.destroy();

zu beenden, also so:

var net = require('net');
var tcpclient = net.connect(4998, '192.168.178.51', function() {
tcpclient.write('sendir,1:2,1,39000,1,1,348,172,21,22,21,63,21,63,21,63,21,22,21,63,21,63,21,63,21,63,21,63,21,63,21,22,21,22,21,22,21,22,21,63,21,63,21,63,21,63,21,22,21,22,21,22,21,22,21,22,21,22,21,63,21,22,21,63,21,22,21,63,21,22,21,63,21,1472,347,87,21,780\r\n');
tcpclient.destroy();
});


Ergebnis:

- FHEM stürzt zwar nicht ab
- Das Script bewirkt nichts mehr - mein iTach und damit auch der Apple TV reagieren nicht.

Jetzt bin ich etwas ratlos, ...

BenWend

So, jetzt habe ich mir eine Lösung ergoogelt, das Ergbenis war hier (https://globalcache.zendesk.com/entries/21099162-perl-example) zu finden.

Mit dem Perl-Script:

use IO::Socket::INET;

my ($socket,$client_socket);
$socket = new IO::Socket::INET (
    PeerHost => '192.168.178.51',
    PeerPort => '4998',
    Proto => 'tcp',
) or die "ERROR in Socket Creation : $!\n";

print "TCP Connection Success.\n";

# send iTach command getdevices
$data = "sendir,1:2,1,39000,1,1,348,172,21,22,21,63,21,63,21,63,21,22,21,63,21,63,21,63,21,63,21,63,21,63,21,22,21,22,21,22,21,22,21,63,21,63,21,63,21,63,21,22,21,22,21,22,21,22,21,22,21,22,21,63,21,22,21,63,21,22,21,63,21,22,21,63,21,1472,347,87,21,780\r\n";
$socket->send($data);
sleep (1);

$socket->recv($data,1024);
print "Received from Server : $data\n";

$socket->close();

print "socket closed\n";


lassen sich TCP/IP-Befehle an den iTach senden und alles funktioniert wie geplant.

Eine Frage habe ich allerdings noch.

In diesem Beitrag (Link) wird der zu sendende Befehl nicht direkt in das Perl-Script geschrieben, sondern über einen Parameter beim Aufruf des Perl-Scripts eingelesen (ARGV). Leider habe ich dies bei dem o. g. Script nicht umsetzten können, obwohl dies viele Vorteile hätte. Kann mir jemand helfen?

Schöne Grüße

Ben

BenWend

Die fertige Lösung habe ich hier Link gepostet, damit diese nicht untergeht.

closed