-
Notifications
You must be signed in to change notification settings - Fork 0
/
sunrise.js
executable file
·127 lines (115 loc) · 6.18 KB
/
sunrise.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"use strict";
/* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://www.wtfpl.net/ for more details. */
// jshint esnext:true
const PIN_RED = 4;
const PIN_GREEN = 17;
const PIN_BLUE = 22;
let IFTTT_These = require("ifttt-these");
var piblaster = require('pi-blaster.js');
var ifttt = new IFTTT_These({
username: "authuser",
password: "authpw",
key: "ifttt-maker-key" // not necessary unless using maker channel
});
ifttt.ifThisThen(
function() {console.log(ifttt); return ifttt.wasTriggered("Light");},
function() {setScene(ifttt.state)}
);
let targetState = {
startTime:(new Date()).getTime(), red:0, green:0, blue:0, transition:30, duration:60*60*24
};
let transitionFrom = {red:0,green:0,blue:0};
let currentState = {red:0, green:0, blue:0}
function setScene(state) {
transitionFrom = {
red: currentState.red, green: currentState.green, blue: currentState.blue
};
if(ifttt.wasTriggered("command")) {
targetState.duration = 24*60*60; // one day
targetState.transition = 1; // one second
switch(state.command.toLowerCase()) {
case "off":
targetState.red=0;targetState.green=0;targetState.blue=0;
break;
case "on":
targetState.red=1;targetState.green=1;targetState.blue=1;
break;
default:
var hex = colorNameToHex(state.command.trim());
if(hex) {
var color = hexToRgb(hex.substring(1));
targetState.red = color.red/255.0;
targetState.green = color.green/255.0;
targetState.blue = color.blue/255.0;
} else {
return; // invalid command
}
break;
}
} else {
targetState.red=state.red; targetState.green = state.green; targetState.blue = state.blue;
targetState.duration = ifttt.wasTriggered('duration') && state.duration || 60*60*24;
targetState.transition = ifttt.wasTriggered('transition') && state.transition || 0.01;
}
targetState.startTime = (new Date()).getTime();
}
function frame() {
let timeDifferenceSeconds = ((new Date()).getTime() - targetState.startTime) / 1000;
let i = Math.min(timeDifferenceSeconds / targetState.transition, 1);
let j = 1.0-i;
if(timeDifferenceSeconds - targetState.transition > targetState.duration) {
i = 0;
}
currentState = {
red:j*transitionFrom.red + targetState.red*i,
green: j*transitionFrom.green + targetState.green*i,
blue: j*transitionFrom.blue + targetState.blue*i
};
piblaster.setPwm(PIN_RED, currentState.red);
piblaster.setPwm(PIN_GREEN, currentState.green );
piblaster.setPwm(PIN_BLUE, currentState.blue);
}
setInterval(frame, 1000/60);
function colorNameToHex(colour)
{
var colours = {"aliceblue":"#f0f8ff","antiquewhite":"#faebd7","aqua":"#00ffff","aquamarine":"#7fffd4","azure":"#f0ffff",
"beige":"#f5f5dc","bisque":"#ffe4c4","black":"#000000","blanchedalmond":"#ffebcd","blue":"#0000ff","blueviolet":"#8a2be2","brown":"#a52a2a","burlywood":"#deb887",
"cadetblue":"#5f9ea0","chartreuse":"#7fff00","chocolate":"#d2691e","coral":"#ff7f50","cornflowerblue":"#6495ed","cornsilk":"#fff8dc","crimson":"#dc143c","cyan":"#00ffff",
"darkblue":"#00008b","darkcyan":"#008b8b","darkgoldenrod":"#b8860b","darkgray":"#a9a9a9","darkgreen":"#006400","darkkhaki":"#bdb76b","darkmagenta":"#8b008b","darkolivegreen":"#556b2f",
"darkorange":"#ff8c00","darkorchid":"#9932cc","darkred":"#8b0000","darksalmon":"#e9967a","darkseagreen":"#8fbc8f","darkslateblue":"#483d8b","darkslategray":"#2f4f4f","darkturquoise":"#00ced1",
"darkviolet":"#9400d3","deeppink":"#ff1493","deepskyblue":"#00bfff","dimgray":"#696969","dodgerblue":"#1e90ff",
"firebrick":"#b22222","floralwhite":"#fffaf0","forestgreen":"#228b22","fuchsia":"#ff00ff",
"gainsboro":"#dcdcdc","ghostwhite":"#f8f8ff","gold":"#ffd700","goldenrod":"#daa520","gray":"#808080","green":"#008000","greenyellow":"#adff2f",
"honeydew":"#f0fff0","hotpink":"#ff69b4",
"indianred ":"#cd5c5c","indigo":"#4b0082","ivory":"#fffff0","khaki":"#f0e68c",
"lavender":"#e6e6fa","lavenderblush":"#fff0f5","lawngreen":"#7cfc00","lemonchiffon":"#fffacd","lightblue":"#add8e6","lightcoral":"#f08080","lightcyan":"#e0ffff","lightgoldenrodyellow":"#fafad2",
"lightgrey":"#d3d3d3","lightgreen":"#90ee90","lightpink":"#ffb6c1","lightsalmon":"#ffa07a","lightseagreen":"#20b2aa","lightskyblue":"#87cefa","lightslategray":"#778899","lightsteelblue":"#b0c4de",
"lightyellow":"#ffffe0","lime":"#00ff00","limegreen":"#32cd32","linen":"#faf0e6",
"magenta":"#ff00ff","maroon":"#800000","mediumaquamarine":"#66cdaa","mediumblue":"#0000cd","mediumorchid":"#ba55d3","mediumpurple":"#9370d8","mediumseagreen":"#3cb371","mediumslateblue":"#7b68ee",
"mediumspringgreen":"#00fa9a","mediumturquoise":"#48d1cc","mediumvioletred":"#c71585","midnightblue":"#191970","mintcream":"#f5fffa","mistyrose":"#ffe4e1","moccasin":"#ffe4b5",
"navajowhite":"#ffdead","navy":"#000080",
"oldlace":"#fdf5e6","olive":"#808000","olivedrab":"#6b8e23","orange":"#ffa500","orangered":"#ff4500","orchid":"#da70d6",
"palegoldenrod":"#eee8aa","palegreen":"#98fb98","paleturquoise":"#afeeee","palevioletred":"#d87093","papayawhip":"#ffefd5","peachpuff":"#ffdab9","peru":"#cd853f","pink":"#ffc0cb","plum":"#dda0dd","powderblue":"#b0e0e6","purple":"#800080",
"red":"#ff0000","rosybrown":"#bc8f8f","royalblue":"#4169e1",
"saddlebrown":"#8b4513","salmon":"#fa8072","sandybrown":"#f4a460","seagreen":"#2e8b57","seashell":"#fff5ee","sienna":"#a0522d","silver":"#c0c0c0","skyblue":"#87ceeb","slateblue":"#6a5acd","slategray":"#708090","snow":"#fffafa","springgreen":"#00ff7f","steelblue":"#4682b4",
"tan":"#d2b48c","teal":"#008080","thistle":"#d8bfd8","tomato":"#ff6347","turquoise":"#40e0d0",
"violet":"#ee82ee",
"wheat":"#f5deb3","white":"#ffffff","whitesmoke":"#f5f5f5",
"yellow":"#ffff00","yellowgreen":"#9acd32",
"sun":"#FFFF19"
};
if (typeof colours[colour.toLowerCase()] != 'undefined')
return colours[colour.toLowerCase()];
return false;
}
function hexToRgb(hex) {
var bigint = parseInt(hex, 16);
var r = (bigint >> 16) & 255;
var g = (bigint >> 8) & 255;
var b = bigint & 255;
return {red:r,green:g,blue:b};
}