").appendTo(this.container);
68 | this.onSpan = this.onLabel.children('span');
69 | this.handle = $("
").appendTo(this.container);
70 | this.handleCenter = $("
").appendTo(this.handle);
71 | this.handleRight = $("
").appendTo(this.handle);
72 | return true;
73 | };
74 |
75 | iOSCheckbox.prototype.disableTextSelection = function() {
76 | if ($.browser.msie) {
77 | return $([this.handle, this.offLabel, this.onLabel, this.container]).attr("unselectable", "on");
78 | }
79 | };
80 |
81 | iOSCheckbox.prototype._getDimension = function(elem, dimension) {
82 | if ($.fn.actual != null) {
83 | return elem.actual(dimension);
84 | } else {
85 | return elem[dimension]();
86 | }
87 | };
88 |
89 | iOSCheckbox.prototype.optionallyResize = function(mode) {
90 | var newWidth, offLabelWidth, offSpan, onLabelWidth, onSpan;
91 |
92 | onSpan = this.onLabel.find('span');
93 | onLabelWidth = this._getDimension(onSpan, "width");
94 | onLabelWidth += parseInt(onSpan.css('padding-left'), 10);
95 | offSpan = this.offLabel.find('span');
96 | offLabelWidth = this._getDimension(offSpan, "width");
97 | offLabelWidth += parseInt(offSpan.css('padding-right'), 10);
98 | if (mode === "container") {
99 | newWidth = onLabelWidth > offLabelWidth ? onLabelWidth : offLabelWidth;
100 | newWidth += this._getDimension(this.handle, "width") + this.handleMargin;
101 | return this.container.css({
102 | width: newWidth
103 | });
104 | } else {
105 | newWidth = onLabelWidth > offLabelWidth ? onLabelWidth : offLabelWidth;
106 | this.handleCenter.css({
107 | width: newWidth + 4
108 | });
109 | return this.handle.css({
110 | width: newWidth + 7
111 | });
112 | }
113 | };
114 |
115 | iOSCheckbox.prototype.onMouseDown = function(event) {
116 | var x;
117 |
118 | event.preventDefault();
119 | if (this.isDisabled()) {
120 | return;
121 | }
122 | x = event.pageX || event.originalEvent.changedTouches[0].pageX;
123 | iOSCheckbox.currentlyClicking = this.handle;
124 | iOSCheckbox.dragStartPosition = x;
125 | return iOSCheckbox.handleLeftOffset = parseInt(this.handle.css('left'), 10) || 0;
126 | };
127 |
128 | iOSCheckbox.prototype.onDragMove = function(event, x) {
129 | var newWidth, p;
130 |
131 | if (iOSCheckbox.currentlyClicking !== this.handle) {
132 | return;
133 | }
134 | p = (x + iOSCheckbox.handleLeftOffset - iOSCheckbox.dragStartPosition) / this.rightSide;
135 | if (p < 0) {
136 | p = 0;
137 | }
138 | if (p > 1) {
139 | p = 1;
140 | }
141 | newWidth = p * this.rightSide;
142 | this.handle.css({
143 | left: newWidth
144 | });
145 | this.onLabel.css({
146 | width: newWidth + this.handleRadius
147 | });
148 | this.offSpan.css({
149 | marginRight: -newWidth
150 | });
151 | return this.onSpan.css({
152 | marginLeft: -(1 - p) * this.rightSide
153 | });
154 | };
155 |
156 | iOSCheckbox.prototype.onDragEnd = function(event, x) {
157 | var p;
158 |
159 | if (iOSCheckbox.currentlyClicking !== this.handle) {
160 | return;
161 | }
162 | if (this.isDisabled()) {
163 | return;
164 | }
165 | if (iOSCheckbox.dragging) {
166 | p = (x - iOSCheckbox.dragStartPosition) / this.rightSide;
167 | this.elem.prop('checked', p >= 0.5).change();
168 | } else {
169 | this.elem.prop('checked', !this.elem.prop('checked')).change();
170 | }
171 | iOSCheckbox.currentlyClicking = null;
172 | iOSCheckbox.dragging = null;
173 | if (typeof this.onChange === "function") {
174 | this.onChange(this.elem, this.elem.prop('checked'));
175 | }
176 | return this.didChange();
177 | };
178 |
179 | iOSCheckbox.prototype.refresh = function() {
180 | return this.didChange();
181 | };
182 |
183 | iOSCheckbox.prototype.didChange = function() {
184 | var new_left;
185 |
186 | if (this.isDisabled()) {
187 | this.container.addClass(this.disabledClass);
188 | return false;
189 | } else {
190 | this.container.removeClass(this.disabledClass);
191 | }
192 | new_left = this.elem.prop('checked') ? this.rightSide + 2 : 0;
193 | this.handle.animate({
194 | left: new_left
195 | }, this.duration);
196 | this.onLabel.animate({
197 | width: new_left + this.handleRadius
198 | }, this.duration);
199 | this.offSpan.animate({
200 | marginRight: -new_left
201 | }, this.duration);
202 | return this.onSpan.animate({
203 | marginLeft: new_left - this.rightSide
204 | }, this.duration);
205 | };
206 |
207 | iOSCheckbox.prototype.attachEvents = function() {
208 | var localMouseMove, localMouseUp, self;
209 |
210 | self = this;
211 | localMouseMove = function(event) {
212 | return self.onGlobalMove.apply(self, arguments);
213 | };
214 | localMouseUp = function(event) {
215 | self.onGlobalUp.apply(self, arguments);
216 | $(document).unbind('mousemove touchmove', localMouseMove);
217 | return $(document).unbind('mouseup touchend', localMouseUp);
218 | };
219 | this.elem.change(function() {
220 | return self.refresh();
221 | });
222 | return this.container.bind('mousedown touchstart', function(event) {
223 | self.onMouseDown.apply(self, arguments);
224 | $(document).bind('mousemove touchmove', localMouseMove);
225 | return $(document).bind('mouseup touchend', localMouseUp);
226 | });
227 | };
228 |
229 | iOSCheckbox.prototype.initialPosition = function() {
230 | var containerWidth, offset;
231 |
232 | containerWidth = this._getDimension(this.container, "width");
233 | this.offLabel.css({
234 | width: containerWidth - this.containerRadius - 4
235 | });
236 | this.offBorder.css({
237 | left: containerWidth - 4
238 | });
239 | offset = this.containerRadius + 1;
240 | if ($.browser.msie && $.browser.version < 7) {
241 | offset -= 3;
242 | }
243 | this.rightSide = containerWidth - this._getDimension(this.handle, "width") - offset;
244 | if (this.elem.is(':checked')) {
245 | this.handle.css({
246 | left: this.rightSide
247 | });
248 | this.onLabel.css({
249 | width: this.rightSide + this.handleRadius
250 | });
251 | this.offSpan.css({
252 | marginRight: -this.rightSide,
253 | });
254 | } else {
255 | this.onLabel.css({
256 | width: 0
257 | });
258 | this.onSpan.css({
259 | marginLeft: -this.rightSide
260 | });
261 | }
262 | if (this.isDisabled()) {
263 | return this.container.addClass(this.disabledClass);
264 | }
265 | };
266 |
267 | iOSCheckbox.prototype.onGlobalMove = function(event) {
268 | var x;
269 |
270 | if (!(!this.isDisabled() && iOSCheckbox.currentlyClicking)) {
271 | return;
272 | }
273 | event.preventDefault();
274 | x = event.pageX || event.originalEvent.changedTouches[0].pageX;
275 | if (!iOSCheckbox.dragging && (Math.abs(iOSCheckbox.dragStartPosition - x) > this.dragThreshold)) {
276 | iOSCheckbox.dragging = true;
277 | }
278 | return this.onDragMove(event, x);
279 | };
280 |
281 | iOSCheckbox.prototype.onGlobalUp = function(event) {
282 | var x;
283 |
284 | if (!iOSCheckbox.currentlyClicking) {
285 | return;
286 | }
287 | event.preventDefault();
288 | x = event.pageX || event.originalEvent.changedTouches[0].pageX;
289 | this.onDragEnd(event, x);
290 | return false;
291 | };
292 |
293 | iOSCheckbox.defaults = {
294 | duration: 200,
295 | checkedLabel: 'ON',
296 | uncheckedLabel: 'OFF',
297 | resizeHandle: true,
298 | resizeContainer: true,
299 | disabledClass: 'iPhoneCheckDisabled',
300 | containerClass: 'iPhoneCheckContainer',
301 | labelOnClass: 'iPhoneCheckLabelOn',
302 | labelOffClass: 'iPhoneCheckLabelOff',
303 | handleClass: 'iPhoneCheckHandle',
304 | handleCenterClass: 'iPhoneCheckHandleCenter',
305 | handleRightClass: 'iPhoneCheckHandleRight',
306 | dragThreshold: 5,
307 | handleMargin: 15,
308 | handleRadius: 4,
309 | containerRadius: 5,
310 | dataName: "iphoneStyle",
311 | onChange: function() {}
312 | };
313 |
314 | return iOSCheckbox;
315 |
316 | })();
317 |
318 | $.iphoneStyle = this.iOSCheckbox = iOSCheckbox;
319 |
320 | $.fn.iphoneStyle = function() {
321 | var args, checkbox, dataName, existingControl, method, params, _i, _len, _ref, _ref1, _ref2, _ref3;
322 |
323 | args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
324 | dataName = (_ref = (_ref1 = args[0]) != null ? _ref1.dataName : void 0) != null ? _ref : iOSCheckbox.defaults.dataName;
325 | _ref2 = this.filter(':checkbox');
326 | for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
327 | checkbox = _ref2[_i];
328 | existingControl = $(checkbox).data(dataName);
329 | if (existingControl != null) {
330 | method = args[0], params = 2 <= args.length ? __slice.call(args, 1) : [];
331 | if ((_ref3 = existingControl[method]) != null) {
332 | _ref3.apply(existingControl, params);
333 | }
334 | } else {
335 | new iOSCheckbox(checkbox, args[0]);
336 | }
337 | }
338 | return this;
339 | };
340 |
341 | $.fn.iOSCheckbox = function(options) {
342 | var opts;
343 |
344 | if (options == null) {
345 | options = {};
346 | }
347 | opts = $.extend({}, options, {
348 | resizeHandle: false,
349 | disabledClass: 'iOSCheckDisabled',
350 | containerClass: 'iOSCheckContainer',
351 | labelOnClass: 'iOSCheckLabelOn',
352 | labelOffClass: 'iOSCheckLabelOff',
353 | handleClass: 'iOSCheckHandle',
354 | handleCenterClass: 'iOSCheckHandleCenter',
355 | handleRightClass: 'iOSCheckHandleRight',
356 | dataName: 'iOSCheckbox'
357 | });
358 | return this.iphoneStyle(opts);
359 | };
360 |
361 | }).call(this);
362 |
--------------------------------------------------------------------------------
/code/html/custom.css:
--------------------------------------------------------------------------------
1 | #menu .pure-menu-heading {
2 | font-size: 100%;
3 | padding: .5em .5em;
4 | }
5 | .header h2 {
6 | font-size: 1em;
7 | }
8 | .panel {
9 | display: none;
10 | }
11 | .footer {
12 | position: absolute;
13 | bottom: 0;
14 | left: 0;
15 | right: 0;
16 | padding: 10px;
17 | font-size: 80%;
18 | color: #999;
19 | }
20 | #menu .footer a {
21 | text-decoration: none;
22 | padding: 0px;
23 | }
24 | .content {
25 | margin: 0px;
26 | }
27 | .page {
28 | margin-top: 40px;
29 | }
30 | .pure-button {
31 | color: white;
32 | padding: 8px 12px;
33 | border-radius: 4px;
34 | text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
35 | }
36 | .main-buttons {
37 | margin: 50px auto;
38 | text-align: center;
39 | }
40 | .main-buttons button {
41 | width: 100px;
42 | margin: 5px auto;
43 | }
44 | .button-update-password,
45 | .button-update {
46 | background: #1f8dd6;
47 | }
48 | .button-reset {
49 | background: rgb(202, 60, 60);
50 | }
51 | .button-reconnect {
52 | background: rgb(202, 60, 60);
53 | }
54 | .button-apikey {
55 | background: rgb(0, 202, 0);
56 | margin-left: 5px;
57 | }
58 | .button-add-network {
59 | background: rgb(28, 184, 65);
60 | }
61 | .button-del-network {
62 | background: rgb(202, 60, 60);
63 | }
64 | .button-more-network {
65 | background: rgb(223, 117, 20);
66 | }
67 | .button-settings-backup,
68 | .button-settings-restore {
69 | background: rgb(0, 202, 0);
70 | }
71 | .pure-g {
72 | margin-bottom: 20px;
73 | }
74 | legend {
75 | font-weight: bold;
76 | }
77 | .l-box {
78 | padding-right: 1px;
79 | }
80 | .pure-form input[type=text][disabled] {
81 | color: #777777;
82 | }
83 | div.hint {
84 | font-size: 80%;
85 | color: #ccc;
86 | }
87 | .break {
88 | margin-top: 5px;
89 | }
90 | #networks .pure-g {
91 | padding-bottom: 10px;
92 | margin-bottom: 5px;
93 | border-bottom: 2px dashed #e5e5e5;
94 | }
95 | #networks div.more {
96 | display: none;
97 | }
98 | .module {
99 | display: none;
100 | }
101 | .template {
102 | display: none;
103 | }
104 | .pure-form .center {
105 | margin: .5em 0 .2em;
106 | }
107 | .webmode {
108 | display: none;
109 | }
110 | #credentials {
111 | font-size: 200%;
112 | text-align: center;
113 | height: 100px;
114 | width: 400px;
115 | position: fixed;
116 | top: 50%;
117 | left: 50%;
118 | margin-top: -50px;
119 | margin-left: -200px;
120 | }
121 |
--------------------------------------------------------------------------------
/code/html/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/code/html/favicon.ico
--------------------------------------------------------------------------------
/code/html/grids-responsive-min.css:
--------------------------------------------------------------------------------
1 | @media screen and (min-width:35.5em){.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-1-2,.pure-u-sm-1-3,.pure-u-sm-2-3,.pure-u-sm-1-4,.pure-u-sm-3-4,.pure-u-sm-1-5,.pure-u-sm-2-5,.pure-u-sm-3-5,.pure-u-sm-4-5,.pure-u-sm-5-5,.pure-u-sm-1-6,.pure-u-sm-5-6,.pure-u-sm-1-8,.pure-u-sm-3-8,.pure-u-sm-5-8,.pure-u-sm-7-8,.pure-u-sm-1-12,.pure-u-sm-5-12,.pure-u-sm-7-12,.pure-u-sm-11-12,.pure-u-sm-1-24,.pure-u-sm-2-24,.pure-u-sm-3-24,.pure-u-sm-4-24,.pure-u-sm-5-24,.pure-u-sm-6-24,.pure-u-sm-7-24,.pure-u-sm-8-24,.pure-u-sm-9-24,.pure-u-sm-10-24,.pure-u-sm-11-24,.pure-u-sm-12-24,.pure-u-sm-13-24,.pure-u-sm-14-24,.pure-u-sm-15-24,.pure-u-sm-16-24,.pure-u-sm-17-24,.pure-u-sm-18-24,.pure-u-sm-19-24,.pure-u-sm-20-24,.pure-u-sm-21-24,.pure-u-sm-22-24,.pure-u-sm-23-24,.pure-u-sm-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-sm-1-24{width:4.1667%;*width:4.1357%}.pure-u-sm-1-12,.pure-u-sm-2-24{width:8.3333%;*width:8.3023%}.pure-u-sm-1-8,.pure-u-sm-3-24{width:12.5%;*width:12.469%}.pure-u-sm-1-6,.pure-u-sm-4-24{width:16.6667%;*width:16.6357%}.pure-u-sm-1-5{width:20%;*width:19.969%}.pure-u-sm-5-24{width:20.8333%;*width:20.8023%}.pure-u-sm-1-4,.pure-u-sm-6-24{width:25%;*width:24.969%}.pure-u-sm-7-24{width:29.1667%;*width:29.1357%}.pure-u-sm-1-3,.pure-u-sm-8-24{width:33.3333%;*width:33.3023%}.pure-u-sm-3-8,.pure-u-sm-9-24{width:37.5%;*width:37.469%}.pure-u-sm-2-5{width:40%;*width:39.969%}.pure-u-sm-5-12,.pure-u-sm-10-24{width:41.6667%;*width:41.6357%}.pure-u-sm-11-24{width:45.8333%;*width:45.8023%}.pure-u-sm-1-2,.pure-u-sm-12-24{width:50%;*width:49.969%}.pure-u-sm-13-24{width:54.1667%;*width:54.1357%}.pure-u-sm-7-12,.pure-u-sm-14-24{width:58.3333%;*width:58.3023%}.pure-u-sm-3-5{width:60%;*width:59.969%}.pure-u-sm-5-8,.pure-u-sm-15-24{width:62.5%;*width:62.469%}.pure-u-sm-2-3,.pure-u-sm-16-24{width:66.6667%;*width:66.6357%}.pure-u-sm-17-24{width:70.8333%;*width:70.8023%}.pure-u-sm-3-4,.pure-u-sm-18-24{width:75%;*width:74.969%}.pure-u-sm-19-24{width:79.1667%;*width:79.1357%}.pure-u-sm-4-5{width:80%;*width:79.969%}.pure-u-sm-5-6,.pure-u-sm-20-24{width:83.3333%;*width:83.3023%}.pure-u-sm-7-8,.pure-u-sm-21-24{width:87.5%;*width:87.469%}.pure-u-sm-11-12,.pure-u-sm-22-24{width:91.6667%;*width:91.6357%}.pure-u-sm-23-24{width:95.8333%;*width:95.8023%}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-5-5,.pure-u-sm-24-24{width:100%}}@media screen and (min-width:48em){.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-1-2,.pure-u-md-1-3,.pure-u-md-2-3,.pure-u-md-1-4,.pure-u-md-3-4,.pure-u-md-1-5,.pure-u-md-2-5,.pure-u-md-3-5,.pure-u-md-4-5,.pure-u-md-5-5,.pure-u-md-1-6,.pure-u-md-5-6,.pure-u-md-1-8,.pure-u-md-3-8,.pure-u-md-5-8,.pure-u-md-7-8,.pure-u-md-1-12,.pure-u-md-5-12,.pure-u-md-7-12,.pure-u-md-11-12,.pure-u-md-1-24,.pure-u-md-2-24,.pure-u-md-3-24,.pure-u-md-4-24,.pure-u-md-5-24,.pure-u-md-6-24,.pure-u-md-7-24,.pure-u-md-8-24,.pure-u-md-9-24,.pure-u-md-10-24,.pure-u-md-11-24,.pure-u-md-12-24,.pure-u-md-13-24,.pure-u-md-14-24,.pure-u-md-15-24,.pure-u-md-16-24,.pure-u-md-17-24,.pure-u-md-18-24,.pure-u-md-19-24,.pure-u-md-20-24,.pure-u-md-21-24,.pure-u-md-22-24,.pure-u-md-23-24,.pure-u-md-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-md-1-24{width:4.1667%;*width:4.1357%}.pure-u-md-1-12,.pure-u-md-2-24{width:8.3333%;*width:8.3023%}.pure-u-md-1-8,.pure-u-md-3-24{width:12.5%;*width:12.469%}.pure-u-md-1-6,.pure-u-md-4-24{width:16.6667%;*width:16.6357%}.pure-u-md-1-5{width:20%;*width:19.969%}.pure-u-md-5-24{width:20.8333%;*width:20.8023%}.pure-u-md-1-4,.pure-u-md-6-24{width:25%;*width:24.969%}.pure-u-md-7-24{width:29.1667%;*width:29.1357%}.pure-u-md-1-3,.pure-u-md-8-24{width:33.3333%;*width:33.3023%}.pure-u-md-3-8,.pure-u-md-9-24{width:37.5%;*width:37.469%}.pure-u-md-2-5{width:40%;*width:39.969%}.pure-u-md-5-12,.pure-u-md-10-24{width:41.6667%;*width:41.6357%}.pure-u-md-11-24{width:45.8333%;*width:45.8023%}.pure-u-md-1-2,.pure-u-md-12-24{width:50%;*width:49.969%}.pure-u-md-13-24{width:54.1667%;*width:54.1357%}.pure-u-md-7-12,.pure-u-md-14-24{width:58.3333%;*width:58.3023%}.pure-u-md-3-5{width:60%;*width:59.969%}.pure-u-md-5-8,.pure-u-md-15-24{width:62.5%;*width:62.469%}.pure-u-md-2-3,.pure-u-md-16-24{width:66.6667%;*width:66.6357%}.pure-u-md-17-24{width:70.8333%;*width:70.8023%}.pure-u-md-3-4,.pure-u-md-18-24{width:75%;*width:74.969%}.pure-u-md-19-24{width:79.1667%;*width:79.1357%}.pure-u-md-4-5{width:80%;*width:79.969%}.pure-u-md-5-6,.pure-u-md-20-24{width:83.3333%;*width:83.3023%}.pure-u-md-7-8,.pure-u-md-21-24{width:87.5%;*width:87.469%}.pure-u-md-11-12,.pure-u-md-22-24{width:91.6667%;*width:91.6357%}.pure-u-md-23-24{width:95.8333%;*width:95.8023%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-5-5,.pure-u-md-24-24{width:100%}}@media screen and (min-width:64em){.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-1-2,.pure-u-lg-1-3,.pure-u-lg-2-3,.pure-u-lg-1-4,.pure-u-lg-3-4,.pure-u-lg-1-5,.pure-u-lg-2-5,.pure-u-lg-3-5,.pure-u-lg-4-5,.pure-u-lg-5-5,.pure-u-lg-1-6,.pure-u-lg-5-6,.pure-u-lg-1-8,.pure-u-lg-3-8,.pure-u-lg-5-8,.pure-u-lg-7-8,.pure-u-lg-1-12,.pure-u-lg-5-12,.pure-u-lg-7-12,.pure-u-lg-11-12,.pure-u-lg-1-24,.pure-u-lg-2-24,.pure-u-lg-3-24,.pure-u-lg-4-24,.pure-u-lg-5-24,.pure-u-lg-6-24,.pure-u-lg-7-24,.pure-u-lg-8-24,.pure-u-lg-9-24,.pure-u-lg-10-24,.pure-u-lg-11-24,.pure-u-lg-12-24,.pure-u-lg-13-24,.pure-u-lg-14-24,.pure-u-lg-15-24,.pure-u-lg-16-24,.pure-u-lg-17-24,.pure-u-lg-18-24,.pure-u-lg-19-24,.pure-u-lg-20-24,.pure-u-lg-21-24,.pure-u-lg-22-24,.pure-u-lg-23-24,.pure-u-lg-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-lg-1-24{width:4.1667%;*width:4.1357%}.pure-u-lg-1-12,.pure-u-lg-2-24{width:8.3333%;*width:8.3023%}.pure-u-lg-1-8,.pure-u-lg-3-24{width:12.5%;*width:12.469%}.pure-u-lg-1-6,.pure-u-lg-4-24{width:16.6667%;*width:16.6357%}.pure-u-lg-1-5{width:20%;*width:19.969%}.pure-u-lg-5-24{width:20.8333%;*width:20.8023%}.pure-u-lg-1-4,.pure-u-lg-6-24{width:25%;*width:24.969%}.pure-u-lg-7-24{width:29.1667%;*width:29.1357%}.pure-u-lg-1-3,.pure-u-lg-8-24{width:33.3333%;*width:33.3023%}.pure-u-lg-3-8,.pure-u-lg-9-24{width:37.5%;*width:37.469%}.pure-u-lg-2-5{width:40%;*width:39.969%}.pure-u-lg-5-12,.pure-u-lg-10-24{width:41.6667%;*width:41.6357%}.pure-u-lg-11-24{width:45.8333%;*width:45.8023%}.pure-u-lg-1-2,.pure-u-lg-12-24{width:50%;*width:49.969%}.pure-u-lg-13-24{width:54.1667%;*width:54.1357%}.pure-u-lg-7-12,.pure-u-lg-14-24{width:58.3333%;*width:58.3023%}.pure-u-lg-3-5{width:60%;*width:59.969%}.pure-u-lg-5-8,.pure-u-lg-15-24{width:62.5%;*width:62.469%}.pure-u-lg-2-3,.pure-u-lg-16-24{width:66.6667%;*width:66.6357%}.pure-u-lg-17-24{width:70.8333%;*width:70.8023%}.pure-u-lg-3-4,.pure-u-lg-18-24{width:75%;*width:74.969%}.pure-u-lg-19-24{width:79.1667%;*width:79.1357%}.pure-u-lg-4-5{width:80%;*width:79.969%}.pure-u-lg-5-6,.pure-u-lg-20-24{width:83.3333%;*width:83.3023%}.pure-u-lg-7-8,.pure-u-lg-21-24{width:87.5%;*width:87.469%}.pure-u-lg-11-12,.pure-u-lg-22-24{width:91.6667%;*width:91.6357%}.pure-u-lg-23-24{width:95.8333%;*width:95.8023%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-5-5,.pure-u-lg-24-24{width:100%}}@media screen and (min-width:80em){.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-1-2,.pure-u-xl-1-3,.pure-u-xl-2-3,.pure-u-xl-1-4,.pure-u-xl-3-4,.pure-u-xl-1-5,.pure-u-xl-2-5,.pure-u-xl-3-5,.pure-u-xl-4-5,.pure-u-xl-5-5,.pure-u-xl-1-6,.pure-u-xl-5-6,.pure-u-xl-1-8,.pure-u-xl-3-8,.pure-u-xl-5-8,.pure-u-xl-7-8,.pure-u-xl-1-12,.pure-u-xl-5-12,.pure-u-xl-7-12,.pure-u-xl-11-12,.pure-u-xl-1-24,.pure-u-xl-2-24,.pure-u-xl-3-24,.pure-u-xl-4-24,.pure-u-xl-5-24,.pure-u-xl-6-24,.pure-u-xl-7-24,.pure-u-xl-8-24,.pure-u-xl-9-24,.pure-u-xl-10-24,.pure-u-xl-11-24,.pure-u-xl-12-24,.pure-u-xl-13-24,.pure-u-xl-14-24,.pure-u-xl-15-24,.pure-u-xl-16-24,.pure-u-xl-17-24,.pure-u-xl-18-24,.pure-u-xl-19-24,.pure-u-xl-20-24,.pure-u-xl-21-24,.pure-u-xl-22-24,.pure-u-xl-23-24,.pure-u-xl-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-xl-1-24{width:4.1667%;*width:4.1357%}.pure-u-xl-1-12,.pure-u-xl-2-24{width:8.3333%;*width:8.3023%}.pure-u-xl-1-8,.pure-u-xl-3-24{width:12.5%;*width:12.469%}.pure-u-xl-1-6,.pure-u-xl-4-24{width:16.6667%;*width:16.6357%}.pure-u-xl-1-5{width:20%;*width:19.969%}.pure-u-xl-5-24{width:20.8333%;*width:20.8023%}.pure-u-xl-1-4,.pure-u-xl-6-24{width:25%;*width:24.969%}.pure-u-xl-7-24{width:29.1667%;*width:29.1357%}.pure-u-xl-1-3,.pure-u-xl-8-24{width:33.3333%;*width:33.3023%}.pure-u-xl-3-8,.pure-u-xl-9-24{width:37.5%;*width:37.469%}.pure-u-xl-2-5{width:40%;*width:39.969%}.pure-u-xl-5-12,.pure-u-xl-10-24{width:41.6667%;*width:41.6357%}.pure-u-xl-11-24{width:45.8333%;*width:45.8023%}.pure-u-xl-1-2,.pure-u-xl-12-24{width:50%;*width:49.969%}.pure-u-xl-13-24{width:54.1667%;*width:54.1357%}.pure-u-xl-7-12,.pure-u-xl-14-24{width:58.3333%;*width:58.3023%}.pure-u-xl-3-5{width:60%;*width:59.969%}.pure-u-xl-5-8,.pure-u-xl-15-24{width:62.5%;*width:62.469%}.pure-u-xl-2-3,.pure-u-xl-16-24{width:66.6667%;*width:66.6357%}.pure-u-xl-17-24{width:70.8333%;*width:70.8023%}.pure-u-xl-3-4,.pure-u-xl-18-24{width:75%;*width:74.969%}.pure-u-xl-19-24{width:79.1667%;*width:79.1357%}.pure-u-xl-4-5{width:80%;*width:79.969%}.pure-u-xl-5-6,.pure-u-xl-20-24{width:83.3333%;*width:83.3023%}.pure-u-xl-7-8,.pure-u-xl-21-24{width:87.5%;*width:87.469%}.pure-u-xl-11-12,.pure-u-xl-22-24{width:91.6667%;*width:91.6357%}.pure-u-xl-23-24{width:95.8333%;*width:95.8023%}.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-5-5,.pure-u-xl-24-24{width:100%}}
2 |
--------------------------------------------------------------------------------
/code/html/images/border-off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/code/html/images/border-off.png
--------------------------------------------------------------------------------
/code/html/images/border-on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/code/html/images/border-on.png
--------------------------------------------------------------------------------
/code/html/images/handle-center.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/code/html/images/handle-center.png
--------------------------------------------------------------------------------
/code/html/images/handle-left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/code/html/images/handle-left.png
--------------------------------------------------------------------------------
/code/html/images/handle-right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/code/html/images/handle-right.png
--------------------------------------------------------------------------------
/code/html/images/label-off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/code/html/images/label-off.png
--------------------------------------------------------------------------------
/code/html/images/label-on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/code/html/images/label-on.png
--------------------------------------------------------------------------------
/code/html/side-menu.css:
--------------------------------------------------------------------------------
1 | body {
2 | color: #777;
3 | }
4 |
5 | .pure-img-responsive {
6 | max-width: 100%;
7 | height: auto;
8 | }
9 |
10 | /*
11 | Add transition to containers so they can push in and out.
12 | */
13 | #layout,
14 | #menu,
15 | .menu-link {
16 | -webkit-transition: all 0.2s ease-out;
17 | -moz-transition: all 0.2s ease-out;
18 | -ms-transition: all 0.2s ease-out;
19 | -o-transition: all 0.2s ease-out;
20 | transition: all 0.2s ease-out;
21 | }
22 |
23 | /*
24 | This is the parent `
` that contains the menu and the content area.
25 | */
26 | #layout {
27 | position: relative;
28 | padding-left: 0;
29 | }
30 | #layout.active #menu {
31 | left: 150px;
32 | width: 150px;
33 | }
34 |
35 | #layout.active .menu-link {
36 | left: 150px;
37 | }
38 | /*
39 | The content `
` is where all your content goes.
40 | */
41 | .content {
42 | margin: 0 auto;
43 | padding: 0 2em;
44 | max-width: 800px;
45 | margin-bottom: 50px;
46 | line-height: 1.6em;
47 | }
48 |
49 | .header {
50 | margin: 0;
51 | color: #333;
52 | text-align: center;
53 | padding: 2.5em 2em 0;
54 | border-bottom: 1px solid #eee;
55 | }
56 | .header h1 {
57 | margin: 0.2em 0;
58 | font-size: 3em;
59 | font-weight: 300;
60 | }
61 | .header h2 {
62 | font-weight: 300;
63 | color: #ccc;
64 | padding: 0;
65 | margin-top: 0;
66 | }
67 |
68 | .content-subhead {
69 | margin: 50px 0 20px 0;
70 | font-weight: 300;
71 | color: #888;
72 | }
73 |
74 |
75 |
76 | /*
77 | The `#menu` `
` is the parent `
` that contains the `.pure-menu` that
78 | appears on the left side of the page.
79 | */
80 |
81 | #menu {
82 | margin-left: -150px; /* "#menu" width */
83 | width: 150px;
84 | position: fixed;
85 | top: 0;
86 | left: 0;
87 | bottom: 0;
88 | z-index: 1000; /* so the menu or its navicon stays above all content */
89 | background: #191818;
90 | overflow-y: auto;
91 | -webkit-overflow-scrolling: touch;
92 | }
93 | /*
94 | All anchors inside the menu should be styled like this.
95 | */
96 | #menu a {
97 | color: #999;
98 | border: none;
99 | padding: 0.6em 0 0.6em 0.6em;
100 | }
101 |
102 | /*
103 | Remove all background/borders, since we are applying them to #menu.
104 | */
105 | #menu .pure-menu,
106 | #menu .pure-menu ul {
107 | border: none;
108 | background: transparent;
109 | }
110 |
111 | /*
112 | Add that light border to separate items into groups.
113 | */
114 | #menu .pure-menu ul,
115 | #menu .pure-menu .menu-item-divided {
116 | border-top: 1px solid #333;
117 | }
118 | /*
119 | Change color of the anchor links on hover/focus.
120 | */
121 | #menu .pure-menu li a:hover,
122 | #menu .pure-menu li a:focus {
123 | background: #333;
124 | }
125 |
126 | /*
127 | This styles the selected menu item `
`.
128 | */
129 | #menu .pure-menu-selected,
130 | #menu .pure-menu-heading {
131 | background: #1f8dd6;
132 | }
133 | /*
134 | This styles a link within a selected menu item ``.
135 | */
136 | #menu .pure-menu-selected a {
137 | color: #fff;
138 | }
139 |
140 | /*
141 | This styles the menu heading.
142 | */
143 | #menu .pure-menu-heading {
144 | font-size: 110%;
145 | color: #fff;
146 | margin: 0;
147 | }
148 |
149 | /* -- Dynamic Button For Responsive Menu -------------------------------------*/
150 |
151 | /*
152 | The button to open/close the Menu is custom-made and not part of Pure. Here's
153 | how it works:
154 | */
155 |
156 | /*
157 | `.menu-link` represents the responsive menu toggle that shows/hides on
158 | small screens.
159 | */
160 | .menu-link {
161 | position: fixed;
162 | display: block; /* show this only on small screens */
163 | top: 0;
164 | left: 0; /* "#menu width" */
165 | background: #000;
166 | background: rgba(0,0,0,0.7);
167 | font-size: 10px; /* change this value to increase/decrease button size */
168 | z-index: 10;
169 | width: 2em;
170 | height: auto;
171 | padding: 2.1em 1.6em;
172 | }
173 |
174 | .menu-link:hover,
175 | .menu-link:focus {
176 | background: #000;
177 | }
178 |
179 | .menu-link span {
180 | position: relative;
181 | display: block;
182 | }
183 |
184 | .menu-link span,
185 | .menu-link span:before,
186 | .menu-link span:after {
187 | background-color: #fff;
188 | width: 100%;
189 | height: 0.2em;
190 | }
191 |
192 | .menu-link span:before,
193 | .menu-link span:after {
194 | position: absolute;
195 | margin-top: -0.6em;
196 | content: " ";
197 | }
198 |
199 | .menu-link span:after {
200 | margin-top: 0.6em;
201 | }
202 |
203 |
204 | /* -- Responsive Styles (Media Queries) ------------------------------------- */
205 |
206 | /*
207 | Hides the menu at `48em`, but modify this based on your app's needs.
208 | */
209 | @media (min-width: 48em) {
210 |
211 | .header,
212 | .content {
213 | padding-left: 2em;
214 | padding-right: 2em;
215 | }
216 |
217 | #layout {
218 | padding-left: 150px; /* left col width "#menu" */
219 | left: 0;
220 | }
221 | #menu {
222 | left: 150px;
223 | }
224 |
225 | .menu-link {
226 | position: fixed;
227 | left: 150px;
228 | display: none;
229 | }
230 |
231 | #layout.active .menu-link {
232 | left: 150px;
233 | }
234 | }
235 |
236 | @media (max-width: 48em) {
237 | /* Only apply this when the window is small. Otherwise, the following
238 | case results in extra padding on the left:
239 | * Make the window small.
240 | * Tap the menu to trigger the active state.
241 | * Make the window large again.
242 | */
243 | #layout.active {
244 | position: relative;
245 | left: 150px;
246 | }
247 | }
248 |
249 |
--------------------------------------------------------------------------------
/code/html/wheelcolorpicker.css:
--------------------------------------------------------------------------------
1 | /**
2 | * jQuery Wheel Color Picker
3 | * Base Stylesheet
4 | *
5 | * http://www.jar2.net/projects/jquery-wheelcolorpicker
6 | *
7 | * Copyright © 2011-2016 Fajar Chandra. All rights reserved.
8 | * Released under MIT License.
9 | * http://www.opensource.org/licenses/mit-license.php
10 | *
11 | * Note: Width, height, left, and top properties are handled by the
12 | * plugin. These values might change on the fly.
13 | */
14 |
15 | .jQWCP-wWidget {
16 | position: absolute;
17 | width: 250px;
18 | height: 180px;
19 | background: #eee;
20 | box-shadow: 1px 1px 4px rgba(0,0,0,.5);
21 | border-radius: 4px;
22 | border: solid 1px #aaa;
23 | padding: 10px;
24 | z-index: 1001;
25 | }
26 |
27 | .jQWCP-wWidget.jQWCP-block {
28 | position: relative;
29 | border-color: #aaa;
30 | box-shadow: inset 1px 1px 1px #ccc;
31 | }
32 |
33 | .jQWCP-wWheel {
34 | background-size: contain;
35 | position: relative;
36 | float: left;
37 | width: 180px;
38 | height: 180px;
39 | -webkit-border-radius: 90px;
40 | -moz-border-radius: 50%;
41 | border-radius: 50%;
42 | border: solid 1px #aaa;
43 | margin: -1px;
44 | margin-right: 10px;
45 | transition: border .15s;
46 | cursor: crosshair;
47 | }
48 |
49 | .jQWCP-wWheel:hover {
50 | border-color: #666;
51 | }
52 |
53 | .jQWCP-wWheelOverlay {
54 | position: absolute;
55 | top: 0;
56 | left: 0;
57 | width: 100%;
58 | height: 100%;
59 | background: #000;
60 | opacity: 0;
61 | -webkit-border-radius: 90px;
62 | -moz-border-radius: 50%;
63 | border-radius: 50%;
64 | }
65 |
66 | .jQWCP-wWheelCursor {
67 | width: 8px;
68 | height: 8px;
69 | position: absolute;
70 | top: 50%;
71 | left: 50%;
72 | margin: -6px -6px;
73 | cursor: crosshair;
74 | border: solid 2px #fff;
75 | box-shadow: 1px 1px 2px #000;
76 | border-radius: 50%;
77 | }
78 |
79 | .jQWCP-slider-wrapper,
80 | .jQWCP-wPreview {
81 | position: relative;
82 | width: 20px;
83 | height: 180px;
84 | float: left;
85 | margin-right: 10px;
86 | }
87 |
88 | .jQWCP-wWheel:last-child,
89 | .jQWCP-slider-wrapper:last-child,
90 | .jQWCP-wPreview:last-child {
91 | margin-right: 0;
92 | }
93 |
94 | .jQWCP-slider,
95 | .jQWCP-wPreviewBox {
96 | position: absolute;
97 | width: 100%;
98 | height: 100%;
99 | left: 0;
100 | top: 0;
101 | box-sizing: border-box;
102 | border: solid 1px #aaa;
103 | margin: -1px;
104 | -moz-border-radius: 4px;
105 | border-radius: 4px;
106 | transition: border .15s;
107 | }
108 |
109 | .jQWCP-slider {
110 | cursor: crosshair;
111 | }
112 |
113 | .jQWCP-slider-wrapper:hover .jQWCP-slider {
114 | border-color: #666;
115 | }
116 |
117 | .jQWCP-scursor {
118 | position: absolute;
119 | left: 0;
120 | top: 0;
121 | right: 0;
122 | height: 6px;
123 | margin: -5px -1px -5px -3px;
124 | cursor: crosshair;
125 | border: solid 2px #fff;
126 | box-shadow: 1px 1px 2px #000;
127 | border-radius: 4px;
128 | }
129 |
130 | .jQWCP-wAlphaSlider,
131 | .jQWCP-wPreviewBox {
132 | background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEVAQEB/f39eaJUuAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYRBDgK9dKdMgAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAARSURBVAjXY/jPwIAVYRf9DwB+vw/x6vMT1wAAAABJRU5ErkJggg==') center center;
133 | }
134 |
135 | .jQWCP-overlay {
136 | position: fixed;
137 | top: 0;
138 | left: 0;
139 | bottom: 0;
140 | right: 0;
141 | z-index: 1000;
142 | }
143 |
144 | /*********************/
145 |
146 | /* Mobile layout */
147 |
148 | .jQWCP-mobile.jQWCP-wWidget {
149 | position: fixed;
150 | bottom: 0;
151 | left: 0 !important;
152 | top: auto !important;
153 | width: 100%;
154 | height: 75%;
155 | max-height: 240px;
156 | box-sizing: border-box;
157 | border-radius: 0;
158 | }
159 |
--------------------------------------------------------------------------------
/code/lib/readme.txt:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for the project specific (private) libraries.
3 | PlatformIO will compile them to static libraries and link to executable file.
4 |
5 | The source code of each library should be placed in separate directory, like
6 | "lib/private_lib/[here are source files]".
7 |
8 | For example, see how can be organized `Foo` and `Bar` libraries:
9 |
10 | |--lib
11 | | |--Bar
12 | | | |--docs
13 | | | |--examples
14 | | | |--src
15 | | | |- Bar.c
16 | | | |- Bar.h
17 | | |--Foo
18 | | | |- Foo.c
19 | | | |- Foo.h
20 | | |- readme.txt --> THIS FILE
21 | |- platformio.ini
22 | |--src
23 | |- main.c
24 |
25 | Then in `src/main.c` you should use:
26 |
27 | #include
28 | #include
29 |
30 | // rest H/C/CPP code
31 |
32 | PlatformIO will find your libraries automatically, configure preprocessor's
33 | include paths and build them.
34 |
35 | See additional options for PlatformIO Library Dependency Finder `lib_*`:
36 |
37 | http://docs.platformio.org/en/latest/projectconf.html#lib-install
38 |
39 |
--------------------------------------------------------------------------------
/code/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "esp8266-filesystem-builder",
3 | "version": "0.1.0",
4 | "description": "Gulp based build system for ESP8266 file system files",
5 | "main": "gulpfile.js",
6 | "author": "Xose Pérez ",
7 | "license": "GPL-3.0",
8 | "devDependencies": {
9 | "del": "^2.2.1",
10 | "gulp": "^3.9.1",
11 | "gulp-base64-favicon": "^1.0.2",
12 | "gulp-clean-css": "^2.0.10",
13 | "gulp-css-base64": "^1.3.4",
14 | "gulp-gzip": "^1.4.0",
15 | "gulp-htmlmin": "^2.0.0",
16 | "gulp-if": "^2.0.1",
17 | "gulp-inline": "^0.1.1",
18 | "gulp-plumber": "^1.1.0",
19 | "gulp-uglify": "^1.5.3",
20 | "gulp-useref": "^3.1.2"
21 | },
22 | "dependencies": {}
23 | }
24 |
--------------------------------------------------------------------------------
/code/pio_hooks.py:
--------------------------------------------------------------------------------
1 | #!/bin/python
2 |
3 | import subprocess
4 | import socket
5 | from SCons.Script import DefaultEnvironment
6 | env = DefaultEnvironment()
7 |
8 | def before_build_spiffs(source, target, env):
9 | env.Execute("node node_modules/gulp/bin/gulp.js")
10 |
11 | env.AddPreAction(".pioenvs/%s/spiffs.bin" % env['PIOENV'], before_build_spiffs)
12 |
--------------------------------------------------------------------------------
/code/platformio.ini:
--------------------------------------------------------------------------------
1 | [platformio]
2 | env_default = d1-debug
3 | src_dir = espurna
4 | data_dir = espurna/data
5 |
6 | [common]
7 | build_flags = -g -DDEBUG_PORT=Serial -DMQTT_MAX_PACKET_SIZE=400
8 | build_flags_1m128 = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld
9 | lib_deps =
10 | DHT sensor library
11 | Adafruit Unified Sensor
12 | https://github.com/xoseperez/Time
13 | ArduinoJson
14 | https://github.com/me-no-dev/ESPAsyncTCP#36b6b5a
15 | https://github.com/me-no-dev/ESPAsyncWebServer#bab5457
16 | https://github.com/marvinroger/async-mqtt-client#f1b4576
17 | PubSubClient
18 | Embedis
19 | NtpClientLib
20 | OneWire
21 | DallasTemperature
22 | Brzo I2C
23 | https://bitbucket.org/xoseperez/justwifi.git#1.1.3
24 | https://bitbucket.org/xoseperez/hlw8012.git#1.0.0
25 | https://bitbucket.org/xoseperez/fauxmoesp.git#2.1.0
26 | https://bitbucket.org/xoseperez/nofuss.git#0.2.2
27 | https://bitbucket.org/xoseperez/emonliteesp.git#0.1.2
28 | https://bitbucket.org/xoseperez/debounceevent.git#2.0.0
29 | https://github.com/xoseperez/my9291#1.0.0
30 | https://github.com/xoseperez/RemoteSwitch-arduino-library.git
31 | lib_ignore =
32 |
33 | # ------------------------------------------------------------------------------
34 |
35 | [env:d1-debug]
36 | platform = espressif8266
37 | framework = arduino
38 | board = d1_mini
39 | lib_deps = ${common.lib_deps}
40 | lib_ignore = ${common.lib_ignore}
41 | extra_script = pio_hooks.py
42 | build_flags = ${common.build_flags} -DD1_RELAYSHIELD -DDEBUG_FAUXMO=Serial -DNOWSAUTH
43 |
44 | [env:d1-debug-ota]
45 | platform = espressif8266
46 | framework = arduino
47 | board = d1_mini
48 | lib_deps = ${common.lib_deps}
49 | lib_ignore = ${common.lib_ignore}
50 | extra_script = pio_hooks.py
51 | build_flags = ${common.build_flags} -DD1_RELAYSHIELD -DDEBUG_FAUXMO=Serial -DNOWSAUTH
52 | upload_speed = 115200
53 | upload_port = "192.168.4.1"
54 | upload_flags = --auth=fibonacci --port 8266
55 |
56 | [env:node-debug]
57 | platform = espressif8266
58 | framework = arduino
59 | board = nodemcuv2
60 | lib_deps = ${common.lib_deps}
61 | lib_ignore = ${common.lib_ignore}
62 | extra_script = pio_hooks.py
63 | build_flags = ${common.build_flags} -DNODEMCUV2 -DDEBUG_FAUXMO=Serial -DNOWSAUTH
64 |
65 | [env:node-debug-ota]
66 | platform = espressif8266
67 | framework = arduino
68 | board = nodemcuv2
69 | lib_deps = ${common.lib_deps}
70 | lib_ignore = ${common.lib_ignore}
71 | extra_script = pio_hooks.py
72 | build_flags = ${common.build_flags} -DNODEMCUV2 -DDEBUG_FAUXMO=Serial -DNOWSAUTH
73 | upload_speed = 115200
74 | upload_port = "192.168.4.1"
75 | upload_flags = --auth=fibonacci --port 8266
76 |
77 | [env:sonoff-debug]
78 | platform = espressif8266
79 | framework = arduino
80 | board = esp01_1m
81 | lib_deps = ${common.lib_deps}
82 | lib_ignore = ${common.lib_ignore}
83 | extra_script = pio_hooks.py
84 | build_flags = ${common.build_flags_1m128} -DSONOFF
85 |
86 | [env:sonoff-debug-ota]
87 | platform = espressif8266
88 | framework = arduino
89 | board = esp01_1m
90 | lib_deps = ${common.lib_deps}
91 | lib_ignore = ${common.lib_ignore}
92 | extra_script = pio_hooks.py
93 | build_flags = ${common.build_flags_1m128} -DSONOFF
94 | upload_speed = 115200
95 | upload_port = "192.168.4.1"
96 | upload_flags = --auth=fibonacci --port 8266
97 |
98 | [env:sonoff-dht22-debug]
99 | platform = espressif8266
100 | framework = arduino
101 | board = esp01_1m
102 | lib_deps = ${common.lib_deps}
103 | lib_ignore = ${common.lib_ignore}
104 | extra_script = pio_hooks.py
105 | build_flags = ${common.build_flags_1m128} -DSONOFF -DENABLE_DHT=1
106 |
107 | [env:sonoff-ds18b20-debug]
108 | platform = espressif8266
109 | framework = arduino
110 | board = esp01_1m
111 | lib_deps = ${common.lib_deps}
112 | lib_ignore = ${common.lib_ignore}
113 | extra_script = pio_hooks.py
114 | build_flags = ${common.build_flags_1m128} -DSONOFF -DENABLE_DS18B20=1
115 |
116 | [env:sonoff-pow-debug]
117 | platform = espressif8266
118 | framework = arduino
119 | board = esp01_1m
120 | lib_deps = ${common.lib_deps}
121 | lib_ignore = ${common.lib_ignore}
122 | extra_script = pio_hooks.py
123 | build_flags = ${common.build_flags_1m128} -DSONOFF_POW
124 |
125 | [env:sonoff-pow-debug-ota]
126 | platform = espressif8266
127 | framework = arduino
128 | board = esp01_1m
129 | lib_deps = ${common.lib_deps}
130 | lib_ignore = ${common.lib_ignore}
131 | extra_script = pio_hooks.py
132 | build_flags = ${common.build_flags_1m128} -DSONOFF_POW
133 | upload_speed = 115200
134 | upload_port = "192.168.4.1"
135 | upload_flags = --auth=fibonacci --port 8266
136 |
137 | [env:sonoff-dual-debug]
138 | platform = espressif8266
139 | framework = arduino
140 | board = esp01_1m
141 | lib_deps = ${common.lib_deps}
142 | lib_ignore = ${common.lib_ignore}
143 | extra_script = pio_hooks.py
144 | build_flags = ${common.build_flags_1m128} -DSONOFF_DUAL
145 |
146 | [env:sonoff-dual-debug-ota]
147 | platform = espressif8266
148 | framework = arduino
149 | board = esp01_1m
150 | lib_deps = ${common.lib_deps}
151 | lib_ignore = ${common.lib_ignore}
152 | extra_script = pio_hooks.py
153 | build_flags = ${common.build_flags_1m128} -DSONOFF_DUAL
154 | upload_speed = 115200
155 | upload_port = "192.168.4.1"
156 | upload_flags = --auth=fibonacci --port 8266
157 |
158 | [env:sonoff-4ch-debug]
159 | platform = espressif8266
160 | framework = arduino
161 | board = esp8285
162 | lib_deps = ${common.lib_deps}
163 | lib_ignore = ${common.lib_ignore}
164 | extra_script = pio_hooks.py
165 | build_flags = ${common.build_flags_1m128} -DSONOFF_4CH
166 |
167 | [env:sonoff-4ch-debug-ota]
168 | platform = espressif8266
169 | framework = arduino
170 | board = esp8285
171 | lib_deps = ${common.lib_deps}
172 | lib_ignore = ${common.lib_ignore}
173 | extra_script = pio_hooks.py
174 | build_flags = ${common.build_flags_1m128} -DSONOFF_4CH
175 | upload_speed = 115200
176 | upload_port = "192.168.4.1"
177 | upload_flags = --auth=fibonacci --port 8266
178 |
179 | [env:sonoff-touch-debug]
180 | platform = espressif8266
181 | framework = arduino
182 | board = esp8285
183 | lib_deps = ${common.lib_deps}
184 | lib_ignore = ${common.lib_ignore}
185 | extra_script = pio_hooks.py
186 | build_flags = ${common.build_flags_1m128} -DSONOFF_TOUCH
187 |
188 | [env:sonoff-touch-debug-ota]
189 | platform = espressif8266
190 | framework = arduino
191 | board = esp8285
192 | lib_deps = ${common.lib_deps}
193 | lib_ignore = ${common.lib_ignore}
194 | extra_script = pio_hooks.py
195 | build_flags = ${common.build_flags_1m128} -DSONOFF_TOUCH
196 | upload_speed = 115200
197 | upload_port = "192.168.4.1"
198 | upload_flags = --auth=fibonacci --port 8266
199 |
200 | [env:slampher-debug]
201 | platform = espressif8266
202 | framework = arduino
203 | board = esp01_1m
204 | lib_deps = ${common.lib_deps}
205 | lib_ignore = ${common.lib_ignore}
206 | extra_script = pio_hooks.py
207 | build_flags = ${common.build_flags_1m128} -DSLAMPHER
208 |
209 | [env:slampher-debug-ota]
210 | platform = espressif8266
211 | framework = arduino
212 | board = esp01_1m
213 | lib_deps = ${common.lib_deps}
214 | lib_ignore = ${common.lib_ignore}
215 | extra_script = pio_hooks.py
216 | build_flags = ${common.build_flags_1m128} -DSLAMPHER
217 | upload_speed = 115200
218 | upload_port = "192.168.4.1"
219 | upload_flags = --auth=fibonacci --port 8266
220 |
221 | [env:s20-debug]
222 | platform = espressif8266
223 | framework = arduino
224 | board = esp01_1m
225 | lib_deps = ${common.lib_deps}
226 | lib_ignore = ${common.lib_ignore}
227 | extra_script = pio_hooks.py
228 | build_flags = ${common.build_flags_1m128} -DS20
229 |
230 | [env:s20-debug-ota]
231 | platform = espressif8266
232 | framework = arduino
233 | board = esp01_1m
234 | lib_deps = ${common.lib_deps}
235 | lib_ignore = ${common.lib_ignore}
236 | extra_script = pio_hooks.py
237 | build_flags = ${common.build_flags_1m128} -DS20
238 | upload_speed = 115200
239 | upload_port = "192.168.4.1"
240 | upload_flags = --auth=fibonacci --port 8266
241 |
242 | [env:1ch-inching-debug]
243 | platform = espressif8266
244 | framework = arduino
245 | board = esp01_1m
246 | lib_deps = ${common.lib_deps}
247 | lib_ignore = ${common.lib_ignore}
248 | extra_script = pio_hooks.py
249 | build_flags = ${common.build_flags_1m128} -DITEAD_1CH_INCHING
250 |
251 | [env:1ch-inching-debug-ota]
252 | platform = espressif8266
253 | framework = arduino
254 | board = esp01_1m
255 | lib_deps = ${common.lib_deps}
256 | lib_ignore = ${common.lib_ignore}
257 | extra_script = pio_hooks.py
258 | build_flags = ${common.build_flags_1m128} -DITEAD_1CH_INCHING
259 | upload_speed = 115200
260 | upload_port = "192.168.4.1"
261 | upload_flags = --auth=fibonacci --port 8266
262 |
263 | [env:motor-debug]
264 | platform = espressif8266
265 | framework = arduino
266 | board = esp01_1m
267 | lib_deps = ${common.lib_deps}
268 | lib_ignore = ${common.lib_ignore}
269 | extra_script = pio_hooks.py
270 | build_flags = ${common.build_flags_1m128} -DITEAD_MOTOR
271 |
272 | [env:motor-debug-ota]
273 | platform = espressif8266
274 | framework = arduino
275 | board = esp01_1m
276 | lib_deps = ${common.lib_deps}
277 | lib_ignore = ${common.lib_ignore}
278 | extra_script = pio_hooks.py
279 | build_flags = ${common.build_flags_1m128} -DITEAD_MOTOR
280 | upload_speed = 115200
281 | upload_port = "192.168.4.1"
282 | upload_flags = --auth=fibonacci --port 8266
283 |
284 | [env:electrodragon-debug]
285 | platform = espressif8266
286 | framework = arduino
287 | board = esp12e
288 | lib_deps = ${common.lib_deps}
289 | lib_ignore = ${common.lib_ignore}
290 | extra_script = pio_hooks.py
291 | build_flags = ${common.build_flags} -DESP_RELAY_BOARD -DENABLE_DHT=1
292 |
293 | [env:electrodragon-debug-ota]
294 | platform = espressif8266
295 | framework = arduino
296 | board = esp12e
297 | lib_deps = ${common.lib_deps}
298 | lib_ignore = ${common.lib_ignore}
299 | extra_script = pio_hooks.py
300 | build_flags = ${common.build_flags} -DESP_RELAY_BOARD -DENABLE_DHT=1
301 | upload_speed = 115200
302 | upload_port = "192.168.4.1"
303 | upload_flags = --auth=fibonacci --port 8266
304 |
305 | [env:ecoplug-debug]
306 | platform = espressif8266
307 | framework = arduino
308 | board = esp01_1m
309 | lib_deps = ${common.lib_deps}
310 | lib_ignore = ${common.lib_ignore}
311 | extra_script = pio_hooks.py
312 | build_flags = ${common.build_flags_1m128} -DECOPLUG
313 |
314 | [env:ecoplug-debug-ota]
315 | platform = espressif8266
316 | framework = arduino
317 | board = esp01_1m
318 | lib_deps = ${common.lib_deps}
319 | lib_ignore = ${common.lib_ignore}
320 | extra_script = pio_hooks.py
321 | build_flags = ${common.build_flags_1m128} -DECOPLUG
322 | upload_speed = 115200
323 | upload_port = "192.168.4.1"
324 | upload_flags = --auth=fibonacci --port 8266
325 |
326 | [env:jangoe-debug]
327 | platform = espressif8266
328 | framework = arduino
329 | board = esp12e
330 | lib_deps = ${common.lib_deps}
331 | lib_ignore = ${common.lib_ignore}
332 | extra_script = pio_hooks.py
333 | build_flags = ${common.build_flags} -DWIFI_RELAY_NC
334 |
335 | [env:jangoe-debug-ota]
336 | platform = espressif8266
337 | framework = arduino
338 | board = esp12e
339 | lib_deps = ${common.lib_deps}
340 | lib_ignore = ${common.lib_ignore}
341 | extra_script = pio_hooks.py
342 | build_flags = ${common.build_flags} -DWIFI_RELAY_NC
343 | upload_speed = 115200
344 | upload_port = "192.168.4.1"
345 | upload_flags = --auth=fibonacci --port 8266
346 |
347 | [env:mqtt-relay-debug]
348 | platform = espressif8266
349 | framework = arduino
350 | board = esp_wroom_02
351 | lib_deps = ${common.lib_deps}
352 | lib_ignore = ${common.lib_ignore}
353 | extra_script = pio_hooks.py
354 | build_flags = ${common.build_flags} -DMQTT_RELAY -DENABLE_DS18B20=1
355 |
356 | [env:mqtt-relay-debug-ota]
357 | platform = espressif8266
358 | framework = arduino
359 | board = esp_wroom_02
360 | lib_deps = ${common.lib_deps}
361 | lib_ignore = ${common.lib_ignore}
362 | extra_script = pio_hooks.py
363 | build_flags = ${common.build_flags} -DMQTT_RELAY -DENABLE_DS18B20=1
364 | upload_speed = 115200
365 | upload_port = "192.168.4.1"
366 | upload_flags = --auth=fibonacci --port 8266
367 |
368 | [env:wifi-relays-debug]
369 | platform = espressif8266
370 | framework = arduino
371 | board = esp01_1m
372 | lib_deps = ${common.lib_deps}
373 | lib_ignore = ${common.lib_ignore}
374 | extra_script = pio_hooks.py
375 | build_flags = ${common.build_flags_1m128} -DWIFI_RELAYS_BOARD_KIT
376 |
377 | [env:wifi-relays-debug-ota]
378 | platform = espressif8266
379 | framework = arduino
380 | board = esp01_1m
381 | lib_deps = ${common.lib_deps}
382 | lib_ignore = ${common.lib_ignore}
383 | extra_script = pio_hooks.py
384 | build_flags = ${common.build_flags_1m128} -DWIFI_RELAYS_BOARD_KIT
385 | upload_speed = 115200
386 | upload_port = "192.168.4.1"
387 | upload_flags = --auth=fibonacci --port 8266
388 |
389 | [env:ai-light-debug]
390 | platform = espressif8266
391 | framework = arduino
392 | board = esp8285
393 | lib_deps = ${common.lib_deps}
394 | lib_ignore = ${common.lib_ignore}
395 | extra_script = pio_hooks.py
396 | build_flags = ${common.build_flags_1m128} -DAI_LIGHT
397 |
398 | [env:ai-light-debug-ota]
399 | platform = espressif8266
400 | framework = arduino
401 | board = esp8285
402 | lib_deps = ${common.lib_deps}
403 | lib_ignore = ${common.lib_ignore}
404 | extra_script = pio_hooks.py
405 | build_flags = ${common.build_flags_1m128} -DAI_LIGHT
406 | upload_speed = 115200
407 | upload_port = "192.168.4.1"
408 | upload_flags = --auth=fibonacci --port 8266
409 |
410 | [env:led-controller-debug]
411 | platform = espressif8266
412 | framework = arduino
413 | board = esp12e
414 | lib_deps = ${common.lib_deps}
415 | lib_ignore = ${common.lib_ignore}
416 | extra_script = pio_hooks.py
417 | build_flags = ${common.build_flags} -DLED_CONTROLLER
418 |
419 | [env:led-controller-debug-ota]
420 | platform = espressif8266
421 | framework = arduino
422 | board = esp12e
423 | lib_deps = ${common.lib_deps}
424 | lib_ignore = ${common.lib_ignore}
425 | extra_script = pio_hooks.py
426 | build_flags = ${common.build_flags} -DLED_CONTROLLER
427 | upload_speed = 115200
428 | upload_port = "192.168.4.1"
429 | upload_flags = --auth=fibonacci --port 8266
430 |
--------------------------------------------------------------------------------
/images/devices/1ch-inching.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/1ch-inching.jpg
--------------------------------------------------------------------------------
/images/devices/aithinker-ailight.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/aithinker-ailight.jpg
--------------------------------------------------------------------------------
/images/devices/d1mini.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/d1mini.jpg
--------------------------------------------------------------------------------
/images/devices/electrodragon-relay-board.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/electrodragon-relay-board.jpg
--------------------------------------------------------------------------------
/images/devices/jangoe-wifi-relay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/jangoe-wifi-relay.png
--------------------------------------------------------------------------------
/images/devices/jorgegarcia-wifi-relays-board-kit.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/jorgegarcia-wifi-relays-board-kit.jpg
--------------------------------------------------------------------------------
/images/devices/motor-switch.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/motor-switch.jpg
--------------------------------------------------------------------------------
/images/devices/mqtt-relay.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/mqtt-relay.jpg
--------------------------------------------------------------------------------
/images/devices/s20.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/s20.jpg
--------------------------------------------------------------------------------
/images/devices/slampher.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/slampher.jpg
--------------------------------------------------------------------------------
/images/devices/sonoff-4ch.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/sonoff-4ch.jpg
--------------------------------------------------------------------------------
/images/devices/sonoff-basic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/sonoff-basic.jpg
--------------------------------------------------------------------------------
/images/devices/sonoff-dual.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/sonoff-dual.jpg
--------------------------------------------------------------------------------
/images/devices/sonoff-led.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/sonoff-led.jpg
--------------------------------------------------------------------------------
/images/devices/sonoff-pow.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/sonoff-pow.jpg
--------------------------------------------------------------------------------
/images/devices/sonoff-rf.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/sonoff-rf.jpg
--------------------------------------------------------------------------------
/images/devices/sonoff-sv.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/sonoff-sv.jpg
--------------------------------------------------------------------------------
/images/devices/sonoff-th10-th16.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/sonoff-th10-th16.jpg
--------------------------------------------------------------------------------
/images/devices/sonoff-touch.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/sonoff-touch.jpg
--------------------------------------------------------------------------------
/images/devices/workchoice-ecoplug.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SensorsIot/Espurna-Framework/ed8c754fd86a704670ef38187313f0dab3e1ecba/images/devices/workchoice-ecoplug.jpg
--------------------------------------------------------------------------------