FHEM Forum

FHEM - Anwendungen => Multimedia => Thema gestartet von: sluggyly am 17 Januar 2019, 12:56:45

Titel: Neues Modul [48_SkyQ]
Beitrag von: sluggyly am 17 Januar 2019, 12:56:45
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 (https://www.npmjs.com/package/sky-remote-cli) (auf Grundlage von sky-remote (https://www.npmjs.com/package/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.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: carlos am 17 Januar 2019, 17:06:39
Super, darauf hatte ich schon lange gewartet.
Installiert und funktioniert.
Dank und Gruß
Carlos
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Det20 am 08 Februar 2019, 13:32:37
Vielen Dank, darauf habe ich ewig gewartet. Lässt sich auch irgendwie das aktuell gewählte Programm auslesen oder ist es "nur" eine Fernsteuerung?
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Det20 am 08 Februar 2019, 14:24:09
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.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: CoolTux am 10 Februar 2019, 16:21:43
$hash->{AttrList} =
       "ip"
      . $readingFnAttributes;

Ändern in

$hash->{AttrList} =
       "ip "
      . $readingFnAttributes;
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Det20 am 11 Februar 2019, 09:14:18
Scheint zu funktionieren, vielen Dank für die schnelle Hilfe.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Freee84neu am 12 April 2019, 16:41:54
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
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Det20 am 16 April 2019, 14:12:21
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.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: CoolTux am 21 Mai 2019, 10:32:57
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
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Shadow3561 am 10 Juni 2019, 15:46:20
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
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: CoolTux am 10 Juni 2019, 15:56:46
Hier das Modul. Musst aber Namen an passen.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Shadow3561 am 10 Juni 2019, 16:09:11
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"
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: CoolTux am 10 Juni 2019, 16:16:35
Schaue ich mir.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: CoolTux am 10 Juni 2019, 16:19:48
Neuer Versuch
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Shadow3561 am 10 Juni 2019, 16:45:48
Danke,
klappt perfekt.

Wenn jetzt noch jemand dem Receiver Infos über den Aktuellen Kanal entlocken könnte wäre es perfekt.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Det20 am 10 Juni 2019, 18:43:55
Habe ich auch schon gesucht, die verwendeten NodeJS's können das leider nicht.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: flipkill am 11 Juli 2019, 19:25:55
Hallo,

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

Gruß Jan
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: flyingKenny am 27 Juli 2019, 19:36:48
Hallo Jan,

ich hatte das gleiche Problem.
Bei mir musste ich noch das modul sky-remote-cli installieren.
npm install -g sky-remote-cliDer receiver Status kommt mit http request. Die Kommandos müssen per socket verbindung geschickt werde, die das JS modul übernimmt.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Ryker am 09 Januar 2021, 12:11:46
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
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Det20 am 09 Januar 2021, 15:50:27
Cool ... Damit fehlt eigentlich nur noch die Info, was gerade geschaut wird (Welcher Sender. Oder Netflix.)
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Ryker am 14 Januar 2021, 23:29:59
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
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Det20 am 15 Januar 2021, 17:06:37
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?
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Ryker am 16 Januar 2021, 12:12:13
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
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Ryker am 16 Januar 2021, 12:53:42
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
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Det20 am 19 Januar 2021, 20:08:41
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.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Det20 am 20 Januar 2021, 21:46:10
War ein wenig Tricky, aber nun wird im Reading "Station" der aktuelle Sender angezeigt.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Helmuth am 28 Januar 2021, 01:18:40
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
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Det20 am 28 Januar 2021, 07:34:39
attr global showInternalValues 1
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Helmuth am 28 Januar 2021, 10:24:33
Hallo Det20

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

Grüße

Helmuth
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Ryker am 30 Januar 2021, 11:28:41
@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
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Det20 am 08 Februar 2021, 16:50:58
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.
Titel: Antw:Neues Modul [48_SkyQ]
Beitrag von: Ryker am 20 Februar 2021, 12:24:03
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