Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // { 0:0, 2:0, 4:0, 5:0, 12:0, 13:0, 14:0, 15:0, 16:0 }
- var LED_COUNT = 16;
- var SCHEDULE_COUNT = 20;
- var http = require( 'http' );
- var url = require( 'url' );
- var hash = function(s){
- return s.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0);
- }
- var lampus = [];
- for ( var i=0; i < LED_COUNT; i++ )
- lampus[i] =0;
- var schedules = [];
- for ( var i=0; i < SCHEDULE_COUNT; i++)
- schedules[i] = [2000,1,1,0,0,0,0,-1];
- var TIMEOUT = 600;
- var PORT = 83;
- // Get datetime
- // ? now = now
- // return JSON[y,m,d,H,i,s]
- // Set pin value (2 = toggle)
- // ? lampu = pin & value = 1
- // return none
- // Set schedule slot [y,m,s,h,i,s,pin,value], slot from 0 to 11
- // ? schedule = 1 & value = [2019,12,31,23,59,59,0,1]
- // return none
- // Clear schedule slot, slot from 0 to 11
- // ? clear_schedule = 1
- // Send all old pin values to get new pin values
- // ? mode = alarm & current = {
- // lampus:{"0":value,"2":value,"4":value,"5":value,"12":value,"13":value,"14":value,"15":value,"16":value},
- // schedules:{ 0:[y,m,d,h,i,s,pin,value], ..., 11:[y,m,d,h,i,s,pin,value],
- // }
- // return JSON{
- // lampus:{"0":value,"2":value,"4":value,"5":value,"12":value,"13":value,"14":value,"15":value,"16":value},
- // schedules:{ 0:[y,m,d,h,i,s,pin,value], ..., 11:[y,m,d,h,i,s,pin,value],
- // }
- // Main page
- // ?
- // return main page
- var to_ts = function (y, m, d, h, i, s){
- return (365 * y + Math.floor( y / 4 ) - Math.floor( y / 100 ) + Math.floor( y / 400)
- + 30 * m + Math.floor( ( m + ( m > 8 )) / 2 ) + ( ( y % 4 == 0 ) - ( y % 100 == 0 ) + ( y % 400 == 0) ? 1 : 2 ) * ( m < 3 )
- + d - 719560)*24*3600+h*3600+i*60+s;
- };
- http.createServer( function( req, res ){
- res.writeHead( 200, { 'Content-Type' : 'text/html' } );
- var timeout = 0;
- var q = url.parse( req.url, true ).query;
- if ( q.now ){
- console.log( "Getting now" );
- var now = new Date();
- res.write( JSON.stringify( [now.getFullYear(), now.getMonth()+1, now.getDate(),
- now.getHours(), now.getMinutes(), now.getSeconds()] ) );
- } else if ( q.lampu ){
- console.log( "Set lampu " + q.lampu + " value to " + q.value );
- if ( q.value == 2 )
- q.value = ! lampus[ q.lampu|0 ];
- lampus[ q.lampu|0 ] = +q.value ? 1 : 0;
- } else if ( q.clear_schedule ){
- console.log( "Clear schedule " );
- schedules[ q.clear_schedule ][7] = -1;
- } else if ( q.schedule ){
- console.log( "Set schedule " + q.schedule + " value to " + q.value );
- schedules[ q.schedule ] = JSON.parse( q.value );
- } else if ( q.current ){
- //remote
- //- mengecek bila berubah atau timeout
- //alarm
- //- mengecek bila berubah atau timeout atau tiba
- console.log( "Requesting lampus/schedules new value from old value " + q.current + " mode = " + q.mode );
- timeout = TIMEOUT;
- var to = function(){
- var current = JSON.stringify( { lampus: lampus, schedules: schedules } );
- console.log("Hash: " + hash(current) + hash(q.current));
- if ( current != q.current || timeout <= 0 ){
- res.write( current );
- res.end();
- return;
- } else if ( q.mode == 'alarm' ){
- var parse = JSON.parse( q.current );
- //console.log(parse);
- var now = new Date();
- now = to_ts(now.getFullYear(), now.getMonth()+1, now.getDate(),
- now.getHours(), now.getMinutes(), now.getSeconds());
- //console.log('Now = '+now);
- for (var i=0; i<SCHEDULE_COUNT; i++){
- var c = parse.schedules[i];
- //console.log(now+' vs '+ to_ts(c[0],c[1],c[2],c[3],c[4],c[5]));
- if (to_ts(c[0],c[1],c[2],c[3],c[4],c[5]) <= now && c[7] >= 0 ){
- timeout = 0;
- res.write( current );
- res.end();
- return;
- }
- }
- }
- if ( timeout > 0 ){
- timeout--;
- setTimeout( to, 1000 );
- }
- };
- to();
- } else {
- console.log( "Main page" );
- var lamputables = "";
- for (var i = 0; i < LED_COUNT; i++){
- lamputables += `<tr>
- <td>Lampu#` + i + `
- <td>Value=<span data-lampu=` + i + ` >` + lampus[i] + `</span>
- <td><button type=button data-lampu=` + i + ` data-value=0 >Off</button>
- <button type=button data-lampu=` + i + ` data-value=1 >On</button>
- <button type=button data-lampu=` + i + ` data-value=2 >Toggle</button>`;
- }
- var scheduletables = "";
- for ( var i = 0; i < SCHEDULE_COUNT; i++) {
- scheduletables += `<tr>
- <td>Schedule#` + i + `
- <td><input type=text data-schedule=` + i + ` value=` + JSON.stringify( schedules[i] ) + ` />
- <td><button type=button data-schedule=` + i + ` >Set</button>`;
- }
- res.write(`<!doctype html><html><head>
- <meta charset=utf-8 >
- <title>Lampu Micropython ESP8266 NodeJS</title>
- <body>
- <h1>Lampu</h1>
- <table data-lampu>` + lamputables + `</table>
- <h1>Jadwal</h1>
- <table data-schedule>` + scheduletables + `</table>
- <script>
- var lampus = ` + JSON.stringify( lampus ) + `;
- var schedules = ` + JSON.stringify( schedules ) + `;
- function ajax( url, cb ) {
- var xhr = new XMLHttpRequest();
- xhr.onreadystatechange = function() {
- if ( this.readyState == 4 && this.status == 200 )
- if (cb) cb( this.responseText );
- };
- xhr.open( "GET", url, true );
- xhr.send();
- }
- document.querySelector( 'table[data-lampu]' ).addEventListener( 'click', function(e){
- if ( e.target.tagName == 'BUTTON' ){
- var button = e.target;
- ajax( "?lampu=" + button.getAttribute( 'data-lampu' ) + '&value=' + button.getAttribute( 'data-value' ) );
- }
- }, false);
- document.querySelector( 'table[data-schedule]' ).addEventListener( 'click', function(e){
- if ( e.target.tagName == 'BUTTON' ){
- var button = e.target;
- ajax( "?schedule=" + button.getAttribute( 'data-schedule' ) + '&value=' + document.querySelector('input[data-schedule="' + button.getAttribute( 'data-schedule' ) + '"]').value );
- }
- }, false);
- var to = function(){
- ajax( "?mode=remote¤t=" + JSON.stringify( { lampus: lampus, schedules: schedules } ), function(d){
- d = JSON.parse(d);
- lampus = d.lampus;
- schedules = d.schedules;
- for ( var i = 0; i < `+LED_COUNT+`; i++ ){
- document.querySelector( 'span[data-lampu="' + i + '"]' ).innerHTML = lampus[i];
- }
- for ( var i = 0; i < `+SCHEDULE_COUNT+`; i++ ){
- document.querySelector( 'input[data-schedule="' + i + '"]' ).value = JSON.stringify( schedules[i] );
- }
- setTimeout( to, 1000 );
- } );
- };
- to();
- </script>
- </html>`);
- }
- if ( ! timeout )
- res.end();
- } ).listen( PORT );
- console.log( "Server is running on port " + PORT );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement