Neues Modul 82_UmHorizon.pm - Unitymedia Horizon Box

Begonnen von LarsMie, 24 April 2017, 00:18:15

Vorheriges Thema - Nächstes Thema

LarsMie

Hallo zusammen,

Der Eingangspost wird beim nächsten Update angepasst. Es gibt dann eine Anleitung wie man die Richtige IP-Adresse der Horizon Box herausfindet. Steht auch etwas verkürzt etwas weiter unten in diesem Post.

Bisher geht:
- Ein- Ausschalten
- Programmnummer eingeben
- Programm umschalten

Ich habe vor einiger zeit mal nach Infos gestöbert, ob es ein FHEM-Modul für die Horizon-Box von Unitymedia gibt. Gibt es jedoch (immer) noch nicht. Also habe ich heute mal intensiver geforscht, da ich nach Infos aus diesem Thread (-> https://forum.fhem.de/index.php?topic=19390.0 eine möglichkeit gesucht habe, die Kommandos über VNC abzusetzen.

Nach etwas recherche bin ich auf das hier gestoßen:

http://www.domoticz.com/wiki/Control_ZiggoHorizon

#!/usr/bin/php
<?php
/*
Script (C) KixAss 2016 - horizon@kixass.net
 
Possible keys:
KEY_POWER = E0 00
KEY_OK  = E0 01
KEY_BACK  = E0 02
KEY_CHAN_UP = E0 06
KEY_CHAN_DWN = E0 07
KEY_HELP = E0 09
KEY_MENU = E0 0a
KEY_GUIDE = E0 0b
KEY_INFO = E0 0e
KEY_TEXT = E0 0f
KEY_MENU1 = E0 11
KEY_MENU2 = E0 15
KEY_DPAD_UP = E1 00
KEY_DPAD_DOWN = E1 01
KEY_DPAD_LEFT = E1 02
KEY_DPAD_RIGHT = E1 03
KEY_NUM_0 = E3 00
KEY_NUM_1 = E3 01
KEY_NUM_2 = E3 02
KEY_NUM_3 = E3 03
KEY_NUM_4 = E3 04
KEY_NUM_5 = E3 05
KEY_NUM_6 = E3 06
KEY_NUM_7 = E3 07
KEY_NUM_8 = E3 08
KEY_NUM_9 = E3 09
KEY_PAUSE = E4 00
KEY_STOP = E4 02
KEY_RECORD = E4 03
KEY_FWD = E4 05
KEY_RWD = E4 07
KEY_MENU3 = Ef 00
KEY_UNKNOWN_0  = Ef 06; // TIMESHIFT INF
KEY_UNKNOWN_1 = Ef 15; // POWE
KEY_UNKNOWN_2 = Ef 16; // N
KEY_UNKNOWN_3 = Ef 17; // RC PAIRIN
KEY_UNKNOWN_4 = Ef 19; // TIMIN
KEY_ONDEMAND = Ef 28
KEY_DVR  = Ef 29
KEY_TV = Ef 2a;
*/
 
function makeBuffer($data)
{
    
$data str_replace(" """$data);
    return 
hex2bin($data);
}
 
 
$localip "192.168.192.100"// IP of mediabox
$localport 5900// Controlport of mediabox
$key "E0 00"// Power toggle
 
if ($sock fsockopen($localip$localport))
{
    
$data fgets($sock); // readVersionMsg
    
echo "recv version: " $data "<br>";
 
    echo 
"-----------------------------<br>";
 
    
fwrite($sock$data); // Send the same version back
 
    
$data fgets($sock2); // Get OKE
    
echo "recv: " $data "<br>";
 
    echo 
"-----------------------------<br>";
 
    
fwrite($sockmakeBuffer("01")); // Send Authorization type (none)
 
    
$data fgets($sock4); // Get OKE
    
echo "recv: " $data "<br>";
 
    echo 
"-----------------------------<br>";
 
    
$data fgets($sock24); // Get init data
    
echo "recv: " $data "<br>";
 
    
fwrite($sockmakeBuffer("04 01 00 00 00 00 " $key)); // Turn key on
    
usleep(400);
    
fwrite($sockmakeBuffer("04 00 00 00 00 00 " $key)); // Turn key off
 
    
fclose($sock);
}
?>


Das ist ein PHP-Script, welches einen Socket auf der VNC-IP von der Box öffnet und einen Befehl absetzt. Klappt prima nach dem Einstellen der Richtigen IP-Adresse. Die Box reserviert ja gleich einige IPs im Heimnetzwerk (als Client).

Man muss vorher die richtige IP mit
nmap -sV -Pn <ipadresse>
herausfinden. Wobei hier die IPs der Box durchsucht werden müssen um den offenen VNC-Port herauszufinden (Port 5900).



Wie gesagt, daas PHP-Script funktioniert einwandfrei, nun möchtre ich das ganze in ein Perl-Script umwandeln. Da hapert es noch etwas. Ich bekomme eine Verbindung zur Box und bekomme auch eine Rückmeldung:

TCP Connection Success.
Received from Server : RFB 003.008


Das ist das verwendete Protokoll plus Version.

Allerdings klappt das versenden von Nachrichten noch nicht. Habe versucht das äquivalent zu den PHP-Funktionen zu finden und das dann umzubauen.

Hier mal mein Script, vielleicht kann ja einer helfen, der sich etwas besser mit perl auskennt und mir nen Tipp geben, was ich ändern muss.

#!/usr/bin/perl
#tcpclient.pl

use IO::Socket::INET;
use Time::HiRes qw ( usleep );

# flush after every write
$| = 1;

my ($socket,$client_socket);

# creating object interface of IO::Socket::INET modules which internally creates
# socket, binds and connects to the TCP server running on the specific port.
$socket = new IO::Socket::INET (
PeerHost => '192.168.1.79',
PeerPort => '5900',
Proto => 'tcp',
) or die "ERROR in Socket Creation : $!\n";

print "TCP Connection Success.\n";

# read the socket data sent by server.
$data = <$socket>;
# we can also read from socket through recv()  in IO::Socket::INET
#$socket->recv($data,1024);
print "Received from Server : $data\n";

# write on the socket to server.
$data = "040100000000E007";

my $test = pack("H*",$data);

printf($test);


binmode $socket;

#print $socket $test;
#usleep(400);
#print $socket $test;
# we can also send the data through IO::Socket::INET module,
$socket->send($test);
usleep(400);
$socket->send($test);

sleep (10);
$socket->close();

LarsMie

Oh, ich glaube ich bin im Falschen unterforum, das hier ist ja nur für funktionierende. Naja Teilweise klappts ja.

Falls es einen besseren Ort gibt, bitte dahin verschieben, in den Entwicklerbereich kann ich ja nichts posten.

LarsMie

#!/usr/bin/perl
#tcpclient.pl

use IO::Socket::INET;
use Time::HiRes qw ( usleep );

# flush after every write
$| = 1;

my ($socket,$client_socket);

# creating object interface of IO::Socket::INET modules which internally creates
# socket, binds and connects to the TCP server running on the specific port.
$socket = new IO::Socket::INET (
PeerHost => '192.168.1.79',
PeerPort => '5900',
Proto => 'tcp',
) or die "ERROR in Socket Creation : $!\n";

print "TCP Connection Success.\n";

# read the socket data sent by server.
$data = <$socket>;
# we can also read from socket through recv()  in IO::Socket::INET
#$socket->recv($data,1024);
print "Received from Server : $data\n";
#send back received data
$socket->send($data);
usleep(400);
#get server OKE
$socket->recv($data,2);
print unpack "H*", $data;
#send authentication type
$data = pack "H*","01";
$socket->send($data);
#get server OKE
$socket->recv($data,4);
#$data = <$socket>;
print unpack "H*",$data;
#get init data
$socket->recv($data,24);
#$data = <$socket>;
print unpack "H*",$data;

# write on the socket to server.
# write program down command
$data = pack "H*","040100000000E000";
$socket->send($data);
usleep(400);
$data = pack "H*","040000000000E000";
$socket->send($data);


#close connection
$socket->close();


so klappts schonmal. ein- und ausschalten geht mit diesem schnipsel. Jetzt gehts ans implementieren von den restlichen kommandos :)

CoolTux

Guten Morgen,

Ich finde Dein Arrangement sehr gut. Kann mir vorstellen das die Box doch gut verbreitet ist und daher eine Implementierung in FHEM Sinn ergeben würde.
Ich hoffe Du bleibst dran. Und um Dich etwas an zu spornen habe ich Dir etwas angehangen.

Ich habe oft gesehen das gerade Socket Implementierungen an FHEM vorbei in die Module eingearbeitet wurden, daher war ich so frei und habe Dir ein passendes Modul Skelett entworfen.
Du kannst den Kopf gerne löschen, war jetzt nur zu faul. Ich konnte es nicht auf Lauffähigkeit testen. Also bitte nur im Testsystem rennen lassen.

Den Thread solltest Du nach Multimedia verschieben.


Grüße
Leon
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

LarsMie

Moin,

freut mich sehr das zu hören! :)

Ich denke auch, dass das Sinn macht, die Horror-Box als Modul zu implementieren. Es gibt mittlerweile eine neue Version (Horizon v2), die hat soweit ich weiß den gleichen Befehlssatz.

Vielleicht kann man der Box auch noch mehr entlocken.

Danke für deine Vorarbeit, ich werde mich auf jeden Fall ans Werk machen, weil ich die Box auch in meine Automation einbinden möchte. Mit einem Modul ist das wesentlich einfacher als immer scripte auszuführen bzw. aufzurufen. Ich les mich dann mal in die Modulprogrammierung ein.


Könnte ein Moderator das ganze dann in den Multimedia-Bereich verschieben?

CoolTux

Das verschieben kannst Du auch alleine machen. Einfach unten links auf VERSCHIEBEN klicken.

Wenn Du noch Fragen wegen Modulentwicklung hast können wir das hier auch gerne Diskutieren.



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Brause

Das klingt ja richtig Interessant, dann wäre meine Horizon(UPC CH) wohl doch zu was zu gebrauchen.
Muss doch gleich mal schauen das ich sie ins Netz einbinde (ohne das sie 36 Adressen belegt)

LarsMie

Schön!

Werd mich auf jeden Fall reinarbeiten und ein Modul draus erstellen.

Gibt hier und da etwas Probleme, aber die, die schon aufgekommen sind habe ich gelöst bekommen.

Bis jetzt geht:

- Power on und off (wobei hier jeweils der gleiche befehl gesendet wird, da muss ich mal schauen, wie ich den Power-Status der Box am besten speichere oder abfrage)
- Channelnummer einstellen


Ich habe das Modul mal angehangen, beim nächsten Update werde ich den Eingangpost editieren.

LarsMie

Zitat von: CoolTux am 24 April 2017, 11:01:46
Wenn Du noch Fragen wegen Modulentwicklung hast können wir das hier auch gerne Diskutieren

Ich komm bestimmt drauf zurück. Die Grundfunktionen werd ich denk ich mal hinbekommen. Aber mir schwirren noch so ein paar ideen im Kopf, wie z.B. Favoritensender und so dinge.

LarsMie

Ich möchte gerne die Tasten Kategorisieren, habe aber keine Ideen :)

'KEY_POWER' => 'E000', #
'KEY_OK' => 'E001',
'KEY_BACK' => 'E002',
'KEY_CHAN_UP' => 'E006', #
'KEY_CHAN_DWN' => 'E007', #
'KEY_HELP' => 'E009',
'KEY_MENU' => 'E00a',
'KEY_GUIDE' => 'E00b',
'KEY_INFO' => 'E00e',
'KEY_TEXT' => 'E00f',
'KEY_MENU1' => 'E011',
'KEY_MENU2' => 'E015',
'KEY_DPAD_UP' => 'E100', #
'KEY_DPAD_DOWN' => 'E101', #
'KEY_DPAD_LEFT' => 'E102', #
'KEY_DPAD_RIGHT' => 'E103', #
'KEY_NUM_0' => 'E300', # Num Keys implemented for channel_no
'KEY_NUM_1' => 'E301',
'KEY_NUM_2' => 'E302',
'KEY_NUM_3' => 'E303',
'KEY_NUM_4' => 'E304',
'KEY_NUM_5' => 'E305',
'KEY_NUM_6' => 'E306',
'KEY_NUM_7' => 'E307',
'KEY_NUM_8' => 'E308',
'KEY_NUM_9' => 'E309',
'KEY_PAUSE' => 'E400', #
'KEY_STOP' => 'E402', #
'KEY_RECORD' => 'E403', #
'KEY_FWD' => 'E405', #
'KEY_RWD' => 'E407', #
'KEY_MENU3' => 'EF00',
'KEY_UNKNOWN_0' => 'EF06', # TIMESHIFT INF
'KEY_UNKNOWN_1' => 'EF15', # POWE
'KEY_UNKNOWN_2' => 'EF16', # N
'KEY_UNKNOWN_3' => 'EF17', # RC PAIRIN
'KEY_UNKNOWN_4' => 'EF19', # TIMIN
'KEY_ONDEMAND' => 'EF28',
'KEY_DVR' => 'EF29',
'KEY_TV' => 'EF2a', 


Die mit # ohne text Gekennzeichneten Tasten sind schon gemappt. Lässt sich leider nicht so formatieren, dass alles gleichmäßig aussieht hier im Forum

CoolTux

Verstehe gerade die Frag enicht. Geht es Dir um Code oder um Estetik?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

LarsMie

Eher um Ästhetik, also die Tasten in ordentliche unterkategorien einzuordnen in FHEM.

Also als Beispiel die Dpad buttons:

set Horizon dpad <up|down|left|right>

Das dann z.B. für andere Tasten, die man kategorisieren/gruppieren kann. Ich möchte das einfach eher etwas übersichtlicher gestalten, als alles in einem Dropdown zu haben.

Mir fallen nur einfach keine Begriffe für Kategorien ein. Da bin ich leider nicht so Kreativ wie beim Programmieren  ;D

CoolTux

Geht mir auch so. Vielleicht finden sich ja ein paar kreative Wortfinder  ;D
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

sluggyly

heyhey,

ich habe mich einmal ran gesetzt, und sämtliche Programme, die derzeit von Unitymedia bei horizon verfügbar sind, in ein File geschrieben. Habe das Modul bislang jedoch nur um ein Reading erweitert, dass mir den aktuellen Channel anzeigt. Mir schwebt da vor, direkt einen Sender auszuwählen, der dann geschaltet wird. Damit nicht noch mehr Leute die Arbeit haben, sämtliche TV-Channel aufzuschreiben, hier das File.

hologramm

Hi Leute!

Zum Programmieren bin ich absolut ungeeignet, aber ich gebe mich sehr gerne als Tester her falls bedarf besteht.
Habe eben mal (versucht) das Modul in fhem einzubinden, aber fhem meckert dauernd "unbekanntes Modul UmHorizon" (82_UmHorizon.pm ist in contrib, rechte passen).
Meine def war: define Horizon UmHorizon 192.168.178.103. Ja, auf der 103 lauscht der VNC, nmap sagt das auch. Das Web-Interface der Horizon erreiche ich aber auf der 102.

Ich wäre dankbar für input, denn ich das Modul interessiert mich SEHR.

@sluggyly:

Gute Idee, nur leider macht dir UM da grade nen fetten Strich durch die Rechnung:

ZitatAm 29.08. in NRW, 05.09. in Hessen und 12.09. in BW erweitern wir unser Senderangebot für Sie und führen eine komplett neue Senderplatzierung durch

Grüße
Björn
FHEM hab ich auch