Neues Modul [48_SkyQ]

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

Vorheriges Thema - Nächstes Thema

sluggyly

Ich habe durch Zufall ein NodeJS-Modul für die Steuerung von SkyQ gefunden. Auf Grundlage dieses Moduls habe ich ein Modul für FHEM erstellt. Sicher kann man auch ohne den Umweg über Node den Sky Receiver steuern, doch meine Fertigkeiten sind da leider noch arg begrenzt.

Für die Nutzung des Moduls ist also Node auf dem Server notwendig und folgende Perl-Module:

HTTP::Request ();
JSON;
LWP::UserAgent;

Das Node-Modul sky-remote-cli (auf Grundlage von sky-remote) muss auch vorhanden sein.

Die Nutzung von meinem Modul erlaubt sämtliche Tasten, die auch auf der SkyQ Fernbedienung vorhanden sind.

define Sky SkyQ <IP>

Sollte jemand Interesse daran haben, das Modul ohne den Node Umweg zu erweitern, würde ich mich freuen.

carlos

Super, darauf hatte ich schon lange gewartet.
Installiert und funktioniert.
Dank und Gruß
Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

Det20

#2
Vielen Dank, darauf habe ich ewig gewartet. Lässt sich auch irgendwie das aktuell gewählte Programm auslesen oder ist es "nur" eine Fernsteuerung?

Det20

#3
Nachtrag: Es wird immer ein Attribut "ip" angelegt, das sorgt dann bei jedem Neustart für die Fehlermeldung "configfile: Sky: unknown attribute ip. Type 'attr Sky ?' for a detailed list."
Denke Zeile 70-72 müssen raus. Und ein Wunsch: Automatisch alle 60 Sekunden aktualisieren wäre super.

CoolTux


$hash->{AttrList} =
       "ip"
      . $readingFnAttributes;


Ändern in


$hash->{AttrList} =
       "ip "
      . $readingFnAttributes;
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Det20

Scheint zu funktionieren, vielen Dank für die schnelle Hilfe.

Freee84neu

#6
Drauf geschoben und läuft ... super vielen dank hab auch lange nach sowas gesucht...
Schließe mich auch dem an das es gut wäre wenn in regelmäßigen Abständen aktualisiert werden würde.

Ich mache es bis auf weiters so wenn der Fernseher AN bzw. AUS geht stoße ich das "get info" an. Dann
sehe ob die Box AN oder AUS ist und kann die Box ausschalten wenn ich das Haus verlasse und es mal vergessen haben sollte :)

Gruß Mike

Det20

Ich bin in einer völlig anderen Programmierwelt zu Hause, daher bitte nicht lachen, schimpfen oder sonst was. Habe das 48_SkyQ für meine Bedürfnisse angepasst.

- Presence zeigt, ob der Receiver erreichbar ist oder nicht
- Es lässt sich disable'n (schaltet nicht den Timer ab, sondern springt nur aus den Funktionen raus)
- Es lässt sich mittels on/off auch über Google ansteuern (einfach intern in power on/off geändert)
- Die getReceiverInfo reißt FHEM nicht in den Tod, wenn der Receiver nicht da ist

Nicht schön, sondern praktisch gelöst. Vielleicht kann es jemand gebrauchen.

CoolTux

Ich habe mir mal erlaubt ein zwei Sachen schön zu machen. Ist nur auf die schnelle und muß mal getestet werden.

Was mir aufgefallen ist, es gibt kein wirklichen Wiederanlauf von InternalTimer. Dem zu Folge werden die Informationen nur einmal geholt und dann erst wieder wenn man set oder get macht.
Ist das korrekt so?

Wenn noch Fragen sind oder Du noch mehr ändern möchtest kannst Dich gerne melden.



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Shadow3561

Moin,
bei mir funktioniert der Patch leider nicht.
Er bricht mit folgender Meldung ab.
patching file 48_SkyQ.pm
Hunk #1 FAILED at 16 (different line endings).
Hunk #2 FAILED at 85 (different line endings).


MfG

CoolTux

#10
Hier das Modul. Musst aber Namen an passen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Shadow3561

Ups,
Das klappt leider auch nicht.

Global symbol "$name" requires explicit package name (did you forget to declare "my $name"?) at ./FHEM/48_SkyQ.pm line 101.
Global symbol "$name" requires explicit package name (did you forget to declare "my $name"?) at ./FHEM/48_SkyQ.pm line 101.
Global symbol "$name" requires explicit package name (did you forget to declare "my $name"?) at ./FHEM/48_SkyQ.pm line 101.
syntax error at ./FHEM/48_SkyQ.pm line 124, near ")
            Log3"

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Shadow3561

Danke,
klappt perfekt.

Wenn jetzt noch jemand dem Receiver Infos über den Aktuellen Kanal entlocken könnte wäre es perfekt.

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

Det20

War faul, sorry. Kannst das Reading löschen, Update im Anhang.
Falls hier ein "Profi" mitliest ... vielleicht kann da mal einer drüberschauen, sind wahrscheinlich noch ordentlich Optimierungsmöglichkeiten.

Ryker

#31
Hm, mit dem neuen Modul bekomme ich jetzt einen StackTrace beim ReadigsUpdate:


readingsUpdate(SkyQ,StationList,0) missed to call readingsBeginUpdate first.
stacktrace:
     main::readingsBulkUpdate            called by fhem.pl (4817)
     main::readingsEndUpdate             called by ./FHEM/48_SkyQ.pm (464)
     main::getReceiverInfo_HTTPResponse  called by FHEM/HttpUtils.pm (639)
     main::__ANON__                      called by fhem.pl (764)



Ich hab aber überhaupt keine Ahnung, was er da will, weil wenn ich mir den Code an den entsprechenden Stellen anschaue, dann sieht das eigentlich alles gut aus.


---UPDATE---------
Problem lag bei mir. Ich hatte ein UserReading anlegt, was nun iwie rumgesponnen hat.
Hab das UserReading erstmal gelöscht - damit geht es wieder.



Ryker

Det20

Anbei die neueste Version, die läuft bei mir

Ryker

#33
@Det20: Vielen Dank dir. Was hat sich in der neuen Version genau geändert ?

Es kommt aber noch das Warning:
PERL WARNING: Character in 'c' format wrapped in pack at ....

Es muss dazu in Zeile 157 und 161 das c* in ein C* geändert werden:


    #$cb = join '', pack('c*',@commandBytes);
    $cb = join '', pack('C*',@commandBytes);


Das 2. Warning der beim Modul-Init kommt, da weiß ich aber aktuell auhc nicht, wie der wegzubekommen ist:
PERL WARNING: Odd number of elements in hash assignment at ./FHEM/48_SkyQ.pm line 21



Ryker

Dodger

wenn ich noch einen Wunsch äussern dürfte:
falls jemand herausfinden würde, wie man die einzelnen Energiespar-Modi einschalten kann, dann wäre das echt super...

Ansonsten: klasse Arbeit!

Ryker

Energiesparmodies müssen direkt am SkyQ unter Einstellungen konfiguriert werden.

ch.eick

#36
Hallo zusammen,
ich habe jetzt auch das Modul aktiviert. Soweit scheint alles okay zu sein.

Kann man eventuell erkennen, ob gerade die Jugendschutz Pin abgefragt wird, um diese dann setzen zu lassen?

EDIT: Das on/off klappt irgend wie nicht so richtig, was jedoch eventuell mit der Abfrage des Pins zutun haben könnte.

VG
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick