BeoGateway/Resources/CONSTANTS.py
2021-11-23 15:14:40 +00:00

463 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"),
]
)