Files
IoTManagerWeb/examples/Setup.svelte

1697 lines
50 KiB
Svelte
Raw Normal View History

2021-09-16 02:00:52 +08:00
<script>
import Cookies, { get } from "js-cookie";
import Tooltip from "./Tooltip.svelte";
import Box from "./Box.svelte";
//import Toggle from "svelte-toggle";
import Logo from "./Logo.svelte";
let devices = [];
let socket = [];
let connectionType = "WS";
let myip = document.location.hostname;
let NetworkMap = [];
let Conf = [];
let name;
let urlMQTT = "";
let editJSON;
// ==на время разработки==
myip = "192.168.36.139";
/* if (Conf==""){
Conf = [{
"ip": myip,
"name": "IoT",
"chipID": "",
"apssid": "IoT",
"appass": "",
"routerssid": "EURECA",
"routerpass": "4455667788",
"timezone": 3,
"ntp": "pool.ntp.org",
"mqttServer": "",
"mqttPort": 0,
"mqttPortwss":"",
"mqttPath":"",
"mqttPrefix": "",
"mqttUser": "",
"mqttPass": "",
"mqttServer2": "",
"mqttPort2": 0,
"mqttPrefix2": "",
"mqttUser2": "",
"mqttPass2": "",
"scen": "1",
"telegramApi": "",
"telegonof": "0",
"teleginput": "0",
"autos": "1",
"weblogin": "admin",
"webpass": "admin",
"MqttIn": "0",
"MqttOut": "0",
"blink": "0",
"oneWirePin": "2",
"serverip": "http://meef.ru",
"uart": "0",
"uartS": "9600",
"uartTX": "12",
"uartRX": "13",
"grafmax": "0",
"socket": "0"
}];
}*/
// темная тема
let darkMode = false;
// data.darktheme=(Cookies.get('darktheme') == "true") ? true : false;
if (Cookies.get("darktheme") == "true") {
window.document.body.classList.value = "dark-mode";
}
function toggleTheme() {
window.document.body.classList.toggle("dark-mode");
}
// подключаемся к локальной машине, получаем карту сети
function getNetworkMap() {
devices = JSON.parse(
'[{"deviceID":"","deviceIP":"' + myip + '","deviceName":""}]'
);
devices[0].id = 0;
devices[0].status = false;
console.log("Подключаемся к WS на localhost ", devices);
if (connectionType != "MQTT") {
socket[0] = new WebSocket("ws://" + myip + "/ws");
socket[0].addEventListener("open", function (event) {
devices[0].id = 0;
devices[0].status = true;
devices = devices;
console.log("WS CONNECTED! " + myip);
// получаем "карту сети" по websocket
socket[0].send("getNetworkMap");
// получаем конфигурацию ESP по websocket
socket[0].send("getconfigsetupjson");
});
socket[0].addEventListener("message", function (event) {
if (Cookies.get("consolelog") == "true") {
console.log("NEW data packet " + myip, event.data);
}
// запускаем обработку пришедшего сообщения
//console.log(event.data);
addMessage(event.data, 0);
});
// Обработка ошибок websocket
socket[0].addEventListener("close", (event) => {
if (item) {
console.log("ws close " + item.deviceIP);
} else {
console.log("ws close " + myip);
}
devices[0].status = false;
devices = devices;
});
socket[0].addEventListener("error", function (event) {
if (item) {
console.log(item.deviceIP + " WebSocket error: ", event);
} else {
console.log(myip + " WebSocket error: ", event);
}
devices[0].status = false;
devices = devices;
});
}
}
getNetworkMap();
// добавляем новые подключения из карты сети
function addConnection(devices) {
if (devices) {
devices.forEach(function (item, i, arr) {
if (item.deviceIP != myip) {
console.log("trying connect", item, i);
socket[i] = new WebSocket("ws://" + item.deviceIP + "/ws");
socket[i].addEventListener("open", function (event) {
devices[i].id = i;
devices[i].status = true;
devices = devices;
console.log("WS CONNECTED! " + item.deviceIP, i);
// получаем конфигурацию ESP по websocket
socket[i].send("getconfigsetupjson");
});
socket[i].addEventListener("message", function (event) {
// запускаем обработку пришедшего сообщения
// вывод отладочных сообщений в консоль
if (Cookies.get("consolelog") == "true") {
console.log("NEW data packet " + item.deviceIP, event.data);
}
addMessage(event.data, i);
});
// Обработка ошибок websocket
socket[i].addEventListener("close", (event) => {
console.log("ws close " + item.deviceIP);
devices[i].status = false;
devices = devices;
NetworkMap = NetworkMap;
console.log(devices);
});
socket[i].addEventListener("error", function (event) {
console.log(item.deviceIP + " WebSocket error: ", event);
devices[i].status = false;
devices = devices;
NetworkMap = NetworkMap;
console.log(devices);
});
}
});
devices[0].id = 0;
devices[0].status = true;
}
}
// addConnection(devices);
function addMessage(data, socket) {
NetworkMap = NetworkMap;
devices = devices;
try {
data = JSON.parse(data);
// editor
if (data.widget) {
editJSON = data;
editJSON = JSON.stringify(editJSON);
}
// Если пришла карта сети
if (data.deviceID) {
editJSON = data;
editJSON = JSON.stringify(editJSON);
}
data.socket = socket;
// Если пришел Config
if (data.apssid) {
// console.log(data);
data.webMQTT = false;
data.consolelog = false;
data.darktheme = false;
data.webMQTT = Cookies.get("webMQTT") == "true" ? true : false;
data.consolelog = Cookies.get("consolelog") == "true" ? true : false;
data.darktheme = Cookies.get("darktheme") == "true" ? true : false;
Conf = [...Conf, data];
// Запоминаем настройки MQTT дря быстрой смены в выпадающем списке
if (Conf != "") {
MQTTsample[0].mqttServer = Conf[0].mqttServer;
MQTTsample[0].mqttPort = Conf[0].mqttPort;
MQTTsample[0].mqttPortwss = Conf[0].mqttPortwss;
MQTTsample[0].mqttPrefix = Conf[0].mqttPrefix;
MQTTsample[0].mqttUser = Conf[0].mqttUser;
MQTTsample[0].mqttPass = Conf[0].mqttPass;
MQTTsample[0].mqttPath = Conf[0].mqttPath;
}
}
// Если пришла карта сети
if (data[0].deviceID) {
console.log("пришла карта сети :", data);
devices = data;
editJSON = data;
editJSON = JSON.stringify(editJSON);
//Conf=[];
addConnection(devices);
NetworkMap = data;
}
} catch (e) {
if (Cookies.get("consolelog") == "true") {
console.log("ERROR parse JSON", data);
}
}
}
let inputIP = "";
let inputName = "";
let edit = true;
function handleClick() {
edit = true;
}
function handleClick1() {
edit = false;
}
function addTodo(inputIP, inputName) {
NetworkMap = [
...NetworkMap,
{
deviceID: "0000000-0000000",
deviceIP: inputIP,
deviceName: inputName,
},
];
NetworkMap = NetworkMap;
inputIP = "";
inputName = "";
// сохраняем NetworkMap.json // Надо добавить перебор сокетов
// socket.forEach(function(asd, i, arr) {
socket[0].send("{NetworkMap:" + JSON.stringify(NetworkMap) + "}");
//});
}
function removeTodo(id) {
NetworkMap.splice(id, 1);
NetworkMap = NetworkMap;
// сохраняем NetworkMap.json // Надо добавить перебор сокетов
//socket.forEach(function(asd, i, arr) {
socket[0].send("{NetworkMap:" + JSON.stringify(NetworkMap) + "}");
//});
}
let MQTTsample = [
{
mqttServer: "",
mqttPort: "",
mqttPortwss: "",
mqttPrefix: "",
mqttUser: "",
mqttPass: "",
mqttPath: "",
placeholder: "",
},
{
mqttServer: "meef.ru",
mqttPort: 1883,
mqttPortwss: 18883,
mqttPrefix: "/IotManager",
mqttUser: "IotManager:guest",
mqttPass: "guest",
mqttPath: "/ws",
placeholder: "",
},
{
mqttServer: "test.mosquitto.org",
mqttPort: 1883,
mqttPortwss: 8081,
mqttPrefix: "/IotManager",
mqttUser: "",
mqttPass: "",
mqttPath: "/ws",
placeholder: "",
},
{
mqttServer: "broker.hivemq.com",
mqttPort: 1883,
mqttPortwss: 8000,
mqttPrefix: "/IotManager",
mqttUser: "",
mqttPass: "",
mqttPath: "/mqtt",
placeholder: "",
},
{
mqttServer: "broker.mqttdashboard.com",
mqttPort: 1883,
mqttPortwss: 8000,
mqttPrefix: "/IotManager",
mqttUser: "",
mqttPass: "",
mqttPath: "/mqtt",
placeholder: "",
},
{
mqttServer: "broker.emqx.io",
mqttPort: 1883,
mqttPortwss: 8083,
mqttPrefix: "/IotManager",
mqttUser: "",
mqttPass: "",
mqttPath: "/mqtt",
placeholder: "",
},
{
mqttServer: "m3.wqtt.ru",
mqttPort: "",
mqttPortwss: "",
mqttPrefix: "/IotManager",
mqttUser: "",
mqttPass: "",
mqttPath: "",
placeholder: "Параметры указаны в личном кабинете насайте wqtt.ru",
},
{
mqttServer: "91.204.228.124",
mqttPort: 1883,
mqttPortwss: "",
mqttPrefix: "/IotManager",
mqttUser: "rise",
mqttPass: "23ri22se32",
mqttPath: "",
placeholder: "",
},
];
let selected;
let i = 0;
let id = 0;
let wiget = [];
function chengConf(id) {
i = id;
}
function chengMQTT(selected) {
Conf[i]["mqttServer"] = selected.mqttServer;
Conf[i]["mqttPort"] = selected.mqttPort;
Conf[i]["mqttPortwss"] = selected.mqttPortwss;
Conf[i]["mqttPrefix"] =
selected.mqttPrefix + Math.floor(Math.random() * 10000);
Conf[i]["mqttUser"] = selected.mqttUser;
Conf[i]["mqttPass"] = selected.mqttPass;
Conf[i]["mqttPath"] = selected.mqttPath;
Conf[i]["placeholder"] = selected.placeholder;
changeConf(selected.mqttServer, "mqttServer", i);
changeConf(selected.mqttPort, "mqttPort", i);
changeConf(selected.mqttPortwss, "mqttPortwss", i);
changeConf(selected.mqttPrefix, "mqttPrefix", i);
changeConf(selected.mqttUser, "mqttUser", i);
changeConf(selected.mqttPass, "mqttPass", i);
changeConf(selected.mqttPath, "mqttPath", i);
}
let m;
function changeConf(val, name, socet) {
console.log(val, name, socet);
socket[socet].send(
'{"setconfigsetupjson":"1", "name":"' + name + '", "val":"' + val + '"}'
);
Cookies.set(name, val, { expires: 365 });
}
function GetMQTThttp(val, name, socet) {
console.log(val, name, socet);
socket[socet].send(
'{"setconfigsetupjson":"1", "name":"' + name + '", "val":"' + val + '"}'
);
Cookies.set(name, val, { expires: 365 });
if (val == true) {
urlMQTT =
"https://meef.ru/dashboard/?id=" +
Math.floor(Math.random() * 100000000);
//urlMQTT = "https://192.168.0.10/?id=" + Math.floor(Math.random() * 100000000);
Cookies.set("urlMQTT", urlMQTT, { expires: 365 });
} else {
urlMQTT = "";
Cookies.set("urlMQTT", urlMQTT, { expires: 365 });
}
}
function reboot(selected) {
socket[selected].send('{"command":"reboot"}');
}
function Pastesettings(i) {
Conf[i]["mqttServer"] = Conf[0]["mqttServer"];
Conf[i]["mqttPort"] = Conf[0]["mqttPort"];
Conf[i]["mqttPortwss"] = Conf[0]["mqttPortwss"];
Conf[i]["mqttPrefix"] = Conf[0]["mqttPrefix"];
Conf[i]["mqttUser"] = Conf[0]["mqttUser"];
Conf[i]["mqttPass"] = Conf[0]["mqttPass"];
Conf[i]["mqttPath"] = Conf[0]["mqttPath"];
Conf[i]["mqttServer2"] = Conf[0]["mqttServer2"];
Conf[i]["mqttPort2"] = Conf[0]["mqttPort2"];
Conf[i]["mqttPortwss2"] = Conf[0]["mqttPortwss2"];
Conf[i]["mqttPrefix2"] = Conf[0]["mqttPrefix2"];
Conf[i]["mqttUser2"] = Conf[0]["mqttUser2"];
Conf[i]["mqttPass2"] = Conf[0]["mqttPass2"];
Conf[i]["mqttPath2"] = Conf[0]["mqttPath2"];
Conf[i]["telegramApi"] = Conf[0]["telegramApi"];
Conf[i]["telegonof"] = Conf[0]["telegonof"];
Conf[i]["teleginput"] = Conf[0]["teleginput"];
Conf[i]["autos"] = Conf[0]["autos"];
Conf[i]["chatId"] = Conf[0]["chatId"];
changeConf(Conf[i]["mqttServer"], "mqttServer", i);
changeConf(Conf[i]["mqttPort"], "mqttPort", i);
changeConf(Conf[i]["mqttPortwss"], "mqttPortwss", i);
changeConf(Conf[i]["mqttPrefix"], "mqttPrefix", i);
changeConf(Conf[i]["mqttUser"], "mqttUser", i);
changeConf(Conf[i]["mqttPass"], "mqttPass", i);
changeConf(Conf[i]["mqttPath"], "mqttPath", i);
changeConf(Conf[i]["mqttServer2"], "mqttServer2", i);
changeConf(Conf[i]["mqttPort2"], "mqttPort2", i);
changeConf(Conf[i]["mqttPortwss2"], "mqttPortwss2", i);
changeConf(Conf[i]["mqttPrefix2"], "mqttPrefix2", i);
changeConf(Conf[i]["mqttUser2"], "mqttUser2", i);
changeConf(Conf[i]["mqttPass2"], "mqttPass2", i);
changeConf(Conf[i]["mqttPath2"], "mqttPath2", i);
changeConf(Conf[i]["telegramApi"], "telegramApi", i);
changeConf(Conf[i]["telegonof"], "telegonof", i);
changeConf(Conf[i]["teleginput"], "teleginput", i);
changeConf(Conf[i]["autos"], "autos", i);
changeConf(Conf[i]["chatId"], "chatId", i);
}
// обратный отсчет для Shutter
let frame;
let elapsed = 0;
let duration = 5000;
let last_time = window.performance.now();
(function update() {
frame = requestAnimationFrame(update);
const time = window.performance.now();
elapsed += Math.min(time - last_time, duration - elapsed);
last_time = time;
if (elapsed == duration) {
Shutterhiddn();
}
})();
let Shuttervisibl = "visibility: hidden;";
function Shuttervisibil() {
Shuttervisibl = "visibility: visible;";
// duration = sec;
elapsed = 0;
if (elapsed === duration) {
Shuttervisibl = "visibility: hidden;";
}
}
function Shutterhiddn() {
Shuttervisibl = "visibility: hidden;";
}
Shuttervisibil();
// Селектор wiget.json для editor
let fileSelected;
let widgetfiles = [
{ id: 0, name: `` },
{ id: 1, name: `anydataTemp.json` },
{ id: 2, name: `anydataHum.json` },
{ id: 3, name: `anydataPress.json` },
{ id: 4, name: `alarm.json` },
{ id: 5, name: `anydataAlarm.json` },
{ id: 6, name: `anydataAmp.json` },
{ id: 7, name: `anydataHtz.json` },
{ id: 8, name: `anydataPpb.json` },
{ id: 9, name: `anydataPpm.json` },
{ id: 10, name: `anydataTime.json` },
{ id: 11, name: `anydataVlt.json` },
{ id: 12, name: `anydataWhr.json` },
{ id: 13, name: `anydataWtt.json` },
{ id: 14, name: `btn.json` },
{ id: 15, name: `select.json` },
{ id: 16, name: `chart.json` },
{ id: 17, name: `chart3.json` },
{ id: 18, name: `NetworkMap.json` },
];
const syntaxHighlight = (json) => {
try {
json = JSON.stringify(JSON.parse(json), null, 4);
} catch (e) {
return json;
}
json = json
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;");
json = json.replace(
/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g,
function (match) {
return match;
}
);
return json;
};
// editJSON=JSON.stringify(editJSON);
// получаем файл с esp
function widgetFileChenged(fileSelected, i) {
console.log(fileSelected.name);
if (
fileSelected.name == "NetworkMap.json" ||
fileSelected.name == "config.json"
) {
socket[i].send('{"getFileName" : "' + fileSelected.name + '"}');
} else {
socket[i].send('{"getFileName" : "widgets/' + fileSelected.name + '"}');
}
}
// отправляем файл на ESP
function handleSubmit(val1, wigetJSON, i) {
let newWigetJSON = document.getElementById("S1").value;
if (newWigetJSON) {
newWigetJSON = JSON.parse(newWigetJSON);
if (fileSelected.name == "NetworkMap.json") {
newWigetJSON.setFileName = fileSelected.name;
} else {
newWigetJSON.setFileName = "widgets/" + fileSelected.name;
}
console.log("newWigetJSON: ", newWigetJSON);
newWigetJSON = JSON.stringify(newWigetJSON);
socket[i].send(newWigetJSON);
}
}
</script>
<body>
{#if connectionType == "MQTT"}{:else}
<div
class="Shutter"
style="{Shuttervisibl} position: absolute; z-index: 1; right: 1%; top: -45px"
id="layer1"
>
<span>
<progress value={elapsed / duration} />
<br /><br />
<!--Перечисляем девайсы в сети-->
{#each devices as NetworkDevice, i}
{#if !NetworkDevice.status && NetworkDevice.status != false}
<p align="left" style=" margin-top: -5px; margin-bottom: -5px">
{NetworkDevice.deviceIP}
{NetworkDevice.deviceName} waiting
</p>
{/if}
{#if NetworkDevice.status == true}
<p
align="left"
style="color: green; margin-top: -5px; margin-bottom: -5px"
>
{NetworkDevice.deviceIP}
{NetworkDevice.deviceName} connected
</p>
{/if}
{#if NetworkDevice.status == false}
<p
align="left"
style="color: red; margin-top: -5px; margin-bottom: -5px"
on:click={addConnection(devices)}
>
{NetworkDevice.deviceIP}
{NetworkDevice.deviceName} disconnected
</p>
{/if}
{/each}
</span>
</div>
{/if}
{#if connectionType == "MQTT"}
<div
style=" position: absolute; z-index: 2; right: 2%; top: 1%"
id="layerMQTT"
>
MQTT
</div>
{:else}
<div
on:mouseenter={Shuttervisibil}
on:click={Shutterhiddn}
style=" position: absolute; z-index: 2; right: 1.5%; top: -45px"
id="layerWS"
>
localNET
</div>
{/if}
<div
style=" position: absolute; z-index: 2; right: 90px; top: -45px; color:red"
on:click={toggleTheme}
id="toggleTheme"
>
🔆
</div>
{#if Conf != ""}
<Box>
<b on:click={handleClick}>Network Map</b>
<span on:click={handleClick1} class="letter1" />
{#if NetworkMap == ""}
<b>Файл с картой сети еще не создан</b>
{/if}
<div>Навсех добавляемых ESP должнабыть такая же прошивка !!!</div>
<table border="0" width="100%">
{#if NetworkMap != ""}
{#each NetworkMap as espconf, m}
<tr>
<td width="1%" class="letter2">IP</td><td
><input
class:red={espconf["status"] == false}
type="text"
disabled
required
bind:value={NetworkMap[m]["deviceIP"]}
/>
</td>
<td width="1%">Name</td><td width="30%"
><input
type="text"
required
bind:value={NetworkMap[m]["deviceName"]}
/></td
>
<td><button on:click={() => removeTodo(m)}>-</button></td>
</tr>
{/each}
<tr>
<td width="1%" class="letter2">IP</td><td
><input type="text" bind:value={inputIP} /></td
>
<td width="1%">Name</td><td width="30%"
><input type="text" bind:value={inputName} /></td
>
<td
><button on:click={() => addTodo(inputIP, inputName)}>+</button
></td
>
</tr>
{:else}
<tr>
<td width="1%" class="letter2">IP</td><td
><input
disabled
type="text"
required
bind:value={Conf[i].ip}
/></td
>
<td width="1%">Name</td><td width="30%"
><input type="text" required bind:value={Conf[i].name} /></td
>
<td
><button on:click={() => addTodo(Conf[i].ip, Conf[i].name)}
>+</button
></td
></tr
>
{/if}
</table>
<br />
<div>После добавления ESP нажмите "F5" что обновить страницу</div>
</Box>
<b>Select ESP</b>
<span
><select bind:value={selected} on:change={chengConf(selected)}>
{#each Conf as espconf, n}
<option value={n}>
<b>{Conf[n]["name"]}</b> ({Conf[n]["ip"]})
</option>
{/each}
</select></span
>
<!--WIFI-->
<button on:click={Pastesettings(i)}
><Tooltip
title="Вставить настройки MQTT и Telegram из верхней в списке ESP "
>Paste settings</Tooltip
></button
>
<button on:click={reboot(Conf[i].socket)}>Reboot</button>
<Box>
<b on:click={handleClick}>WIFI</b><span
on:click={handleClick1}
class="letter1"
/>
{#if edit == true}
<table border="0" width="100%">
<tr>
<td width="40%">ESP name</td>
<td>
<input
type="text"
placeholder="IotManager"
required
bind:value={Conf[i].name}
on:change={changeConf(Conf[i].name, "name", Conf[i].socket)}
/>
</td>
<Tooltip
title="Имя устройства должно состоять из английских букв и иметь длинну от 6 до 12 символов"
>
<td>?</td>
</Tooltip>
</tr>
<hr />
<tr>
<td>WIFI name</td>
<td
><input
type="text"
bind:value={Conf[i].routerssid}
on:change={changeConf(
Conf[i].routerssid,
"routerssid",
Conf[i].socket
)}
/></td
>
<Tooltip
title="После того как вы введете логин пароль от вашего wifi роутера необходимо нажать кнопку сохранить, а затем обязательно нажать кнопку перезагрузить устройство внизу этой страницы"
><td>?</td>
</Tooltip>
</tr>
<tr>
<td>WIFI password</td>
<td
><input
type="password"
bind:value={Conf[i]["routerpass"]}
on:change={changeConf(
Conf[i].routerpass,
"routerpass",
Conf[i].socket
)}
/></td
>
<Tooltip
title="После того как вы введете логин пароль от вашего wifi роутера необходимо нажать кнопку сохранить, а затем обязательно нажать кнопку перезагрузить устройство внизу этой страницы"
><td>?</td>
</Tooltip>
</tr>
<hr />
<tr>
<td>AP name</td>
<td
><input
type="text"
required
bind:value={Conf[i]["apssid"]}
on:change={changeConf(Conf[i].apssid, "apssid", Conf[i].socket)}
/></td
>
<Tooltip
title="Устройство постоянно сканирует сеть на наличие wifi. Если роутер отключен, то устройство автоматически перейдет в режим точки доступа. Когда wifi появится устройство автоматически подключится к роутеру снова, и выключит точку доступа"
><td>?</td>
</Tooltip>
</tr>
</table>
{/if}
</Box>
<!-- Users-->
<Box>
<b on:click={handleClick}>Users</b><span
on:click={handleClick1}
class="letter1"
/>
{#if edit == true}
<table border="0" width="100%">
<tr>
<td width="40%">WEB admin login</td>
<td
><input
type="text"
required
bind:value={Conf[i]["weblogin"]}
on:change={changeConf(
Conf[i].weblogin,
"weblogin",
Conf[i].socket
)}
/></td
>
<Tooltip title="Бла-бла-бла про то как это использовать"
><td>?</td>
</Tooltip>
</tr>
<tr>
<td>WEB admin password</td>
<td
><input
type="password"
required
bind:value={Conf[i]["webpass"]}
on:change={changeConf(
Conf[i].webpass,
"webpass",
Conf[i].socket
)}
/></td
>
<Tooltip title="Бла-бла-бла про то как это использовать"
><td>?</td>
</Tooltip>
</tr>
</table>
{/if}
</Box>
<!--Time-->
<Box>
<b on:click={handleClick}>Time </b><span
on:click={handleClick1}
class="letter1"
/>
{#if edit == true}
<table border="0" width="100%">
<tr>
<td width="40%">Time Zone</td>
<td
><input
type="text"
required
bind:value={Conf[i]["timezone"]}
on:change={changeConf(
Conf[i].timezone,
"timezone",
Conf[i].socket
)}
/></td
>
<Tooltip title="Бла-бла-бла про то как это использовать"
><td>?</td>
</Tooltip>
</tr>
<tr>
<td>NTP server</td>
<td
><input
type="text"
required
bind:value={Conf[i]["ntp"]}
on:change={changeConf(Conf[i].ntp, "ntp", Conf[i].socket)}
/></td
>
<Tooltip
title="После изменения поля NTP сервер необходимо перезагрузить устройство"
><td>?</td>
</Tooltip>
</tr>
</table>
{/if}
</Box>
<!--MQTT-->
<Box>
<b on:click={handleClick}>MQTT</b>
<select bind:value={selected} on:change={chengMQTT(selected)}>
{#each MQTTsample as mqtt, n}
<option value={mqtt}>
<b>{mqtt.mqttServer}</b>
</option>
{/each}
</select> <span>Готовые шаблоны</span>
<span on:click={handleClick1} class="letter1">
<!-- {@html Conf[i]["warning4"]}-->
</span>
{#if edit == true}
<table border="0" width="100%">
<tr>
<td width="40%">MQTT server</td>
<td
><input
type="text"
placeholder={Conf[i]["placeholder"]}
required
bind:value={Conf[i]["mqttServer"]}
on:change={changeConf(
Conf[i].mqttServer,
"mqttServer",
Conf[i].socket
)}
/></td
>
<Tooltip
title="После изменеения параметров MQTT требуетсяперезагрузка"
>
<td>?</td>
</Tooltip>
</tr>
<tr>
<td>MQTT port (TCP)</td>
<td
><input
type="text"
required
placeholder={Conf[i]["placeholder"]}
bind:value={Conf[i]["mqttPort"]}
on:change={changeConf(
Conf[i].mqttPort,
"mqttPort",
Conf[i].socket
)}
/></td
>
<Tooltip
title="После изменеения параметров MQTT требуетсяперезагрузка"
><td>?</td>
</Tooltip>
</tr>
<tr>
<td>MQTT wss port (TLS)</td>
<td
><input
type="text"
placeholder={Conf[i]["placeholder"]}
bind:value={Conf[i]["mqttPortwss"]}
on:change={changeConf(
Conf[i].mqttPortwss,
"mqttPortwss",
Conf[i].socket
)}
/></td
>
<Tooltip
title="Должен быть указан для подключения IOS устройств и подключения к 'Панели управлени' по MQTT через Internet "
><td>?</td>
</Tooltip>
</tr>
<tr>
<td>mqttPrefix</td>
<td
><input
type="text"
required
bind:value={Conf[i]["mqttPrefix"]}
on:change={changeConf(
Conf[i].mqttPrefix,
"mqttPrefix",
Conf[i].socket
)}
/></td
>
<Tooltip
title="Обратите внимание что поле префикс может состоять только из одного слова и одного разделителя: /prefix, вариант вида: /prefix1/prefix2 работать не будет. После изменения поля prefix необходимо перезагрузить устройство"
><td>?</td>
</Tooltip>
</tr>
<tr>
<td>mqttUser</td>
<td
><input
type="text"
placeholder={Conf[i]["placeholder"]}
bind:value={Conf[i]["mqttUser"]}
on:change={changeConf(
Conf[i].mqttUser,
"mqttUser",
Conf[i].socket
)}
/></td
>
<Tooltip
title="После изменеения параметров MQTT требуетсяперезагрузка"
><td>?</td>
</Tooltip>
</tr>
<tr>
<td>mqttPass</td>
<td
><input
type="text"
placeholder={Conf[i]["placeholder"]}
bind:value={Conf[i]["mqttPass"]}
on:change={changeConf(
Conf[i].mqttPass,
"mqttPass",
Conf[i].socket
)}
/></td
>
<Tooltip title="Бла-бла-бла про то как это использовать"
><td>?</td>
</Tooltip>
</tr>
<tr>
<td>mqttPath</td>
<td
><input
type="text"
bind:value={Conf[i]["mqttPath"]}
on:change={changeConf(
Conf[i].mqttPath,
"mqttPath",
Conf[i].socket
)}
/></td
>
<Tooltip title="Бла-бла-бла про то как это использовать"
><td>?</td>
</Tooltip>
</tr>
<br />
<tr>
<td width="40%">Web dashbord over MQTT</td>
<td>
<form
id="mqttform"
method="post"
action={urlMQTT}
onsubmit="fmSubmit()"
>
<input
type="checkbox"
bind:checked={Conf[i].webMQTT}
on:change={GetMQTThttp(
Conf[i].webMQTT,
"webMQTT",
Conf[i].socket
)}
/>
<input
hidden
type="text"
id="id_user"
name="id_user"
value={urlMQTT}
/>
<input
hidden
type="text"
id="mqttServer"
name="mqttServer"
value={Conf[i]["mqttServer"]}
/>
<input
hidden
type="text"
id="mqttPort"
name="mqttPort"
value={Conf[i]["mqttPort"]}
/>
<input
hidden
type="text"
id="mqttPortwss"
name="mqttPortwss"
value={Conf[i]["mqttPortwss"]}
/>
<input
hidden
type="text"
id="mqttPrefix"
name="mqttPrefix"
value={Conf[i]["mqttPrefix"]}
/>
<input
hidden
type="text"
id="mqttUser"
name="mqttUser"
value={Conf[i]["mqttUser"]}
/>
<input
hidden
type="text"
id="mqttPass"
name="mqttPass"
value={Conf[i]["mqttPass"]}
/>
<input
hidden
type="text"
id="mqttPath"
name="mqttPath"
value={Conf[i]["mqttPath"]}
/>
{#if Conf[i].webMQTT == true}
<input type="submit" value="перейти на MQTT" />
<!--<a href="{Cookies.get('urlMQTT')}" onclick="document.getElementById('mqttform').submit(); ">перейти на MQTT</a>-->
{(urlMQTT = Cookies.get("urlMQTT"))}
{/if}
</form>
</td>
<Tooltip
title="Позволяет поучить доступ к 'Панели управления' через Internet по протоколу MQTT. Должен быть указан MQTT wss port (TLS) "
><td>?</td>
</Tooltip>
</tr>
<br /><br /><br /><br /><br />
<!--MQTT2-->
<b>Rreserve MQTT</b>
<hr />
<br />
<tr>
<td>MQTT server </td>
<td
><input
type="text"
bind:value={Conf[i]["mqttServer2"]}
on:change={changeConf(
Conf[i].mqttServer2,
"mqttServer2",
Conf[i].socket
)}
/></td
>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
<tr>
<td>MQTT port</td>
<td
><input
type="text"
bind:value={Conf[i]["mqttPort2"]}
on:change={changeConf(
Conf[i].mqttPort2,
"mqttPort2",
Conf[i].socket
)}
/></td
>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
<tr>
<td>MQTT wss port</td>
<td
><input
type="text"
bind:value={Conf[i]["mqttPortwss2"]}
on:change={changeConf(
Conf[i].mqttPortwss2,
"mqttPortwss2",
Conf[i].socket
)}
/></td
>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
<tr>
<td>mqttPrefix</td>
<td
><input
type="text"
bind:value={Conf[i]["mqttPrefix2"]}
on:change={changeConf(
Conf[i].mqttPrefix2,
"mqttPrefix2",
Conf[i].socket
)}
/></td
>
<Tooltip
title="Поле префикс может состоять только из одного слова и одного разделителя: /prefix, вариант вида: /prefix1/prefix2 работать не будет. После изменения поля prefix необходимо перезагрузить устройство"
><td>?</td>
</Tooltip>
</tr>
<tr>
<td>mqttUser</td>
<td
><input
type="text"
bind:value={Conf[i]["mqttUser2"]}
on:change={changeConf(
Conf[i].mqttUser2,
"mqttUser2",
Conf[i].socket
)}
/></td
>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
<tr>
<td>mqttPass</td>
<td
><input
type="text"
bind:value={Conf[i]["mqttPass2"]}
on:change={changeConf(
Conf[i].mqttPass2,
"mqttPass2",
Conf[i].socket
)}
/></td
>
<Tooltip title="Бла-бла-бла про то как это использовать"
><td>?</td>
</Tooltip>
</tr>
<tr>
<td>mqttPath</td>
<td
><input
type="text"
bind:value={Conf[i]["mqttPath2"]}
on:change={changeConf(
Conf[i].mqttPath2,
"mqttPath2",
Conf[i].socket
)}
/></td
>
<Tooltip title="Бла-бла-бла про то как это использовать"
><td>?</td>
</Tooltip>
</tr><br />
</table>
{/if}
</Box>
<!--Telegram-->
<Box>
<b on:click={handleClick}>Telegram </b><span
on:click={handleClick1}
class="letter1"
/>
{#if edit == true}
<table border="0" width="100%">
<br />
<tr>
<td width="40%">Enable Telegram</td>
<td>
<input
type="checkbox"
bind:checked={Conf[i]["telegonof"]}
on:change={changeConf(
Conf[i]["telegonof"] == true ? 1 : 0,
"telegonof",
Conf[i].socket
)}
/>
{#if Conf[i]["telegonof"] == 0}
{(Conf[i]["telegonof"] = false)}
{:else}
{(Conf[i]["telegonof"] = true)}
{/if}
</td>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
<tr /><tr>
<td>Enable incoming messages</td>
<td>
<input
type="checkbox"
bind:checked={Conf[i]["teleginput"]}
on:change={changeConf(
Conf[i]["teleginput"] == true ? 1 : 0,
"teleginput",
Conf[i].socket
)}
/>
{#if Conf[i]["teleginput"] == 0}
{(Conf[i]["teleginput"] = false)}
{:else}
{(Conf[i]["teleginput"] = true)}
{/if}
</td>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
<tr /><tr>
<td>Auto get chat ID </td>
<td>
<input
type="checkbox"
bind:checked={Conf[i]["autos"]}
on:change={changeConf(
Conf[i]["autos"] == true ? 1 : 0,
"autos",
Conf[i].socket
)}
/>
{#if Conf[i]["autos"] == 0}
{(Conf[i]["autos"] = false)}
{:else}
{(Conf[i]["autos"] = true)}
{/if}
</td>
<Tooltip title=""><td>?</td></Tooltip>
</tr><br />
<tr>
<td>Telegram API token</td>
<td
><input
type="text"
bind:value={Conf[i]["telegramApi"]}
on:change={changeConf(
Conf[i].telegramApi,
"telegramApi",
Conf[i].socket
)}
/></td
>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
<tr>
<td>Telegram chat ID</td>
<td
><input
type="text"
bind:value={Conf[i]["chatId"]}
on:change={changeConf(Conf[i].chatId, "chatId", Conf[i].socket)}
/></td
>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
</table>
{/if}
</Box>
<!--UART-->
<Box>
<b on:click={handleClick}>UART </b><span
on:click={handleClick1}
class="letter1"
/>
{#if edit == true}
<table border="0" width="100%">
<tr>
<td width="40%">Enable UART</td>
<td>
<input disabled type="checkbox" bind:checked={Conf[i]["???"]} />
</td>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
<tr /><tr>
<td>Send all messages to UART</td>
<td
><input
disabled
type="checkbox"
bind:checked={Conf[i]["???"]}
/></td
>
<Tooltip title=""><td>?</td></Tooltip>
</tr><br />
<tr>
<td>UART speed</td>
<td><input disabled type="text" bind:value={Conf[i]["???"]} /></td>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
<tr>
<td>PIN TX</td>
<td><input disabled type="text" bind:value={Conf[i]["???"]} /></td>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
<tr>
<td>PIN RX</td>
<td><input disabled type="text" bind:value={Conf[i]["???"]} /></td>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
</table>
{/if}
</Box>
<!-- Developer settings-->
<Box>
<b on:click={handleClick}>Developer settings</b><span
on:click={handleClick1}
class="letter1"
/>
{#if edit == true}
<table border="0" width="100%">
<tr>
<td width="40%">Update server</td>
<td
><input
type="text"
placeholder="http://206.189.49.244"
bind:value={Conf[i]["serverip"]}
on:change={changeConf(
Conf[i].serverip,
"serverip",
Conf[i].socket
)}
/></td
>
<Tooltip title="Бла-бла-бла про то как это использовать"
><td>?</td>
</Tooltip>
</tr>
<tr>
<td>Split point graphs</td>
<td
><input
type="text"
bind:value={Conf[i]["grafmax"]}
on:change={changeConf(
Conf[i].grafmax,
"grafmax",
Conf[i].socket
)}
/></td
>
<Tooltip title="Бла-бла-бла про то как это использовать"
><td>?</td>
</Tooltip>
</tr>
<tr>
<td width="40%">Use a dark theme</td>
<td>
{#if Conf[i]["darktheme"] == "false"}
<td
><input
type="checkbox"
on:change={(changeConf("true", "darktheme", Conf[i].socket),
toggleTheme())}
/></td
>
{:else}
<td
><input
type="checkbox"
bind:checked={Conf[i]["darktheme"]}
on:change={(changeConf(
Conf[i].darktheme,
"darktheme",
Conf[i].socket
),
toggleTheme())}
/></td
>
{/if}
</td>
<Tooltip title=""><td>?</td></Tooltip>
</tr>
<tr>
<td width="40%">Console LOG</td>
<td>
{#if Conf[i]["consolelog"] == "false"}
<td
><input
type="checkbox"
on:change={changeConf("true", "consolelog", Conf[i].socket)}
/></td
>
{:else}
<td
><input
type="checkbox"
bind:checked={Conf[i]["consolelog"]}
on:change={changeConf(
Conf[i].consolelog,
"consolelog",
Conf[i].socket
)}
/></td
>
{/if}
</td>
<Tooltip
title="Включает вывод в консоль браузера всех полученных пакетов"
><td>?</td>
</Tooltip>
</tr>
</table>
{/if}
</Box>
<!-- editor-->
<Box>
<b on:click={handleClick}>Editor</b><span
on:click={handleClick1}
class="letter1"
/>
{#if edit == true}
<form>
<select
bind:value={fileSelected}
on:change={widgetFileChenged(fileSelected, i)}
>
{#each widgetfiles as file}
<option value={file}>
{file.name}
</option>
{/each}
</select>
<button
on:click={handleSubmit(fileSelected, editJSON, Conf[i].socket)}
>Save</button
>
<p>
<textarea rows="15" id="S1">{syntaxHighlight(editJSON)}</textarea>
</p>
</form>
{/if}
</Box>
{:else}
<p align="center"><Logo /></p>
{/if}
<br /><br />
<div class="letter" align="center">developed by avaks@meef.ru</div>
</body>
<style>
.letter {
color: grey;
font-size: 60%;
padding-left: 0px;
opacity: 0.5;
}
table {
margin: 0px;
background-color: #fafafa;
line-height: 1;
}
td {
text-align: left;
padding-left: 1px;
}
input[type="text"] {
width: 100%;
padding: 10px;
border: 1;
box-shadow: 0 0 15px 10px rgba(0, 0, 0, 0.06);
border-radius: 1px;
}
.letter1 {
color: grey;
font-size: 80%;
padding-left: 20px;
}
.letter2 {
text-align: left;
padding-left: 0px;
}
select {
padding: 10px;
border-radius: 10px;
padding-left: 20px;
height: 40px;
font-size: 13px;
}
input[type="password"] {
width: 100%;
padding: 10px;
border: 1;
box-shadow: 0 0 15px 10px rgba(0, 0, 0, 0.06);
border-radius: 1px;
}
input:required:invalid:not(:placeholder-shown) {
border-color: crimson;
}
.red {
border-color: crimson;
}
.green {
border-color: greenyellow;
}
.tooltip {
border: 1px solid #ddd;
box-shadow: 1px 1px 1px #ddd;
background: white;
border-radius: 4px;
padding: 4px;
position: absolute;
}
progress {
height: 4px;
}
textarea {
width: 100%;
}
button {
height: 30px;
border-radius: 4px;
line-height: 0;
}
:global(body.dark-mode) {
background-color: #1d3040;
color: #bfc2c7;
}
:global(body.dark-mode) textarea {
background-color: #1d3040;
color: #bfc2c7;
}
:global(body.dark-mode) input {
background-color: #1d3040;
color: #bfc2c7;
}
:global(body.dark-mode) select {
background-color: #1d3040;
color: #bfc2c7;
}
:global(body.dark-mode) button {
background-color: #1d3040;
color: #bfc2c7;
}
:global(body.dark-mode) div {
background-color: #1d3040;
color: #bfc2c7;
}
:global(body.dark-mode) span {
background-color: #1d3040;
color: #bfc2c7;
}
:global(body.dark-mode) lable {
background-color: #1d3040;
color: #bfc2c7;
}
.Shutter {
background-color: hsl(200, 16%, 96%);
color: blak;
padding: 10px;
border-radius: 5px;
}
:global(body.dark-mode) .Shutter {
background-color: #1d3040;
color: #bfc2c7;
padding: 10px;
border-radius: 5px;
}
:global(body.dark-mode) table {
background-color: #1d3040;
color: #bfc2c7;
}
:global(body.dark-mode) .letter1 {
color: #bfc2c7;
}
:global(body.dark-mode) .letter2 {
color: #bfc2c7;
}
:global(body.dark-mode) b {
color: #bfc2c7;
}
:global(body.dark-mode) button {
background-color: #1d3040;
color: #bfc2c7;
}
</style>