sohotcall

lampu.js

Mar 17th, 2019
196
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // { 0:0, 2:0, 4:0, 5:0, 12:0, 13:0, 14:0, 15:0, 16:0 }
  2. var LED_COUNT = 16;
  3. var SCHEDULE_COUNT = 20;
  4. var http = require( 'http' );
  5. var url = require( 'url' );
  6. var hash = function(s){
  7.     return s.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0);
  8. }
  9. var lampus = [];
  10. for ( var i=0; i < LED_COUNT; i++ )
  11.     lampus[i] =0;
  12. var schedules = [];
  13. for ( var i=0; i < SCHEDULE_COUNT; i++)
  14.     schedules[i] = [2000,1,1,0,0,0,0,-1];
  15. var TIMEOUT = 600;
  16. var PORT = 83;
  17. // Get datetime
  18. //  ? now = now
  19. //  return JSON[y,m,d,H,i,s]
  20. // Set pin value (2 = toggle)
  21. //  ? lampu = pin & value = 1
  22. //  return none
  23. // Set schedule slot [y,m,s,h,i,s,pin,value], slot from 0 to 11
  24. //  ? schedule = 1 & value = [2019,12,31,23,59,59,0,1]
  25. //  return none
  26. // Clear schedule slot, slot from 0 to 11
  27. //  ? clear_schedule = 1
  28. // Send all old pin values to get new pin values
  29. //  ? mode = alarm & current = {
  30. //    lampus:{"0":value,"2":value,"4":value,"5":value,"12":value,"13":value,"14":value,"15":value,"16":value},
  31. //    schedules:{ 0:[y,m,d,h,i,s,pin,value], ..., 11:[y,m,d,h,i,s,pin,value],
  32. //    }
  33. //  return JSON{
  34. //    lampus:{"0":value,"2":value,"4":value,"5":value,"12":value,"13":value,"14":value,"15":value,"16":value},
  35. //    schedules:{ 0:[y,m,d,h,i,s,pin,value], ..., 11:[y,m,d,h,i,s,pin,value],
  36. //    }
  37. // Main page
  38. //  ?
  39. //  return main page
  40. var to_ts = function (y, m, d, h, i, s){
  41.     return (365 * y + Math.floor( y / 4 ) - Math.floor( y / 100 ) + Math.floor( y / 400)
  42.         + 30 * m + Math.floor( ( m + ( m > 8 )) / 2 ) + ( ( y % 4 == 0 ) - ( y % 100 == 0 ) + ( y % 400 == 0) ? 1 : 2 ) * ( m < 3 )
  43.         + d - 719560)*24*3600+h*3600+i*60+s;
  44. };
  45. http.createServer( function( req, res ){
  46.     res.writeHead( 200, { 'Content-Type' : 'text/html' } );
  47.     var timeout = 0;
  48.     var q = url.parse( req.url, true ).query;
  49.     if ( q.now ){
  50.         console.log( "Getting now" );
  51.         var now = new Date();
  52.         res.write( JSON.stringify( [now.getFullYear(), now.getMonth()+1, now.getDate(),
  53.             now.getHours(), now.getMinutes(), now.getSeconds()] ) );
  54.     } else if ( q.lampu ){
  55.         console.log( "Set lampu " + q.lampu + " value to " + q.value );
  56.         if ( q.value == 2 )
  57.             q.value = ! lampus[ q.lampu|0 ];
  58.         lampus[ q.lampu|0 ] = +q.value ? 1 : 0;
  59.     } else if ( q.clear_schedule ){
  60.         console.log( "Clear schedule " );
  61.         schedules[ q.clear_schedule ][7] = -1;
  62.     } else if ( q.schedule ){
  63.         console.log( "Set schedule " + q.schedule + " value to " + q.value );
  64.         schedules[ q.schedule ] = JSON.parse( q.value );
  65.     } else if ( q.current ){
  66.         //remote
  67.         //- mengecek bila berubah atau timeout
  68.         //alarm
  69.         //- mengecek bila berubah atau timeout atau tiba
  70.         console.log( "Requesting lampus/schedules new value from old value " + q.current + " mode = " + q.mode );
  71.         timeout = TIMEOUT;
  72.         var to = function(){
  73.             var current = JSON.stringify( { lampus: lampus, schedules: schedules } );
  74.             console.log("Hash: " + hash(current) + hash(q.current));
  75.             if ( current != q.current || timeout <= 0 ){
  76.                 res.write( current );
  77.                 res.end();
  78.                 return;
  79.             } else if ( q.mode == 'alarm' ){
  80.                 var parse = JSON.parse( q.current );
  81.                 //console.log(parse);
  82.                 var now = new Date();
  83.                 now = to_ts(now.getFullYear(), now.getMonth()+1, now.getDate(),
  84.                     now.getHours(), now.getMinutes(), now.getSeconds());
  85.                 //console.log('Now = '+now);
  86.                 for (var i=0; i<SCHEDULE_COUNT; i++){
  87.                     var c = parse.schedules[i];
  88.                     //console.log(now+' vs '+ to_ts(c[0],c[1],c[2],c[3],c[4],c[5]));
  89.                     if (to_ts(c[0],c[1],c[2],c[3],c[4],c[5]) <= now && c[7] >= 0 ){
  90.                         timeout = 0;
  91.                         res.write( current );
  92.                         res.end();
  93.                         return;
  94.                     }
  95.                 }
  96.             }
  97.             if ( timeout > 0 ){
  98.                 timeout--;
  99.                 setTimeout( to, 1000 );
  100.             }
  101.         };
  102.         to();
  103.     } else {
  104.         console.log( "Main page" );
  105.         var lamputables = "";
  106.         for (var i = 0; i < LED_COUNT; i++){
  107.             lamputables += `<tr>
  108.                     <td>Lampu#` + i + `
  109.                     <td>Value=<span data-lampu=` + i + ` >` + lampus[i] + `</span>
  110.                     <td><button type=button data-lampu=` + i + ` data-value=0 >Off</button>
  111.                         <button type=button data-lampu=` + i + ` data-value=1 >On</button>
  112.                         <button type=button data-lampu=` + i + ` data-value=2 >Toggle</button>`;
  113.         }
  114.         var scheduletables = "";
  115.         for ( var i = 0; i < SCHEDULE_COUNT; i++) {
  116.             scheduletables += `<tr>
  117.                 <td>Schedule#` + i + `
  118.                 <td><input type=text data-schedule=` + i + ` value=` + JSON.stringify( schedules[i] ) + ` />
  119.                 <td><button type=button data-schedule=` + i + ` >Set</button>`;
  120.         }
  121.         res.write(`<!doctype html><html><head>
  122.             <meta charset=utf-8 >
  123.             <title>Lampu Micropython ESP8266 NodeJS</title>
  124.             <body>
  125.             <h1>Lampu</h1>
  126.             <table data-lampu>` + lamputables + `</table>
  127.             <h1>Jadwal</h1>
  128.             <table data-schedule>` + scheduletables + `</table>
  129.             <script>
  130.             var lampus = ` + JSON.stringify( lampus ) + `;
  131.             var schedules = ` + JSON.stringify( schedules ) + `;
  132.             function ajax( url, cb ) {
  133.                 var xhr = new XMLHttpRequest();
  134.                 xhr.onreadystatechange = function() {
  135.                     if ( this.readyState == 4 && this.status == 200 )
  136.                         if (cb) cb( this.responseText );
  137.                 };
  138.                 xhr.open( "GET", url, true );
  139.                 xhr.send();
  140.             }
  141.             document.querySelector( 'table[data-lampu]' ).addEventListener( 'click', function(e){
  142.                 if ( e.target.tagName == 'BUTTON' ){
  143.                     var button = e.target;
  144.                     ajax( "?lampu=" + button.getAttribute( 'data-lampu' ) + '&value=' + button.getAttribute( 'data-value' ) );
  145.                 }
  146.             }, false);
  147.             document.querySelector( 'table[data-schedule]' ).addEventListener( 'click', function(e){
  148.                 if ( e.target.tagName == 'BUTTON' ){
  149.                     var button = e.target;
  150.                     ajax( "?schedule=" + button.getAttribute( 'data-schedule' ) + '&value=' + document.querySelector('input[data-schedule="' + button.getAttribute( 'data-schedule' ) + '"]').value );
  151.                 }
  152.             }, false);
  153.             var to = function(){
  154.                 ajax( "?mode=remote&current=" + JSON.stringify( { lampus: lampus, schedules: schedules } ), function(d){
  155.                     d = JSON.parse(d);
  156.                     lampus = d.lampus;
  157.                     schedules = d.schedules;
  158.                     for ( var i = 0; i < `+LED_COUNT+`; i++ ){
  159.                         document.querySelector( 'span[data-lampu="' + i + '"]' ).innerHTML = lampus[i];
  160.                     }
  161.                     for ( var i = 0; i < `+SCHEDULE_COUNT+`; i++ ){
  162.                         document.querySelector( 'input[data-schedule="' + i + '"]' ).value = JSON.stringify( schedules[i] );
  163.                     }
  164.                     setTimeout( to, 1000 );
  165.                 } );
  166.             };
  167.             to();
  168.             </script>
  169.             </html>`);
  170.     }
  171.     if ( ! timeout )
  172.         res.end();
  173. } ).listen( PORT );
  174.  
  175. console.log( "Server is running on port " + PORT );
RAW Paste Data