/fhem/FHEM/70_VIERA.pm

https://github.com/JulianCT/fhem-mirror · Perl · 816 lines · 390 code · 64 blank · 362 comment · 43 complexity · e02c258d126051adb3c237d565ecdbcf MD5 · raw file

  1. # $Id$
  2. ##############################################################################
  3. #
  4. # 70_VIERA.pm
  5. #
  6. # a module to send messages or commands to a Panasonic TV
  7. # inspired by Samsung TV Module from Gabriel Bentele <gabriel at bentele.de>
  8. # written 2013 by Tobias Vaupel <fhem at 622 mbit dot de>
  9. #
  10. #
  11. # Version = 1.22
  12. #
  13. # Version History:
  14. # - 1.22 - 2013-12-28
  15. # -- fixed set command remoteControl
  16. #
  17. # - 1.21 - 2013-08-19
  18. # -- Log() deprecated/replaced by Log3()
  19. # -- GetStatus() is called after set volume/mute to update readings immediately
  20. #
  21. # - 1.20 - 2013-08-16
  22. # -- added support according to http://www.fhemwiki.de/wiki/DevelopmentGuidelinesAV
  23. #
  24. # - 1.11 - 2013-08-13
  25. # -- added "noArg" at get/set-command
  26. # -- changed format of return() in VIERA_Get() for get-command dropdown menu in FHEMWEB
  27. #
  28. # - 1.10 - 2013-06-29
  29. # -- Added support for module 95_remotecontrol
  30. # -- New functions: sub VIERA_RClayout_TV(); sub VIERA_RCmakenotify($$);
  31. # -- Updated VIERA_Initialize for remotecontrol
  32. #
  33. # - 1.00 - 2013-03-16
  34. # -- First release
  35. #
  36. ##############################################################################
  37. package main;
  38. use strict;
  39. use warnings;
  40. use IO::Socket::INET;
  41. use feature qw/say switch/;
  42. use Time::HiRes qw(gettimeofday sleep);
  43. #########################
  44. # Forward declaration for remotecontrol module
  45. sub VIERA_RClayout_TV();
  46. sub VIERA_RCmakenotify($$);
  47. my %VIERA_remoteControl_args = (
  48. "NRC_CH_DOWN-ONOFF" => "Channel down",
  49. "NRC_CH_UP-ONOFF" => "Channel up",
  50. "NRC_VOLUP-ONOFF" => "Volume up",
  51. "NRC_VOLDOWN-ONOFF" => "Volume down",
  52. "NRC_MUTE-ONOFF" => "Mute",
  53. "NRC_TV-ONOFF" => "TV",
  54. "NRC_CHG_INPUT-ONOFF" => "AV",
  55. "NRC_RED-ONOFF" => "Red",
  56. "NRC_GREEN-ONOFF" => "Green",
  57. "NRC_YELLOW-ONOFF" => "Yellow",
  58. "NRC_BLUE-ONOFF" => "Blue",
  59. "NRC_VTOOLS-ONOFF" => "VIERA tools",
  60. "NRC_CANCEL-ONOFF" => "Cancel / Exit",
  61. "NRC_SUBMENU-ONOFF" => "Option",
  62. "NRC_RETURN-ONOFF" => "Return",
  63. "NRC_ENTER-ONOFF" => "Control Center click / enter",
  64. "NRC_RIGHT-ONOFF" => "Control RIGHT",
  65. "NRC_LEFT-ONOFF" => "Control LEFT",
  66. "NRC_UP-ONOFF" => "Control UP",
  67. "NRC_DOWN-ONOFF" => "Control DOWN",
  68. "NRC_3D-ONOFF" => "3D button",
  69. "NRC_SD_CARD-ONOFF" => "SD-card",
  70. "NRC_DISP_MODE-ONOFF" => "Display mode / Aspect ratio",
  71. "NRC_MENU-ONOFF" => "Menu",
  72. "NRC_INTERNET-ONOFF" => "VIERA connect",
  73. "NRC_VIERA_LINK-ONOFF"=> "VIERA link",
  74. "NRC_EPG-ONOFF" => "Guide / EPG",
  75. "NRC_TEXT-ONOFF" => "Text / TTV",
  76. "NRC_STTL-ONOFF" => "STTL / Subtitles",
  77. "NRC_INFO-ONOFF" => "Info",
  78. "NRC_INDEX-ONOFF" => "TTV index",
  79. "NRC_HOLD-ONOFF" => "TTV hold / image freeze",
  80. "NRC_R_TUNE-ONOFF" => "Last view",
  81. "NRC_POWER-ONOFF" => "Power off",
  82. "NRC_REW-ONOFF" => "Rewind",
  83. "NRC_PLAY-ONOFF" => "Play",
  84. "NRC_FF-ONOFF" => "Fast forward",
  85. "NRC_SKIP_PREV-ONOFF" => "Skip previous",
  86. "NRC_PAUSE-ONOFF" => "Pause",
  87. "NRC_SKIP_NEXT-ONOFF" => "Skip next",
  88. "NRC_STOP-ONOFF" => "Stop",
  89. "NRC_REC-ONOFF" => "Record",
  90. "NRC_D1-ONOFF" => "Digit 1",
  91. "NRC_D2-ONOFF" => "Digit 2",
  92. "NRC_D3-ONOFF" => "Digit 3",
  93. "NRC_D4-ONOFF" => "Digit 4",
  94. "NRC_D5-ONOFF" => "Digit 5",
  95. "NRC_D6-ONOFF" => "Digit 6",
  96. "NRC_D7-ONOFF" => "Digit 7",
  97. "NRC_D8-ONOFF" => "Digit 8",
  98. "NRC_D9-ONOFF" => "Digit 9",
  99. "NRC_D0-ONOFF" => "Digit 0",
  100. "NRC_P_NR-ONOFF" => "P-NR (Noise reduction)",
  101. "NRC_R_TUNE-ONOFF" => "Seems to do the same as INFO",
  102. );
  103. sub VIERA_Initialize($){
  104. my ($hash) = @_;
  105. $hash->{DefFn} = "VIERA_Define";
  106. $hash->{SetFn} = "VIERA_Set";
  107. $hash->{GetFn} = "VIERA_Get";
  108. $hash->{UndefFn} = "VIERA_Undefine";
  109. $hash->{AttrList} = $readingFnAttributes;
  110. $data{RC_layout}{VIERA_TV} = "VIERA_RClayout_TV";
  111. $data{RC_makenotify}{VIERA} = "VIERA_RCmakenotify";
  112. }
  113. sub VIERA_Define($$){
  114. my ($hash, $def) = @_;
  115. my @args = split("[ \t][ \t]*", $def);
  116. my $name = $hash->{NAME};
  117. if(int(@args) < 3 && int(@args) > 4) {
  118. my $msg = "wrong syntax: define <name> VIERA <host> [<interval>]";
  119. Log3 $name, 2, "VIERA: $msg";
  120. return $msg;
  121. }
  122. $hash->{helper}{HOST} = $args[2];
  123. readingsSingleUpdate($hash,"state","Initialized",1);
  124. if(defined($args[3]) and $args[3] > 10) {
  125. $hash->{helper}{INTERVAL}=$args[3];
  126. }
  127. else{
  128. $hash->{helper}{INTERVAL}=30;
  129. }
  130. CommandAttr(undef,$name.' webCmd off') if( !defined( AttrVal($hash->{NAME}, "webCmd", undef) ) );
  131. Log3 $name, 2, "VIERA: defined with host: $hash->{helper}{HOST} and interval: $hash->{helper}{INTERVAL}";
  132. InternalTimer(gettimeofday()+$hash->{helper}{INTERVAL}, "VIERA_GetStatus", $hash, 0);
  133. return undef;
  134. }
  135. sub VIERA_Set($@){
  136. my ($hash, @a) = @_;
  137. my $name = $hash->{NAME};
  138. my $host = $hash->{helper}{HOST};
  139. my $count = @a;
  140. my $key = "";
  141. my $tab = "";
  142. my $usage = "choose one of off:noArg mute:on,off " .
  143. "remoteControl:" . join(",", sort keys %VIERA_remoteControl_args) . " " .
  144. "volume:slider,0,1,100 volumeUp:noArg volumeDown:noArg ".
  145. "channel channelUp:noArg channelDown:noArg";
  146. $usage =~ s/(NRC_|-ONOFF)//g;
  147. my $what = lc($a[1]);
  148. return "VIERA: Device is not present or reachable, power on or check ethernet connection" if(ReadingsVal($name,"presence","absent")ne "present" && $what ne "?");
  149. return "VIERA: No argument given, $usage" if(!defined($a[1]));
  150. my $state = lc($a[2]) if(defined($a[2]));
  151. given($what) {
  152. when("mute"){
  153. Log3 $name, 3, "VIERA: Set mute $state";
  154. if ($state eq "on") {$state = 1;} else {$state = 0;}
  155. VIERA_connection(VIERA_BuildXML_RendCtrl($hash, "Set", "Mute", $state), $host);
  156. VIERA_GetStatus($hash, 1);
  157. break;
  158. }
  159. when("volume"){
  160. return "VIERA: Volume range is too high! Use Value 0 till 100 for volume." if($state < 0 || $state > 100);
  161. Log3 $name, 3, "VIERA: Set volume $state";
  162. VIERA_connection(VIERA_BuildXML_RendCtrl($hash, "Set", "Volume", $state), $host);
  163. VIERA_GetStatus($hash, 1);
  164. break;
  165. }
  166. when("volumeup"){
  167. return "VIERA: Volume range is too high!" if(ReadingsVal($name, "volume", "0") > 100);
  168. Log3 $name, 3, "VIERA: Set volumeUp";
  169. VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"VOLUP"), $host);
  170. VIERA_GetStatus($hash, 1);
  171. break;
  172. }
  173. when("volumedown"){
  174. return "VIERA: Volume range is too low!" if(ReadingsVal($name, "volume", "0") < 1);
  175. Log3 $name, 3, "VIERA: Set volumeDown";
  176. VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"VOLDOWN"), $host);
  177. VIERA_GetStatus($hash, 1);
  178. break;
  179. }
  180. when("channel"){
  181. return "VIERA: Channel is too high or low!" if($state < 1 || $state > 9999);
  182. Log3 $name, 3, "VIERA: Set channel $state";
  183. for(my $i = 0; $i <= length($state)-1; $i++) {
  184. VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"D" . substr($state, $i, 1)), $host);
  185. sleep 0.1;
  186. }
  187. VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"ENTER"), $host);
  188. break;
  189. }
  190. when("channelup"){
  191. Log3 $name, 3, "VIERA: Set channelUp";
  192. VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"CH_UP"), $host);
  193. break;
  194. }
  195. when("channeldown"){
  196. Log3 $name, 3, "VIERA: Set channelDown";
  197. VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"CH_DOWN"), $host);
  198. break;
  199. }
  200. when("remotecontrol"){
  201. if($state eq "?"){
  202. $usage = "choose one of the states:\n";
  203. foreach $key (sort keys %VIERA_remoteControl_args){
  204. if(length($key) < 17){ $tab = "\t\t"; }else{ $tab = "\t"; }
  205. $usage .= "$key $tab=> $VIERA_remoteControl_args{$key}\n";
  206. }
  207. $usage =~ s/(NRC_|-ONOFF)//g;
  208. return $usage;
  209. }
  210. else{
  211. $state = uc($state);
  212. Log3 $name, 3, "VIERA: Set remoteControl $state";
  213. VIERA_connection(VIERA_BuildXML_NetCtrl($hash,$state), $host);
  214. }
  215. break;
  216. }
  217. when("off"){
  218. Log3 $name, 3, "VIERA: Set off";
  219. VIERA_connection(VIERA_BuildXML_NetCtrl($hash,"POWER"), $host);
  220. break;
  221. }
  222. when("statusrequest"){
  223. Log3 $name, 3, "VIERA: Set statusRequest";
  224. VIERA_GetStatus($hash, 1);
  225. break;
  226. }
  227. when("?"){
  228. return "$usage";
  229. break;
  230. }
  231. default{
  232. Log3 $name, 3, "VIERA: Unknown argument $what, $usage";
  233. return "Unknown argument $what, $usage";
  234. };
  235. }
  236. return undef;
  237. }
  238. sub VIERA_Get($@){
  239. my ($hash, @a) = @_;
  240. my $what;
  241. my $usage = "choose one of mute:noArg volume:noArg power:noArg presence:noArg";
  242. my $name = $hash->{NAME};
  243. return "VIERA: No argument given, $usage" if(int(@a) != 2);
  244. $what = lc($a[1]);
  245. if($what =~ /^(volume|mute|power|presence)$/) {
  246. if (defined($hash->{READINGS}{$what})) {
  247. ReadingsVal($name, $what, "undefined");
  248. }
  249. else{
  250. return "no such reading: $what";
  251. }
  252. }
  253. else{
  254. return "Unknown argument $what, $usage";
  255. }
  256. }
  257. sub VIERA_Undefine($$){
  258. my($hash, $name) = @_;
  259. # Stop the internal GetStatus-Loop and exist
  260. RemoveInternalTimer($hash);
  261. return undef;
  262. }
  263. sub VIERA_GetStatus($;$){
  264. my ($hash, $local) = @_;
  265. my $name = $hash->{NAME};
  266. my $host = $hash->{helper}{HOST};
  267. #if $local is set to 1 just fetch informations from device without interupting InternalTimer
  268. $local = 0 unless(defined($local));
  269. InternalTimer(gettimeofday()+$hash->{helper}{INTERVAL}, "VIERA_GetStatus", $hash, 0) unless($local == 1);
  270. return "" if(!defined($hash->{helper}{HOST}) or !defined($hash->{helper}{INTERVAL}));
  271. my $returnVol = VIERA_connection(VIERA_BuildXML_RendCtrl($hash, "Get", "Volume", ""), $host);
  272. Log3 $name, 5, "VIERA: GetStatusVol-Request returned: $returnVol" if(defined($returnVol));
  273. if(not defined($returnVol) or $returnVol eq "") {
  274. Log3 $name, 4, "VIERA: GetStatusVol-Request NO SOCKET!";
  275. if( ReadingsVal($name,"state","absent") ne "absent") {
  276. readingsBeginUpdate($hash);
  277. readingsBulkUpdate($hash, "state", "absent");
  278. readingsBulkUpdate($hash, "power", "off");
  279. readingsBulkUpdate($hash, "presence", "absent");
  280. readingsEndUpdate($hash, 1);
  281. }
  282. return;
  283. }
  284. my $returnMute = VIERA_connection(VIERA_BuildXML_RendCtrl($hash, "Get", "Mute", ""), $host);
  285. Log3 $name, 5, "VIERA: GetStatusMute-Request returned: $returnMute" if(defined($returnMute));
  286. if(not defined($returnMute) or $returnMute eq "") {
  287. Log3 $name, 4, "VIERA: GetStatusMute-Request NO SOCKET!";
  288. if( ReadingsVal($name,"state","absent") ne "absent") {
  289. readingsBeginUpdate($hash);
  290. readingsBulkUpdate($hash, "state", "absent");
  291. readingsBulkUpdate($hash, "power", "off");
  292. readingsBulkUpdate($hash, "presence", "absent");
  293. readingsEndUpdate($hash, 1);
  294. }
  295. return;
  296. }
  297. readingsBeginUpdate($hash);
  298. if($returnVol =~ /<CurrentVolume>(.+)<\/CurrentVolume>/){
  299. Log3 $name, 4, "VIERA: GetStatus-Set reading volume to $1";
  300. if( $1 != ReadingsVal($name, "volume", "0") ) {readingsBulkUpdate($hash, "volume", $1);}
  301. }
  302. if($returnMute =~ /<CurrentMute>(.+)<\/CurrentMute>/){
  303. my $myMute = $1;
  304. if ($myMute == 0) { $myMute = "off"; } else { $myMute = "on";}
  305. Log3 $name, 4, "VIERA: GetStatus-Set reading mute to $myMute";
  306. if( $myMute ne ReadingsVal($name, "mute", "0") ) {readingsBulkUpdate($hash, "mute", $myMute);}
  307. }
  308. if( ReadingsVal($name,"state","absent") ne "on") {
  309. readingsBulkUpdate($hash, "state", "on");
  310. readingsBulkUpdate($hash, "power", "on");
  311. readingsBulkUpdate($hash, "presence", "present");
  312. }
  313. readingsEndUpdate($hash, 1);
  314. #Log3 $name, 4, "VIERA $name: $hash->{STATE}";
  315. return $hash->{STATE};
  316. }
  317. sub VIERA_connection($$){
  318. my $tmp = shift ;
  319. my $TV = shift;
  320. my $buffer = "";
  321. my $tmp2 = "";
  322. my $sock = new IO::Socket::INET (
  323. PeerAddr => $TV,
  324. PeerPort => '55000',
  325. Proto => 'tcp',
  326. Timeout => 2
  327. );
  328. #Log3 $name, 5, "VIERA: connection message: $tmp";
  329. if(defined ($sock)){
  330. print $sock $tmp;
  331. my $buff ="";
  332. while ((read $sock, $buff, 1) > 0){
  333. $buffer .= $buff;
  334. }
  335. my @tmp2 = split (/\n/,$buffer);
  336. #Log3 $name, 4, "VIERA: $TV response: $tmp2[0]";
  337. #Log3 $name, 5, "VIERA: $TV buffer response: $buffer";
  338. $sock->close();
  339. return $buffer;
  340. }
  341. else{
  342. #Log3 $name, 4, "VIERA: $TV: not able to open socket";
  343. return undef;
  344. }
  345. }
  346. #####################################
  347. # Callback from 95_remotecontrol for command makenotify.
  348. sub VIERA_RCmakenotify($$) {
  349. my ($nam, $ndev) = @_;
  350. my $nname="notify_$nam";
  351. fhem("define $nname notify $nam set $ndev remoteControl ".'$EVENT',1);
  352. Log3 undef, 2, "[remotecontrol:VIERA] Notify created: $nname";
  353. return "Notify created by VIERA: $nname";
  354. }
  355. #####################################
  356. # Default-layout for panasonic TV (maybe other VIERA devices will have other layouts)
  357. sub VIERA_RClayout_TV() {
  358. my @row;
  359. $row[0]="power:POWEROFF2,TV, CHG_INPUT:HDMI";
  360. $row[1]="MENU, disp_mode:ASPECT,epg:GUIDE";
  361. $row[2]="VIERA_LINK,VTOOLS,INTERNET";
  362. $row[3]=":blank,:blank,:blank";
  363. $row[4]="INFO:INFO2,UP,cancel:EXIT";
  364. $row[5]="LEFT,ENTER,RIGHT";
  365. $row[6]="SUBMENU,DOWN,RETURN";
  366. $row[7]=":blank,:blank,:blank";
  367. $row[8]="d1:1,d2:2,d3:3";
  368. $row[9]="d4:4,d5:5,d6:6";
  369. $row[10]="d7:7,d8:8,d9:9";
  370. $row[11]="MUTE,d0:0,r_tune:PRECH";
  371. $row[12]=":blank,:blank,:blank";
  372. $row[13]="VOLUP,:blank,ch_up:CHUP";
  373. $row[14]=":VOL,:blank,:PROG";
  374. $row[15]="VOLDOWN,:blank,ch_down:CHDOWN";
  375. $row[16]=":blank,:blank,:blank";
  376. $row[17]="rew:REWIND,PLAY,FF";
  377. $row[18]="STOP,PAUSE,REC";
  378. $row[19]="attr rc_iconpath icons/remotecontrol";
  379. $row[20]="attr rc_iconprefix black_btn_";
  380. return @row;
  381. }
  382. sub VIERA_BuildXML_NetCtrl($$){
  383. my ($hash, $command) = @_;
  384. my $host = $hash->{helper}{HOST};
  385. my $callsoap = "";
  386. my $message = "";
  387. my $head = "";
  388. my $size = "";
  389. $callsoap .= "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
  390. $callsoap .= "<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
  391. $callsoap .= "<s:Body>";
  392. $callsoap .= "<u:X_SendKey xmlns:u=\"urn:panasonic-com:service:p00NetworkControl:1\">";
  393. $callsoap .= "<X_KeyEvent>NRC_$command-ONOFF</X_KeyEvent>";
  394. $callsoap .= "</u:X_SendKey>";
  395. $callsoap .= "</s:Body>";
  396. $callsoap .= "</s:Envelope>";
  397. $size = length($callsoap);
  398. $head .= "POST /nrc/control_0 HTTP/1.1\r\n";
  399. $head .= "Host: $host:55000\r\n";
  400. $head .= "SOAPACTION: \"urn:panasonic-com:service:p00NetworkControl:1#X_SendKey\"\r\n";
  401. $head .= "Content-Type: text/xml; charset=\"utf-8\"\r\n";
  402. $head .= "Content-Length: $size\r\n";
  403. $head .= "\r\n";
  404. $message .= $head;
  405. $message .= $callsoap;
  406. Log3 $hash, 5, "VIERA: Building XML SOAP (NetworkControl) for command $command to host $host:\n$message";
  407. return $message;
  408. }
  409. sub VIERA_BuildXML_RendCtrl($$$$){
  410. my ($hash, $methode, $command, $value) = @_;
  411. my $host = $hash->{helper}{HOST};
  412. my $callsoap = "";
  413. my $message = "";
  414. my $head = "";
  415. my $size = "";
  416. Log3 $hash, 5, "DEBUG: $command with $value to $host";
  417. $callsoap .= "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n";
  418. $callsoap .= "<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">\r\n";
  419. $callsoap .= "<s:Body>\r\n";
  420. $callsoap .= "<u:$methode$command xmlns:u=\"urn:schemas-upnp-org:service:RenderingControl:1\">\r\n";
  421. $callsoap .= "<InstanceID>0</InstanceID>\r\n";
  422. $callsoap .= "<Channel>Master</Channel>\r\n";
  423. $callsoap .= "<Desired$command>$value</Desired$command>\r\n" if(defined($value));
  424. $callsoap .= "</u:$methode$command>\r\n";
  425. $callsoap .= "</s:Body>\r\n";
  426. $callsoap .= "</s:Envelope>\r\n";
  427. $size = length($callsoap);
  428. $head .= "POST /dmr/control_0 HTTP/1.1\r\n";
  429. $head .= "Host: $host:55000\r\n";
  430. $head .= "SOAPACTION: \"urn:schemas-upnp-org:service:RenderingControl:1#$methode$command\"\r\n";
  431. $head .= "Content-Type: text/xml; charset=\"utf-8\"\r\n";
  432. $head .= "Content-Length: $size\r\n";
  433. $head .= "\r\n";
  434. $message .= $head;
  435. $message .= $callsoap;
  436. Log3 $hash, 5, "VIERA: Building XML SOAP (RenderingControl) for command $command with value $value to host $host:\n$message";
  437. return $message;
  438. }
  439. 1;
  440. =pod
  441. =begin html
  442. <a name="VIERA"></a>
  443. <h3>VIERA</h3>
  444. <ul>
  445. <a name="VIERAdefine"></a>
  446. <b>Define</b>
  447. <ul>
  448. <code>define &lt;name&gt; VIERA &lt;host&gt; [&lt;interval&gt;]</code>
  449. <br><br>
  450. This module controls Panasonic TV device over ethernet. It's possible to
  451. power down the tv, change volume or mute/unmute the TV. Also this modul is simulating
  452. the remote control and you are able to send different command buttons actions of remote control.
  453. The module is tested with Panasonic plasma TV tx-p50vt30e
  454. <br><br>
  455. Defining a VIERA device will schedule an internal task (interval can be set
  456. with optional parameter &lt;interval&gt; in seconds, if not set, the value is 30
  457. seconds), which periodically reads the status of volume and mute status and triggers
  458. notify/filelog commands.<br><br>
  459. Example:
  460. <ul><code>
  461. define myTV1 VIERA 192.168.178.20<br><br>
  462. define myTV1 VIERA 192.168.178.20 60 #with custom interval of 60 seconds
  463. </code></ul>
  464. </ul>
  465. <br>
  466. <a name="VIERAset"></a>
  467. <b>Set</b>
  468. <ul>
  469. <code>set &lt;name&gt; &lt;command&gt; [&lt;value&gt;]</code>
  470. <br><br>
  471. Currently, the following commands are defined.
  472. <ul>
  473. <code>
  474. off<br>
  475. mute [on|off]<br>
  476. volume [0-100]<br>
  477. volumeUp<br>
  478. volumeDown<br>
  479. channel [1-9999]<br>
  480. channelUp<br>
  481. channelDown<br>
  482. statusRequest<br>
  483. remoteControl &lt;command&gt;<br>
  484. </code>
  485. </ul>
  486. </ul>
  487. <ul>
  488. <br>
  489. <u>Remote control (depending on your model, maybe)</u><br>
  490. For this application the following commands are available:<br>
  491. <ul><code>
  492. 3D => 3D button<br>
  493. BLUE => Blue<br>
  494. CANCEL => Cancel / Exit<br>
  495. CHG_INPUT => AV<br>
  496. CH_DOWN => Channel down<br>
  497. CH_UP => Channel up<br>
  498. D0 => Digit 0<br>
  499. D1 => Digit 1<br>
  500. D2 => Digit 2<br>
  501. D3 => Digit 3<br>
  502. D4 => Digit 4<br>
  503. D5 => Digit 5<br>
  504. D6 => Digit 6<br>
  505. D7 => Digit 7<br>
  506. D8 => Digit 8<br>
  507. D9 => Digit 9<br>
  508. DISP_MODE => Display mode / Aspect ratio<br>
  509. DOWN => Control DOWN<br>
  510. ENTER => Control Center click / enter<br>
  511. EPG => Guide / EPG<br>
  512. FF => Fast forward<br>
  513. GREEN => Green<br>
  514. HOLD => TTV hold / image freeze<br>
  515. INDEX => TTV index<br>
  516. INFO => Info<br>
  517. INTERNET => VIERA connect<br>
  518. LEFT => Control LEFT<br>
  519. MENU => Menu<br>
  520. MUTE => Mute<br>
  521. PAUSE => Pause<br>
  522. PLAY => Play<br>
  523. POWER => Power off<br>
  524. P_NR => P-NR (Noise reduction)<br>
  525. REC => Record<br>
  526. RED => Red<br>
  527. RETURN => Return<br>
  528. REW => Rewind<br>
  529. RIGHT => Control RIGHT<br>
  530. R_TUNE => Seems to do the same as INFO<br>
  531. SD_CARD => SD-card<br>
  532. SKIP_NEXT => Skip next<br>
  533. SKIP_PREV => Skip previous<br>
  534. STOP => Stop<br>
  535. STTL => STTL / Subtitles<br>
  536. SUBMENU => Option<br>
  537. TEXT => Text / TTV<br>
  538. TV => TV<br>
  539. UP => Control UP<br>
  540. VIERA_LINK => VIERA link<br>
  541. VOLDOWN => Volume down<br>
  542. VOLUP => Volume up<br>
  543. VTOOLS => VIERA tools<br>
  544. YELLOW => Yellow<br>
  545. </code></ul>
  546. <br>
  547. Example:<br>
  548. <ul><code>
  549. set &lt;name&gt; mute on<br>
  550. set &lt;name&gt; volume 20<br>
  551. set &lt;name&gt; remoteControl CH_DOWN<br>
  552. </code></ul>
  553. <br>
  554. Notes:<br>
  555. <ul>Activate volume remotecontrol by DLNA: Menu -> Setup -> Network Setup -> Network Link Settings -> DLNA RemoteVolume -> On</ul>
  556. </ul>
  557. <br>
  558. <a name="VIERAget"></a>
  559. <b>Get</b>
  560. <ul>
  561. <code>get &lt;name&gt; &lt;what&gt;</code>
  562. <br><br>
  563. Currently, the following commands are defined and return the current state of the TV.
  564. <ul><code>
  565. mute<br>
  566. volume<br>
  567. power<br>
  568. presence<br>
  569. </code></ul>
  570. </ul>
  571. <br>
  572. <a name="VIERAattr"></a>
  573. <b>Attributes</b>
  574. <ul>N/A</ul>
  575. <br>
  576. <a name="VIERAevents"></a>
  577. <b>Generated events:</b>
  578. <ul>
  579. <li>volume</li>
  580. <li>mute</li>
  581. <li>presence</li>
  582. <li>power</li>
  583. <li>state</li>
  584. </ul>
  585. </ul>
  586. =end html
  587. =begin html_DE
  588. <a name="VIERA"></a>
  589. <h3>VIERA</h3>
  590. <ul>
  591. <a name="VIERAdefine"></a>
  592. <b>Define</b>
  593. <ul>
  594. <code>define &lt;name&gt; VIERA &lt;host&gt; [&lt;interval&gt;]</code>
  595. <br><br>
  596. Dieses Modul steuert einen Panasonic Fernseher &uuml;ber das Netzwerk. Es ist m&ouml;glich den Fernseher
  597. auszuschalten, die Lautst&auml;rke zu &auml;ndern oder zu muten bzw. unmuten. Dieses Modul kann zus&auml;tzlich
  598. die Fernbedienung simulieren. Somit k&ouml;nnen also die Schaltaktionen einer Fernbedienung simuliert werden.
  599. Getestet wurde das Modul mit einem Panasonic Plasma TV tx-p50vt30e
  600. <br><br>
  601. Beim definieren des Ger&auml;tes in FHEM wird ein interner Timer gestartet, welcher zyklisch alle 30 Sekunden
  602. den Status der Lautst&auml;rke und des Mute-Zustand ausliest. Das Intervall des Timer kann &uuml;ber den Parameter &lt;interval&gt;
  603. ge&auml;ndert werden. Wird kein Interval angegeben, liest das Modul alle 30 Sekunden die Werte aus und triggert ein notify.
  604. <br><br>
  605. Beispiel:
  606. <ul><code>
  607. define myTV1 VIERA 192.168.178.20<br><br>
  608. define myTV1 VIERA 192.168.178.20 60 #Mit einem Interval von 60 Sekunden
  609. </code></ul>
  610. </ul>
  611. <br>
  612. <a name="VIERAset"></a>
  613. <b>Set</b>
  614. <ul>
  615. <code>set &lt;name&gt; &lt;command&gt; [&lt;value&gt;]</code>
  616. <br><br>
  617. Zur Zeit sind die folgenden Befehle implementiert:
  618. <ul><code>
  619. off<br>
  620. mute [on|off]<br>
  621. volume [0-100]<br>
  622. volumeUp<br>
  623. volumeDown<br>
  624. channel [1-9999]<br>
  625. channelUp<br>
  626. channelDown<br>
  627. statusRequest<br>
  628. remoteControl &lt;command&gt;<br>
  629. </code></ul>
  630. </ul>
  631. <ul>
  632. <br>
  633. <u>Fernbedienung (Kann vielleicht nach Modell variieren)</u><br>
  634. Das Modul hat die folgenden Fernbedienbefehle implementiert:<br>
  635. <ul><code>
  636. 3D => 3D Knopf<br>
  637. BLUE => Blau<br>
  638. CANCEL => Cancel / Exit<br>
  639. CHG_INPUT => AV<br>
  640. CH_DOWN => Kanal runter<br>
  641. CH_UP => Kanal hoch<br>
  642. D0 => Ziffer 0<br>
  643. D1 => Ziffer 1<br>
  644. D2 => Ziffer 2<br>
  645. D3 => Ziffer 3<br>
  646. D4 => Ziffer 4<br>
  647. D5 => Ziffer 5<br>
  648. D6 => Ziffer 6<br>
  649. D7 => Ziffer 7<br>
  650. D8 => Ziffer 8<br>
  651. D9 => Ziffer 9<br>
  652. DISP_MODE => Anzeigemodus / Seitenverh&auml;ltnis<br>
  653. DOWN => Navigieren runter<br>
  654. ENTER => Navigieren enter<br>
  655. EPG => Guide / EPG<br>
  656. FF => Vorspulen<br>
  657. GREEN => Gr&uuml;n<br>
  658. HOLD => Bild einfrieren<br>
  659. INDEX => TTV index<br>
  660. INFO => Info<br>
  661. INTERNET => VIERA connect<br>
  662. LEFT => Navigieren links<br>
  663. MENU => Men&uuml;<br>
  664. MUTE => Mute<br>
  665. PAUSE => Pause<br>
  666. PLAY => Play<br>
  667. POWER => Power off<br>
  668. P_NR => P-NR (Ger&auml;uschreduzierung)<br>
  669. REC => Aufnehmen<br>
  670. RED => Rot<br>
  671. RETURN => Enter<br>
  672. REW => Zur&uuml;ckspulen<br>
  673. RIGHT => Navigieren Rechts<br>
  674. R_TUNE => Vermutlich die selbe Funktion wie INFO<br>
  675. SD_CARD => SD-card<br>
  676. SKIP_NEXT => Skip next<br>
  677. SKIP_PREV => Skip previous<br>
  678. STOP => Stop<br>
  679. STTL => Untertitel<br>
  680. SUBMENU => Option<br>
  681. TEXT => TeleText<br>
  682. TV => TV<br>
  683. UP => Navigieren Hoch<br>
  684. VIERA_LINK => VIERA link<br>
  685. VOLDOWN => Lauter<br>
  686. VOLUP => Leiser<br>
  687. VTOOLS => VIERA tools<br>
  688. YELLOW => Gelb<br>
  689. </code></ul>
  690. <br>
  691. Beispiel:<br>
  692. <ul><code>
  693. set &lt;name&gt; mute on<br>
  694. set &lt;name&gt; volume 20<br>
  695. set &lt;name&gt; remoteControl CH_DOWN<br>
  696. </code></ul>
  697. <br>
  698. Anmerkung:<br>
  699. <ul>Aktivieren von Fernbedienung der Lautst&auml;rke per DLNA: Men&uuml; -> Setup -> Netzwerk-Setup -> Netzwerkverbindungsein. -> DLNA-Fernbed. Lautst. -> Ein</ul>
  700. </ul>
  701. <br>
  702. <a name="VIERAget"></a>
  703. <b>Get</b>
  704. <ul>
  705. <code>get &lt;name&gt; &lt;what&gt;</code>
  706. <br><br>
  707. Die folgenden Befehle sind definiert und geben den entsprechenden Wert zur&uuml;ck, der vom Fernseher zur&uuml;ckgegeben wurde.
  708. <ul><code>
  709. mute<br>
  710. volume<br>
  711. power<br>
  712. presence<br>
  713. </code></ul>
  714. </ul>
  715. <br>
  716. <a name="VIERAattr"></a>
  717. <b>Attribute</b>
  718. <ul>N/A</ul>
  719. <br>
  720. <a name="VIERAevents"></a>
  721. <b>Generierte events:</b>
  722. <ul>
  723. <li>volume</li>
  724. <li>mute</li>
  725. <li>presence</li>
  726. <li>power</li>
  727. <li>state</li>
  728. </ul>
  729. </ul>
  730. =end html_DE
  731. =cut