BeoGateway/Resources/CONSTANTS.py

496 lines
17 KiB
Python
Raw Normal View History

2021-11-23 15:14:40 +00:00
# Constants for B&O telegram protocols
# ########################################################################################
2021-11-25 19:18:52 +00:00
# Config data (set on initialisation)
2021-12-17 18:45:05 +00:00
gateway = dict(
[
("Current Audio Source", 'Unknown'),
("Current Video Source", 'Unknown'),
("Now Playing", 'Unknown'),
("N.MUSIC Renderers", [])
]
)
2021-11-23 15:14:40 +00:00
rooms = []
devices = []
available_sources = []
2021-12-08 13:03:50 +00:00
# ########################################################################################
# Source Types
source_type_dict = dict(
[
("Video Sources", ("TV", "V.AUX/DTV2", "MEDIA", "V.TAPE/V.MEM/DVD2", "DVD", "CAMERA",
"SAT/DTV", "PC", "WEB", "DOORCAM", "PHOTO", "USB2", "WEBMEDIA", "AV.IN",
2021-12-17 18:45:05 +00:00
"HOMEMEDIA", "DVB_RADIO", "DNLA", "RECORDINGS", "CAMERA", "USB", "DNLA-DMR", "YOUTUBE",
2021-12-08 13:03:50 +00:00
"HOME.APP", "HDMI_1", "HDMI_2", "HDMI_3", "HDMI_4", "HDMI_5", "HDMI_6",
"HDMI_7", "HDMI_8", "MATRIX_1", "MATRIX_2", "MATRIX_3", "MATRIX_4", "MATRIX_5",
"MATRIX_6", "MATRIX_7", "MATRIX_8", "MATRIX_9", "MATRIX_10", "MATRIX_11",
"MATRIX_12", "MATRIX_13", "MATRIX_14", "MATRIX_15", "MATRIX_16", "PERSONAL_1",
"PERSONAL_2", "PERSONAL_3", "PERSONAL_4", "PERSONAL_5", "PERSONAL_6", "PERSONAL_7",
"PERSONAL_8")),
("Audio Sources", ("RADIO", "A.AUX", "A.TAPE/A.MEM", "CD", "PHONO/N.RADIO", "A.TAPE2/N.MUSIC",
"SERVER", "SPOTIFY", "CD2/JOIN", "TUNEIN", "DVB_RADIO", "LINE.IN", "BLUETOOTH",
"MUSIC", "AIRPLAY", "SPOTIFY", "DEEZER", "QPLAY"))
]
)
2021-11-23 15:14:40 +00:00
# ########################################################################################
2021-11-25 19:18:52 +00:00
# Beo4 Commands
2021-11-23 15:14:40 +00:00
beo4_commanddict = dict(
[
# Source selection:
(0x0C, "Standby"),
(0x47, "Sleep"),
(0x80, "TV"),
(0x81, "Radio"),
(0x82, "V.Aux/DTV2"),
(0x83, "A.Aux"),
(0x84, "Media"),
2021-12-08 13:03:50 +00:00
(0x85, "V.Tape/V.Mem"),
2021-11-23 15:14:40 +00:00
(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()}
2021-11-25 19:18:52 +00:00
# BeoRemote One Commands
2021-11-23 15:14:40 +00:00
beoremoteone_commanddict = dict(
[
2021-11-25 19:18:52 +00:00
# Source, (Cmd, Unit)
2021-11-23 15:14:40 +00:00
("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)),
2021-11-25 19:18:52 +00:00
("PATTERNPLAY", (0xD3, 1)),
2021-11-23 15:14:40 +00:00
]
)
# ########################################################################################
# Source Activity
2021-11-25 19:18:52 +00:00
sourceactivitydict = dict(
2021-11-23 15:14:40 +00:00
[
(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
2021-11-25 19:18:52 +00:00
ml_telegram_type_dict = dict(
2021-11-23 15:14:40 +00:00
[
(0x0A, "COMMAND"),
(0x0B, "REQUEST"),
(0x14, "RESPONSE"),
(0x2C, "INFO"),
(0x5E, "CONFIG"),
]
)
2021-11-25 19:18:52 +00:00
ml_command_type_dict = dict(
2021-11-23 15:14:40 +00:00
[
(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"),
(0x45, "GOTO_SOURCE"),
2021-12-17 18:45:05 +00:00
# LOCKMANAGER_COMMAND: Lock to Determine what device issues source commands
# reference: https://tidsskrift.dk/daimipb/article/download/7043/6004/0
2021-11-23 15:14:40 +00:00
(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
2021-11-25 19:18:52 +00:00
# Master in older implementations) then asserts a NEW_LOCKmANAGER telegram and assumes responsibility
2021-12-17 18:45:05 +00:00
# for LOCKMANAGER_COMMAND telegrams until a key transfer occurs.
# reference: https://tidsskrift.dk/daimipb/article/download/7043/6004/0
2021-11-25 19:18:52 +00:00
(0x12, "KEY_LOST"), # ?
2021-11-23 15:14:40 +00:00
# Unknown command with payload of length 1.
# bit 0: unknown
# bit 1: unknown
2021-11-25 19:18:52 +00:00
(0xA0, "NEW_LOCKMANAGER"), # ?
2021-11-23 15:14:40 +00:00
# Unknown command with payload of length 2
# bit 0: unknown
# bit 1: unknown
# bit 2: unknown
]
)
2021-11-25 19:18:52 +00:00
ml_command_type_request_key_subtype_dict = dict(
2021-11-23 15:14:40 +00:00
[
(0x01, "Request Key"),
(0x02, "Transfer Key"),
(0x03, "Transfer Impossible"),
(0x04, "Key Received"),
(0x05, "Timeout"),
(0xFF, "Undefined"),
]
)
2021-11-25 19:18:52 +00:00
ml_activity_dict = dict(
2021-11-23 15:14:40 +00:00
[
(0x01, "Request Source"),
(0x02, "Request Source"),
(0x04, "No Source"),
(0x06, "Source Active"),
]
)
2021-11-25 19:18:52 +00:00
ml_device_dict = dict(
2021-11-23 15:14:40 +00:00
[
2021-11-25 19:18:52 +00:00
(0xC0, "VIDEO MASTER"),
(0xC1, "AUDIO MASTER"),
(0xC2, "SOURCE CENTER/SLAVE DEVICE"),
(0x81, "ALL AUDIO LINK DEVICES"),
(0x82, "ALL VIDEO LINK DEVICES"),
(0x83, "ALL LINK DEVICES"),
2021-11-23 15:14:40 +00:00
(0x80, "ALL"),
(0xF0, "MLGW"),
2021-12-17 18:45:05 +00:00
(0x21, "BLC NL/ML"),
2021-11-23 15:14:40 +00:00
# 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.
2021-12-17 18:45:05 +00:00
# reference: https://tidsskrift.dk/daimipb/article/download/7043/6004/0
2021-11-25 19:18:52 +00:00
(0xFF, "POWER MASTER"), # ?
2021-11-23 15:14:40 +00:00
]
)
2021-11-25 19:18:52 +00:00
ml_pictureformatdict = dict(
2021-11-23 15:14:40 +00:00
[
(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"),
]
)
2021-11-25 19:18:52 +00:00
ml_selectedsourcedict = dict(
2021-11-23 15:14:40 +00:00
[
(0x00, "NONE"),
(0x0B, "TV"),
(0x15, "V.TAPE/V.MEM"),
(0x16, "DVD2"),
2021-12-08 13:03:50 +00:00
(0x1F, "SAT/DTV"),
2021-11-23 15:14:40 +00:00
(0x29, "DVD"),
2021-12-08 13:03:50 +00:00
(0x33, "V.AUX/DTV2"),
2021-11-23 15:14:40 +00:00
(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"),
]
)
2021-11-25 19:18:52 +00:00
ml_trackinfo_subtype_dict = dict([(0x05, "Current Source"), (0x07, "Change Source"), ])
2021-11-23 15:14:40 +00:00
2021-12-08 13:03:50 +00:00
ml_sourcekind_dict = dict([(0x01, "audio source"), (0x02, "video source"), (0xFF, "undefined")])
2021-11-25 19:18:52 +00:00
ml_selectedsource_type_dict = dict(
2021-11-23 15:14:40 +00:00
[
("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
2021-11-25 19:18:52 +00:00
mlgw_payloadtypedict = dict(
2021-11-23 15:14:40 +00:00
[
(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"),
]
)
2021-11-25 19:18:52 +00:00
MLGW_PL = {v.upper(): k for k, v in mlgw_payloadtypedict.items()}
2021-11-23 15:14:40 +00:00
2021-11-25 19:18:52 +00:00
destselectordict = dict(
2021-11-23 15:14:40 +00:00
[
(0x00, "Video Source"),
(0x01, "Audio Source"),
2021-12-17 18:45:05 +00:00
(0x05, "Secondary Video Source (V.TAPE/V.MEM)"),
2021-11-23 15:14:40 +00:00
(0x0F, "All Products"),
(0x1B, "MLGW"),
]
)
2021-11-25 19:18:52 +00:00
CMDS_DEST = {v.upper(): k for k, v in destselectordict.items()}
2021-11-23 15:14:40 +00:00
2021-11-25 19:18:52 +00:00
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")])
2021-11-23 15:14:40 +00:00
2021-11-25 19:18:52 +00:00
mlgw_virtualactiondict = dict([(0x01, "PRESS"), (0x02, "HOLD"), (0x03, "RELEASE")])
2021-11-23 15:14:40 +00:00
2021-11-25 19:18:52 +00:00
# for '0x03: Picture and Sound Status'
mlgw_soundstatusdict = dict([(0x00, "Not muted"), (0x01, "Muted")])
2021-11-23 15:14:40 +00:00
2021-11-25 19:18:52 +00:00
mlgw_speakermodedict = dict(
2021-11-23 15:14:40 +00:00
[
(0x01, "Center channel"),
2021-12-17 18:45:05 +00:00
(0x02, "2 channel stereo"),
2021-11-23 15:14:40 +00:00
(0x03, "Front surround"),
2021-12-17 18:45:05 +00:00
(0x04, "4 channel stereo"),
2021-11-23 15:14:40 +00:00
(0x05, "Full surround"),
2021-11-25 19:18:52 +00:00
(0xFD, "<all>"), # Dummy for 'Listen for all modes'
2021-11-23 15:14:40 +00:00
]
)
2021-11-25 19:18:52 +00:00
mlgw_screenmutedict = dict([(0x00, "not muted"), (0x01, "muted")])
mlgw_screenactivedict = dict([(0x00, "not active"), (0x01, "active")])
mlgw_cinemamodedict = dict([(0x00, "Cinema mode off"), (0x01, "Cinema mode on")])
mlgw_stereoindicatordict = dict([(0x00, "Mono"), (0x01, "Stereo")])
2021-11-23 15:14:40 +00:00
2021-11-25 19:18:52 +00:00
# for '0x04: Light and Control command'
mlgw_lctypedict = dict([(0x01, "LIGHT"), (0x02, "CONTROL")])
2021-11-23 15:14:40 +00:00
2021-11-25 19:18:52 +00:00
# for '0x31: Login Status
mlgw_loginstatusdict = dict([(0x00, "OK"), (0x01, "FAIL")])
2021-11-23 15:14:40 +00:00
# ########################################################################################
# ##### BeoLink Gateway Protocol packet constants
2021-11-25 19:18:52 +00:00
blgw_srcdict = dict(
2021-11-23 15:14:40 +00:00
[
("TV", "TV"),
("DVD", "DVD"),
("RADIO", "RADIO"),
("TP1", "A.TAPE/A.MEM"),
("TP2", "A.TAPE2/N.MUSIC"),
("CD", "CD"),
("PH", "PHONO/N.RADIO"),
]
)