2019-06-05 13:32:10 -04:00
|
|
|
<!DOCTYPE html>
|
2019-06-24 09:06:41 -04:00
|
|
|
<html lang="en">
|
2019-06-18 12:49:01 -04:00
|
|
|
<head>
|
|
|
|
<title>Juice</title>
|
|
|
|
<link rel="stylesheet" type="text/css" href="/static/juice.css">
|
2019-11-15 10:35:56 -05:00
|
|
|
<script>
|
|
|
|
const init_state = {{ init_state|tojson|safe }};
|
2019-11-17 19:46:57 -05:00
|
|
|
const ws_uri = "{{ url('ws') }}";
|
2019-11-15 10:35:56 -05:00
|
|
|
</script>
|
2019-06-18 12:49:01 -04:00
|
|
|
<script type="text/javascript" src="/static/juice.js"></script>
|
2019-06-19 10:15:08 -04:00
|
|
|
<script>window.onload = load;</script>
|
2019-07-02 08:47:34 -04:00
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=0.8">
|
2019-06-24 09:06:41 -04:00
|
|
|
<meta name="description" content="An IOT hub.">
|
2019-07-02 08:47:34 -04:00
|
|
|
<meta name="theme-color" content="lightblue">
|
|
|
|
<link rel="manifest" href="/static/juice-manifest.webmanifest">
|
|
|
|
<link rel="icon" href="/static/orange-juice.svg">
|
|
|
|
<link rel="icon" href="/static/orange-juice-144p.png">
|
2019-06-18 12:49:01 -04:00
|
|
|
</head>
|
|
|
|
<body>
|
2019-06-20 07:48:11 -04:00
|
|
|
<header>
|
2019-07-02 08:47:34 -04:00
|
|
|
<div id="logo-line">
|
|
|
|
<object id="logo" aria-label="Juice: An IOT hub" data="/static/orange-juice.svg"></object>
|
|
|
|
<h1>Juice</h1>
|
|
|
|
<h3>An IOT hub</h3>
|
|
|
|
</div>
|
2019-06-20 07:48:11 -04:00
|
|
|
<nav>
|
2019-07-02 08:47:34 -04:00
|
|
|
<span class="font-awesome" title="Home"><a href="./"></a></span>
|
|
|
|
<span class="font-awesome" title="Add new device" onclick="new_device()"></span>
|
2019-06-20 07:48:11 -04:00
|
|
|
</nav>
|
|
|
|
</header>
|
2019-06-18 12:49:01 -04:00
|
|
|
<main>
|
|
|
|
<div id="devices">
|
2019-06-18 13:44:35 -04:00
|
|
|
{% for device in network %}
|
2019-11-18 13:05:37 -05:00
|
|
|
{% if device.type == 'RelayDevice' %}
|
2020-11-30 08:40:09 -05:00
|
|
|
{% include 'RelayDevice.html' %}
|
2019-11-18 13:05:37 -05:00
|
|
|
{% elif device.type == 'LightStrip' %}
|
2020-11-30 08:40:09 -05:00
|
|
|
{% include 'LightStrip.html' %}
|
2019-11-25 08:39:42 -05:00
|
|
|
{% elif device.type == 'LixieClock' %}
|
2020-11-30 08:40:09 -05:00
|
|
|
{% include 'LixieClock.html' %}
|
2019-11-18 13:05:37 -05:00
|
|
|
{% endif %}
|
2020-11-30 08:40:09 -05:00
|
|
|
{% endfor %}
|
2019-06-05 13:32:10 -04:00
|
|
|
</div>
|
2019-06-18 12:49:01 -04:00
|
|
|
</main>
|
2019-06-20 08:38:56 -04:00
|
|
|
<template id="RelayDevice_template">
|
2019-06-19 10:15:08 -04:00
|
|
|
<div class="device RelayDevice" id="">
|
2019-06-20 14:51:00 -04:00
|
|
|
<div class="id editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span><span class="delete font-awesome" onclick="delete_device(this.parentElement.parentElement)"></span><span class="lock font-awesome" onclick="lock_device(this.parentElement.parentElement)"></span></div>
|
|
|
|
<div class="description editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span></div>
|
|
|
|
<div class="location editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span></div>
|
|
|
|
<div class="ip_address editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span></div>
|
2019-06-19 10:15:08 -04:00
|
|
|
<div class="sub_devices">
|
2020-12-11 09:49:16 -05:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<template id="RelayOutlet_template">
|
|
|
|
<div class="sub_device RelayOutlet">
|
|
|
|
<div class="id"></div>
|
|
|
|
<object class="outlet_image" alt="Outlet Image" data="/static/outlet.svg"></object>
|
|
|
|
<div class="description editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span></div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<template id="LightStrip_template">
|
|
|
|
<div class="device LightStrip" id="">
|
|
|
|
<div class="id editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span><span class="delete font-awesome" onclick="delete_device(this.parentElement.parentElement)"></span><span class="lock font-awesome" onclick="lock_device(this.parentElement.parentElement)"></span></div>
|
|
|
|
<div class="description editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span></div>
|
|
|
|
<div class="location editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span></div>
|
|
|
|
<div class="mqtt_root editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span></div>
|
|
|
|
<div class="light_controls">
|
|
|
|
<div class="state">
|
|
|
|
<span>State</span><br>
|
|
|
|
<select class="state_select" onchange="state_select(this)">
|
|
|
|
<option selected value="solid">Solid</option>
|
|
|
|
<option value="rainbow">Rainbow</option>
|
|
|
|
<option value="america">America</option>
|
|
|
|
</select>
|
|
|
|
<div class="state_solid" style="display: block">
|
|
|
|
<input type="radio" id="state_solid_all_" name="state_solid_" value="all" onchange="state_solid_amount(this)" checked>
|
|
|
|
<label for="state_solid_all_">All</label><br>
|
|
|
|
<input type="radio" id="state_solid_single_" name="state_solid_" value="single" onchange="state_solid_amount(this)">
|
|
|
|
<label for="state_solid_single_">Single</label><br>
|
|
|
|
<label for="state_solid_all_color_">All:</label>
|
|
|
|
<input type="color" id="state_solid_all_color_" value="#ff0000" onchange="neopixel_state(this.closest('.device'))">
|
|
|
|
</div>
|
|
|
|
<div class="state_rainbow" style="display: none">
|
|
|
|
<table>
|
|
|
|
<tr>
|
|
|
|
<td>Red</td>
|
|
|
|
<td>
|
|
|
|
<input type="number" id="state_rainbow_red_freq_" min="0" max="1" step="0.1" value="0.5" onchange="neopixel_state(this.closest('.device'))">
|
|
|
|
<label for="state_rainbow_red_freq_">f</label>
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<input type="number" id="state_rainbow_red_phase_" min="0" max="10" step="1" value="0" onchange="neopixel_state(this.closest('.device'))">
|
|
|
|
<label for="state_rainbow_red_phase_">Φ</label>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td>Green</td>
|
|
|
|
<td>
|
|
|
|
<input type="number" id="state_rainbow_green_freq_" min="0" max="1" step="0.1" value="0.5" onchange="neopixel_state(this.closest('.device'))">
|
|
|
|
<label for="state_rainbow_green_freq_">f</label>
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<input type="number" id="state_rainbow_green_phase_" min="0" max="10" step="1" value="2" onchange="neopixel_state(this.closest('.device'))">
|
|
|
|
<label for="state_rainbow_green_phase_">Φ</label>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td>Blue</td>
|
|
|
|
<td>
|
|
|
|
<input type="number" id="state_rainbow_blue_freq_" min="0" max="1" step="0.1" value="0.5" onchange="neopixel_state(this.closest('.device'))">
|
|
|
|
<label for="state_rainbow_blue_freq_">f</label>
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<input type="number" id="state_rainbow_blue_phase_" min="0" max="10" step="1" value="4" onchange="neopixel_state(this.closest('.device'))">
|
|
|
|
<label for="state_rainbow_blue_phase_">Φ</label>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><label for="state_rainbow_center_">Center</label></td>
|
|
|
|
<td><input type="number" id="state_rainbow_center_" min="0" max="255" step="1" value="28" onchange="neopixel_state(this.closest('.device'))"></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><label for="state_rainbow_width_">Width</label></td>
|
|
|
|
<td><input type="number" id="state_rainbow_width_" min="0" max="128" step="1" value="28" onchange="neopixel_state(this.closest('.device'))"></td>
|
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
</div>
|
|
|
|
<div class="state_america" style="display: none">
|
|
|
|
<table>
|
|
|
|
<tr>
|
|
|
|
<td><label for="state_america_stripe_">Stripe Length</label></td>
|
|
|
|
<td><input type="number" id="state_america_stripe_" min="1" max="256" step="1" value="8" onchange="neopixel_state(this.closest('.device'))"></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><label for="state_america_magnitude_">Magnitude</label></td>
|
|
|
|
<td><input type="number" id="state_america_magnitude_" min="0" max="255" step="1" value="127" onchange="neopixel_state(this.closest('.device'))"></td>
|
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
</div>
|
2019-06-19 10:15:08 -04:00
|
|
|
</div>
|
2020-12-11 09:49:16 -05:00
|
|
|
<div class="animation">
|
|
|
|
<span>Animation</span><br>
|
|
|
|
<select class="animation_select" onchange="animation_select(this)">
|
|
|
|
<option selected value="static">Static</option>
|
|
|
|
<option value="rotate_left">Rotate Left</option>
|
|
|
|
<option value="rotate_right">Rotate Right</option>
|
|
|
|
</select>
|
|
|
|
<div class="animation_static" style="display: block">
|
|
|
|
</div>
|
|
|
|
<div class="animation_rotate" style="display: none">
|
|
|
|
<label for="animation_rotate_count_">Rotate Count</label>
|
|
|
|
<input type="number" id="animation_rotate_count_" min="1" max="255" step="1" value="1" onchange="neopixel_animation(this.closest('.device'))">
|
|
|
|
</div>
|
|
|
|
Delay
|
|
|
|
<input type="number" id="animation_delay_" min="1" max="255" step="1" value="200" onchange="neopixel_animation(this)">
|
|
|
|
<label for="animation_delay_">ms</label>
|
2019-06-19 10:15:08 -04:00
|
|
|
</div>
|
|
|
|
</div>
|
2020-12-11 09:49:16 -05:00
|
|
|
<div class="sub_devices">
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<template id="NeoPixel_template">
|
|
|
|
<div class="sub_device NeoPixel">
|
|
|
|
<label class="NeoPixel_color" style="background-color: #ff0000">
|
|
|
|
<input class="NeoPixel_color_input" type="color" value="#ff0000" onchange="neopixel_state(this.closest('.sub_device'))" disabled>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<template id="LixieClock_template">
|
|
|
|
<div class="device LixieClock" id="">
|
|
|
|
<div class="id editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span><span class="delete font-awesome" onclick="delete_device(this.parentElement.parentElement)"></span><span class="lock font-awesome" onclick="lock_device(this.parentElement.parentElement)"></span></div>
|
|
|
|
<div class="description editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span></div>
|
|
|
|
<div class="location editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span></div>
|
|
|
|
<div class="mqtt_root editable"><span class="field_value"></span><span class="edit font-awesome" onclick="edit_field(this.parentElement)"></span></div>
|
|
|
|
<div class="lixie_controls">
|
|
|
|
<input type="radio" id="display_mode_time_" class="time" name="display_mode_" value="time" onchange="lixie_display_mode(this)" checked>
|
|
|
|
<label for="display_mode_time_">Time</label><br>
|
|
|
|
<div class='lixie_time_offset' style="display: block">
|
|
|
|
<label for="lixie_time_offset_">Time Zone Offset:</label>
|
|
|
|
<input type="number" id="lixie_time_offset_" class="time_offset" min="-12" max="12" value="-5" onchange="lixie_clock(this)">
|
|
|
|
</div>
|
|
|
|
<input type="radio" id="display_mode_number_" class="number" name="display_mode_" value="number" onchange="lixie_display_mode(this)">
|
|
|
|
<label for="display_mode_number_">Number</label><br>
|
|
|
|
<div class="lixie_number" style="display: none">
|
|
|
|
<label for="lixie_number_">Number:</label>
|
|
|
|
<input type="number" id="lixie_number_" class="number" min="0" max="9999" value="1111" onchange="lixie_clock(this)">
|
|
|
|
</div>
|
|
|
|
<label for="display_color_">Color:</label>
|
|
|
|
<input type="color" id="display_color_" class="color" value="#ff0000" onchange="lixie_clock(this)">
|
|
|
|
</div>
|
|
|
|
<div class="sub_devices">
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<template id="LixieDisplay_template">
|
|
|
|
<div class="sub_device LixieDisplay">
|
|
|
|
LixieDisplay
|
2019-06-19 10:15:08 -04:00
|
|
|
</div>
|
|
|
|
</template>
|
2019-06-18 12:49:01 -04:00
|
|
|
</body>
|
2019-06-05 13:32:10 -04:00
|
|
|
</html>
|