UNPKG

htd-lync

Version:

This library is meant to be used to interact with an HTD Lync 12

230 lines (184 loc) 7.08 kB
import { promisify } from 'util'; import Connector from "../dist/Connector"; import Protocol from "../dist/Protocol"; import { Source, MP3, Response_Exist, Response_Id, Response_MP3_Artist, Response_MP3_End, Response_MP3_File, Response_MP3_Off, Response_MP3_On, Response_MP3_Repeat, Response_Source_Name, Response_Status, Response_Zone_Name, Zone, Response_System } from "../src"; interface StatusZone { number: number name: string power: boolean; mute: boolean; dnd: boolean; source: number volume: number treble: number bass: number balance: number sources: Map<number, string> } const sleep = promisify(setTimeout); const zones = new Map<number, StatusZone>(); zones.set(1, {number: 1, name: "Zone 1", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); zones.set(2, {number: 2, name: "Zone 2", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); zones.set(3, {number: 3, name: "Zone 3", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); zones.set(4, {number: 4, name: "Zone 4", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); zones.set(5, {number: 5, name: "Zone 5", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); zones.set(6, {number: 6, name: "Zone 6", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); zones.set(7, {number: 7, name: "Zone 7", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); zones.set(8, {number: 8, name: "Zone 8", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); zones.set(9, {number: 9, name: "Zone 9", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); zones.set(10, {number: 10, name: "Zone 10", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); zones.set(11, {number: 11, name: "Zone 11", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); zones.set(12, {number: 12, name: "Zone 12", power: false, mute: false, dnd: false, source: 1, volume: 0, treble: 0, bass: 0, balance: 0, sources: new Map()}); type LyncStatus = { id: string all_on: boolean all_off: boolean party_mode: boolean mp3: { repeat: boolean on: null | boolean file: string artist: string } sources: Map<number, string> zones: Map<number, StatusZone> } const Lync: LyncStatus = { id: '', sources: new Map<number, string>, zones, all_on: false, all_off: false, party_mode: false, mp3: { repeat: false, on: null, file: '', artist: '' } } const LC = new Connector('10.0.0.25', 10006); const bye = () => { LC.client.destroy(); console.log('\nBye!'); process.exit(0); }; LC.events.on('socket:connected', () => { console.info('Socket Connected'); }); LC.events.on('socket:error', (error) => { console.error('Socket Error', error); }); LC.events.on('error', (error) => { console.error('Lync Error', error); }); LC.events.on('system', (response: Response_System) => { Lync.all_on = response.system.all_on; Lync.all_off = response.system.all_off; Lync.party_mode = response.system.party_mode; }); LC.events.on('status', (response: Response_Status) => { // console.log('- - - - - STATUS - - - - - -'); // console.dir(response, { depth: null }); const zone = Lync.zones.get(response.zone.number); if (zone) { const update: StatusZone = { ...zone, ...response.zone, }; zones.set(response.zone.number, update); } }); LC.events.on('exist', (response: Response_Exist) => { // console.log('- - - - - EXIST - - - - - -'); // console.log(response); }); LC.events.on('id', (response: Response_Id) => { // console.info('Lync Id', response.id); Lync.id = response.id; }); LC.events.on('source_name', (response: Response_Source_Name) => { // console.info('Source Name', response.source.zone, response.source.number, response.source.name); if (response.source.zone === 1) { Lync.sources.set(response.source.number, response.source.name); } Lync.zones.get(response.source.zone)?.sources.set(response.source.number, response.source.name); }); LC.events.on('zone_name', (response: Response_Zone_Name) => { // console.info('StatusZone Name', response.zone.number, response.zone.name); const zone = Lync.zones.get(response.zone.number); if (zone) { const update: StatusZone = { ...zone, ...response.zone }; zones.set(response.zone.number, update); } }); LC.events.on('mp3:on', (response: Response_MP3_On) => { console.info('MP3 On'); Lync.mp3.on = true; }); LC.events.on('mp3:off', (response: Response_MP3_Off) => { console.info('MP3 Off', response.mp3.data); Lync.mp3.on = false; }); LC.events.on('mp3:repeat', (response: Response_MP3_Repeat) => { // console.info('MP3 Repeat', response.mp3.repeat); Lync.mp3.repeat = response.mp3.repeat; }); LC.events.on('mp3:end', (response: Response_MP3_End) => { console.info('MP3 End'); }); LC.events.on('mp3:artist', (response: Response_MP3_Artist) => { // console.info('MP3 Artist', response.mp3.artist); Lync.mp3.artist = response.mp3.artist; }); LC.events.on('mp3:file', (response: Response_MP3_File) => { // console.info('MP3 File', response.mp3.file); Lync.mp3.file = response.mp3.file; }); await LC.send_command(Protocol.set_echo_mode(true)); await LC.send_command(Protocol.set_zone_source_name(12, Source._03, 'Source 3')); await sleep(2000); await LC.send_command(Protocol.get_status_all()); process.on('SIGINT', () => bye); var stdin = process.stdin; // without this, we would only get streams once enter is pressed stdin.setRawMode( true ); // resume stdin in the parent process (node app won't quit all by itself // unless an error or process.exit() happens) stdin.resume(); // i don't want binary, do you? stdin.setEncoding( 'utf8' ); console.log('Press s for status, and q to quit') // on any data into stdin stdin.on( 'data', function( key ){ if ( key.toString() === '\u0003' ) { bye(); } switch (key.toString()) { case 's': console.dir(Lync, {depth: null}); break; case 'q': bye(); break; } // write the key to stdout all normal like // process.stdout.write( `WRITE ${key}` ); });