diff --git a/index.js b/index.js new file mode 100644 index 0000000000000000000000000000000000000000..17ddf9ae05efc30348329fe55af767ff78cb464c --- /dev/null +++ b/index.js @@ -0,0 +1,97 @@ +'use strict'; + +/** + * LIBRARIES + */ + +var dashButton = require( 'node-dash-button' ); +var request = require( 'request' ); + +/** + * CONFIGURATION & EVENT BINDING + */ + +var config = require( './config.json' ); + +Object.keys( config.buttons ).forEach( function( index ) { + var buttonConfig = config.buttons[index]; + + var button = dashButton( buttonConfig.mac, config.arp_interface ); + + button.on( 'detected', buttonActivated ); +} ); + +var homeAssistantApiBase = config.home_assistant_proto + '://' + config.home_assistant_host + ':' + config.home_assistant_port + '/api/'; + +/** + * BUTTON FUNCTIONALITY + */ + +/** + * Make HTTP(s) requests to Home Assistant to toggle status of device assigned to pushed button + */ +function buttonActivated( mac ) { + var buttonConfig = config.buttons[mac]; + + var req = { + url: homeAssistantApiBase + 'states/' + buttonConfig.status.entity_id, + headers: { + 'Content-Type': 'application/json', + 'x-ha-access': config.home_assistant_pass + } + }; +console.log( req ); + // First, check the current status so we can toggle + request( req, function( err, res, body ) { + // Handle error states + if ( err ) { + console.error( err ); + return; + } + + if ( 200 !== res.statusCode ) { + console.error( res.statusCode ); + return; + } + + // HA only deals with JSON + body = JSON.parse( body ); + + var service = null, + postBody = {}; + + if ( 'off' === body.state ) { + service = buttonConfig.on.entity + '/turn_on'; + postBody.entity_id = buttonConfig.on.entity_id; + } else if ( 'on' === body.state ) { + service = buttonConfig.off.entity + '/turn_off'; + postBody.entity_id = buttonConfig.off.entity_id; + } else { + console.error( 'Unknown state: ' + body.state ); + return; + } + + // Build new request to update state + req.url = homeAssistantApiBase + service; + req.method = 'POST'; + req.body = JSON.stringify( postBody ); + + // Make request to change alarm status + request( req, function( err, res, body ) { + // Handle error states + if ( err ) { + console.error( err ); + return; + } + + if ( 200 !== res.statusCode ) { + console.error( res.statusCode ); + return; + } + + // Nothing more to do + // services endpoints don't return anything useful + return true; + } ); + } ); +}