2018-01-01 18:56:07 +00:00
|
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
|
|
<head>
|
|
|
|
<meta charset="UTF-8">
|
|
|
|
<title></title>
|
|
|
|
<meta name="theme-color" content="#000000">
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
|
<link rel="stylesheet" href="bundle.css">
|
|
|
|
<script src="bundle.js"></script>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="app">
|
|
|
|
<div v-cloak>
|
2018-01-18 16:10:18 +00:00
|
|
|
<div class="notificationContainer">
|
2018-01-22 22:01:49 +00:00
|
|
|
<div class="notification" :class="{ error: notification != null && notification.error }" v-if="notification != null" @click.prevent="hideNotification">
|
2018-01-18 16:10:18 +00:00
|
|
|
<span class="message">{{ notification.message }}</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
2018-01-01 18:56:07 +00:00
|
|
|
<div id="container">
|
|
|
|
<div class="header">
|
|
|
|
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXBJREFUeNrsWdENgjAQLcYBcAPcACdQN4AN2MC4gRsYJ9ENdAPYADaADepdUhM1qFjurgp9ScMHgd713V3ftUp5eHgMF1rrGEau6VHD2HMbH5qJOLHra+fkzbsYRshM8pLTgUIgSgvuMMoYw+iMYTr6QhNYMrNiNywILlyVKdcyyPsmcRsyU50kgHtQQu2AdNJFpDkAK4I/LIWMb2AsIBcq0iRGeQGPTZfV6QE0+gDGF2rosGEgMQxIAhnZAiPN84upRf0/OlpsLCBp3yq0chgtCUUZrRw6QDO3EWHSqF9tarZaSKJXeJDdbQlsE0KD6JN/KoRsGhxXKClCKHJIfkThwMWhA6dBSolRijkJOd1ZUv9yQ9OpqbHpiaUVaEbZE7tIIjoBKXysos1c4V8ebLEdbv2bcMsE7gjuBdvXRSJ4F+/wqIXXrIGwmX3zwacLDheNO91OjLQKd14VMDCnYgCxVjI3NTe1mSoPD49x4SrAAG9qPn4eovCMAAAAAElFTkSuQmCC" />
|
|
|
|
<h1>{{ $t('title') }}</h1>
|
2018-02-12 21:13:03 +00:00
|
|
|
<h2>{{ status.systemID !== null ? $t('systemID') + ': ' + status.systemID : '' }}</h2>
|
2018-01-01 18:56:07 +00:00
|
|
|
|
|
|
|
<div class="wifistatus">
|
|
|
|
<div class="connection">
|
|
|
|
<div class="indicator" :data-status="wifiStatus.ap.enabled ? 'connected' : 'disconnected'"></div> {{ $t('wifiStatus.accesspoint.title') }} {{ wifiStatus.ap.enabled ? wifiStatus.ap.ip : $t('wifiStatus.accesspoint.disabled') }}
|
|
|
|
</div>
|
|
|
|
<div class="connection">
|
|
|
|
<div class="indicator" :data-status="getWiFiStationStatus()"></div> {{ $t('wifiStatus.stationmode.title') }} {{ getWiFiStationStatusText() }}
|
|
|
|
</div>
|
2018-02-12 21:13:03 +00:00
|
|
|
<div class="connection">
|
|
|
|
<div class="indicator" data-status="disconnected"></div> {{ $t('deviceTime') }}{{ getDeviceTime }}
|
|
|
|
</div>
|
2018-01-01 18:56:07 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div v-if="loading" class="loading">
|
|
|
|
{{ $t('loading') }} {{ loadingIndicator }}
|
|
|
|
</div>
|
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div v-if="!loading && calibration === null">
|
2018-02-12 21:13:03 +00:00
|
|
|
<div class="warning" v-if="hasResetError">
|
|
|
|
<p>
|
|
|
|
{{ $t('error.resetError') }}
|
|
|
|
</p>
|
|
|
|
|
|
|
|
<p class="resetReason">
|
|
|
|
{{ $t('error.resetReason.' + status.resetReason) }}
|
|
|
|
</p>
|
|
|
|
|
|
|
|
<p v-if="status.stackTrace">
|
|
|
|
{{ $t('error.stackTrace') }}
|
|
|
|
</p>
|
|
|
|
|
2018-03-19 06:45:54 +00:00
|
|
|
<a class="button button-primary" href="/api/stacktrace/get" v-if="status.stackTrace">{{ $t('error.stackTraceDownload') }}</a>
|
|
|
|
<a class="button" @click="deleteStackTrace">{{ $t('error.stackTraceDelete') }}</a>
|
2018-02-12 21:13:03 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="navigation tabs">
|
2018-01-22 22:01:49 +00:00
|
|
|
<a class="button" :class="{ 'active': activeTab == 'status' }" @click="activeTab = 'status'">{{ $t('status.tabTitle') }}</a><a class="button" :class="{ 'active': activeTab == 'triggers' }" @click="activeTab = 'triggers'">{{ $t('triggers.tabTitle') }}</a><a class="button" :class="{ 'active': activeTab == 'connection' }" @click="activeTab = 'connection'">{{ $t('connection.tabTitle') }}</a><a class="button" :class="{ 'active': activeTab == 'system' }" @click="activeTab = 'system'">{{ $t('system.tabTitle') }}</a>
|
2018-01-01 18:56:07 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<div v-if="activeTab == 'status'">
|
2018-01-07 22:12:42 +00:00
|
|
|
<!--
|
|
|
|
|
|
|
|
Status tab
|
|
|
|
|
|
|
|
-->
|
2018-01-01 18:56:07 +00:00
|
|
|
<h3>{{ $t('status.title') }}</h3>
|
|
|
|
|
2018-01-23 14:06:51 +00:00
|
|
|
<div><radio :title="$t('status.allStepsTrue')" v-model="allSteps" :id="true"></radio></div>
|
|
|
|
<div><radio :title="$t('status.allStepsFalse')" v-model="allSteps" :id="false"></radio></div>
|
2018-01-22 22:01:49 +00:00
|
|
|
|
2018-01-07 22:12:42 +00:00
|
|
|
<div class="sliders">
|
|
|
|
<div class="step" v-if="allSteps">
|
|
|
|
<span class="value">{{ Math.floor(allStepsValue / 255 * 100) }}%</span>
|
|
|
|
<div class="slidercontainer">
|
|
|
|
<input type="range" min="0" max="255" class="slider" v-model.number="allStepsValue">
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="step" v-if="!allSteps" v-for="(step, index) in steps">
|
|
|
|
<span class="value">{{ Math.floor(step.value / 255 * 100) }}%</span>
|
|
|
|
<div class="slidercontainer">
|
|
|
|
<input type="range" min="0" max="255" class="slider" v-model.number="step.value">
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-01-01 18:56:07 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div v-if="activeTab == 'triggers'">
|
2018-01-07 22:12:42 +00:00
|
|
|
<!--
|
|
|
|
|
|
|
|
Triggers tab
|
|
|
|
|
|
|
|
-->
|
2018-01-18 16:10:18 +00:00
|
|
|
<form @submit.prevent="applyTimeTriggers">
|
2018-01-22 22:01:49 +00:00
|
|
|
<h3>{{ $t('triggers.timeTitle') }}</h3>
|
2018-01-07 22:12:42 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<check v-model.boolean="triggers.time.enabled" :title="$t('triggers.timeEnabled')"></check>
|
2018-01-12 15:20:28 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<div v-if="triggers.time.enabled">
|
|
|
|
<div class="warning" v-if="!wifiStatus.station.enabled || wifiStatus.station.status != 3">
|
|
|
|
{{ $t('triggers.timeInternet') }}
|
|
|
|
</div>
|
2018-01-12 15:20:28 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<label for="timeTransitionTime">{{ $t('triggers.timeTransitionTime') }}</label>
|
|
|
|
<input type="number" id="timeTransitionTime" v-model.number="triggers.time.transitionTime">
|
2018-01-17 15:57:14 +00:00
|
|
|
|
2018-01-23 14:06:51 +00:00
|
|
|
<h4>Regels</h4>
|
2018-01-22 22:01:49 +00:00
|
|
|
<div v-if="triggers.time.triggers.length">
|
2018-01-23 14:06:51 +00:00
|
|
|
<div v-for="(trigger, index) in triggers.time.triggers" class="panel" :class="{ active: trigger.enabled }">
|
2018-01-22 22:01:49 +00:00
|
|
|
<div class="panel-header">
|
|
|
|
<check v-model.boolean="trigger.enabled" :title="$t('triggers.timeTriggerEnabled')"></check>
|
|
|
|
|
|
|
|
<span class="actions">
|
|
|
|
<a href="#" @click.prevent="deleteTimeTrigger(index)">{{ $t('triggers.timeDelete') }}</a>
|
|
|
|
</span>
|
|
|
|
<div class="clear"></div>
|
|
|
|
</div>
|
2018-01-17 15:57:14 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<div class="panel-body">
|
|
|
|
<select v-model.number="trigger.triggerType" class="inline">
|
|
|
|
<option value="0">{{ $t('triggers.timeFixedTime') }}</option>
|
|
|
|
<option value="1">{{ $t('triggers.timeSunrise') }}</option>
|
|
|
|
<option value="2">{{ $t('triggers.timeSunset') }}</option>
|
|
|
|
</select>
|
|
|
|
|
|
|
|
<select v-model.number="trigger.fixedTime" class="inline" v-if="trigger.triggerType == 0">
|
|
|
|
<option v-for="time in fixedTimes" :value="time">{{ getDisplayTime(time, false) }}</option>
|
|
|
|
</select>
|
|
|
|
<select v-model.number="trigger.relativeTime" class="inline" v-else>
|
|
|
|
<option v-for="time in relativeTimes" :value="time">{{ getDisplayTime(time, true) }}</option>
|
|
|
|
</select>
|
|
|
|
|
|
|
|
<div class="weekdays">
|
|
|
|
<check v-model.boolean="trigger.monday" :title="$t('triggers.timeMonday')"></check>
|
|
|
|
<check v-model.boolean="trigger.tuesday" :title="$t('triggers.timeTuesday')"></check>
|
|
|
|
<check v-model.boolean="trigger.wednesday" :title="$t('triggers.timeWednesday')"></check>
|
|
|
|
<check v-model.boolean="trigger.thursday" :title="$t('triggers.timeThursday')"></check>
|
|
|
|
<check v-model.boolean="trigger.friday" :title="$t('triggers.timeFriday')"></check>
|
|
|
|
<check v-model.boolean="trigger.saturday" :title="$t('triggers.timeSaturday')"></check>
|
|
|
|
<check v-model.boolean="trigger.sunday" :title="$t('triggers.timeSunday')"></check>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="step">
|
|
|
|
<span class="value">{{ Math.floor(trigger.brightness / 255 * 100) }}%</span>
|
|
|
|
<div class="slidercontainer">
|
|
|
|
<input type="range" min="0" max="255" class="slider" v-model.number="trigger.brightness">
|
2018-01-17 22:28:39 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-01-22 22:01:49 +00:00
|
|
|
</div>
|
2018-01-17 15:57:14 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<div v-else class="nodata">
|
|
|
|
{{ $t('triggers.timeNoData') }}
|
2018-01-17 22:28:39 +00:00
|
|
|
</div>
|
2018-01-18 16:10:18 +00:00
|
|
|
|
|
|
|
<div class="buttons">
|
2018-01-23 14:06:51 +00:00
|
|
|
<button :disabled="saving" @click.prevent="addTimeTrigger">{{ $t('triggers.timeAdd') }}</button>
|
2018-01-18 16:10:18 +00:00
|
|
|
</div>
|
2018-01-22 22:01:49 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="buttons">
|
2018-01-28 19:03:47 +00:00
|
|
|
<input type="submit" :disabled="saving" :value="saving ? $t('applyButtonSaving') : $t('applyButton')">
|
2018-01-22 22:01:49 +00:00
|
|
|
</div>
|
2018-01-18 16:10:18 +00:00
|
|
|
</form>
|
2018-01-17 22:28:39 +00:00
|
|
|
|
2018-01-18 16:10:18 +00:00
|
|
|
<form @submit.prevent="applyMotionTriggers">
|
2018-01-22 22:01:49 +00:00
|
|
|
<h3>{{ $t('triggers.motionTitle') }}</h3>
|
2018-01-12 15:20:28 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<check v-model.boolean="triggers.motion.enabled" :title="$t('triggers.motionEnabled')"></check>
|
|
|
|
|
|
|
|
<div v-if="triggers.motion.enabled">
|
2018-04-22 08:30:34 +00:00
|
|
|
<label for="motionEnabledDuringTimeTrigger">{{ $t('triggers.motionEnabledDuringTimeTrigger') }}</label>
|
|
|
|
<select v-model="triggers.motion.enabledDuringTimeTrigger" id="motionEnabledDuringTimeTrigger">
|
|
|
|
<option value="0">{{ $t('triggers.motionEnabledDuringTimeTriggerNever') }}</option>
|
|
|
|
<option value="1">{{ $t('triggers.motionEnabledDuringTimeTriggerAlways') }}</option>
|
|
|
|
<option value="2">{{ $t('triggers.motionEnabledDuringTimeTriggerOnly') }}</option>
|
|
|
|
</select>
|
2018-02-16 21:02:55 +00:00
|
|
|
|
2018-04-29 09:01:43 +00:00
|
|
|
<div>
|
|
|
|
<check v-model.boolean="triggers.motion.enabledDuringDay" :disabled="triggers.motion.enabledDuringTimeTrigger == 2" :title="$t('triggers.motionEnabledDuringDay')"></check>
|
|
|
|
</div>
|
2018-01-22 22:01:49 +00:00
|
|
|
|
|
|
|
<label for="motionTransitionTime">{{ $t('triggers.motionTransitionTime') }}</label>
|
|
|
|
<input type="number" id="motionTransitionTime" v-model.number="triggers.motion.transitionTime">
|
|
|
|
|
2018-02-16 21:02:55 +00:00
|
|
|
<label for="motionDelay">{{ $t('triggers.motionDelay') }}</label>
|
|
|
|
<input type="number" id="motionDelay" v-model.number="triggers.motion.delay">
|
|
|
|
|
2018-01-23 14:06:51 +00:00
|
|
|
<h4>Regels</h4>
|
2018-01-22 22:01:49 +00:00
|
|
|
<div v-if="triggers.motion.triggers.length">
|
2018-01-23 14:06:51 +00:00
|
|
|
<div v-for="(trigger, index) in triggers.motion.triggers" class="panel" :class="{ active: trigger.enabled }">
|
2018-01-22 22:01:49 +00:00
|
|
|
<div class="panel-header">
|
|
|
|
<check v-model.boolean="trigger.enabled" :title="$t('triggers.motionTriggerEnabled')"></check>
|
|
|
|
<span class="actions">
|
|
|
|
<a href="#" @click.prevent="deleteMotionTrigger(index)">{{ $t('triggers.motionDelete') }}</a>
|
|
|
|
</span>
|
|
|
|
<div class="clear"></div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="panel-body">
|
|
|
|
<label :for="'motion' + index + '_pin'">{{ $t('triggers.motionPin') }}</label>
|
|
|
|
<input type="number" :id="'motion' + index + '_pin'" v-model.number="trigger.pin">
|
|
|
|
|
|
|
|
<label :for="'motion' + index + '_direction'">{{ $t('triggers.motionDirection') }}</label>
|
|
|
|
<select :id="'motion' + index + '_direction'" v-model.number="trigger.direction">
|
|
|
|
<option value="1">{{ $t('triggers.motionDirectionNonDirectional') }}</option>
|
|
|
|
<option value="2">{{ $t('triggers.motionDirectionTopDown') }}</option>
|
|
|
|
<option value="3">{{ $t('triggers.motionDirectionBottomUp') }}</option>
|
|
|
|
</select>
|
|
|
|
|
|
|
|
<div class="step">
|
|
|
|
<span class="value">{{ Math.floor(trigger.brightness / 255 * 100) }}%</span>
|
|
|
|
<div class="slidercontainer">
|
|
|
|
<input type="range" min="0" max="255" class="slider" v-model.number="trigger.brightness">
|
2018-01-17 15:57:14 +00:00
|
|
|
</div>
|
2018-01-12 15:20:28 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-01-22 22:01:49 +00:00
|
|
|
</div>
|
2018-01-12 15:20:28 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<div v-else class="nodata">
|
|
|
|
{{ $t('triggers.motionNoData') }}
|
2018-01-17 15:57:14 +00:00
|
|
|
</div>
|
2018-01-01 18:56:07 +00:00
|
|
|
|
2018-01-18 16:10:18 +00:00
|
|
|
<div class="buttons">
|
2018-01-23 14:06:51 +00:00
|
|
|
<button :disabled="saving" @click.prevent="addMotionTrigger">{{ $t('triggers.motionAdd') }}</button>
|
2018-01-18 16:10:18 +00:00
|
|
|
</div>
|
2018-01-22 22:01:49 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="buttons">
|
2018-01-28 19:03:47 +00:00
|
|
|
<input type="submit" :disabled="saving" :value="saving ? $t('applyButtonSaving') : $t('applyButton')">
|
2018-01-22 22:01:49 +00:00
|
|
|
</div>
|
2018-01-01 18:56:07 +00:00
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div v-if="activeTab == 'connection'">
|
2018-01-07 22:12:42 +00:00
|
|
|
<!--
|
|
|
|
|
|
|
|
Connection tab
|
|
|
|
|
|
|
|
-->
|
2018-01-01 18:56:07 +00:00
|
|
|
<form @submit.prevent="applyConnection">
|
2018-01-22 22:01:49 +00:00
|
|
|
<h3>{{ $t('connection.title') }}</h3>
|
2018-01-01 18:56:07 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<check v-model.boolean="connection.accesspoint" :title="$t('connection.accesspoint')"></check>
|
|
|
|
<span class="hint">{{ $t('connection.accesspointHint') }}</span>
|
2018-01-01 18:56:07 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<check v-model.boolean="connection.station" :title="$t('connection.stationmode')"></check>
|
|
|
|
<span class="hint">{{ $t('connection.stationmodeHint') }}</span>
|
2018-01-01 18:56:07 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<label for="ssid">{{ $t('connection.ssid') }}</label>
|
|
|
|
<input type="text" id="ssid" v-model="connection.ssid" :disabled="!connection.station">
|
2018-01-01 18:56:07 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<label for="password">{{ $t('connection.password') }}</label>
|
|
|
|
<input type="password" id="password" v-model="connection.password" :disabled="!connection.station">
|
2018-01-01 18:56:07 +00:00
|
|
|
|
2018-01-23 14:06:51 +00:00
|
|
|
<check v-model.boolean="connection.dhcp" :disabled="!connection.station" :title="$t('connection.dhcp')" class="form-control"></check>
|
2018-01-22 22:01:49 +00:00
|
|
|
<span class="hint">{{ $t('connection.dhcpHint') }}</span>
|
2018-01-01 18:56:07 +00:00
|
|
|
|
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<div class="suboptions">
|
|
|
|
<label for="ip">{{ $t('connection.ipaddress') }}</label>
|
|
|
|
<input type="text" id="ip" v-model="connection.ip" :disabled="!connection.station || connection.dhcp">
|
2018-01-01 18:56:07 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<label for="subnetmask">{{ $t('connection.subnetmask') }}</label>
|
|
|
|
<input type="text" id="subnetmask" v-model="connection.subnetmask" :disabled="!connection.station || connection.dhcp">
|
2018-01-01 18:56:07 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<label for="gateway">{{ $t('connection.gateway') }}</label>
|
|
|
|
<input type="text" id="gateway" v-model="connection.gateway" :disabled="!connection.station || connection.dhcp">
|
|
|
|
</div>
|
2018-01-01 18:56:07 +00:00
|
|
|
|
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<label for="hostname">{{ $t('connection.hostname') }}</label>
|
|
|
|
<input type="text" :placeholder="$t('connection.hostnamePlaceholder')" id="hostname" v-model="connection.hostname" :disabled="!connection.station">
|
2018-01-01 18:56:07 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<div class="buttons">
|
2018-01-28 19:03:47 +00:00
|
|
|
<input type="submit" :disabled="saving" :value="saving ? $t('applyButtonSaving') : $t('applyButton')">
|
2018-01-22 22:01:49 +00:00
|
|
|
</div>
|
2018-01-01 18:56:07 +00:00
|
|
|
</form>
|
|
|
|
</div>
|
2018-01-01 20:00:56 +00:00
|
|
|
|
2018-01-11 20:03:46 +00:00
|
|
|
<div v-if="activeTab == 'system'">
|
2018-01-07 22:12:42 +00:00
|
|
|
<!--
|
|
|
|
|
2018-01-11 20:03:46 +00:00
|
|
|
System tab
|
2018-01-07 22:12:42 +00:00
|
|
|
|
|
|
|
-->
|
2018-01-26 10:50:42 +00:00
|
|
|
<form @submit.prevent="uploadFirmware">
|
2018-01-22 22:01:49 +00:00
|
|
|
<h3>{{ $t('system.firmwareTitle') }}</h3>
|
2018-01-01 20:00:56 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<input type="file" id="firmwareFile">
|
2018-01-01 20:00:56 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<div class="buttons">
|
2018-01-28 19:03:47 +00:00
|
|
|
<input type="submit" :disabled="saving" :value="saving ? $t('applyButtonSaving') : $t('applyButton')">
|
2018-01-22 22:01:49 +00:00
|
|
|
</div>
|
2018-01-03 20:44:34 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<div v-if="uploadProgress !== false">
|
|
|
|
{{ uploadProgress }}%
|
|
|
|
</div>
|
2018-01-01 20:00:56 +00:00
|
|
|
</form>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<h3>{{ $t('system.calibrateTitle') }}</h3>
|
|
|
|
|
|
|
|
<span class="hint">{{ $t('system.calibrateHint') }}</span>
|
|
|
|
|
|
|
|
<div class="buttons">
|
|
|
|
<a class="button button-primary" @click.prevent="startCalibration">{{ $t('system.calibrateButton') }}</a>
|
|
|
|
</div>
|
|
|
|
|
2018-01-26 10:50:42 +00:00
|
|
|
<form @submit.prevent="applySystem">
|
2018-01-22 22:01:49 +00:00
|
|
|
<h3>{{ $t('system.ntpTitle') }}</h3>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<div class="warning" v-if="!wifiStatus.station.enabled || wifiStatus.station.status != 3">
|
|
|
|
{{ $t('triggers.timeInternet') }}
|
|
|
|
</div>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="horizontal">
|
|
|
|
<label for="ntpServer">{{ $t('system.ntpServer') }}</label>
|
|
|
|
<input type="text" id="ntpServer" v-model="system.ntpServer">
|
|
|
|
</div>
|
2018-01-18 16:10:18 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="horizontal">
|
|
|
|
<label for="ntpInterval">{{ $t('system.ntpInterval') }}</label>
|
|
|
|
<input type="number" id="ntpInterval" v-model="system.ntpInterval">
|
|
|
|
</div>
|
2018-01-18 16:10:18 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="horizontal">
|
|
|
|
<label for="lat">{{ $t('system.ntpLat') }}</label>
|
|
|
|
<input type="text" id="lat" v-model="system.lat">
|
|
|
|
</div>
|
2018-01-18 16:10:18 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="horizontal">
|
|
|
|
<label for="lng">{{ $t('system.ntpLng') }}</label>
|
|
|
|
<input type="text" id="lng" v-model="system.lng">
|
|
|
|
</div>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<div class="suboptions">
|
|
|
|
<label for="location" class="label-inline">{{ $t('system.ntpLocation') }}</label>
|
|
|
|
<input type="text" id="location" v-model="location">
|
2018-01-23 14:06:51 +00:00
|
|
|
<button @click.prevent="searchLocation" :disabled="searchingLocation">{{ $t('system.ntpLocationSearch') }}</button>
|
2018-01-22 22:01:49 +00:00
|
|
|
</div>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<h3>{{ $t('system.pinsTitle') }}</h3>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="horizontal">
|
|
|
|
<label for="pinLEDAP">{{ $t('system.pinLEDAP') }}</label>
|
|
|
|
<input type="number" id="pinLEDAP" v-model.number="system.pins.ledAP">
|
|
|
|
</div>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="horizontal">
|
|
|
|
<label for="pinLEDSTA">{{ $t('system.pinLEDSTA') }}</label>
|
|
|
|
<input type="number" id="pinLEDSTA" v-model.number="system.pins.ledSTA">
|
|
|
|
</div>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="horizontal">
|
|
|
|
<label for="pinAPButton">{{ $t('system.pinAPButton') }}</label>
|
|
|
|
<input type="number" id="pinAPButton" v-model.number="system.pins.apButton">
|
|
|
|
</div>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="horizontal">
|
|
|
|
<label for="pinPWMDriverSDA">{{ $t('system.pinPWMDriverSDA') }}</label>
|
|
|
|
<input type="number" id="pinPWMDriverSDA" v-model.number="system.pins.pwmSDA">
|
|
|
|
</div>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="horizontal">
|
|
|
|
<label for="pinPWMDriverSCL">{{ $t('system.pinPWMDriverSCL') }}</label>
|
|
|
|
<input type="number" id="pinPWMDriverSCL" v-model.number="system.pins.pwmSCL">
|
|
|
|
</div>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="horizontal">
|
|
|
|
<label for="pwmAddress">{{ $t('system.pwmAddress') }}</label>
|
|
|
|
<input type="number" id="pwmAddress" v-model.number="system.pwmAddress">
|
|
|
|
</div>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<div class="horizontal">
|
|
|
|
<label for="pwmFrequency">{{ $t('system.pwmFrequency') }}</label>
|
|
|
|
<input type="number" id="pwmFrequency" v-model.number="system.pwmFrequency">
|
|
|
|
</div>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<h3>{{ $t('system.mapsTitle') }}</h3>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<label for="mapsAPIKey">{{ $t('system.mapsAPIKey') }}</label>
|
|
|
|
<input type="text" id="mapsAPIKey" v-model.number="system.mapsAPIKey">
|
|
|
|
<span class="hint">{{ $t('system.mapsAPIKeyhint') }}</span>
|
2018-01-11 20:03:46 +00:00
|
|
|
|
2018-01-22 22:01:49 +00:00
|
|
|
<div class="buttons">
|
2018-01-28 19:03:47 +00:00
|
|
|
<input type="submit" :disabled="saving" :value="saving ? $t('applyButtonSaving') : $t('applyButton')">
|
2018-01-22 22:01:49 +00:00
|
|
|
</div>
|
2018-01-11 20:03:46 +00:00
|
|
|
</form>
|
2018-01-01 20:00:56 +00:00
|
|
|
</div>
|
2018-01-01 18:56:07 +00:00
|
|
|
</div>
|
|
|
|
|
2018-01-28 19:03:47 +00:00
|
|
|
<!--
|
|
|
|
|
|
|
|
Calibration
|
|
|
|
|
|
|
|
-->
|
|
|
|
<div v-if="!loading && calibration !== null">
|
|
|
|
<div class="navigation">
|
|
|
|
<a class="button" @click.prevent="stopCalibration">« {{ $t('calibration.backButton') }}</a>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<h3>{{ $t('calibration.title') }}</h3>
|
|
|
|
|
|
|
|
<div class="horizontal">
|
2018-02-03 14:44:44 +00:00
|
|
|
<label for="stepCount">{{ $t('calibration.count') }}</label>
|
|
|
|
<input type="number" id="stepCount" v-model.number="calibration.count" min="1" max="16" :disabled="calibration.wizardStep >= 1">
|
2018-01-28 19:03:47 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<div v-if="calibration.wizardStep >= 1">
|
2018-02-03 14:44:44 +00:00
|
|
|
<h4>{{ $t('calibration.allStepsValue') }}</h4>
|
|
|
|
<div class="slidercontainer">
|
|
|
|
<input type="range" min="0" max="255" class="slider" v-model.number="allStepsValue">
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<check v-model.boolean="calibration.useCurve" :title="$t('calibration.useCurve')" class="form-control"></check>
|
|
|
|
|
|
|
|
<h4>{{ $t('calibration.ranges') }}</h4>
|
|
|
|
<div class="range" v-for="(step, index) in calibration.ranges">
|
|
|
|
<range v-model="step"></range>
|
|
|
|
</div>
|
2018-01-28 19:03:47 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="buttons">
|
|
|
|
<a class="button button-primary" @click.prevent="nextCalibrationStep">{{ $t(hasNextCalibrationStep() ? 'calibration.nextButton' : 'calibration.applyButton') }}</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
2018-01-01 18:56:07 +00:00
|
|
|
<div class="clearfix"></div>
|
|
|
|
</div>
|
|
|
|
<div class="version">
|
|
|
|
{{ $t('copyright') }}<br>
|
2018-02-12 21:13:03 +00:00
|
|
|
{{ status.version !== null ? $t('firmwareVersion') + status.version : '' }}
|
2018-01-01 18:56:07 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<script language="javascript">
|
|
|
|
startApp();
|
|
|
|
</script>
|
|
|
|
</body>
|
|
|
|
</html>
|