FHEM Forum

Allgemeine Informationen => Wiki => Thema gestartet von: Jogile am 04 März 2021, 14:15:57

Titel: Homebridgemapping für Samsung TV
Beitrag von: Jogile am 04 März 2021, 14:15:57
Dies ist eine Info für alle, die wie ich ihren Samsung Fernseher über Alexa mit dem Fhem Connector Skill steuern möchten.

Hier eine Auflistung, was alles geht:
Alexa, Fernseher ein | aus
Alexa, Fernseher stumm
Alexa, schalte Fernseher auf Kanal 1-999
Alexa, schalte Fernseher auf Kanal n-tv (oder alle anderen, die unter der Variable channels definiert sind)
Alexa, schalte Fernseher um auf n-tv (oder alle anderen, die unter der Variable channels definiert sind)
Alexa, schalte Fernseher Kanal rauf/runter | hoch/runter | nächster/voheriger
Alexa, Fernseher (um x=1..9) lauter/leiser
Alexa, Kanal rauf/runter | hoch/runter
Alexa, nächster/vorheriger Kanal
Alexa, schalte Fernseher Eingang um auf TV | PC | Playstation

Und hier noch ein paar Sprachbefehle zur Timeshift Steuerung (ich nutze hier nur stop,weiter und pause):
Alexa, Fernseher stop (=Stop) | weiter (=Play) | pause (=Pause)
Alexa, Fernseher vorwärts,nächster (=Next) | vorher(iger) (=Previous) | rückwärts (=Rewind)
Alexa, Fernseher Schnellvorlauf, Schneller Vorlauf (=FastForward) | zum Anfang (=StartOver)

Noch ein paar Anmerkungen:
Fernseher ist der Alexaname
TV55C7700 ist der Name für das SamsungAV device (ich habe einen Samsung Q70 Series 55)
Taste_TV ist bei mir ein Dummy device, weil ich den Fernseher über hdmi-cec Befehl einschalte bzw. die Eingänge umschalte
Für das Einschalten des Fernsehers sowie für das Umschalten der Eingänge (TV,PC,Playstation) wird also ein HDMI Kabel zwischen Raspberry und Fernseher benötigt

Noch ein paar Anmerkungen zur Installation von HDMI CEC auf raspberry:
#Um CEC (anynet+) über HDMI des Raspberry zu nutzen
sudo apt-get install cec-utils
in /etc/sudoers eintragen, damit fhem den cec-client Befehl auch ausführen darf
fhem ALL=(ALL) NOPASSWD: ALL


Das muss in die fhem.cfg:

define TV dummy
attr TV alexaName Fernseher
attr TV alexaRoom alexa
attr TV genericDeviceType media
attr TV homebridgeMapping On=Taste_TV:state,cmdOn=on,cmdOff=off Mute=TV55C7700:mute,cmd=mute,ValueOn=on,ValueOff=off,cmdOn=mute+on,cmdOff=mute+off ChannelController:reading=channel,cmd=channel InputController:reading=source,cmd=source,values=TV;;PC;;PLAYSTATION PlaybackController:reading=playback,cmd=playback,values=Play;;Pause;;Stop;;Previous;;Next
attr TV readingList volume mute channel
attr TV room BearsCave
attr TV setList on off volume mute channel
attr TV webCmd :
define n_TV notify TV:.* {\
   #Log 1, "Das Notify n_TV hat mit Name $NAME den Event $EVENT ausgelöst";;\
   fhem("setreading TV cmd ".$EVENT);;\
   my @words = split / /, $EVENT;;\
   if ($words[0] eq "channel:") {\
      my %channels=("ARD","1","ZDF","2","N-TV","262","WELT","260","3SAT","9","PROSIEBEN","5","SAT.1","4","RTL HESSEN","31","RTL","3","RTL II","8","SUPER RTL","180","NITRO","201","VOX","6","SIXX","205","PRO7 MAXX","206","DMAX","120","TELE 5","203","SWR BW","46","BAYERN","32","ARTE","10","PHOENIX","261","M TV","463","KABEL EINS","7","SERVUS TV","11");;\
      $EVENT =~ s/channel\: //ig;;\
      if ($EVENT =~ /^[+-]?\d+$/ ) {\
         #print "Is a number\n";;\
         my @array=split('',"".$EVENT);;\
         foreach (@array){\
            fhem("set TV55C7700 ".$_);;\
            sleep(0.3);;\
         }\
         fhem("set TV55C7700 enter");;\
         fhem("setreading TV channel ".$EVENT);;\
      } else {\
         #print "Is not a number\n";;\
         #print uc($EVENT);;\
         my @array=split('',$channels{uc($EVENT)});;\
         foreach (@array){\
            fhem("set TV55C7700 ".$_);;\
            sleep(0.3);;\
         }\
         fhem("set TV55C7700 enter");;\
         fhem("setreading TV channel ".$channels{uc($EVENT)});;\
      }\
   } elsif ($words[0] eq "volume:") {\
      $EVENT =~ s/volume\: //ig;;\
      if ($EVENT != 50) {\
         #Ermittle, wie oft die Taste lauter/leiser gedrückt werden soll. Normalerweise ist der loop_count gleich 10 bzw. -10, wenn man "Mach Fernseher lauter/leiser" sagt.\
         #Wenn man sagt, "Mache Fernseher um X leiser", entspricht loop_count dann X und kann max. 5 sein.\
         my $loopCount = abs($EVENT - ReadingsVal("TV","last_volume",50));;\
         #print "$loopCount\n";;\
         if ($loopCount > 9) {\
            $loopCount = 1;;\
         }\
         if ($EVENT > 50) {\
            #print ("TV lauter: ".$EVENT." > 50\n");;\
            foreach my $i (1..$loopCount) {\
               #print "$i\n";;\
               fhem("set TV55C7700 volumeUp");;\
               sleep(0.3);;\
            }\
         } else {\
            #print ("TV leiser: ".$EVENT." <= 50\n");;\
            foreach my $i (1..$loopCount) {\
               #print "$i\n";;\
               fhem("set TV55C7700 volumeDown");;\
               sleep(0.3);;\
            }\
         }\
         fhem("setreading TV volume 50");;\
      }\
   } elsif ($words[0] eq "source") {\
      $EVENT =~ s/source FERNSEHER EINGANG //ig;;\
      if ("$EVENT" eq "TV") {\
         fhem("set TV55C7700 tv");;\
      } elsif ("$EVENT" eq "PC") {\
         #fhem("set TV55C7700 hdmi");;\
         system("echo 'tx 4F:82:10:00' | sudo cec-client -s -d 1 &");;\
      } elsif ("$EVENT" eq "PLAYSTATION") {\
         system("echo 'tx 4F:82:20:00' | sudo cec-client -s -d 1 &");;\
      }\
      fhem("setreading TV source $EVENT");;\
   } elsif ($words[0] eq "playback") {\
      $EVENT =~ s/playback //ig;;\
      if ("$EVENT" eq "Play") {\
         fhem("set TV55C7700 play");;\
      } elsif ("$EVENT" eq "Pause") {\
         fhem("set TV55C7700 pause");;\
      } elsif ("$EVENT" eq "Stop") {\
         fhem("set TV55C7700 stop;;sleep 2;;set TV55C7700 left;;set TV55C7700 enter");;\
      } elsif ("$EVENT" eq "Next") {\
         fhem("set TV55C7700 ff");;\
      } elsif ("$EVENT" eq "Rewind") {\
         fhem("set TV55C7700 rewind");;\
      }\
      fhem("setreading TV playback $EVENT");;\
   }\
}


# TV
# define <name> STV <host> <port>
define TV55C7700 SamsungAV 192.168.168.46 8001
attr TV55C7700 webCmd :


#Der Vollständigkeit halber, hier noch die Def. der Taste_TV
define Taste_TV dummy
attr Taste_TV devStateIcon on:general_an@#00FF00 off:general_aus@#FFFFFF
attr Taste_TV group Steckdosen
attr Taste_TV setList on off
attr Taste_TV webCmd :
define on_TV notify Taste_TV:on IF ([TV55C7700] eq "absent") (define tmp_Taste2 at +00:00:10 set TV55C7700 tv) ELSE (set TV55C7700 tv);;{ system("echo 'on 0' | sudo cec-client -s -d 1") }
define off_TV notify Taste_TV:off IF ([TV55C7700] eq "on") (set TV55C7700 power)
Titel: Antw:Homebridgemapping für Samsung TV
Beitrag von: PeMue am 27 März 2021, 19:12:22
Hallo,
packst Du bitte den Quelltext in codetags (geht auch nachträglich noch).
Danke und Gruß
Peter