Neues Modul PHTV für Philips Fernseher (inkl. Ambilight)

Begonnen von Loredo, 06 März 2014, 22:09:17

Vorheriges Thema - Nächstes Thema

Loredo

Zitat von: akr1983 am 12 Februar 2017, 13:38:27
Nur es funktionieren halt keine Commands und der Fernseher wird auch egal welchen Status er in wirklichkeit hat, als "absent" angezeigt. Vermutlich weil im Protokoll halt zu viel Unterschiedlich ist...


Das audio/volume Kommando wird ja definitiv unterstützt.
Das Timeout hier liegt vermutlich daran, dass HTTPDigestAuth nicht richtig angewendet wird und der Fernseher womöglich daraufhin nichtmal eine Antwort zurück schickt. FHEM's HttpUtils hat dafür theoretisch rudimentären Support drin, ich konnte aus dem Quellcode aber nicht herauslesen, wie man es richtig anwendet. Aktuell werden die Benutzerdaten einfach "as is" mitgeschickt. HttpUtils versucht zunächst HTTP Basic Auth und daraufhin müsste der TV eigentlich sagen, dass er lieber HTTP DigestAuth möchte und HttpUtils sollte selbstständig die Anfrage nochmals mit HTTP DigestAuth verschicken. Das lässt sich vermutlich debuggen, indem das globale Verbose-Level hochgesetzt wird. Es ginge nun also darum herauszufinden, wie Digest Auth in HttpUtils funktioniert.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

kurt6908

Hallo,

neues vom Perl-Script. Fehler beim Pairing gefunden, ich bekomme jetzt die PIN an TV angezeigt und über das Script Benutzernamen (device_id) und das Kennwort (auth_key).

Aber: Irgendwo ist noch ein Fehler drinnen, denn Benutzernamen (device_id) und das Kennwort (auth_key) werden beim Aufrufen von Einstellungen, z.B. Lautstärke nicht akzeptiert. Ich glaube bei der Verschlüsselung hakt es noch. Ich habe Benutzernamen (device_id) und das Kennwort (auth_key) mit dem original Python-Script getestet, da gehts auch nicht.

Auf alle Fälle bin ich nah dran, dass mit Perl zu erledigen und wenn es fertig ist, kann man (Loredo?) es ins Modul einbauen.

Hier mein Perl-Script bis zur (falschen) Ausgabe von Benutzernamen (device_id) und Kennwort (auth_key). 

#!/usr/bin/perl

use strict;
use warnings;
use JSON;
use Digest::SHA qw(hmac_sha256_base64);
use LWP::UserAgent;
use IO::Socket::SSL;

my $secretkey;
my @chars;
my $len;
my $deviceid;
my $tosign;
my $authsignature;
my %config;
my %devicespec;
my %data;
my $data_json;
my $uri;
my $authTimestamp;
my $authTimeout;
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
my $req;
my $res;
my $message;
my %resp;
my $authtimestamp;
my $authtimeout;
my $pin;
my %auth;
my %grant_request;

$config{'address'} = "xxx.xxx.xx.xx";


# Key used for generated the HMAC signature
$secretkey = "ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA==";

# 16-stellige Device-ID aufbauen
sub createDeviceId(){
@chars = split("","abcdefghkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789");
$len = 16;
foreach (0..$len-1) {
$deviceid .= $chars[int(rand(@chars))]; 
}
return $deviceid;
}

# Signatur aufbauen
sub createsignature(){
$authsignature = hmac_sha256_base64($tosign, $secretkey);
while (length($authsignature) % 4) {
$authsignature .= '=';
}
return $authsignature;
}

# JSON aufbauen
sub getDeviceSpecJson(){
$data{'device'} =  {
device_name => 'heliotrope',
device_os => 'Android',
app_name => 'ApplicationName',
type => 'native',
app_id => $config{'application_id'},
id => $config{'device_id'},
};
return $data{'device'};
}

# HTTP-Request für Pairing ausführen
$config{'application_id'} = "app.id";
createDeviceId();
$config{'device_id'} = $deviceid;
$data{'scope'} = ["read", "write", "control"];
getDeviceSpecJson();
$data_json = encode_json \%data;
$uri = "https://".$config{'address'}.":1926/6/pair/request";
print "Starting pairing request", "\n";

$req = HTTP::Request->new( 'POST', $uri );
$req->header('Content-Type'=>'application/json');
$req->content( $data_json );
$res = $ua->request($req);

if ($res->is_success) {
    $message = $res->decoded_content;
print "Received reply: $message \n";
}
else {
    print "HTTP POST error code: ", $res->code, "\n";
    print "HTTP POST error message: ", $res->message, "\n";
}

%resp = %{decode_json($message)};

$authtimestamp = $resp{'timestamp'};
$config{'auth_key'} = $resp{'auth_key'};
$authtimeout = $resp{'timeout'};

print "Enter onscreen passcode: ";
$pin = <STDIN>;
chomp $pin;

print "pin :", $pin, "\n";
print "authtimestamp :", $resp{'timestamp'}, "\n";
print "config_auth_key :", $resp{'auth_key'}, "\n";
print "authtimeout :", $resp{'timeout'}, "\n";

$tosign = $authtimestamp.$pin;
print "tosign :", $tosign, "\n";

createsignature();

print "authsignature :", $authsignature, "\n";

%auth = (
"auth_AppId" => "1",
"pin" => $pin,
"auth_timestamp" => $authtimestamp,
"auth_signature" => $authsignature,
);

%grant_request = (
"auth" => %auth,
"device" => $data{'device'},
);

print "Attempting to pair", "\n";

$uri = "https://".$config{'address'}.":1926/6/pair/request";
$data_json = encode_json \%grant_request;

print "Starting pairing request", "\n";

$req = HTTP::Request->new( 'POST', $uri );
$req->header('Content-Type'=>'application/json');
$req->content($data_json);
$req->authorization_basic($config{'device_id'}, $config{'auth_key'});
$res = $ua->request($req);

if ($res->is_success) {
    $message = $res->decoded_content;
print "Received reply: $message \n";
}
else {
    print "HTTP POST error code: ", $res->code, "\n";
    print "HTTP POST error message: ", $res->message, "\n";
}

print "Username for subsequent calls is: ", $config{'device_id'}, "\n";
print "Password for subsequent calls is: ", $config{'auth_key'}, "\n";


Vom Vorgehen im Modul stelle ich mir das mal so vor:

- Device anlegen
- FHEM: set Device pair
- PIN am Fernseher ablesen
- PIN in FHEM als Dialog während des "set Device pair" eingeben
- Benutzernamen (device_id) und Kennwort (auth_key) werden in den Attributen gespeichert
- Benutzernamen (device_id) und Kennwort (auth_key) werden für alle anderen FHEM-Befehle über SSL und Port hergenommen.

.... so ungefähr...

Gruß

Kurt
3* Raspberry Pi (2 über LTE/VPN), 5* Cul, 3* FS20, 4* FHT, 6* HM, Somfy, Solarlog, WMBus/EnergyCam, AVM FritzBox, 3* AVM Powerline, Alexa, Tasmota/MQTT, Rademacher DuoFern, EPEver HiPower/ModBus, go-eCharger

SmartHome

Hallo,

ich habe PHTV problemlos für meinen Philips 55PFL8008S/12 eingerichtet und 2 Hue Living Colors über die den attr Befehl zugeordnet (ambiHueLeft HUEDevice1 und ambiHueRight HUEDevice2) danach mit set PhilipsTV ambiHue on eingeschaltet.

Das erweiterte Ambilight hat alles rund eine Woche super funktionert.

Heute habe ich festgestellt das die Livingcolors Lampen nicht mehr mit Ambilight synchonisieren

Alles andere funktioniert über die Hue Installation bzw. PHTV

Der Befehl set PhilipsTV ambiHue on führt jetzt immer zu "No configuration found. Please set ambiHue attributes first."

Wie kann ich den Fehler finden? habe das Devie schon mehrfah entfert und über define neu generiert

Paul Guijt

Hallo Julian,

Mein TV hat bis einige Tage her gut in FHEm functioniert:
defmod TV PHTV 192.168.178.25 20
attr TV devStateIcon on:rc_GREEN:off off:rc_YELLOW:on absent:rc_STOP:on
attr TV event-on-change-reading presence
attr TV event-on-update-reading presence
attr TV icon it_television
attr TV macaddr 48:D2:24:C1:35:D4
attr TV model PHILIPS_2K13_HT_SVT_DL
attr TV room Media,Test
attr TV verbose 5
attr TV webCmd volume:input:rgb

setstate TV absent
setstate TV 2017-02-16 21:50:24 ambiHue off
setstate TV 2017-02-16 21:50:34 ambiMode internal
setstate TV 2017-02-16 21:50:34 bri 0
setstate TV 2017-02-16 21:50:34 channel -
setstate TV 2017-02-16 21:50:34 channelList -,
setstate TV 2017-02-16 21:50:34 currentMedia -
setstate TV 2017-02-16 21:50:34 frequency -
setstate TV 2017-02-16 21:50:34 hue 0
setstate TV 2017-02-16 21:50:34 input -
setstate TV 2017-02-16 21:50:25 inputList
setstate TV 2017-02-16 21:50:34 level 0 %
setstate TV 2017-02-16 21:50:34 mute -
setstate TV 2017-02-16 21:50:34 onid -
setstate TV 2017-02-16 21:50:34 pct 0
setstate TV 2017-02-16 21:50:34 power off
setstate TV 2017-02-16 22:58:16 presence present
setstate TV 2017-02-16 21:50:34 receiveMode -
setstate TV 2017-02-16 21:50:34 rgb 000000
setstate TV 2017-02-16 21:50:34 sat 0
setstate TV 2017-02-16 21:50:34 servicename -
setstate TV 2017-02-16 21:50:34 sid -
setstate TV 2017-02-16 21:50:34 state absent
setstate TV 2017-02-16 21:50:34 stateAV absent
setstate TV 2017-02-16 21:50:34 tsid -
setstate TV 2017-02-16 21:50:34 volume -
setstate TV 2017-02-16 21:50:34 volumeStraight -


Anbei das Label meiner TV.

Der TV hat jetzt immer die State absent und Power off.

Hast du eine Ahnung?

Freundliche Grüße,
Paul
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände

kurt6908

Hallo,

so, nun ist es fertig und sollte funktionieren.

Hier die Übersetzung des Python-Scriptes nach Perl. Bitte beachtet, dass die Programmstruktur wohl nicht optimiert ist, aber es läuft.

Anleitung:

- IP-Adresse des TVs (Android-TV) bei den Übergabeparametern definieren
- Script starten
- PIN wird am Fernseher angezeigt
- PIN im Script eingeben
- Pairing findet statt
- Taste drücken
- Lautstärke wird abgefragt und sollte dann auch die Lautstärke anzeigen

#!/usr/bin/perl

use strict;
use warnings;
use JSON;
use Digest::SHA qw(hmac_sha1_base64 hmac_sha1_hex);
use MIME::Base64;
use LWP::UserAgent;
use HTTP::Request::Common;
use IO::Socket::SSL;

my $secretkey;
my @chars;
my $len;
my $deviceid;
my $tosign;
my $authsignature;
my %config;
my %devicespec;
my %data;
my $data_json;
my $uri;
my $authTimestamp;
my $authTimeout;
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
my $req;
my $res;
my $message;
my %resp;
my $authtimestamp;
my $authtimeout;
my $pin;
my %auth;
my %grantdevice;
my %grant_request;


# Übergabeparameter

# IP-Adresse TV
$config{'address'} = "192.168.69.48";

# Secret Key (Base64-encoded) für die HMAC-Signatur
$secretkey = "ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA==";

# Zufällige 16-stellige Device-ID aufbauen
sub createDeviceId(){
@chars = split("","abcdefghkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789");
$len = 16;
foreach (0..$len-1) {
$deviceid .= $chars[int(rand(@chars))]; 
}
return $deviceid;
}

# HMAC-Signatur (SHA1 Base64-encoded) aufbauen
sub createsignature(){
$secretkey = decode_base64($secretkey);
print "secretkey: ",$secretkey, "\n";
$authsignature = hmac_sha1_hex($tosign, $secretkey);
while (length($authsignature) % 4) {
$authsignature .= '=';
}
$authsignature = encode_base64($authsignature);
chomp $authsignature;
return $authsignature;
}

# JSON-Data für Pairing-Anfrage aufbauen
sub getDeviceSpecJson(){
$data{'device'} =  {
device_name => 'heliotrope',
device_os => 'Android',
app_name => 'ApplicationName',
type => 'native',
app_id => $config{'application_id'},
id => $config{'device_id'},
};
return $data{'device'};
}

# HTTP-Request für Pairing ausführen

$config{'application_id'} = "app.id";
createDeviceId();
$config{'device_id'} = $deviceid;
$data{'scope'} = ["read", "write", "control"];
getDeviceSpecJson();
$data_json = encode_json \%data;
$uri = "https://".$config{'address'}.":1926/6/pair/request";

print "Starting pairing request", "\n";

$res = $ua->post(
  $uri,
  'Content' => $data_json,
  'Content-Type'=>'application/json',
);

# HTTP-Respose auswerten
if ($res->is_success) {
    $message = $res->decoded_content;
print "Received reply: $message \n";
}
else {
     print "HTTP POST error code: ", $res->code, "\n";
     print "HTTP POST error message: ", $res->message, "\n";
}

%resp = %{decode_json($message)};

$authtimestamp = $resp{'timestamp'};
$config{'auth_key'} = $resp{'auth_key'};
$authtimeout = $resp{'timeout'};

# PIN vom TV eingeben
print "Enter onscreen passcode: ";
$pin = <STDIN>;
chomp $pin;

# JSON-Data für Pairing - Erweiterung aufbauen

$tosign = $authtimestamp.$pin;
createsignature();

%auth = (
"auth_AppId" => "1",
"pin" => $pin,
"auth_timestamp" => $authtimestamp,
"auth_signature" => $authsignature,
);

%grant_request = ();
$grant_request{"auth"} = \%auth;
$grant_request{"device"} = $data{'device'};

# Pairing - Erweiterung ausführen
print "Attempting to pair", "\n";

$uri = "https://".$config{'address'}.":1926/6/pair/grant";
$data_json = encode_json \%grant_request;

print "device_id :",$config{'device_id'},"\n";
print "auth_key :",$config{'auth_key'},"\n";

print "Starting pairing request", "\n";

$ua->credentials($config{'address'}.':1926', 'XTV', $config{'device_id'} => $config{'auth_key'});
$res = $ua->post(
    $uri,
    'Content' => $data_json,
    'Content-Type'=>'application/json',
);

# Pairing - Erweiterung auswerten

if ($res->is_success) {
print "HTTP POST code: ", $res->code, "\n";
    $message = $res->decoded_content;
  print "Received reply: $message \n";
}
else {
     print "HTTP POST error code: ", $res->code, "\n";
     print "HTTP POST error message: ", $res->message, "\n";
}

print "Username for subsequent calls is: ", $config{'device_id'}, "\n";
print "Password for subsequent calls is: ", $config{'auth_key'}, "\n";

### Lautstärke abfragen

print "Taste drücken um Lautstärke abzufragen!", "\n";

# Lautstärke abfragen

$pin = <STDIN>;
chomp $pin;

$uri = "https://".$config{'address'}.":1926/6/audio/volume";

$ua->credentials($config{'address'}.':1926', 'XTV', $config{'device_id'} => $config{'auth_key'});
$res = $ua->get(
    $uri,
    'Content-Type'=>'application/json',
);

if ($res->is_success) {
    $message = $res->decoded_content;
print "Received reply: $message \n";
}
else {
     print "HTTP GET error code: ", $res->code, "\n";
     print "HTTP GET error message: ", $res->message, "\n";
}


Wenn jetzt das Modul PHTV um das Pairing und die geänderte Steuerung erweitern kann, dann wäre das super. Hier steigt jedoch mein PERL-Verständnis aus, so dass ich hier nicht mehr weiterkomme.

Viele Grüße und in Erwartung des geänderten Moduls....

Gruß

Kurt
3* Raspberry Pi (2 über LTE/VPN), 5* Cul, 3* FS20, 4* FHT, 6* HM, Somfy, Solarlog, WMBus/EnergyCam, AVM FritzBox, 3* AVM Powerline, Alexa, Tasmota/MQTT, Rademacher DuoFern, EPEver HiPower/ModBus, go-eCharger

hallo.amt

#290
Hallo,

erstmal danke für das Modul. Leider lief es bei mir erst nach ein wenig rumprobieren, kann es sein, daß die neuen Modelle alle Daten in einer Zeile ausgeben ? Ich musste in der Datei 70_PHTV.pm die Zeile 1599 in der Funktion PHTV_ReceiveCommand die beiden Zeilen
        else {
            Log3 $name, 4, "PHTV $name: RCV $service/" . urlDecode($cmd);
        }

        $data =~ s/\R//g;
        $data =~ s/\t//g;

        if ( $data =~
m

einfügen. Das nimmt die Zeilenumbrüche und Tabs raus. Die Antwort meines Fernsehers hat sonst nicht auf die RegEx gepasst und es gab immer den Fehler
RES ERROR audio/volume
und das Modul war unbenutzbar. Die Antwort meines Fernsehers auf diese Frage sieht so aus:
{
   "muted": false,
   "current": 0,
   "min": 0,
   "max": 60
}

Jetzt tut es bei mir :-) Wäre toll, wenn Du das einbauen könntest, dann muss ich mir beim Update keine Gedanken machen und anderen machsen weniger graue Haare  8)

Viele Grüße

HA

P.S.:
model 40PFL6606K/02
swversion Q5551-0.14.105.0

Christian72D

Zitat von: kurt6908 am 17 Februar 2017, 21:15:35
Hallo,

so, nun ist es fertig und sollte funktionieren.

Hier die Übersetzung des Python-Scriptes nach Perl. Bitte beachtet, dass die Programmstruktur wohl nicht optimiert ist, aber es läuft.


Also den Code als Datei auf den RasPi packen und dann starten oder wie?

kurt6908

Hallo,

ja...

- Perl auf Raspi laden,
- IP-Adresse am Anfang anpassen,
- dann Script starten,
- Fernseher muss an und im Netz ein,
- dann wird eine PIN am Fernseher angezeigt,
- diese am Raspi eingeben
- dann sollte die Lautstäre des Fernsehers angezeigt werden

ABER: Das Script ist noch nicht in FHEM implementiert, soll nur den generellen Funktionsaufruf darstellen und es unterstützt aktuell nur die Anzeige der Lautstärke. Ich werde noch ein weiterens Script basteln, bei dem dann noch andere Werte angezeigt werden und mit dem man was steuern kann.

Dann muss das ganze "nur noch" in das PHTV-Modul integriert werden.

Gruß

Kurt 
3* Raspberry Pi (2 über LTE/VPN), 5* Cul, 3* FS20, 4* FHT, 6* HM, Somfy, Solarlog, WMBus/EnergyCam, AVM FritzBox, 3* AVM Powerline, Alexa, Tasmota/MQTT, Rademacher DuoFern, EPEver HiPower/ModBus, go-eCharger

Christian72D

Bei mir kommt ein:

Starting pairing request
HTTP POST error code: 500
HTTP POST error message: Can't connect to 192.168.1.131:1926
malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "(end of string)") at phtv.pl line 110.


Die IP ist richtig.

Loredo

Ich habe gerade eine neue Version eingecheckt, die das Pairing unterstützen sollte, sofern ich den Code von kurt6908 richtig interpretieren konnte.
Gibt es ab morgen dann per Update oder alternativ direkt aus dem SVN.


Zitat von: Paul Guijt am 16 Februar 2017, 23:13:32
Mein TV hat bis einige Tage her gut in FHEm functioniert:
...
Der TV hat jetzt immer die State absent und Power off.


Ist in der aktualisierten Version behoben.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Loredo

Zitat von: SmartHome am 15 Februar 2017, 21:44:15
Heute habe ich festgestellt das die Livingcolors Lampen nicht mehr mit Ambilight synchonisieren


Das konnte ich bei mir leider nicht reproduzieren.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

kurt6908

Hallo Loredo,

vielen Dank für den Einbau des Pairings.

ZitatIch habe gerade eine neue Version eingecheckt, die das Pairing unterstützen sollte, sofern ich den Code von kurt6908 richtig interpretieren konnte.
Gibt es ab morgen dann per Update oder alternativ direkt aus dem SVN.

Aber wie kann ich das Pairing anstossen. Ich habe

70_PHTV.pm 13432 2017-02-18 15:00:03

installiert, finde aber keine entsprechende Funktion.

jsversion = 6
auth_key und device_id sind mit den Werten aus meinem o.g. Perl-Script befüllt (ich geh mal davon aus, dass beide nach dem Pairing mit dem Modul überschrieben werden müssten)

Wenn das Pairing mit dem Modul funktioniert, dann könnte ich mit dem Perl-Script (sitzt gerade darüber) die Werte überprüfen.

Gruß

Kurt
3* Raspberry Pi (2 über LTE/VPN), 5* Cul, 3* FS20, 4* FHT, 6* HM, Somfy, Solarlog, WMBus/EnergyCam, AVM FritzBox, 3* AVM Powerline, Alexa, Tasmota/MQTT, Rademacher DuoFern, EPEver HiPower/ModBus, go-eCharger

kurt6908

Hallo Christian 72D,

ZitatStarting pairing request
HTTP POST error code: 500
HTTP POST error message: Can't connect to 192.168.1.131:1926
malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "(end of string)") at phtv.pl line 110.

Kann ich nicht nachvollziehen, dann der Fehler liegt ja in der Kommunikation mit Deinem TV => Can't connect to 192.168.1.131:1926
Der JSON-Fehler entsteht, da keine Rückantwort vom TV kommt.

Hast Du einen Philips ab BJ 2016 mit Android TV? Zielhardware sind die Geräte mit dem Attribut jsversion = 6 im Modul PHTV.

Ein erfolgreicher Durchlauf schaut so aus:

Starting pairing request
Received reply: {"error_id":"SUCCESS","error_text":"Authorization required","auth_key":"xxxxxxxxxxxxxxxxxx","timestamp":xxx,"timeout":60}
Enter onscreen passcode: xxxx
Attempting to pair
Starting pairing request
HTTP POST code: 200
Received reply: {"error_id":"SUCCESS","error_text":"Pairing completed"}
Username for subsequent calls is: xxxxx
Password for subsequent calls is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Taste drücken um Lautstärke abzufragen!

Received reply: {"muted":false,"current":12,"min":0,"max":60}

Gruß

Kurt
3* Raspberry Pi (2 über LTE/VPN), 5* Cul, 3* FS20, 4* FHT, 6* HM, Somfy, Solarlog, WMBus/EnergyCam, AVM FritzBox, 3* AVM Powerline, Alexa, Tasmota/MQTT, Rademacher DuoFern, EPEver HiPower/ModBus, go-eCharger

Loredo

#298
Das Modul aktiviert das Pairing automatisch, wenn die Authentifizierung notwendig ist und fehl schlägt. Da du durch dein manuelles Pairing gültige Werte in den Attributen hinterlegt hast, findet natürlich kein erneutes Pairing statt. Dafür müssen die Attribute entweder gelöscht oder so abgeändert werden, dass sie nicht mehr gültig sind.


Gruß

Julian
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

kurt6908

Hallo,

so und nun hier das Perl-Script zum Abfragen und Steuern:

#!/usr/bin/perl

use strict;
use warnings;
use JSON;
use Digest::SHA qw(hmac_sha1_base64 hmac_sha1_hex);
use MIME::Base64;
use LWP::UserAgent;
use HTTP::Request::Common;
use IO::Socket::SSL;

my $secretkey;
my @chars;
my $len;
my $deviceid;
my $tosign;
my $authsignature;
my %config;
my %devicespec;
my %data;
my $data_json;
my $uri;
my $authTimestamp;
my $authTimeout;
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
my $req;
my $res;
my $message;
my %resp;
my $authtimestamp;
my $authtimeout;
my $pin;
my %auth;
my %grantdevice;
my %grant_request;

# All working GET-commands
# config['path'] = "6/channeldb/tv"
# config['path'] = "6/applications"
# config['path'] = "6/ambilight/mode"
# config['path'] = "6/ambilight/topology"
# config['path'] = "6/recordings/list"
# config['path'] = "6/powerstate"
# config['path'] = "6/ambilight/currentconfiguration"
# config['path'] = "6/channeldb/tv/channelLists/all"
# config['path'] = "6/system/epgsource"
# config['path'] = "6/system"
# config['path'] = "6/system/storage"
# config['path'] = "6/system/timestamp"
# config['path'] = "6/menuitems/settings/structure"
# config['path'] = "6/ambilight/cached"

# All working POST-commands
# Standby:
# config['path'] = "6/input/key"
# config['body'] = { "key" : "Standby" }


# Übergabeparameter

# IP-Adresse TV
$config{'address'} = "xxx.xxx.xxx.xxx";
# device_id
$config{'device_id'} = "xxxxxxxxxxxxxxx";
# auth_key
$config{'auth_key'} = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

print "Username for subsequent calls is: ", $config{'device_id'}, "\n";
print "Password for subsequent calls is: ", $config{'auth_key'}, "\n";
print "\n";

# Powerstate abfragen

print "Powerstate abfragen\n";

$uri = "https://".$config{'address'}.":1926/6/powerstate";

$ua->credentials($config{'address'}.':1926', 'XTV', $config{'device_id'} => $config{'auth_key'});
$res = $ua->get(
    $uri,
    'Content-Type'=>'application/json',
);

if ($res->is_success) {
    $message = $res->decoded_content;
print "Received reply: $message \n";
}
else {
     print "HTTP GET error code: ", $res->code, "\n";
     print "HTTP GET error message: ", $res->message, "\n";
}

print "\n";

# Lautstärke abfragen

print "Lautstärke abfragen\n";

$uri = "https://".$config{'address'}.":1926/6/audio/volume";

$ua->credentials($config{'address'}.':1926', 'XTV', $config{'device_id'} => $config{'auth_key'});
$res = $ua->get(
    $uri,
    'Content-Type'=>'application/json',
);

if ($res->is_success) {
    $message = $res->decoded_content;
print "Received reply: $message \n";
}
else {
     print "HTTP GET error code: ", $res->code, "\n";
     print "HTTP GET error message: ", $res->message, "\n";
}

print "\n";

# Ambilight-Mode abfragen

print "Ambilight-Mode abfragen\n";

$uri = "https://".$config{'address'}.":1926/6/ambilight/mode";

$ua->credentials($config{'address'}.':1926', 'XTV', $config{'device_id'} => $config{'auth_key'});
$res = $ua->get(
    $uri,
    'Content-Type'=>'application/json',
);

if ($res->is_success) {
    $message = $res->decoded_content;
print "Received reply: $message \n";
}
else {
     print "HTTP GET error code: ", $res->code, "\n";
     print "HTTP GET error message: ", $res->message, "\n";
}

print "\n";

# Channeldb-TV abfragen

print "Channeldb-TV abfragen\n";

$uri = "https://".$config{'address'}.":1926/6/channeldb/tv";

$ua->credentials($config{'address'}.':1926', 'XTV', $config{'device_id'} => $config{'auth_key'});
$res = $ua->get(
    $uri,
    'Content-Type'=>'application/json',
);

if ($res->is_success) {
    $message = $res->decoded_content;
print "Received reply: $message \n";
}
else {
     print "HTTP GET error code: ", $res->code, "\n";
     print "HTTP GET error message: ", $res->message, "\n";
}

print "\n";

# Stand-by schalten

print "Stand-by schalten\n";
print "Taste drücken!\n";
$pin = <STDIN>;
chomp $pin;

$config{'body'} = {
"key" => "Standby"
};
$data_json = encode_json $config{'body'};

$uri = "https://".$config{'address'}.":1926/6/input/key";

$ua->credentials($config{'address'}.':1926', 'XTV', $config{'device_id'} => $config{'auth_key'});
$res = $ua->post(
    $uri,
    'Content-Type'=>'application/json',
'Content' => $data_json,
);

if ($res->is_success) {
    $message = $res->decoded_content;
print "Received reply: $message \n";
}
else {
     print "HTTP GET error code: ", $res->code, "\n";
     print "HTTP GET error message: ", $res->message, "\n";
}

print "TV wurde ausgeschalten (keine Antwort mehr vom TV)!";
print "\n";


Am Anfang ist aufgeführt, was gehen sollte.

In den Übergabeparametern ist zu definieren

- IP
- auth_key (vom Pairing-Script oder aus dem Modul)
- device_id  (vom Pairing-Script oder aus dem Modul)

Das Script frägt ab

- Powerstate
- Lautstärke
- Ambilight-Mode
- Channeldb-TV

und schalten dann den TV aus.

Ob noch mehr Schaltbefehle funktionieren, kann ich nicht sagen, im original Python-Script ist dazu nichts enthalten.

Folgende Ausgabe wird erzeugt:

Username for subsequent calls is: xxxxxxxxxxxxxxxxx
Password for subsequent calls is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Powerstate abfragen
Received reply: {"powerstate":"On"}

Lautstärke abfragen
Received reply: {"muted":false,"current":12,"min":0,"max":60}

Ambilight-Mode abfragen
Received reply: {"current":"internal"}

Channeldb-TV abfragen
Received reply: {"channelLists":[{"id":"all","version":4,"listType":"MixedSources","medium":"mixed","active":true,"virtual":true,"modifiable":false}],"favoriteLists":[{"id":"allter","version":"3","listType":"TV","medium":"terrestrial","active":true,"parentId":"all","virtual":false,"modifiable":false},{"id":"com.zattoo.player%2Fcom.zattoo.core.service.TifService","version":1487497641797,"parentId":"all","listType":"MixedSources","medium":"mixed","virtual":false,"modifiable":false,"name":"Zattoo TV"},{"id":"1","version":"12","listType":"MixedSources","medium":"mixed","name":"Senderliste","parentId":"all","virtual":false,"modifiable":true},{"id":"2","version":"0","listType":"MixedSources","medium":"mixed","name":"Favourites  2","parentId":"all","virtual":false,"modifiable":true},{"id":"3","version":"0","listType":"MixedSources","medium":"mixed","name":"Favourites  3","parentId":"all","virtual":false,"modifiable":true},{"id":"4","version":"0","listType":"MixedSources","medium":"mixed","name":"Favourites  4","parentId":"all","virtual":false,"modifiable":true},{"id":"5","version":"0","listType":"MixedSources","medium":"mixed","name":"Favourites  5","parentId":"all","virtual":false,"modifiable":true},{"id":"6","version":"0","listType":"MixedSources","medium":"mixed","name":"Favourites  6","parentId":"all","virtual":false,"modifiable":true},{"id":"7","version":"0","listType":"MixedSources","medium":"mixed","name":"Favourites  7","parentId":"all","virtual":false,"modifiable":true},{"id":"8","version":"0","listType":"MixedSources","medium":"mixed","name":"Favourites  8","parentId":"all","virtual":false,"modifiable":true}]}

Stand-by schalten
Taste drücken!

Received reply:
TV wurde ausgeschalten (keine Antwort mehr vom TV)!

Viele Grüße

Kurt
3* Raspberry Pi (2 über LTE/VPN), 5* Cul, 3* FS20, 4* FHT, 6* HM, Somfy, Solarlog, WMBus/EnergyCam, AVM FritzBox, 3* AVM Powerline, Alexa, Tasmota/MQTT, Rademacher DuoFern, EPEver HiPower/ModBus, go-eCharger