mirror of
https://github.com/LukeSpad/BeoGateway.git
synced 2024-12-23 21:51:51 +00:00
464 lines
15 KiB
Python
464 lines
15 KiB
Python
|
# Constants for B&O telegram protocols
|
||
|
# ########################################################################################
|
||
|
### Config data (set on initialisation)
|
||
|
gateway = dict()
|
||
|
rooms = []
|
||
|
devices = []
|
||
|
available_sources = []
|
||
|
|
||
|
# ########################################################################################
|
||
|
### Beo4 Commands
|
||
|
beo4_commanddict = dict(
|
||
|
[
|
||
|
# Source selection:
|
||
|
(0x0C, "Standby"),
|
||
|
(0x47, "Sleep"),
|
||
|
(0x80, "TV"),
|
||
|
(0x81, "Radio"),
|
||
|
(0x82, "V.Aux/DTV2"),
|
||
|
(0x83, "A.Aux"),
|
||
|
(0x84, "Media"),
|
||
|
(0x85, "V.Tape/V.Mem/DVD2"),
|
||
|
(0x86, "DVD"),
|
||
|
(0x87, "Camera"),
|
||
|
(0x88, "Text"),
|
||
|
(0x8A, "Sat/DTV"),
|
||
|
(0x8B, "PC"),
|
||
|
(0x8C, "Web"),
|
||
|
(0x8D, "Doorcam"),
|
||
|
(0x8E, "Photo"),
|
||
|
(0x90, "USB2"),
|
||
|
(0x91, "A.Tape/A.Mem"),
|
||
|
(0x92, "CD"),
|
||
|
(0x93, "Phono/N.Radio"),
|
||
|
(0x94, "A.Tape2/N.Music"),
|
||
|
(0x95, "Server"),
|
||
|
(0x96, "Spotify"),
|
||
|
(0x97, "CD2/Join"),
|
||
|
(0xBF, "AV"),
|
||
|
(0xFA, "P-IN-P"),
|
||
|
# Digits:
|
||
|
(0x00, "Digit-0"),
|
||
|
(0x01, "Digit-1"),
|
||
|
(0x02, "Digit-2"),
|
||
|
(0x03, "Digit-3"),
|
||
|
(0x04, "Digit-4"),
|
||
|
(0x05, "Digit-5"),
|
||
|
(0x06, "Digit-6"),
|
||
|
(0x07, "Digit-7"),
|
||
|
(0x08, "Digit-8"),
|
||
|
(0x09, "Digit-9"),
|
||
|
# Source control:
|
||
|
(0x1E, "Step Up"),
|
||
|
(0x1F, "Step Down"),
|
||
|
(0x32, "Rewind"),
|
||
|
(0x33, "Return"),
|
||
|
(0x34, "Wind"),
|
||
|
(0x35, "Go/Play"),
|
||
|
(0x36, "Stop"),
|
||
|
(0xD4, "Yellow"),
|
||
|
(0xD5, "Green"),
|
||
|
(0xD8, "Blue"),
|
||
|
(0xD9, "Red"),
|
||
|
# Sound and picture control
|
||
|
(0x0D, "Mute"),
|
||
|
(0x1C, "P.Mute"),
|
||
|
(0x2A, "Format"),
|
||
|
(0x44, "Sound/Speaker"),
|
||
|
(0x5C, "Menu"),
|
||
|
(0x60, "Volume Up"),
|
||
|
(0x64, "Volume Down"),
|
||
|
(0xDA, "Cinema_On"),
|
||
|
(0xDB, "Cinema_Off"),
|
||
|
# Other controls:
|
||
|
(0xF7, "Stand"),
|
||
|
(0x0A, "Clear"),
|
||
|
(0x0B, "Store"),
|
||
|
(0x0E, "Reset"),
|
||
|
(0x14, "Back"),
|
||
|
(0x15, "MOTS"),
|
||
|
(0x20, "Goto"),
|
||
|
(0x28, "Show Clock"),
|
||
|
(0x2D, "Eject"),
|
||
|
(0x37, "Record"),
|
||
|
(0x3F, "Select"),
|
||
|
(0x46, "Sound"),
|
||
|
(0x7F, "Exit"),
|
||
|
(0xC0, "Shift-0/Edit"),
|
||
|
(0xC1, "Shift-1/Random"),
|
||
|
(0xC2, "Shift-2"),
|
||
|
(0xC3, "Shift-3/Repeat"),
|
||
|
(0xC4, "Shift-4/Select"),
|
||
|
(0xC5, "Shift-5"),
|
||
|
(0xC6, "Shift-6"),
|
||
|
(0xC7, "Shift-7"),
|
||
|
(0xC8, "Shift-8"),
|
||
|
(0xC9, "Shift-9"),
|
||
|
# Continue functionality:
|
||
|
(0x70, "Rewind Repeat"),
|
||
|
(0x71, "Wind Repeat"),
|
||
|
(0x72, "Step_UP Repeat"),
|
||
|
(0x73, "Step_DW Repeat"),
|
||
|
(0x75, "Go Repeat"),
|
||
|
(0x76, "Green Repeat"),
|
||
|
(0x77, "Yellow Repeat"),
|
||
|
(0x78, "Blue Repeat"),
|
||
|
(0x79, "Red Repeat"),
|
||
|
(0x7E, "Key Release"),
|
||
|
# Functions:
|
||
|
(0x40, "Guide"),
|
||
|
(0x43, "Info"),
|
||
|
# Cursor functions:
|
||
|
(0x13, "Select"),
|
||
|
(0xCA, "Cursor_Up"),
|
||
|
(0xCB, "Cursor_Down"),
|
||
|
(0xCC, "Cursor_Left"),
|
||
|
(0xCD, "Cursor_Right"),
|
||
|
# Light/Control commands
|
||
|
(0x9B, "Light"),
|
||
|
(0x9C, "Command"),
|
||
|
(0x58, "Light Timeout"),
|
||
|
# Dummy for 'Listen for all commands'
|
||
|
(0xFF, "<all>"),
|
||
|
]
|
||
|
)
|
||
|
BEO4_CMDS = {v.upper(): k for k, v in beo4_commanddict.items()}
|
||
|
|
||
|
### BeoRemote One Commands
|
||
|
beoremoteone_commanddict = dict(
|
||
|
[
|
||
|
#Source, (Cmd, Unit)
|
||
|
("TV", (0x80, 0)),
|
||
|
("RADIO", (0x81, 0)),
|
||
|
("TUNEIN", (0x81, 1)),
|
||
|
("DVB_RADIO", (0x81, 2)),
|
||
|
("AV.IN", (0x82, 0)),
|
||
|
("LINE.IN", (0x83, 0)),
|
||
|
("A.AUX", (0x83, 1)),
|
||
|
("BLUETOOTH", (0x83, 2)),
|
||
|
("HOMEMEDIA", (0x84, 0)),
|
||
|
("DNLA", (0x84, 1)),
|
||
|
("RECORDINGS", (0x85, 0)),
|
||
|
("CAMERA", (0x87, 0)),
|
||
|
("FUTURE.USE", (0x89, 0)),
|
||
|
("USB", (0x90, 0)),
|
||
|
("A.MEM", (0x91, 0)),
|
||
|
("CD", (0x92, 0)),
|
||
|
("N.RADIO", (0x93, 0)),
|
||
|
("MUSIC", (0x94, 0)),
|
||
|
("DNLA-DMR", (0x94, 1)),
|
||
|
("AIRPLAY", (0x94, 2)),
|
||
|
("SPOTIFY", (0x96, 0)),
|
||
|
("DEEZER", (0x96, 1)),
|
||
|
("QPLAY", (0x96, 2)),
|
||
|
("JOIN", (0x97, 0)),
|
||
|
("WEBMEDIA", (0x8C, 0)),
|
||
|
("YOUTUBE", (0x8C, 1)),
|
||
|
("HOME.APP", (0x8C, 2)),
|
||
|
("HDMI_1", (0xCE, 0)),
|
||
|
("HDMI_2", (0xCE, 1)),
|
||
|
("HDMI_3", (0xCE, 2)),
|
||
|
("HDMI_4", (0xCE, 3)),
|
||
|
("HDMI_5", (0xCE, 4)),
|
||
|
("HDMI_6", (0xCE, 5)),
|
||
|
("HDMI_7", (0xCE, 6)),
|
||
|
("HDMI_8", (0xCE, 7)),
|
||
|
("MATRIX_1", (0xCF, 0)),
|
||
|
("MATRIX_2", (0xCF, 1)),
|
||
|
("MATRIX_3", (0xCF, 2)),
|
||
|
("MATRIX_4", (0xCF, 3)),
|
||
|
("MATRIX_5", (0xCF, 4)),
|
||
|
("MATRIX_6", (0xCF, 5)),
|
||
|
("MATRIX_7", (0xCF, 6)),
|
||
|
("MATRIX_8", (0xCF, 7)),
|
||
|
("MATRIX_9", (0xD0, 0)),
|
||
|
("MATRIX_10", (0xD0, 1)),
|
||
|
("MATRIX_11", (0xD0, 2)),
|
||
|
("MATRIX_12", (0xD0, 3)),
|
||
|
("MATRIX_13", (0xD0, 4)),
|
||
|
("MATRIX_14", (0xD0, 5)),
|
||
|
("MATRIX_15", (0xD0, 6)),
|
||
|
("MATRIX_16", (0xD0, 7)),
|
||
|
("PERSONAL_1", (0xD1, 0)),
|
||
|
("PERSONAL_2", (0xD1, 1)),
|
||
|
("PERSONAL_3", (0xD1, 2)),
|
||
|
("PERSONAL_4", (0xD1, 3)),
|
||
|
("PERSONAL_5", (0xD1, 4)),
|
||
|
("PERSONAL_6", (0xD1, 5)),
|
||
|
("PERSONAL_7", (0xD1, 6)),
|
||
|
("PERSONAL_8", (0xD1, 7)),
|
||
|
("TV.ON", (0xD2, 0)),
|
||
|
("MUSIC.ON", (0xD3, 0)),
|
||
|
("PATTERNPLAY",(0xD3, 1)),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
# ########################################################################################
|
||
|
# Source Activity
|
||
|
_sourceactivitydict = dict(
|
||
|
[
|
||
|
(0x00, "Unknown"),
|
||
|
(0x01, "Stop"),
|
||
|
(0x02, "Play"),
|
||
|
(0x03, "Wind"),
|
||
|
(0x04, "Rewind"),
|
||
|
(0x05, "Record Lock"),
|
||
|
(0x06, "Standby"),
|
||
|
(0x07, "Load/No Media"),
|
||
|
(0x08, "Still Picture"),
|
||
|
(0x14, "Scan Forward"),
|
||
|
(0x15, "Scan Reverse"),
|
||
|
(0xFF, "None"),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
# ########################################################################################
|
||
|
# ##### MasterLink (not MLGW) Protocol packet constants
|
||
|
_ml_telegram_type_dict = dict(
|
||
|
[
|
||
|
(0x0A, "COMMAND"),
|
||
|
(0x0B, "REQUEST"),
|
||
|
(0x14, "RESPONSE"),
|
||
|
(0x2C, "INFO"),
|
||
|
(0x5E, "CONFIG"),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
_ml_command_type_dict = dict(
|
||
|
[
|
||
|
(0x04, "MASTER_PRESENT"),
|
||
|
# REQUEST_DISTRIBUTED_SOURCE: seen when a device asks what source is being distributed
|
||
|
# subtypes seen 01:request 04:no source 06:has source (byte 13 is source)
|
||
|
(0x08, "REQUEST_DISTRIBUTED_SOURCE"),
|
||
|
(0x0D, "BEO4_KEY"),
|
||
|
(0x10, "STANDBY"),
|
||
|
(0x11, "RELEASE"), # when a device turns off
|
||
|
(0x20, "MLGW_REMOTE_BEO4"),
|
||
|
# REQUEST_LOCAL_SOURCE: Seen when a device asks what source is playing locally to a device
|
||
|
# subtypes seen 02:request 04:no source 05:secondary source 06:primary source (byte 11 is source)
|
||
|
# byte 10 is bitmask for distribution: 0x01: coaxial cable - 0x02: MasterLink ML_BUS -
|
||
|
# 0x08: local screen
|
||
|
(0x30, "REQUEST_LOCAL_SOURCE"),
|
||
|
(0x3C, "TIMER"),
|
||
|
(0x40, "CLOCK"),
|
||
|
(0x44, "TRACK_INFO"),
|
||
|
# LOCK_MANAGER_COMMAND: Lock to Determine what device issues source commands
|
||
|
# reference: https://tidsskrift.dk/daimipb/article/download/7043/6004/0
|
||
|
(0x45, "GOTO_SOURCE"),
|
||
|
(0x5C, "LOCK_MANAGER_COMMAND"),
|
||
|
(0x6C, "DISTRIBUTION_REQUEST"),
|
||
|
(0x82, "TRACK_INFO_LONG"),
|
||
|
# Source Status
|
||
|
# byte 10:source - byte 13: 80 when DTV is turned off. 00 when it's on
|
||
|
# byte 18H 17L: source medium - byte 19: channel/track - byte 21:activity
|
||
|
# byte 22: 01: audio source 02: video source ff:undefined - byte 23: picture identifier
|
||
|
(0x87, "STATUS_INFO"),
|
||
|
(0x94, "VIDEO_TRACK_INFO"),
|
||
|
#
|
||
|
# -----------------------------------------------------------------------
|
||
|
# More packets that we see on the bus, with a guess of the type
|
||
|
# DISPLAY_SOURCE: Message sent with a payload showing the displayed source name.
|
||
|
# subtype 3 has the printable source name starting at byte 10 of the payload
|
||
|
(0x06, "DISPLAY_SOURCE"),
|
||
|
# START_VIDEO_DISTRIBUTION: Sent when a locally playing source starts being distributed on coaxial cable
|
||
|
(0x07, "START_VIDEO_DISTRIBUTION"),
|
||
|
# EXTENDED_SOURCE_INFORMATION: message with 6 subtypes showing information about the source.
|
||
|
# Printable info at byte 14 of the payload
|
||
|
# For Radio: 1: "" 2: Genre 3: Country 4: RDS info 5: Associated beo4 button 6: "Unknown"
|
||
|
# For A.Mem: 1: Genre 2: Album 3: Artist 4: Track name 5: Associated beo4 button 6: "Unknown"
|
||
|
(0x0B, "EXTENDED_SOURCE_INFORMATION"),
|
||
|
(0x96, "PC_PRESENT"),
|
||
|
# PICTURE AND SOUND STATUS
|
||
|
# byte 0: bit 0-1: sound status - bit 2-3: stereo mode (can be 0 in a 5.1 setup)
|
||
|
# byte 1: speaker mode (see below)
|
||
|
# byte 2: audio volume
|
||
|
# byte 3: picture format identifier (see below)
|
||
|
# byte 4: bit 0: screen1 mute - bit 1: screen2 mute - bit 2: screen1 active -
|
||
|
# bit 3: screen2 active - bit 4: cinema mode
|
||
|
(0x98, "PICT_SOUND_STATUS"),
|
||
|
# Unknown commands - seen on power up and initialisation
|
||
|
#########################################################
|
||
|
# On power up all devices send out a request key telegram. If
|
||
|
# no lock manager is allocated the devices send out a key_lost telegram. The Video Master (or Power
|
||
|
# Master in older implementations) then asserts a NEW_LOCK_MANAGER telegram and assumes responsibility
|
||
|
# for LOCK_MANAGER_COMMAND telegrams until a key transfer occurs.
|
||
|
(0x12, "KEY_LOST"), #?
|
||
|
# Unknown command with payload of length 1.
|
||
|
# bit 0: unknown
|
||
|
# bit 1: unknown
|
||
|
(0xA0, "NEW_LOCK_MANAGER"), #?
|
||
|
# Unknown command with payload of length 2
|
||
|
# bit 0: unknown
|
||
|
# bit 1: unknown
|
||
|
# bit 2: unknown
|
||
|
]
|
||
|
)
|
||
|
|
||
|
_ml_command_type_request_key_subtype_dict = dict(
|
||
|
[
|
||
|
(0x01, "Request Key"),
|
||
|
(0x02, "Transfer Key"),
|
||
|
(0x03, "Transfer Impossible"),
|
||
|
(0x04, "Key Received"),
|
||
|
(0x05, "Timeout"),
|
||
|
(0xFF, "Undefined"),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
_ml_activity_dict = dict(
|
||
|
[
|
||
|
(0x01, "Request Source"),
|
||
|
(0x02, "Request Source"),
|
||
|
(0x04, "No Source"),
|
||
|
(0x06, "Source Active"),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
_ml_device_dict = dict(
|
||
|
[
|
||
|
(0xC0, "VIDEO_MASTER"),
|
||
|
(0xC1, "AUDIO_MASTER"),
|
||
|
(0xC2, "SOURCE_CENTER"),
|
||
|
(0x81, "ALL_AUDIO_LINK_DEVICES"),
|
||
|
(0x82, "ALL_VIDEO_LINK_DEVICES"),
|
||
|
(0x83, "ALL_LINK_DEVICES"),
|
||
|
(0x80, "ALL"),
|
||
|
(0xF0, "MLGW"),
|
||
|
# Power Master exists in older (pre 1996?) ML implementations. Later revisions enforced the Video Master
|
||
|
# as lock key manager for the system and the concept was phased out. If your system is older than 2000
|
||
|
# you may see this device type on the network.
|
||
|
(0xFF, "POWER_MASTER"), #?
|
||
|
]
|
||
|
)
|
||
|
|
||
|
_ml_pictureformatdict = dict(
|
||
|
[
|
||
|
(0x00, "Not known"),
|
||
|
(0x01, "Known by decoder"),
|
||
|
(0x02, "4:3"),
|
||
|
(0x03, "16:9"),
|
||
|
(0x04, "4:3 Letterbox middle"),
|
||
|
(0x05, "4:3 Letterbox top"),
|
||
|
(0x06, "4:3 Letterbox bottom"),
|
||
|
(0xFF, "Blank picture"),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
_ml_selectedsourcedict = dict(
|
||
|
[
|
||
|
(0x00, "NONE"),
|
||
|
(0x0B, "TV"),
|
||
|
(0x15, "V.TAPE/V.MEM"),
|
||
|
(0x16, "DVD2"),
|
||
|
(0x1F, "DTV"),
|
||
|
(0x29, "DVD"),
|
||
|
(0x33, "V.AUX"),
|
||
|
(0x3E, "DOORCAM"),
|
||
|
(0x47, "PC"),
|
||
|
(0x6F, "RADIO"),
|
||
|
(0x79, "A.TAPE/A.MEM"),
|
||
|
(0x7A, "A.TAPE2/N.MUSIC"),
|
||
|
(0x8D, "CD"),
|
||
|
(0x97, "A.AUX"),
|
||
|
(0xA1, "PHONO/N.RADIO"),
|
||
|
# Dummy for 'Listen for all sources'
|
||
|
(0xFE, "ALL"), # have also seen 0xFF as "all"
|
||
|
(0xFF, "ALL"),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
_ml_trackinfo_subtype_dict = dict([(0x05, "Current Source"),(0x07, "Change Source"),])
|
||
|
|
||
|
_ml_selectedsource_type_dict = dict(
|
||
|
[
|
||
|
("VIDEO", (0x0B, 0x1F)),
|
||
|
("VIDEO_PAUSABLE", (0x15, 0x16, 0x29, 0x33)),
|
||
|
("AUDIO", (0x6F, 0x97)),
|
||
|
("AUDIO_PAUSABLE", (0x8D, 0x79, 0x7A, 0xA1, 0x8D)),
|
||
|
("ALL", (0xFE, 0xFF)),
|
||
|
("OTHER", (0x47, 0x3E)),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
# ########################################################################################
|
||
|
# ##### MLGW Protocol packet constants
|
||
|
_mlgw_payloadtypedict = dict(
|
||
|
[
|
||
|
(0x01, "Beo4 Command"),
|
||
|
(0x02, "Source Status"),
|
||
|
(0x03, "Picture and Sound Status"),
|
||
|
(0x04, "Light and Control command"),
|
||
|
(0x05, "All standby notification"),
|
||
|
(0x06, "BeoRemote One control command"),
|
||
|
(0x07, "BeoRemote One source selection"),
|
||
|
(0x20, "MLGW virtual button event"),
|
||
|
(0x30, "Login request"),
|
||
|
(0x31, "Login status"),
|
||
|
(0x32, "Change password request"),
|
||
|
(0x33, "Change password response"),
|
||
|
(0x34, "Secure login request"),
|
||
|
(0x36, "Ping"),
|
||
|
(0x37, "Pong"),
|
||
|
(0x38, "Configuration change notification"),
|
||
|
(0x39, "Request Serial Number"),
|
||
|
(0x3A, "Serial Number"),
|
||
|
(0x40, "Location based event"),
|
||
|
]
|
||
|
)
|
||
|
MLGW_PL = {v.upper(): k for k, v in _mlgw_payloadtypedict.items()}
|
||
|
|
||
|
_destselectordict = dict(
|
||
|
[
|
||
|
(0x00, "Video Source"),
|
||
|
(0x01, "Audio Source"),
|
||
|
(0x05, "V.TAPE/V.MEM"),
|
||
|
(0x0F, "All Products"),
|
||
|
(0x1B, "MLGW"),
|
||
|
]
|
||
|
)
|
||
|
CMDS_DEST = {v.upper(): k for k, v in _destselectordict.items()}
|
||
|
|
||
|
_mlgw_secsourcedict = dict([(0x00, "V.TAPE/V.MEM"),(0x01, "V.TAPE2/DVD2/V.MEM2"),])
|
||
|
_mlgw_linkdict = dict([(0x00, "Local/Default Source"),(0x01, "Remote Source/Option 4 Product"),])
|
||
|
|
||
|
_mlgw_virtualactiondict = dict([(0x01, "PRESS"), (0x02, "HOLD"), (0x03, "RELEASE")])
|
||
|
|
||
|
### for '0x03: Picture and Sound Status'
|
||
|
_mlgw_soundstatusdict = dict([(0x00, "Not muted"), (0x01, "Muted")])
|
||
|
|
||
|
_mlgw_speakermodedict = dict(
|
||
|
[
|
||
|
(0x01, "Center channel"),
|
||
|
(0x02, "2ch stereo"),
|
||
|
(0x03, "Front surround"),
|
||
|
(0x04, "4ch stereo"),
|
||
|
(0x05, "Full surround"),
|
||
|
(0xFD, "<all>"), # Dummy for 'Listen for all modes'
|
||
|
]
|
||
|
)
|
||
|
|
||
|
_mlgw_screenmutedict = dict([(0x00, "not muted"), (0x01, "muted")])
|
||
|
_mlgw_screenactivedict = dict([(0x00, "not active"), (0x01, "active")])
|
||
|
_mlgw_cinemamodedict = dict([(0x00, "Cinemamode=off"), (0x01, "Cinemamode=on")])
|
||
|
_mlgw_stereoindicatordict = dict([(0x00, "Mono"), (0x01, "Stereo")])
|
||
|
|
||
|
### for '0x04: Light and Control command'
|
||
|
_mlgw_lctypedict = dict([(0x01, "LIGHT"), (0x02, "CONTROL")])
|
||
|
|
||
|
### for '0x31: Login Status
|
||
|
_mlgw_loginstatusdict = dict([(0x00, "OK"), (0x01, "FAIL")])
|
||
|
|
||
|
# ########################################################################################
|
||
|
# ##### BeoLink Gateway Protocol packet constants
|
||
|
_blgw_srcdict = dict(
|
||
|
[
|
||
|
("TV", "TV"),
|
||
|
("DVD", "DVD"),
|
||
|
("RADIO", "RADIO"),
|
||
|
("TP1", "A.TAPE/A.MEM"),
|
||
|
("TP2", "A.TAPE2/N.MUSIC"),
|
||
|
("CD", "CD"),
|
||
|
("PH", "PHONO/N.RADIO"),
|
||
|
]
|
||
|
)
|