Можно ли запускать контакты GPIO через веб-сокет в указанные дату и время? - PullRequest
0 голосов
/ 21 мая 2018

Я использую веб-сервер nodejs на своем Raspberry Pi и создаю веб-интерфейс, в котором пользователь может вводить дату и время, когда пин-код gpio будет срабатывать в зависимости от заданного времени.Я сделал простой будильник, используя HTML и Java, но я не знаю, как отправить 1 и 0 на Raspberry Pi, когда будильник инициализируется.

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Alarm Clock</title>
</head>


<body>	
	<input type="datetime-local" id="alarmTime" />
	<button onclick="setAlarm(this);" id="alarmButton">Set Alarm</button>
	
	<div id="alarmOptions" style="display: none;">
		<button onclick="snooze();">Snooze 5 minutes</button>
		<button onclick="stopAlarm();">Stop Alarm</button>
	</div>
	
	<script>
		
		var alarmSound = new Audio();
		alarmSound.src = 'alarm.mp3';
		var alarmTimer;

	

		function setAlarm(button) {
			var ms = document.getElementById('alarmTime').valueAsNumber;
			if(isNaN(ms))  {
				alert('Invalid Date');
				return;
			}
			var alarm = new Date(ms);
			var alarmTime = new Date(alarm.getUTCFullYear(), alarm.getUTCMonth(), alarm.getUTCDate(),  alarm.getUTCHours(), alarm.getUTCMinutes(), alarm.getUTCSeconds());
			
			var differenceInMs = alarmTime.getTime() - (new Date()).getTime();

			if(differenceInMs < 0) {
				alert('Specified time is already passed');
				return;
			}

			alarmTimer = setTimeout(initAlarm, differenceInMs);
			button.innerText = 'Cancel Alarm';
			button.setAttribute('onclick', 'cancelAlarm(this);');

		};
		
		function cancelAlarm(button) {
			clearTimeout(alarmTimer);
			button.innerText = 'Set Alarm';
			button.setAttribute('onclick', 'setAlarm(this);')
		};

		function initAlarm() {
			alarmSound.play();
			document.getElementById('alarmOptions').style.display = '';
			console.log("ALAAAARM");
		};

		function stopAlarm() {
			alarmSound.pause();
			alarmSound.currentTime = 0;
			document.getElementById('alarmOptions').style.display = 'none';
			cancelAlarm(document.getElementById('alarmButton'));
		};

		
		
	</script>	
</body>
</html>

Я пытался использовать

var socket = io(); 
window.addEventListener("load", function(){ 
  var Alarm = document.getElementById("alarmTime"); 
  Alarm.addEventListener("change", function() { 
    socket.emit("alarmTime", Number(this.checked)); 

и вот файл js:

var http = require('http').createServer(handler); 
var fs = require('fs'); 
var io = require('socket.io')(http) 
var Gpio = require('onoff').Gpio; 
var LED = new Gpio(4, 'out'); 
   

http.listen(8080); 

function handler (req, res) { 
  fs.readFile(__dirname + '/test.html', function(err, data) { 
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'}); 
      return res.end("404 Not Found");
    } 
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data); 
    return res.end();
  });
}

io.sockets.on('connection', function (socket) {
  var lightvalue = 0; 
  
  socket.on('alarmTime', function(data) { 
    lightvalue = data;
    if (lightvalue != LED.readSync()) { 
      LED.writeSync(lightvalue); 
    }
  });
});

process.on('SIGINT', function () {
  LED.writeSync(0); 
  LED.unexport(); 
  pushButton.unexport(); 
  process.exit(); 
});

Ничего не работает.Новое в nodejs

...