-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathziggo_mediabox_xl.py
94 lines (84 loc) · 3.24 KB
/
ziggo_mediabox_xl.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# -*- coding: utf-8 -*-
import socket
import requests
class ZiggoMediaboxXL(object):
"""
Ziggo Mediabox XL object.
Library to command the Ziggo Mediabox XL.
"""
def __init__(self, ip, timeout=5):
self._ip = ip
self._timeout = timeout
self._port = {"state": 62137, "cmd": 5900}
self._channels_url = 'https://restapi.ziggo.nl/1.0/channels-overview'
self._fetch_channels()
self._keys = {
"POWER": "E0 00", "OK": "E0 01", "BACK": "E0 02",
"CHAN_UP": "E0 06", "CHAN_DOWN": "E0 07",
"HELP": "E0 09", "MENU": "E0 0A", "GUIDE": "E0 0B",
"INFO": "EO 0E", "TEXT": "E0 0F", "MENU1": "E0 11",
"MENU2": "EO 15", "DPAD_UP": "E1 00",
"DPAD_DOWN": "E1 01", "DPAD_LEFT": "E1 02",
"DPAD_RIGHT": "E1 03", "PAUSE": "E4 00", "STOP": "E4 02",
"RECORD": "E4 04", "FWD": "E4 05", "RWD": "E4 07",
"MENU3": "E4 07", "ONDEMAND": "EF 28", "DVR": "EF 29",
"TV": "EF 2A"}
for i in range(10):
self._keys["NUM_{}".format(i)] = "E3 {:02d}".format(i)
def _fetch_channels(self):
"""Retrieve Ziggo channel information."""
json = requests.get(self._channels_url).json()
self._channels = {c['channel']['code']: c['channel']['name']
for c in json['channels']}
def channels(self):
return self._channels
def test_connection(self):
"""Make sure we can reach the given IP address."""
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(self._timeout)
try:
if sock.connect_ex((self._ip, self._port['cmd'])) == 0:
return True
else:
return False
except socket.error:
raise
def turned_on(self):
"""Update and return switched on state."""
self.update_state()
return self.state
def update_state(self):
"""Find out whether the media box is turned on/off."""
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(self._timeout)
try:
if sock.connect_ex((self._ip, self._port['state'])) == 0:
self.state = True
else:
self.state = False
sock.close()
except socket.error:
raise
def send_keys(self, keys):
"""Send keys to the device."""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(self._timeout)
sock.connect((self._ip, self._port['cmd']))
# mandatory dance
version_info = sock.recv(15)
sock.send(version_info)
sock.recv(2)
sock.send(bytes.fromhex('01'))
sock.recv(4)
sock.recv(24)
# send our command now!
for key in keys:
if key in self._keys:
sock.send(bytes.fromhex("04 01 00 00 00 00 " +
self._keys[key]))
sock.send(bytes.fromhex("04 00 00 00 00 00 " +
self._keys[key]))
sock.close()
except socket.error:
raise