Neues Modul [48_SkyQ]

Begonnen von sluggyly, 17 Januar 2019, 12:56:45

Vorheriges Thema - Nächstes Thema

Det20

Habe ich auch schon gesucht, die verwendeten NodeJS's können das leider nicht.

flipkill

Hallo,

ich bekomme Daten von meinem Sky Q Receiver aber ich kann nichts schalten.
Jemand eine Idee?

Gruß Jan

flyingKenny

Hallo Jan,

ich hatte das gleiche Problem.
Bei mir musste ich noch das modul sky-remote-cli installieren.
npm install -g sky-remote-cli
Der receiver Status kommt mit http request. Die Kommandos müssen per socket verbindung geschickt werde, die das JS modul übernimmt.

Ryker

#18
Danke für das Modul - Es funktioniert soweit perfekt.

Über folgenden Aufruf bekommt man auch noch ein paar mehr Infos z.b. über die SmartCard und seine Entitlements:
curl "http://skyq.fritz.box:9006/as/system/status" -H "Connection: Upgrade" -H "Upgrade: websocket"


Es gibt ja auch noch die Auflistung der Services über:
http://skyq.fritz.box:9006/as/services

bzw. mit Details:
http://skyq.fritz.box:9006/as/services/details/SID z.b. http://skyq.fritz.box:9006/as/services/details/147

Auch die Recordings kann man sich anzeigen lassen:
http://skyq.fritz.box:9006/as/pvr?limit=1000&offset=0

Da wäre es natürlich cool, wenn man übers FHEM-Modul auch die Sender über Auswahl des Sendernamens wechseln könnte. Dafür kenne ich aber keinen API-Aufruf am SkyQ, aber evtl dann über die SenderNummer, was ja eigentlich auch immer funktioniert, egal wo man gerade in der GUI unterwegst ist, außer wenn man eine App geöffnet hat.
Die Sendernummer wird ja in der Service-Auflistung als c mitgeliefert.

Ryker

Det20

Cool ... Damit fehlt eigentlich nur noch die Info, was gerade geschaut wird (Welcher Sender. Oder Netflix.)

Ryker

Ich hab heute mal daran geforscht, wie man die FB-Tasten direkt im perl erledigen kann, ohne den umweg über das node-modul.

Wenn ich Zeit habe, baue ich das mal in das Fhem-Modul ein. Damit reagiert der SkyQ nun viel direkter.
Aber hier schon mal der Code dazu, falls das jemand auch noch irgendwoanders benutzen will. Es muss nur der peerHost angepasst werden und die variable code mit dem tastencode.


use strict;
use IO::Socket;
use POSIX qw/floor/;

my $code = 8; #sidebar

my @commandBytes = (4,1,0,0,0,0,224 + floor($code/16), $code % 16);

my $socket;
$socket = new IO::Socket::INET (PeerHost => 'skyq.fritz.box',PeerPort => '49160',Proto => 'tcp',) or die "ERROR in Socket Creation : $!\n";

my $data;
my $length = 12;
my $cb;

while(1) 
{   
$socket->recv($data,512);
print "$data - " . length($data) . "\n";
    if ( length($data) < 24 ) { # box sends 24 x \x00 to signal end of hand-shake.
$socket->send(substr($data,0,$length));
print "Sent data: " . substr($data,0,$length);
        $length = 1
    }
else {
print "Handshake finished";
last;
}
}   

print "\nSending Commands...\n";

print "@commandBytes\n";
$cb = join '', pack('c*',@commandBytes);
print "$cb\n";
$socket->send($cb);

@commandBytes[1] = 0;

print "@commandBytes\n";
$cb = join '', pack('c*',@commandBytes);
print "$cb\n";
$socket->send($cb);

$socket->close();

=codes
SkyRemote.commands = {
power: 0,
select: 1,
backup: 2,
dismiss: 2,
channelup: 6,
channeldown: 7,
interactive: 8,
sidebar: 8,
help: 9,
services: 10,
search: 10,
tvguide: 11,
home: 11,
i: 14,
text: 15,
up: 16,
down: 17,
left: 18,
right: 19,
red: 32,
green: 33,
yellow: 34,
blue: 35,
0: 48,
1: 49,
2: 50,
3: 51,
4: 52,
5: 53,
6: 54,
7: 55,
8: 56,
9: 57,
play: 64,
pause: 65,
stop: 66,
record: 67,
fastforward: 69,
rewind: 71,
boxoffice: 240,
sky: 241
}
=cut


Gruß
Ryker

Det20

Mega! Ich packe die Sachen erstmal in eine funktion und teste sie. Bin leider sowas von unfit in Sachen Modulentwicklung, sonst würde ich es machen.
Mir fehlt dann nur noch die Info: Welcher Sender wird aktuell gespielt?

Ryker

#22
Da geht es dir genauso wie mir. Eigentlich mag ich Perl überhaupt nicht - ich werde damit einfach nicht warm.
Wenn du es schaffst das als Funktion einzubauen, dann wäre das super.

Wie man den aktuell laufendnen Sender abfrägt, weiß ich leider auch nicht.
Aber der SkyQ schickt anscheinen jeder aktion, die man macht an bd01.sky.com.
Den aktuellen Sender kann man dann theoretisch auf dem Netzwerk mitlesen, weil das ist unverschlüsselt.  ;D
Oder man verändert die DNS-Auflösung im Heimnetz und fängt das an einem eigenen Server ab.

Aber, man sich auflisten lassen, welcher Sender gerade auch sendet, also Daten liefert. Das ist aber nicht der gerade  eingestellte Sender  :(

z.b. ZDF
http://skyq.fritz.box:9006/as/services/details/1110
{
   "details" : {
      "dvbtriplet" : "1.1079.11110",
      "isbroadcasting" : true
   },
   "sid" : "1110"
}

Aber bei Sendern wie z.b. Sky Sports 8 HD, der gerade nicht sendet, fehlt das "isbroadcasting=true".
Keine Ahnung, ob diese Info für irgendwas im Modul nützlich wäre - ist mir nur gerade aufgefallen, beim anschauen der Daten.

Ryker

Ryker

Hab gerade noch was cooles entdeckt.

Über
curl "http://skyq.fritz.box:9006/as/system/status" -H "Connection: Upgrade" -H "Upgrade: websocket"

kann man dauerhaft verbunden bleiben und Änderungen werden sofort in der Augabe sichtbar. z.b. active/inactive oder wenn man smartcard zieht. u.s.w.

Damit könnte man sich evtl das regelmäßige pollen einsparen und bekommt hier Events wirklich in realtime.

Ryker

Det20

#24
So, neue Version ist oben. Habe einiges geändert, im Root Level gibt es nun

set ... ClearReadings => Löscht Readings
set ... off => Schaltet aus
set ... on => Schaltet an
set ... sendRemote ... (power,select,sky usw) => Sendet die virtuelle Taste an den Sky-Receiver
set ... startApp ... (NetFlix, SkyStore, PrimeVideo, YouTube) => Startet die App
set ... startTV ... => Startet den TV-Sender

TV Sender werden als Attribute hinterlegt, Aufbau ist Sendername:Sky-Sendernummer, mehrere Sender durch ein Komma getrennt. Die können dann unter "set ... startTV ..." ausgewählt werden.
Beispiel:


attr SkyQ stationlist ARD:181,ZDF:182


attr disable 0 oder 1 deaktiviert das Modul komplett
attr PollInterval (Default 60) definiert, wie oft der Status abgerufen wird
attr PollTimeout (Default 5) definiert den Timeout-Wert für [PollIntervall]
attr CmdTimeout (Default 4) definiert den Timeout-Wert beim Senden eines Befehls (NICHT Status-Update!)
attr ip definiert die IP vom Receiver
attr port (Default 49160) definiert den Port für Cmd. Sollte bei neueren Receivern immer 49160 sein, ansonsten mal 5900 probieren
attr disableResolveStation (Default 0) Es wird nicht versucht, den aktuell gespielten Sender auszulesen

Reading .stationlistHistory enthält alle Sender inklusive Tastencode, die erkannt wurden. Könnte 1:1 in attr "stationlist" übernommen werden. (attr global showInternalValues 1)
Reading presence informiert, ob der Receiver überhaupt netzwerktechnisch erreichbar ist ("presence" oder "absent").

Offen ist der Code für Volume up/down.

Det20

War ein wenig Tricky, aber nun wird im Reading "Station" der aktuelle Sender angezeigt.

Helmuth

Hallo

Danke für die Erweiterung des Moduls. Bin gerade am Testen. Im Reading Station wird mir der aktuelle Sender angezeigt. Mir fehlt allerdingd das Reading stationlistHistory. Muß dafür noch irgendetwas konfiguriert werden was ich übersehen habe?

Viele Grüße

Helmuth
Wer einen Tippfehler findet darf ihn behalten.

Det20

attr global showInternalValues 1

Helmuth

Hallo Det20

Danke für die schnelle Hilfe. So funkttioniert es jetzt.

Grüße

Helmuth
Wer einen Tippfehler findet darf ihn behalten.

Ryker

#29
@Det20: Super, vielen Dank für das neue SkyQ-Modul.
Cool ist ja das mit dem gerade aktiven Sender. Wie hast du das rausgefunden, was man da senden muss, damit der SkyQ das liefert ?

Bis auf ein kleines Warning funktioniert alles gut.

2021.01.30 11:00:09 1: PERL WARNING: Odd number of elements in hash assignment at ./FHEM/48_SkyQ.pm line 21, <$fh> line 1700.


Was mir aber noch nicht klar ist, warum ich "skyq.fritz.box" nun 2 Mal im Modul angeben muss. Weil einmal ist der hostname/IP in der Geräte-DEFinition drin und damit es überhaupt werte einlesen kann muss ich nun nochmal in IP angeben.


define SkyQ SkyQ skyq.fritz.box <--------- einmal hier
setuuid SkyQ 5ff97907-f33f-dff6-955a-32776c97bce2942d
attr SkyQ alexaName Sky Q
attr SkyQ alexaRoom Wohnzimmer
attr SkyQ genericDeviceType media
attr SkyQ group Multimedia
attr SkyQ homebridgeMapping clear\
On=state,valueOn=on,valueOff=off,cmdOn=on,cmdOff=off\
PlaybackController:playback,values=Play;;Pause;;Stop
attr SkyQ icon it_remote
attr SkyQ ip skyq.fritz.box <------- und auch nochmal hier
attr SkyQ room Wohnzimmer
attr SkyQ stationlist Sky Cinema Premieren HD:300,Sky Cinema Best Of HD:302,Sky Cinema Action HD:304,Sky Cinema Thriller HD:303,Sky Cinema Special HD:309,Sky Krimi HD:103,Sky One HD:100,Sky Atlantic HD:104,Sky Serien & Shows HD:101,Fox HD:115,TNT Serie HD:116,Universal TV HD:125,SYFY HD:118,13th Street HD:119,Discovery HD:409,NatGeo HD:401,Nat Geo Wild HD:402,Sky Sport News HD:200
attr SkyQ webCmd startTV


Würde da nicht auch eine Angabe reichen ?

Aber ansonsten alles sehr gut. Dann fehlt eigentlich nur noch die Abfrage von http://skyq.fritz.box:9006/as/system/status mit den Entitlement und Update-Infos.


Gruß
Ryker