Sky Q über SOAP/Rest/Alexa steuern über Port 49160 (Probleme beim Handshake)

Nachdem mir die ewige Sucherei nach der Sky Fernbedienung echt auf die Nerven geht (typisches Lockdown-Problem ;-), möchte ich meinen Sky Q über Alexa mit SinricPro steuern. SinricPro ist nicht das Problem, sondern der SkyQ. Ich möchte Sky Q aber nicht über Infrarot/Bluetooth steuern (dazu gibt es schon genug enttäuschende Topics), sondern über die SOAP/Rest-Schnittstelle, die Sky Q Receiver über Port 49160 bereitstellt.
(Eigentlich gibt es auch eine nette URL-Schnittstelle an Port 9006, z.B.: :9006/as/system/information
damit kann man aber leider m.W. nicht den Sky Q steuern)
Im Internet gibt es einige Projekte in Javascript und Phyton, die die Möglichkeiten des 49160-Ports nutzen, z.B.:
Javascript:
sky-remote/sky-remote.js at master · dalhundal/sky-remote (github.com)
Python:
Sky Q box switch - Feature Requests - Home Assistant Community (home-assistant.io)

Ich habe versucht, den Code in Arduino umzuschreiben. Als Hardware verwende ich einen ESP8266 (Wemos D1 Mini). Mein Problem ist, dass ich beim Handshake beim ersten Kontakt Daten zurückgemeldet bekomme, aber
keine weiteren Daten mehr aus Sky Q kommen. Der nach dem Handshake stattfindende Schaltbefehl (in meinem einfachen Test "channelup") funzt dann auch nicht mehr.
Daher bitte ich die Arduino-Community, meinen Code zu prüfen, warum der Handshake schief geht:

const char* ssid     = "xxx";
const char* password = "xxx";
const char* host_ip = "192.168.xxx.xxx"; //Sky Q box address
int port = 49160;

WiFiClient client;

void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
}

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());

sendcommand("channelup");
}

void loop() {
}



void sendcommand(char* command)
{
char hsbuffer[24];  
int bufflength=0;

int code = getcode(command);
char commandBytes[] = {'B', 4, 1, 0, 0, 0, 0, floor(224 + (code/16)), code % 16};

client.connect(host_ip, port);  //connect to SkyQ box 
delay(200);  
bufflength=receive(hsbuffer);     //receive 12 bytes
if(bufflength<24)
{
   Serial.print("hsbuffer:");   
    printSerialString(hsbuffer);
   client.write(hsbuffer, 12);
   bufflength=receive(hsbuffer);  
   Serial.print("hsbuffer-12:");   
   printSerialString(hsbuffer);
   client.write(hsbuffer,1);
   bufflength=receive(hsbuffer);  
   Serial.print("hsbuffer-1:");   
   printSerialString(hsbuffer);
}
delay(200);

Serial.println("send command");
client.write(commandBytes);        //send command bytes part 1
commandBytes[1]=0;
client.write(commandBytes);        //send command bytes part 2
client.stop();    

}


int receive(char *charBuffer)
{
static byte index=0;
byte SERIAL_BUFFER_SIZE = sizeof(charBuffer);

while (client.available())
{
 char c = client.read();

 if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
 {
   charBuffer[index++] = c;      
 }
}
return index;
}


int getcode(char* cmd)
{
 int code = 99;
 
 if(cmd=="power") code = 0;
 if(cmd=="select") code = 1;
 if(cmd=="backup") code = 2;
 if(cmd=="dismiss") code = 2;
 if(cmd=="channelup") code = 6;
 if(cmd=="channeldown") code = 7;
 if(cmd=="interactive") code = 8;
 if(cmd=="sidebar") code = 8;
 if(cmd=="help") code = 9;
 if(cmd=="services") code = 10;
 if(cmd=="search") code = 10;
 if(cmd=="tvguide") code = 11;
 if(cmd=="home") code = 11;
 if(cmd=="i") code = 14;
 if(cmd=="text") code = 15;
 if(cmd=="up") code = 16;
 if(cmd=="down") code = 17;
 if(cmd=="left") code = 18;
 if(cmd=="right") code = 19;
 if(cmd=="red") code = 32;
 if(cmd=="green") code = 33;
 if(cmd=="yellow") code = 34;
 if(cmd=="blue") code = 35;
 if(cmd=="0") code = 48;
 if(cmd=="1") code = 49;
 if(cmd=="2") code = 50;
 if(cmd=="3") code = 51;
 if(cmd=="4") code = 52;
 if(cmd=="5") code = 53;
 if(cmd=="6") code = 54;
 if(cmd=="7") code = 55;
 if(cmd=="8") code = 56;
 if(cmd=="9") code = 57;
 if(cmd=="play") code = 64;
 if(cmd=="pause") code = 65;
 if(cmd=="stop") code = 66;
 if(cmd=="record") code = 67;
 if(cmd=="fastforward") code = 69;
 if(cmd=="rewind") code = 71;
 if(cmd=="boxoffice") code = 240;
 if(cmd=="sky") code = 24;

 return code;   
}



int getchannelno(char* chname )
{
int chno = 99;

if(chname=="sky_news") chno=100;
if(chname=="sky_discovery") chno=401;
if(chname=="sky_fox_animation") chno=127;
///...
return chno;   
}


void printSerialString(char *strArray) {
  int i=0;
  if (strArray[i] != 0) {     
      while(strArray[i] != 0) {
         Serial.print( strArray[i], HEX );
         strArray[i] = 0;                  // optional: flush the content
         i++;
      }
  }
  Serial.println("");
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter oder gehe in der IDE auf Bearbeiten - Für Forum kopieren und füge es hier ein).
Dann ist er auch auf mobilen Geräten besser lesbar.

Gruß Tommy

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.