Fhem -> Samsung TV

Begonnen von mcbain2k, 25 Mai 2013, 11:45:13

Vorheriges Thema - Nächstes Thema

mcbain2k

Leider Funktioniert das Fhem-Modul mit meinem neuen SamsungTV mit Ethernet-Anschluss nicht.

Dafür hab ich mir folgendes zusammengesucht und abgeguckt.


define HDMI_Samy dummy
attr HDMI_Samy room Samy_System
attr HDMI_Samy setList on off

define HDMI_Samy_notify notify (HDMI_Samy:on) {\
{fhem("set HDMI_Samy off")}\
{system('/usr/share/fhem/FHEM/script/samsungtv.pl HDMI&');;}\
}
attr HDMI_Samy_notify room Samy_System



#!/usr/bin/perl -w
use CGI qw(:standard);
use IO::Socket;
use MIME::Base64;
#### Configuration
my $tv = "UE55ES6300"; # Might need changing to match your TV type
my $port = "55000";    #TCP port of Samsung TV
my $tvip = "192.168.x.x"; # IP Address of TV
my $myip = "192.168.x.x"; # Doesn't seem to be really used
my $mymac = "xx-xx-xx-xx-xx-xx"; # Used for the access control/validation,$
    ####
    ####
    my $appstring = "iphone..iapp.samsung"; # What the iPhone app reports
    my $tvappstring = "iphone.".$tv.".iapp.samsung"; # TV type
    my $remotename = "PerlRemote"; # What gets reported when it asks for permis$
    #
    # command-line help
    #
    if ($ARGV[0] eq "--help") {
       print "Usage: samsungremote KEY [KEYS]\n";
       print "Normal remote keys:
       0 1 2 3 4 5 6 7 8 9
       UP DOWN LEFT RIGHT ENTER
       MENU PRECH GUIDE INFO RETURN CH_LIST EXIT
       SOURCE AD PICTURE_SIZE VOLUP VOLDOWN MUTE
       TOOLS POWEROFF CHUP CHDOWN CONTENTS W_LINK
       RSS MTS SRS CAPTION TOPMENU SLEEP ESAVING
       ZOOM1 YELLOW CYAN GREEN RED
       PLAY PAUSE REWIND FF REC STOP
       TV HDMI PIP_ONOFF ASPECT \n";
       exit;
    }

    my $sock = new IO::Socket::INET (
    PeerAddr => $tvip,
    PeerPort => $port,
    Proto => 'tcp',
    );
    die "Could not create socket: $!\n" unless $sock;
    my $messagepart1 = chr(0x64) . chr(0x00) . chr(length(encode_base64($myip, $

    my $part1 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . $
    print $sock $part1;

    my $messagepart2 = chr(0xc8) . chr(0x00);
    my $part2 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . $
    print $sock $part2;

    # Preceding sections all first time only

    if (defined(param("text"))) {
       # Send text, e.g. in YouTube app's search, N.B. NOT BBC iPlayer app.
       my $text = param("text");
       my $messagepart3 = chr(0x01) . chr(0x00) . chr(length(encode_base64($tex$
       my $part3 = chr(0x01) . chr(length($appstring)) . chr(0x00) . $appstring$
       print $sock $part3;
    }
    else {
      foreach my $argnum (0 .. $#ARGV) {
        # Send remote key(s)
        my $key = "KEY_" . $ARGV[$argnum];
        my $messagepart3 = chr(0x00) . chr(0x00) . chr(0x00) . chr(length(encod$
        my $part3 = chr(0x00) . chr(length($tvappstring)) . chr(0x00) . $tvapps$
        print $sock $part3;
#        sleep(1);
        select(undef, undef, undef, 0.5);
       }
    }

    close($sock);


Bitte noch $tv $myip $tvip $mymac anpassen, dann sollte der SamsungTV glauben Fhem wäre ein Iphone.
Mögliche Befehle stehen im Pearlscript.

UliM

Ui, klasse, das probier ich mal aus :)
Stellst Du's ins Wiki?
Gruß, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Petrosilius Zwackelmann

Neid!
Hat jemand ähnliches mit einem Sony am Laufen?
Gruss Manuel
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

UliM

Hi,
im script ist sind meherere Zeilen abgeschnitten, zB
my $messagepart1 = chr(0x64) . chr(0x00) . chr(length(encode_base64($myip, $
Kannst Du's bitte noch mal komplett posten?

Gibt's einen Grund warum Du das separat via system() aufrufst und es nicht zB in Deine 99_myUtils aufnimmst?

=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

UliM

Hiho,
so, ne Weile gebastelt - funktioniert :)

Hab das vollst. script gefunden unter http://www.vdr-portal.de/index.php?page=Thread&threadID=114845
Dieses habe ich leicht angepasst, so dass es also Routine in 99_myUtils genommen werden kann.

Kleiner Nachteil: man kann einen HDMI-Eingang nicht explizit wählen (also HDMI1 oder HDMI2), es geht nur toggeln durch den Befehl HDMI. Wenn man aber erst auf TV schaltet und dann auf HDMI, werden die belegten HDMI-Anschlüsse immer in derselben Reihenfolge durchgenudelt.

Wie von mcbain2k beschrieben müssen die Variablen im Block 'configuration' angepasst werden, also $tv,$port,$tvip,$myip,$mymac

Schönes Spielzeug :)

Gruß, Uli


#fhem.cfg
define STV1 dummy
attr STV1 group TV
attr STV1 webCmd HDMI:TV:CHUP:CHDOWN:POWEROFF

define STV2 dummy
attr STV2 group TV
attr STV2 webCmd MENU:UP:ENTER

define STV3 dummy
attr STV3 group TV
attr STV3 webCmd LEFT:DOWN:RIGHT:EXIT

define n_STV notify STV.* { samsungtv($EVENT);; fhem("setstate $NAME .");; -1;;}




#99_myUtils.pm

#am Anfang hinzugefügt:
use CGI qw(:standard);
use IO::Socket;
use MIME::Base64;

sub samsungtv($);

#irgendwo weiter unten:

#### Samsung-TV steuern ########################################################################################################
# called by n_STV
sub
samsungtv($) {
my $cmd = shift;
my @ARGV = split(" ",$cmd);
#### Configuration
#Debug "samsungtv ARGV 0:".$ARGV[0]. ($ARGV[1] ? " 1:".$ARGV[1] : "");
my $tv = "UE46ES8090"; # Might need changing to match your TV type
my $port = "55000";    #TCP port of Samsung TV
my $tvip = "192.168.xx.xx"; # IP Address of TV
my $myip = "192.168.xx.xx"; # Doesn't seem to be really used
my $mymac = "xx:xx:xx:xx:xx:xx"; # Used for the access control/validation

    my $appstring = "iphone..iapp.samsung"; # What the iPhone app reports
    my $tvappstring = "iphone.".$tv.".iapp.samsung"; # TV type
    my $remotename = "Perl Samsung Remote"; # What gets reported when it asks for permission/also shows in General->Wireless Remote Control menu

    # command-line help

    if ($ARGV[0] eq "--help") {
       print "Usage: samsungremote KEY [KEYS]\n";
       print "Normal remote keys:
       0 1 2 3 4 5 6 7 8 9
       UP DOWN LEFT RIGHT ENTER
       MENU PRECH GUIDE INFO RETURN CH_LIST EXIT
       SOURCE AD PICTURE_SIZE VOLUP VOLDOWN MUTE
       TOOLS POWEROFF CHUP CHDOWN CONTENTS W_LINK
       RSS MTS SRS CAPTION TOPMENU SLEEP ESAVING
       PLAY PAUSE REWIND FF REC STOP
       TV HDMI PIP_ONOFF ASPECT \n";
       exit;
    }


    my $sock = new IO::Socket::INET (
    PeerAddr => $tvip,
    PeerPort => '55000',
    Proto => 'tcp',
    );
    die "Could not create socket: $!\n" unless $sock;

    my $messagepart1 = chr(0x64) . chr(0x00) . chr(length(encode_base64($myip, ""))) . chr(0x00) . encode_base64($myip, "") . chr(length(encode_base64($mymac, ""))) . chr(0x00) . encode_base64($mymac, "") . chr(length(encode_base64($remotename, ""))) . chr(0x00) . encode_base64($remotename, "");
    my $part1 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart1)) . chr(0x00) . $messagepart1;
    print $sock $part1;

    my $messagepart2 = chr(0xc8) . chr(0x00);
    my $part2 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart2)) . chr(0x00) . $messagepart2;
    print $sock $part2;

    # Preceding sections all first time only

    if (defined(param("text"))) {
       # Send text, e.g. in YouTube app's search, N.B. NOT BBC iPlayer app.
       my $text = param("text");
       my $messagepart3 = chr(0x01) . chr(0x00) . chr(length(encode_base64($text, ""))) . chr(0x00) . encode_base64($text, "");
       my $part3 = chr(0x01) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart3)) . chr(0x00) . $messagepart3;
       print $sock $part3;
    }
    else {
      foreach my $argnum (0 .. $#ARGV) {
        # Send remote key(s)
# Debug "samsungtv.pl sending ".uc($ARGV[$argnum]);
        my $key = "KEY_" . uc($ARGV[$argnum]);
        my $messagepart3 = chr(0x00) . chr(0x00) . chr(0x00) . chr(length(encode_base64($key, ""))) . chr(0x00) . encode_base64($key, "");
        my $part3 = chr(0x00) . chr(length($tvappstring)) . chr(0x00) . $tvappstring . chr(length($messagepart3)) . chr(0x00) . $messagepart3;
        print $sock $part3;
#        sleep(1);
        select(undef, undef, undef, 0.5);
       }
    }

    close($sock);

}

RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

mcbain2k

Hey danke fürs anpassen Uli,

hatte das Script aus Putty kopiert ist wohl was schief gelaufen.

Einziger Grund das ich es nicht in die 99_MyUtils getan hab ist um es ohne Fhem nutzen zu können.

Für die Nutzung mit Fhem ist die 99_MyUtils die bessere Variante.

Meinst du das taugt fürs Wiki?

hab noch eins für Onkyo-Receiver.

UliM

Zitat von: mcbain2k schrieb am So, 26 Mai 2013 11:44Meinst du das taugt fürs Wiki?
Absolut :)

Hab keinen Onkyo-Receiver, daher ist diesbezüglich mein persönliches Interesse begrenzt ;-)

=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Rince

Logisch gehört sowas ins Wiki :-)

Unbedingt. Damit machst du viele User glücklich :-)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

UliM

Hiho,
hab mal ein bischen gebastelt - das kann man als weblink htmlcode einbinden und funktioniert :)
Auch im floorplan sieht's schick aus.


(siehe Anhang / see attachement)


Fehlt noch ein bischen Feinarbeit, kommt aber dieser Tage hier mit rein.
Gruß, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

mcbain2k

Hey Respekt Uli,

echt klasse was Du daraus gemacht hast.

Ich glaube Deine Version von dieser Geschichte hat es eher verdient ins Wiki zu kommen.

MFG
 McBain

UliM

Hi,
ist ja nur das 'Frontend' , dahinter hängt das o.g. script.
=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

ArminK

Nur kurz zur Info: das hätte man fast auch einfacher haben können: Anfang Dezember letztes Jahr habe ich diese Lösung auch schon fertig in der (damals noch aktiven Googlegroup unter https://groups.google.com/forum/?fromgroups#!searchin/fhem-users/samsungremote/fhem-users/CKAHUqniUVs/-xN1liOLA7gJ )vorgestellt. Sieht ziemlich ähnlich aus: Als erstes der Eintrag in meiner 99_MyUtils.pm
######### TV fernbedienen #########
sub samsungremote {
{
#### Konfiguration
    my $tv = "UE40D6510"; # Bezeichnung des Geräts (weiß nicht ob man das braucht)
    my $tvip = "192.168.1.14"; # IP Addresse TV
    my $myip = "192.168.1.36"; # wird wohl nicht benutzt
    my $mymac = "AB-CD-E1-23-45-67"; # wird anscheinend einmalig zur Zulassung der virtuellen FB gebraucht, Adresse ist egal    
    ####

    my $appstring = "iphone..iapp.samsung"; # What the iPhone app reports
    my $tvappstring = "iphone.".$tv.".iapp.samsung"; # TV type
    my $remotename = "Perl Samsung Remote"; # What gets reported when it asks for permission/also shows in General->Wireless Remote Control menu
   
    my $tvcmd = shift;
  Log 1, "samsungremote cmd: $tvcmd";

    my $sock = new IO::Socket::INET (
    PeerAddr => $tvip,
    PeerPort => '55000',
    Proto => 'tcp',
    );
    die "Could not create socket: $!\n" unless $sock;

    my $messagepart1 = chr(0x64) . chr(0x00) . chr(length(encode_base64($myip, ""))) . chr(0x00) . encode_base64($myip, "") . chr(length(encode_base64($mymac, ""))) . chr(0x00) . encode_base64($mymac, "") . chr(length(encode_base64($remotename, ""))) . chr(0x00) . encode_base64($remotename, "");
    my $part1 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart1)) . chr(0x00) . $messagepart1;
    print $sock $part1;

    my $messagepart2 = chr(0xc8) . chr(0x00);
    my $part2 = chr(0x00) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart2)) . chr(0x00) . $messagepart2;
    print $sock $part2;

    # Preceding sections all first time only

    if (defined(param("text"))) {
       # Send text, e.g. in YouTube app's search, N.B. NOT BBC iPlayer app.
       my $text = param("text");
       my $messagepart3 = chr(0x01) . chr(0x00) . chr(length(encode_base64($text, ""))) . chr(0x00) . encode_base64($text, "");
       my $part3 = chr(0x01) . chr(length($appstring)) . chr(0x00) . $appstring . chr(length($messagepart3)) . chr(0x00) . $messagepart3;
       print $sock $part3;
    }
    else {
        # Send remote key(s)
        my $key = "KEY_" . $tvcmd;
        my $messagepart3 = chr(0x00) . chr(0x00) . chr(0x00) . chr(length(encode_base64($key, ""))) . chr(0x00) . encode_base64($key, "");
        my $part3 = chr(0x00) . chr(length($tvappstring)) . chr(0x00) . $tvappstring . chr(length($messagepart3)) . chr(0x00) . $messagepart3;
        print $sock $part3;
        select(undef, undef, undef, 0.5);
    }

    close($sock);
}
}


undSo jetzt zur fhem.cfg:
Hier ein Dummy-Device um die Power-Off-Taste zu senden:

#TV Fernbedienung
#POWEROFF
define wz_tv1_poweroff dummy
attr wz_tv1_poweroff alias Power off
attr wz_tv1_poweroff eventMap on:an off:aus
attr wz_tv1_poweroff group TV
attr wz_tv1_poweroff room Wohnzimmer
define act_on_wz_tv1_poweroff notify wz_tv1_poweroff {\
   {samsungremote('POWEROFF')} \
}

Beim ersten Senden muss man am TV die virtuelle FB zulassen, also vor den TV setzen wenn das erste mal probiert wird!

Über {samsungremote('befehl')} lassen sich folgende Kommandos senden (nicht alle von mir getestet):
 
  0 1 2 3 4 5 6 7 8 9
  UP DOWN LEFT RIGHT ENTER
  MENU PRECH GUIDE INFO RETURN CH_LIST EXIT
  SOURCE AD PICTURE_SIZE VOLUP VOLDOWN MUTE
  TOOLS POWEROFF CHUP CHDOWN CONTENTS W_LINK
  RSS MTS SRS CAPTION TOPMENU SLEEP ESAVING
   PLAY PAUSE REWIND FF REC STOP
   TV HDMI PIP_ONOFF ASPECT

So, ich denke jetzt hast Du was zu tun - viel Erfolg!

Gruß
Armin


Aber schön dass es hier wieder angepackt wird. Vor allem die "Webfernbedienung find' ich cool!

Gruß aus Heidelberg
Armin
Raspberry Pi 3B mit fhem 5.8;1xCUL USB, 2xCUNO, 1xCUL Raspi über Fhem2Fhem, 2xHMLAN; diverse Homematic und FS20-Komponenten; 7 x Sonos-Player; diverse Eigenbauten mittels FS20 WUE, ESPEasy, MQTT, MySensors

Gerhard

Hi

ich habe es ausprobiert und funktioniert klasse!!

@UliM: könntest Du das Frontend auch posten?

Danke, Gerhard
FB6890LTE, cubietruck, orangePi, raspberry 2/3/4, HM/HMIP, shelly > 50, etc.

UliM

Zitat von: UliM schrieb am So, 26 Mai 2013 18:28
Zitat von: mcbain2k schrieb am So, 26 Mai 2013 11:44Meinst du das taugt fürs Wiki?
Absolut :)
Hiho,
gibt's den Wiki-Eintrag für das script schon, damit ich den ciode für das "Frontend" dranhängen kann?
Klasse wäre, wenn der Autor des Moduls STV es dorthin übernehmen könnte - denn dieses script scheint ja für alle Samsung-Modelle zu funzen, während das Modul bisher leider nur für Serie D und E funktioniert.
Alternativ könnte ich ein ´neues Modul STV2 erstellen - fänd ich aber nicht so gut...
Gruß,
Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

UliM

Hi,
zur Einrichtung der remote incl. frontend:
1.   Icons aus dem zip nach www/images/default
2.   set WEB rereadicons
3.   Routinen samsungtv($) (siehe oben), samsungremote($) und samsungremote_init() kopieren nach 99_myUtils.pm
4.   reload 99_myUtils.pm
5.   define notify n_STV  (siehe oben)
6.   define STV1 dummy (siehe oben)
7.   define STVremote weblink htmlCode {samsungremote("STV1")}
8.   attr STVremote room <Raum>
9.   STVremote kann auch in einen floorplan eingebunden werden

Es muss zunächst STV1 mit seinen buttons funktionieren (siehe oben).
Erst dann die Schritte ab 7 tun, um das frontend einzurichten.

Viel Spaß,
Uli


(siehe Anhang / see attachement)


PS: Im Moment werden die Trennblöcke in Firefox gut dargestellt, auf dem iPad produzieren sie ein hässliches Kasterl.
Wenn dazu jemand ne Lösung weiss, gerne her damit :)
Ggf $row[1], $row[6], $row[10] löschen und die Nummerierung anpassen, so dass sie durchgängig von null aufsteigend ist.


#### Samsung-TV remote frontend ########################################################################################################
# called by weblink htmlCode {samsungremote("<remotedevice>")}
sub
samsungremote_init() {
  my @row;
  $row[0]="POWEROFF,TV,HDMI";
  $row[1]="---";
  $row[2]="1,2,3";
  $row[3]="4,5,6";
  $row[4]="7,8,9";
  $row[5]=",0,PRECH";
  $row[6]="---";
  $row[7]="VOLUP,MUTE,CHUP";
  $row[8]="VOLDOWN,CH_LIST,CHDOWN";
  $row[9]="MENU,,GUIDE";
  $row[10]="---";
  $row[11]="TOOLS,UP,INFO";
  $row[12]="LEFT,ENTER,RIGHT";
  $row[13]="RETURN,DOWN,EXIT";
  # unused available commands
  # AD PICTURE_SIZE  SOURCE
  # CONTENTS W_LINK
  # RSS MTS SRS CAPTION TOPMENU SLEEP ESAVING
  # PLAY PAUSE REWIND FF REC STOP
  # PIP_ONOFF ASPECT
  return @row;
}
sub
samsungremote($) {
  my $stvdev = shift;
  my $stvhtml;
  my @row = samsungremote_init();
  $stvhtml='<table border="2" rules="none">';
  foreach my $rownr (0..$#row) {
    if ( ($row[$rownr] eq "---") && !$FW_tp ) {
  $stvhtml .= "<tr><td colspan=\"3\" style=\"height:6px\"></td></tr>\n";
  next;
}
    $stvhtml .= "<tr>\n";
    my @btn = split (",",$row[$rownr]);
 foreach my $btnnr (0..$#btn) {
   $stvhtml .= "<td>";
if ($btn[$btnnr] ne "") {
#  $stvhtml .=  "<a href=\"$FW_ME$FW_subdir?cmd.$stvdev=set $stvdev $btn[$btnnr]\"><img src=\"$FW_ME/icons/black_btn_".$btn[$btnnr]."\"></a>";
 my $cmd   = "cmd.$stvdev=set $stvdev $btn[$btnnr]";
 my $img   = "<img src=\"$FW_ME/icons/black_btn_$btn[$btnnr]\">";
   $stvhtml .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmd')\">$img</a>";
}
   $stvhtml .= "</td>\n";
 }
    $stvhtml .= "</tr>\n";
  }
  $stvhtml .= "</table>\n";
  return $stvhtml;
}



PS: Bin über's lange WE unterwegs und kann erst mal nicht helfen).

Edit 14.06.13: zip aktualisiert, alle icons drin
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.