SignalK / specification

Signal K is a JSON-based format for storing and sharing marine data from different sources (e.g. nmea 0183, 2000, seatalk, etc)
Other
91 stars 68 forks source link

RFC 0004: Entertainment #293

Open timmathews opened 7 years ago

timmathews commented 7 years ago

Summary

This goal of this RFC is to provide an entertainment group in the Signal K specification. It will be a new node directly under a vessel, encompassing all of the data necessary to display data from and control devices which provide audio or video entertainment streams.

The initial structure of the entertainment will be focused around what data Fusion provides in their proprietary PGNs and what data is available in the stock n2k entertainment PGNs. Where these PGNs fall short, I will attempt to fill in the gaps based on what I learned doing Crestron AV installs for a year or so.

The NMEA 2000 PGNs are detailed in Technical Corrigendum TC# 2000 20160715 and Technical Corrigendum TC# 2000 20160725 available publicly on the NMEA's website.

Motivation

@sbender9 has been working on adding Fusion support to n2k-signalk and it would be helpful if there were a set of paths to map to which we can all agree on. AV is also a really good area to start experimenting with two-way control because worst case scenarios here aren't particularly dangerous.

Detailed design

Regardless of the source of an AV stream, the data attached to it is basically the same. Some sources will have more and some will have less but these should cover 90% of all use cases. Because different sources could potentially be playing in different zones (not in a Fusion system, but certainly in larger installations), entertainment should follow the same basic structure as electrical.

Within the entertainment group there are inputs, these include stereos, satellite tuners, AppleTV, DVD libraries, etc.; and outputs, such as amplifiers, TVs, Bluetooth bridges. Because outputs have a $source parameter which is a JSONpath reference to their connected input, it is possible to describe arbitrarily complex AV installations and routings with this schema.

entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).name
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).deviceType
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).audioFormat
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).videoFormat

entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).transport.playbackState
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).transport.playbackSpeed
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).transport.repeatState
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).transport.shuffleState

entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).track.name
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).track.artistName
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).track.number
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).track.totalTracks
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).track.genre
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).track.releaseDate
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).track.albumName
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).track.albumArt
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).track.elapsedTime
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).track.length

entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).tuner.mode
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).tuner.region
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).tuner.frequency
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).tuner.channel
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).tuner.subChannel
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).tuner.stationName
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).tuner.isStereo
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).tuner.squelch
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).tuner.signalStrength

entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).name
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).deviceType
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).$source
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).audioFormat
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).videoFormat
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).isMuted
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).fade
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).balance

entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).volume.master
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).volume.frontLeft
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).volume.frontRight
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).volume.frontCenter
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).volume.rearLeft
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).volume.rearRight
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).volume.surroundLeft
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).volume.surroundRight
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).volume.sub

entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).equalizer.preset
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).equalizer.bass
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).equalizer.mid
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).equalizer.treble
entertainment.device.(^[A-Za-z0-9]+$).output.(^[A-Za-z0-9]+$).equalizer.(^[0-9]+kHz$)

deviceType values: See NMEA definitions above

playbackState values:
 * Stopped
 * Paused
 * Playing
 * Rewinding
 * Skipping Forward
 * Skipping Backward

repeatState values:
 * None
 * Repeat Track
 * Repeat Album
 * Repeat Playlist

shuffleState values:
 * None
 * Shuffle Album
 * Shuffle Playlist
 * Shuffle All

audioFormat values:
 * Mono
 * Stereo
 * Surround

videoFormat values:
 * ATSC
 * DVB
 * NTSC
 * PAL

tuner.region values:
 * US
 * Europe
 * Asia
 * Middle East
 * Latin America
 * Australia
 * Russia
 * Japan

tuner.mode values:
 * AM
 * FM
 * Shortwave
 * VHF
 * SiriusXM
 * CATV
 * DTV
 * Satellite TV

Drawbacks

Other than being incomplete, none at this time

Alternatives

The videoFormat values come from the NMEA PGNs above, but it's not really very useful information. It would be better (probably) for the videoFormat field to convey resolution information, e.g. 480p, 720p, 1080p, 2k, 4k, etc. or encoding format such as MPEG2, H.264, etc.

Likewise, the audioFormat values are very basic and it may make more sense for these to contain bitrate and encoding information.

As an alternative to the simple fields above, maybe this information should be expanded into a contentStream section with more information about the encoding of the current content.

entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).contentStream.containerFormat

entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).contentStream.audio.bitrate
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).contentStream.audio.samplingFrequency
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).contentStream.audio.codec
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).contentStream.audio.channelCount

entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).contentStream.video.bitrate
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).contentStream.video.bitDepth
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).contentStream.video.chromaFormat
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).contentStream.video.resolution
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).contentStream.video.frameRate
entertainment.device.(^[A-Za-z0-9]+$).input.(^[A-Za-z0-9]+$).contentStream.video.codec

Unresolved questions

Music / video library support

Related

Tracking Branch: rfc0004 Example Full Schema: entertainment-full.json