Проверить доступность сайта
CURL-запрос выполнен без ошибок.
Время распознавания ДНС-имени: 0.007991
IP-адрес сервера: 185.245.187.136
Время соединения с сервером: 0.01991
Время установления SSL-соединения: 0.051731
Время перед началом ответа: 0.070284
Общее время выполнения запроса: 0.098011
Код HTTP-ответа сервера: 200 ( Ok )
Принято байт всего: 63489
Код HTTP-ответа среди заданных: Да
Цепочка сертификатов:
- доверие к цепочке: Да
- даты сертификатов валидны: Да
- имя сервера в сертификате: Да
Время распознавания ДНС-имени: 0.007991
IP-адрес сервера: 185.245.187.136
Время соединения с сервером: 0.01991
Время установления SSL-соединения: 0.051731
Время перед началом ответа: 0.070284
Общее время выполнения запроса: 0.098011
Код HTTP-ответа сервера: 200 ( Ok )
Принято байт всего: 63489
Код HTTP-ответа среди заданных: Да
Цепочка сертификатов:
- доверие к цепочке: Да
- даты сертификатов валидны: Да
- имя сервера в сертификате: Да
Subject: CN = narodmon.ru
SubjectAltNames: DNS:api.narodmon.ru, DNS:narodmon.ru, DNS:www.narodmon.ru
Valid from: Feb 16 05:09:27 2026 GMT
Valid to: May 17 05:09:26 2026 GMT
Issuer: C = US, O = Let's Encrypt, CN = E7
- Date valid: Yes
- Trusted localy: No
- Signer chain ID: 1
SubjectAltNames: DNS:api.narodmon.ru, DNS:narodmon.ru, DNS:www.narodmon.ru
Valid from: Feb 16 05:09:27 2026 GMT
Valid to: May 17 05:09:26 2026 GMT
Issuer: C = US, O = Let's Encrypt, CN = E7
- Date valid: Yes
- Trusted localy: No
- Signer chain ID: 1
Subject: C = US, O = Let's Encrypt, CN = E7
Valid from: Mar 13 00:00:00 2024 GMT
Valid to: Mar 12 23:59:59 2027 GMT
Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1
- Date valid: Yes
- Trusted localy: Yes
- Signer chain ID: Not in chain
Valid from: Mar 13 00:00:00 2024 GMT
Valid to: Mar 12 23:59:59 2027 GMT
Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1
- Date valid: Yes
- Trusted localy: Yes
- Signer chain ID: Not in chain
HTTP/2 200
server: nginx
date: Sun, 08 Mar 2026 20:14:10 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
set-cookie: uuid=f072306b55a3a7737e3d33f2268ef646; expires=Sat, 08-Mar-2036 20:14:10 GMT; Max-Age=315619200; path=/; SameSite=lax
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
server: nginx
date: Sun, 08 Mar 2026 20:14:10 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
set-cookie: uuid=f072306b55a3a7737e3d33f2268ef646; expires=Sat, 08-Mar-2036 20:14:10 GMT; Max-Age=315619200; path=/; SameSite=lax
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
<!DOCTYPE html>
<html lang="ru" dir="ltr" prefix="og: http://ogp.me/ns#">
<head> <link rel="preconnect" href="https://vernet.narodmon.ru" crossorigin>
<link rel="preconnect" href="https://api-maps.yandex.ru">
<link rel="preconnect" href="https://yastatic.net" crossorigin>
<link rel="preconnect" href="https://core-renderer-tiles.maps.yandex.net" crossorigin>
<meta name="yandex-verification" content="47a930df97acfe95" />
<meta name="mailru-verification" content="8cc4960f7ce436dd" />
<meta name='wmail-verification' content='2cc06b84cdced10b52e58e40d6ab71d9' />
<meta name="google-site-verification" content="l-L5zGluN00GWVTYMSF0oL21rC2Njr2u5ypN9yyHRv0" />
<meta name="msapplication-config" content="browserconfig.xml" />
<meta name="msvalidate.01" content="5629516BE059F0FA762FC3D5FB8686D3" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="ru">
<title>Народный Мониторинг - отечественный IoT проект Интернет вещей (мы открыты к предложениям)</title>
<meta property="og:type" content="website" />
<meta property="og:title" content="Народный Мониторинг - отечественный IoT проект Интернет вещей (мы открыты к предложениям)" />
<meta property="og:description" content="Народный Мониторинг - Основанный в 2011 году отечественный проект Интернет вещей (IoT Cloud) для сбора, обработки, хранения и отображения (на карте и в приложениях) показаний датчиков и веб-камер своих участников с публичным или приватным доступом на различных платформах." />
<meta property="og:url" content="https://narodmon.ru/" />
<meta property="og:image" content="https://vernet.narodmon.ru/img/ogimage.png" />
<meta name="description" content="Народный Мониторинг - Основанный в 2011 году отечественный проект Интернет вещей (IoT Cloud) для сбора, обработки, хранения и отображения (на карте и в приложениях) показаний датчиков и веб-камер своих участников с публичным или приватным доступом на различных платформах." />
<meta name="keywords" content="iot, narodmon, 2011" />
<link rel="manifest" href="https://narodmon.ru/.well-known/manifest.json" />
<link rel="icon" type="image/x-icon" href="https://narodmon.ru/favicon.ico" />
<link rel="apple-touch-icon" href="https://vernet.narodmon.ru/img/apple-touch-icon.png" />
<link rel="apple-touch-icon" sizes="180x180" href="https://vernet.narodmon.ru/img/apple-touch-icon-180x180.png" />
<link rel="apple-touch-icon" sizes="192x192" href="https://vernet.narodmon.ru/img/apple-touch-icon-192x192.png" />
<link rel="stylesheet" type="text/css" href="https://vernet.narodmon.ru/js/narodmon.min.css" />
<link rel="alternate" type="application/rss+xml" title="Новости IoT проекта" href="https://narodmon.ru/rss/ru" />
<link rel="alternate" hreflang="x-default" href="https://narodmon.ru/" />
<link rel="alternate" hreflang="en" href="https://narodmon.ru/en" />
<link rel="alternate" hreflang="ru" href="https://narodmon.ru/ru" />
<link rel="alternate" hreflang="uk" href="https://narodmon.ru/uk" />
<script type="text/javascript" src="https://vernet.narodmon.ru/js/lang_ru.js"></script>
<script type="text/javascript" src="https://vernet.narodmon.ru/js/narodmon.min.js"></script>
<script defer src="https://api-maps.yandex.ru/2.1/?lang=ru-RU&apikey=2ab7c0ae-b0d0-4407-8fc6-ccbe32065823"></script>
<script defer type="text/javascript" src="https://vernet.narodmon.ru/js/md5.min.js"></script>
<script defer type="text/javascript" src="https://vernet.narodmon.ru/js/highstock.js"></script>
<script defer type="text/javascript" src="https://vernet.narodmon.ru/js/windbarb.js"></script>
<script defer type="text/javascript" src="https://vernet.narodmon.ru/js/exporting.js"></script>
<script defer type="text/javascript" src="https://vernet.narodmon.ru/js/offline-exporting.js"></script>
<script defer type="text/javascript" src="https://telegram.org/js/telegram-widget.js"></script>
<script defer type="text/javascript" src="https://www.google.com/recaptcha/api.js?render=6LevQdIZAAAAAKkS6XXkhIiO8eJts1ZcnwBZVkZ7"></script>
</head>
<body onLoad="bodyLoad()"><script type="text/javascript">
var map=null, sensors=null, webcams=null, places=null, ListType=null, ymaps=null, grecaptcha=null;
var mapTimer=null, viewTimer=null, Path=null, tracks=[], times=[], alt=[], spd=[], dst=[];
var pmid = 0, lang = "RU", fcm = null, cw = 1920, ch = 1080, sImgHref = "https://vernet.narodmon.ru/img/img60.png";
var curdate = new Date();
var tz = -curdate.getTimezoneOffset()/60;
var webcam = {
iconLayout: "default#image",
iconImageHref: sImgHref,
iconImageClipRect: [[256,16],[288,48]],
iconImageSize: [32,32],
iconImageOffset: [-16,-16] };
var iStart = {
iconLayout: "default#image",
iconImageHref: sImgHref,
iconImageClipRect: [[288,16],[320,48]],
iconImageSize: [32,32],
iconImageOffset: [-16,-32] };
var iStop = {
iconLayout: "default#image",
iconImageHref: sImgHref,
iconImageClipRect: [[160,32],[176,48]],
iconImageSize: [16,16],
iconImageOffset: [-8,-8] };
var iFinish = {
iconLayout: "default#image",
iconImageHref: sImgHref,
iconImageClipRect: [[320,16],[352,48]],
iconImageSize: [32,32],
iconImageOffset: [-0,-32] };
function AddMenuItem(txt) {
if(txt != "") return new ymaps.control.ListBoxItem(txt);
else return new ymaps.control.ListBoxItem({ options: { type:"separator" }}); }
function initMap() {
map = new ymaps.Map("map", {
center: [55.748699,37.618698], zoom:11, type:"yandex#map", controls: ["typeSelector"] }, { suppressMapOpenBlock:true, panoramasItemMode:'off' });
if(cw > 640) {
GetObj("link").style.display = "block";
map.copyrights.add("© " + UI["ProjName"]);
map.controls.add("rulerControl",{ position: { top:45, right:10 }});
map.controls.add("zoomControl", { position: { top:80, right:10 }}); }
if(cw < 1200) {
map.controls.get("typeSelector").options.set("size","small"); }
map.events.add("typechange", function (e) {
var div = GetObj("link"), mtype = e.get("map").getType(), bpx = "9px";
if(mtype != "yandex#map" && mtype != "yandex#publicMap") bpx = "25px";
if(div) div.style.bottom = bpx;
SetCookie("map", mtype); });
map.events.add("boundschange", function (e) {
cw = document.documentElement.clientWidth;
ch = document.documentElement.clientHeight;
var zoom = e.get("newZoom"), GP = e.get("newCenter");
if(zoom != e.get("oldZoom")) SetCookie("zoom", zoom);
if(GP != e.get("oldCenter")) pmid = 0;
if(map.balloon.isOpen() == false) WaitMarkers(); });
map.events.add("mousemove", function (e) {
var GP = e.get("coords"), div = GetObj("link");
if(div) GetObj("link").innerHTML = ShowCoords(GP[0], GP[1]); });
Path = new ymaps.Polyline([], { hasBalloon:false }, { strokeColor:"#ff0000", strokeOpacity:0.5, strokeWidth:5 });
Path.events.add("click", function (e) {
var evt = e.get("coords"), apex = evt, dist = 360, idx = 0;
for(var i = 0; i < Path.geometry.getLength(); i++) {
var GP = Path.geometry.get(i);
var dlat = Math.abs(GP[0] - evt[0]);
var dlng = Math.abs(GP[1] - evt[1]);
if((dlat + dlng) < dist) {
dist = (dlat + dlng);
apex = GP; idx = i; }}
var txt = ShowDate(times[idx]) + " " + ShowTime(times[idx]) + "<br>";
txt += ShowCoords(apex[0], apex[1]) + "<br>";
if(alt[idx] != 0) txt += UI["ELE"].replace("%", alt[idx]) + "<br>";
txt += UI["SPEED"].replace("%", spd[idx]) + "<br>";
txt += UI["PATH"].replace("%", Math.round(dst[idx]/100)/10);
Msg(txt); });
tracks = new ymaps.GeoObjectCollection();
tracks.add(Path);
map.geoObjects.add(tracks);
var btnSearch = new ymaps.control.Button({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACn0lEQVR42o3SW0iTYRzH8d/7brpNN9LS3GYH0fAAGoGpkWnEQuzChDyBAy/mKVKJQlPQMDHTMjQilVwSSmSR1BKllBWhN0GSHYRFQc1cuXZoB+eO77u3KXVhs9j34rn4X3x4TgR+19E8kM4WbKvjhAuKCZLnJkCxCY99Ymuwp11aUfAO/4hYW+orr9SI0vbfEKYkwsvmgaFpWO0UrAYbGP1XRDDGyuraolubAuXSVklSdqbyQIEEBq0ZTrsTUeEhCOKy4PQAqkUndPNvIaT1uTUNpVN+QFVlt0LWUZvPJkhYLXbwuEHw0hQSogWwuGh8WV7FqwUfPD8719ZWluYHNLbcdNW3VwXrTG6QLAIsgoHB4kKqkA8Hm8AbtRmfl91QTc2u8l3a+Nau2u8bgIamPkdn5ynutxU3aIIAhw043IDmpwNuNwWG8YFWAgvKGbiWPib1DDR+2ADUne6xXb92JtRKeUHTDFY8XpAkCZvHA53JBa3OAZLLw/MRhZE2aOIGh1ssG4BDmdXyhxO9FZFhPNgpH0D5XoD2wuqgoF6ygM8XYHHJhCe98lHFRHup3x0kxhdFZx1O1QwONq4Pfri8sLnp9Z2AzYHe6EB3831IgsakTSOTdzf9BzExxw+mpe+dOXe+nJWcHAOzb2ZjgNlnKjwamsaROAuKRf1YNej6Ey4wNX7AWmLxMZJFkheFou0Zwl3iCK1aYzaaqOmy/NTYkymjsqiSLpjnp/F++PJQthwVfsD/et2y49O+6q49RGg4tMoBzI1PyvPuMFUBA/fyQIREChZzZNKdnDAWll8q8eKp+nbpmEsWELBW/1EQgi081YnC2IQQkR42tQ7jCuJBwMCf+nLYMyW5VBaXD1x9vDuwI/zdpQyMG0mxRGEvPPsLbTAb0Ejlx/UAAAAASUVORK5CYII=", title: UI["SearchObj"] }});
btnSearch.events.add("click", SearchObj);
map.controls.add(btnSearch, { selectOnClick:false, position: { left:10, top:80 }});
var btnFindMe = new ymaps.control.Button({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAWtJREFUOI2VlLFKA0EQhj+1MlaGhNQBUwiBWGhhEawUIlicFsYQSPCpLIRAXsIiIOQdLKyDMcnZS4JHzmJmyXru3W1+GO5u5t9/Z2ZnD/xQA448uV54B958iHs58QpwAwTAPvABhMD3thlVgCEQAXHCfoABUPYVawAzXfwCPKjvBOgCI41NgbpPZjOkpLsMXhtYIi0oZQkOdXdb7ABoAdf6btBR7nNWdhFSpsEF8MWmfyHQtOKvwAooppURIz0zmdlixhZAQTl99d3aQjVkzhYabKi/5RAzdqWcU/2eq0Z1Vx0RsFbSTuLpQpzgrFXjD+6V2LVKDh3ZfSJDDvCovsC1axkZ2pHla7JphRE7t+JjZHwO00oZ6MK25SsgPbu0MgPoKfcpTcxkOdVdOxm8HjIuE1JGxkYduQExMmd95DTPkJ6NNTYBjvPEDErIDVjx/1CWSJm5mblQRIZ2jhxIQMYBbAPvH6wvqmq5+AWXZW1BE0Fv+gAAAABJRU5ErkJggg==", title: "Определить местоположение" }});
btnFindMe.events.add("click", function(e) { GetLocation(55.748699,37.618698); });
map.controls.add(btnFindMe, { selectOnClick:false, position: { left:10, top:115 }});
var btnUpdMap = new ymaps.control.Button({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANkE3LLaAgAAAzVJREFUeJxdk1toHGUYht857c5MdjfJNGw21TbLJjYmpAdaSlpxRWyQKtIaaFPwqgvihVhFCi1SbKGKV7aSerxQKNaiVhEavChYKtRQTJukdTEJbhNiOjlsd5Ldmdk57c78M16Yw5IPvovvg/fhf9///ylsrDfQtrO968Setu4X4w1Nkkfc8qQ8NXpr7M+P7c/tEQBoOR3vqxNjzVPnpr6iarXSu/V9/b2HrnRsTdZFwyKEMAde9MGHOeQfa+TrXwcvFErFuQvHP7w0PvvP5JlvPtjLror5t/h0f+/h7+PxWDgAAceEwLIBfNaEhjI2PVnHnMu8foqYAhqFRmSn/QAA/gccBbOrs+sLhZbDgp4i0w8Xh4qGei8UYoLWzU17d+9oSbMxi/GCJbBsIxQrgF5VsQYQN4u9TKPXnV8o5W88+OE181Pz91prL3277739B+o+0h0DxKhH1WYxU9LWASzDNjAWX7nzYOyw95l3t1acvrKnpT0VzyyoMvwKB1Q8uJ4LPiSsA3RZ//m2fHcQP8HeeCnbmpv3xyOJpzQjbPoeDafqgniu8FiRR/EdTAoApJNSzwsdzx+jKYYOqJVwaJa/+fetq8pFZej4jfQWs+pTtuMgr6jBw9xSWRvQNAABCwBHel49mzlw7GXbtUDRBISuQGQjGP33flaBMnT54B9y7amSZ5InyDvkL2PAuE0DgFYt8gvGIxTsR5irTmCZmsb5Hy9ey53PfbnRUups8v30M7svxWKR59YyyFtyMKGOYEv9Ewg4DYQzkUj5T0unI31FxRiDD5+P8qnutm1vptoS/bPqDEq69tsaIADBnDUNW5hHIhqD56vY92zTju2dr/yyKLuOY7G+TxFBJyq1XClBXXIG7QF7eP0hcQHFiwJmx8u5gqgHzT1mx7xqAdUo6OgmnqJYlCwVVcbH8kTlXvbyZGbVEgMA0vboQeJQ9dffHj4ycnXmWuBEktJWqZ1iBcpzQ7A8D2rBJhPX529mP8llkEd+ReuvfqYWcGiCiyiAVgCSmOA7410NrVyMFQ3VdgpZdZwUyTCAAgAFwCIAnQKw2gKAhprmV/YA4AKwAZgAVADlldn9D4Y1agooTtxEAAAAAElFTkSuQmCC", title: UI["UpdateMap"] }});
btnUpdMap.events.add("click", function(e) { tracks.removeAll(); GetMarkers(); });
map.controls.add(btnUpdMap, { selectOnClick:false, position: { left:10, top:150 }});
var btnAsk = new ymaps.control.Button({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAC8UlEQVR4XqWVXUiTYRTHn01n02Ybb+loOEI3IsJgY+LQyCKIdlG7aOs2gojqKpJoiF1UxFZWECuikhC6yQvLwLCLootWqGkO55zTfby7cJtrrik4mBPft/8zlpWbxvSBH+d5zs75n7NnPGcCnufJekutVmthTEAN6sBuEAMsCIDXfr9/uFCucB1BI/iO7ShoB8eAGPhAee5sAd8QNwgMazVK1wiWwdjBBRAFN8FLdBUsUHw/zFlwDvTjfAf2OmK5vI4lEkl3TvQdOICgG4VEKfB7wDUaBxygjWGYx3lXUV1dvSuTyRixbUXCSZDIUytcIAJzFNxeWFi4KJfLq7IB+PGydHR0nLbdtfbT/WaxP7J/tFgsZ7D/0/Hefeo6qVQ2QbawpDsqx2pVe1T/XEUqlaaVTFsR/hFPnCoXS8yrwgaDQRWeCSu9Hu/MVoSDgUBk3DW+02q1arLCRqPxSTL+09Tb23tVr9d/EggEX4sRpPEKheJ9X1/flUDAb2rWNz/LCqfT6WWminlhNps/d3V1HYGrqchmmzo7O4/bbLYvU1NT92Zjs5mscCgUUvl8PmV9fX2ZSCSiLq5IYa6iooJvbGwsFYvFTd5pb60QX+N8PB6XRqNRMj8/T9xuN78Z4XA4zCeTSaJUKkkwGCijHR8cGhoUhkIsoR9MTk5ymxFGY7zH4yEsyxKHw5Ghs2KZZUPTsPKWlsNkcXFx9UUWgRDCJJFIEJfLRc9OKpwBY+AQ7RiLByVFCpfEYrGVv84OYU64B1yam5tbyXXMFynM0zyaT3XAg9/CpXh1T3G/lwcGBtzZQsWtHppH86kOWBHAeQsM4tBfKKOhoUEJ8xzoEFOSSqU+YLy2jYyMsP+r1g4eAnmuc0LBEoFKDPBRjUbDY6zy1Gq1Wl6lUk3odDrBRpOOXsV9MA3soBvP8y0F+zfg1dLSkgKW1NTUEPhJJBIhHMcxcG3bqNv8P9P8q2AwwG149icQux0vc1wmk7U6nc7hjfJ+AYZhoL34zCFbAAAAAElFTkSuQmCC", title: UI["AskAdmin"] }});
btnAsk.events.add("click", function (e) { Dlg("auth"); });
map.controls.add(btnAsk, { selectOnClick:false, position: { left:10, top:185 }});
var btnWeather = new ymaps.control.Button({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAD0klEQVR4XsWVTWxUVRTHf+e+TmfaUopQQiMFSUAiEhTFRILSaQuiEgNhYTDRDaS40YUbEzZKYiICpaKBncFEN8QYIqJWAgGlEJCvFCqftotCC7ZSBtrpfHTm3Xu8TBrTTBRwYfwlJ/cl75z/+79zz32P/51wT90H4bd1O3hADA+e2QS8EX5TZ/61sC9a6WMBo2za8iEt27bgxRYSSCVRI0Dj1o834++NrZvtY9W9HF8CToV748d8Yl0sFqM+3gCGdUyJlVETrSRgXWPDEiKRCD7nmXBvXStwGehhDEIRPvF7yoPljLg0TrqlprFTSyIrURHyCRjuVZL9n2DyixCZ53PLSNlfSlYcXsQYSijG8h4ZV89TUysk/cJcqp+YayqmQBAFO4SmO8V1/vCODHQI88bDr8kkVtffs8e+b3za/Uo7KmdluB6pXYJMeByMQ/NXfLRDyW3M3CWitXPgYhLy2r2jZ2Wbr/1nYWNMoadSE++i+mmITv7rxUQiFHB96MgJZPpMNFalOD24+Pl4ofZvezw6Rg0E0kTN4tXmybcFkwUioBmwXtD2QthbWHFpGLRwscuCfonls5JVbcfHCjM6+K8TNaaw8/Y58cJorgMxUVRDcHfA9qP2BtjrYG+Cm4ie7kQejlr6chlCl0LZifKFAUBJIGSwKoTqNDsw6vI6GvaMCvWBu8XNgST7jlaxfdcCvjtcTW9mAgRiCHBAGcJEoEqKDshCDE0aq15jnn3LqOlGvFNwqGZIpwbZ1TqD+vhSxlWOp6/vBidPHGXZQ0cOPBId2Aoc9O2wFLO5eSOnz5wk3BPfnm9fr3Z4tyauvqt7dm/Qlm0b9fOdG/T8hXM6cGtAr/Vc1ctXLumhQwe0uWXTNV+b8utXfjqmF88xqsqRo23Mn+Hi0n8CV5qj7cpkZsx6kUWLp9J+rp0JVRPJ53LkRkbIZjNIYGhsWDptWu00OjrOvupzAFYLRdw9ykSklfmVFUNn8uzsrGftmnUEQVAI5xxDQ0Ok02nKy8uJlZVRGiklOTyEfxP2798X+pyZhmIC+YiYKac9mfr59zl/LFv2ckEw4ovD0JLP573TLNmRDBXjxjHirxOJWwwODjKcTPLorNmBp7l48xYApwj4Ecv7LV0v/dS09s3KTDZDzgs66zBGSKVS3nGq4NiYwIvewTqLIDh1HD9+LFP8ragFHitZ0fYbQHPL8q/PXzi/pnrSJPGOCkXRWBTntNDnQR+IACAqBfHE7YQaY1qFe+B3eKp3tNE5+xpQyn0wIqEYs9tau54HwT/A+NO5/e7v6X55/Nf8CT9T3zLncVeAAAAAAElFTkSuQmCC", title: UI["Weather"] }});
btnWeather.events.add("click", function (e) { Dlg("auth"); });
map.controls.add(btnWeather, { selectOnClick:false, position: { left:10, top:220 }});
var ListLang = new ymaps.control.ListBox({ data: { content: "RU", title: UI["SwitchLng"] }, items: UI["ListLang"].map(AddMenuItem) });
ListLang.events.add("click", function (e) {
switch (ListLang.indexOf(e.get("target"))) {
case 0: { Go("/en"); break; }
case 1: { Go("/ru"); break; }
case 2: { Go("/uk"); break; }}});
ListLang.get(1).select();
map.controls.add(ListLang, { itemSelectOnClick:false, position: { left:10, top:45 } });
ListType = new ymaps.control.ListBox({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMA6gDrAPAUyBWyAAAAtUlEQVR42t2SLRKDQAyFXzrICgycA4EvB+ghqKYa261FF10O0QNQH8E5FoOoT0V2Mju0BlHT5zbve/mZWfLzgi3aYaN+H0jiR56lX6H4ziRGmRnA7fEy+3zcm6sx8vOSZ6miRg+uEpHT9WkZAGVZhlHMzMwiIiK1G+NlajdqXRkABEBEjNCug6uUBnC/HMwlIvLz0vZTXNWMalXvmoJ0rbafVnYsbdE1RTjaDI19StGw1R/8pTfpfV8d5jqv+QAAAABJRU5ErkJggg==", content: UI["Show"], title:"" }, items:[ new ymaps.control.ListBoxItem({ data: { id:1, content:"t воздуха" }, state: { selected:true }}),
new ymaps.control.ListBoxItem({ data: { id:24, content:"t воды" }}),
new ymaps.control.ListBoxItem({ data: { id:25, content:"t почвы" }}),
new ymaps.control.ListBoxItem({ data: { id:21, content:"t точка росы" }}),
new ymaps.control.ListBoxItem({ data: { id:2, content:"RH влажность" }}),
new ymaps.control.ListBoxItem({ data: { id:3, content:"атм.давление" }}),
new ymaps.control.ListBoxItem({ data: { id:11, content:"освещенность" }}),
new ymaps.control.ListBoxItem({ data: { id:26, content:"яркость" }}),
new ymaps.control.ListBoxItem({ data: { id:20, content:"УФ-индекс" }}),
new ymaps.control.ListBoxItem({ data: { id:12, content:"радиация" }}),
new ymaps.control.ListBoxItem({ data: { id:9, content:"осадки" }}),
new ymaps.control.ListBoxItem({ data: { id:22, content:"запыленность" }}),
new ymaps.control.ListBoxItem({ data: { id:4, content:"скорость" }}),
new ymaps.control.ListBoxItem({ data: { id:5, content:"направление" }}),
new ymaps.control.ListBoxItem({ data: { id:15, content:"концентрация" }}),
new ymaps.control.ListBoxItem({ data: { id:6, content:"P мощность" }}),
new ymaps.control.ListBoxItem({ data: { id:13, content:"U напряжение" }}),
new ymaps.control.ListBoxItem({ data: { id:14, content:"I сила тока" }}),
new ymaps.control.ListBoxItem({ data: { id:8, content:"A энергия" }}),
new ymaps.control.ListBoxItem({ data: { id:19, content:"% батареи" }}),
new ymaps.control.ListBoxItem({ data: { id:7, content:"Rx,Tx трафик" }}),
new ymaps.control.ListBoxItem({ data: { id:10, content:"логический" }}),
new ymaps.control.ListBoxItem({ data: { id:16, content:"dBm сигнал" }}),
new ymaps.control.ListBoxItem({ data: { id:17, content:"водосчетчик" }}),
new ymaps.control.ListBoxItem({ data: { id:18, content:"время работы" }}),
new ymaps.control.ListBoxItem({ data: { id:255, content:"числовой" }}),
new ymaps.control.ListBoxItem({ data: { id:23, content:"текстовый" }}),
new ymaps.control.ListBoxItem({ options: { type:"separator" }}),
new ymaps.control.ListBoxItem({ data: { content: UI["MyPlaces"]}}),
new ymaps.control.ListBoxItem({ data: { content: UI["OurCams"]}, state: { selected:true }}),
new ymaps.control.ListBoxItem({ data: { content: "webcams.windy" }, state: { selected:false }}),
new ymaps.control.ListBoxItem({ data: { content: "METAR" }, state: { selected:true }}) ]});
var typecnt = ListType.getAll().length;
ListType.events.add("click", function (e) {
var idx = ListType.indexOf(e.get("target"));
if(idx >= typecnt - 3) {
ListType.get(idx).disable();
Dlg("auth"); return; } if(idx >= 0) {
if(idx < 27) {
for(var i = 0; i < 27; i++) {
if(i != idx) ListType.get(i).deselect(); }}
WaitMarkers(); }});
map.controls.add(ListType, { float:"left", floatIndex:9 });
var ListSens = new ymaps.control.ListBox({
data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABO0lEQVR4nGNgoBAwIrG1AgICZujq6pozMjJubGpqCkOS4wdiPiB+DMRBQCwMxMeA+CqyYZ1///79/h8IampqfiOJ9wPxEyA+C8RZQJwIFc9Gd037fygAsv9DxXyA+DoQ8yCpqwLiSCAOQ9OPMKClpQVmQBsQt2DxOi8WMYZGLC6oA+Ip2BTDABM2QaALYMw1UOf6ArErEIfiMyzvhbPz/+/u7sguAAF3IF4FNcwRnwvefPrzB8xoUFVFVrOTARJgIUC8H58BX+AG3L6Nz6XYDZDn4DCFsUsUFRmy5ORsSDEgEuhsP20eSHQ3Ar3w9e/fpaQYYBAhJaUEF2RkZJDg4JAgxYBXd799u4Qs8e737+ekGDDZ/sSJ+ze/fQNlkC+zHz++eufLlzJiDEDOjWxAnAvEQkB8E4gXEWMAAFfwcyeljAn8AAAAAElFTkSuQmCC", content: UI["Sens"], title: UI["ChartWait"] }, items: UI["ListSens"].map(AddMenuItem) });
ListSens.events.add("expand", function (e) { AJAX("devmenu", "", SensMenu); });
ListSens.events.add("click", function (e) {
switch (ListSens.indexOf(e.get("target"))) {
case 0: { Dlg("auth"); break; }
case 1: { Dlg("auth"); break; }
case 2: { Dlg("topdev"); break; }
case 3: { Dlg("auth"); break; }
case 4: { if(e.get("target").isEnabled()) DelFavSens(); break; }}});
if(cw > 640) map.controls.add(ListSens, { float:"left", floatIndex:8, itemSelectOnClick:false });
function SensMenu(response) {
if(response.substr(0,1) != "[") { Msg(response); return; }
while(ListSens.get(5)) { ListSens.remove(5); }
var favs = 0, items = eval(response);
for(var i = 0; i < items.length; i++) {
if(items[i][1] == "") { var lbi = new ymaps.control.ListBoxItem({ options: { type:"separator" }}); }
else var lbi = new ymaps.control.ListBoxItem({ data: { id:items[i][0], content:items[i][1], title:"Chart" }});
if(items[i][0] > 0) lbi.options.set("selectOnClick", true);
if(items[i][2] > 0) favs += 1;
lbi.events.add("click", function (e) {
clearTimeout(viewTimer);
var idx = e.get("target").data.get("id");
if(idx > 0) viewTimer = setTimeout(WaitChart, 2000);
if(idx < 0) {
AJAX("devmenu/" + Math.abs(idx), "", SensMenu);
sensUpd = 0; }});
ListSens.add(lbi); }
if(favs > 0) { ListSens.get(4).enable(); } else ListSens.get(4).disable(); }
function WaitChart() {
var ids = GetSelected(ListSens);
if(ids.length > 0) Chart(ids.join(",")); }
function DelFavSens() {
clearTimeout(viewTimer);
var ids = GetSelected(ListSens);
if(ids.length < 1) { Msg(UI["NoSensSel"]); return; }
Ask(UI["DelFavSns"].replace("%",ids.length), 'AJAX("favdel/1","ids='+ids.join(",")+'",AJAXResult)');
ListSens.collapse(); }
var ListCams = new ymaps.control.ListBox({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAABFUlEQVQ4jaXSwSpEcRTH8c+MKVlirJUVNRaUMkoWHsEk8wBiYyEbjyBSHmMKC8rGxoLFLCyUnYWQjfIAMq6xmLO4c10x+dXp3/2e3/nde8+9/FOFH/gKaqnreZxi9S+hFbyjjaOodlQlay5hCNsYC7aEa1TxkfI1cYvjYPfY6cMJZvESjRts4DV1o09cYDjCYAGLkKCe8ypzOIiq5vTrSIooopVpruMSM1FXWMt4WjGrrXvjZbzp3vhqsHKK1dAu5jzaNPrRSLFGsKmsOS/gMc7xFJuI8ylrLmUB7nCo87n2g20Fu8vxf9sBDGAPz1G7wdKqxawEy3nJv2gZSQHnGNX5y3rRJB76cIYRDPYY0MRmjzPf9QWWTDjWEkfsYwAAAABJRU5ErkJggg==", content: UI["Cams"], title:"" }, items: UI["ListCams"].map(AddMenuItem) });
ListCams.events.add("expand", function (e) { AJAX("cammenu", "", CamsMenu); });
ListCams.events.add("click", function (e) {
switch (ListCams.indexOf(e.get("target"))) {
case 0: { Dlg("auth"); break; }
case 1: { Dlg("auth"); break; }
case 2: { Dlg("topdev",1); break; }
case 3: { Dlg("auth"); break; }
case 4: { if(e.get("target").isEnabled()) DelFavCams(); break; }}});
if(cw > 640) map.controls.add(ListCams, { float:"left", floatIndex:7, itemSelectOnClick:false });
function CamsMenu(response) {
if(response.substr(0,1) != "[") { Msg(response); return; }
while(ListCams.get(5)) { ListCams.remove(5); }
var favs = 0, items = eval(response);
for(var i = 0; i < items.length; i++) {
if(items[i][1] == "") { var lbi = new ymaps.control.ListBoxItem({ options: { type:"separator" }}); }
else var lbi = new ymaps.control.ListBoxItem({ data: { id:items[i][0], content:items[i][1] }});
if(items[i][0] > 0) lbi.options.set("selectOnClick", true);
if(items[i][2] > 0) favs += 1;
lbi.events.add("click", function (e) {
clearTimeout(viewTimer);
var idx = e.get("target").data.get("id");
if(idx > 0) viewTimer = setTimeout(WaitView, 2000); });
ListCams.add(lbi); }
if(favs > 0) { ListCams.get(4).enable(); } else ListCams.get(4).disable(); }
function WaitView() {
var ids = GetSelected(ListCams);
if(ids.length > 0) CamView(ids[0]); }
function DelFavCams() {
clearTimeout(viewTimer);
var ids = GetSelected(ListCams);
if(ids.length < 1) { Msg(UI["NoCamsSel"]); return; }
Ask(UI["DelFavCam"].replace("%",ids.length), 'AJAX("favdel/-1","ids='+ids.join(",")+'",AJAXResult)');
ListCams.collapse(); }
var ListTrks = new ymaps.control.ListBox({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACrklEQVR4XpWRTUicVxSGn/v9DDpFLYrp1E0kmhYrtbbJFDVZBN0JjrRdh6BU1EUXwZmOgbT+kJAh3djmz5WLQt201VZIrQtJKW1pNR1LhZYG40ggmXZRQVtHR+e7p5fLgJukkAculwvnvO977lGfj7d96Skde7jtfzL7a8W3jgr6RQevaa0R0Sjl4Lpu3vf9CcdxhjkEpRTqs9EWaX69mXMfPKDppTpePF5Hff1xIpEIIkIgmo31daampqioqFA7OzuvitYvCPR5ntfhIYJojS4cMD42ytwXs6TTad7u6+P5yHPk8/s8W15u7jy5XE5qa2spKSmhp6eHeDyOg0Ws2y8rK9y4cZPb8/M4rguAic3a2n329vaYnp7m4nvvMzA4SDgcJggCvGK/nbck/Azjly5x8uQJxkfHKDfOW9tbJJNJW2zeHATCWCLBYP8AWmucYr9NcKyujtbWVqqPVCNaQLBUVlZiPpJs9k/u3fuDhBE4dbrtUEApG9XGXFxc5MOJjxgZG+FK6jLXr11jdXWVUChEYvgCqSspGhoaKIJXXAchP8TkrUl+/OE7fFPc29tb/APFzMwsruvwystNbG7+TSaTIWM2Y7aAh0Xhmsfd5SUzZ5kd560337Bzm2TWQAQS8fP8m9slPjREVVWVTeUJin92Bd+Fgrhz2Wz2a7PGJYp0dXXdFRErAtim0tJSY/YTWssMn460yG9zA/LV5agAtUBZrLub7uKJRqPvxGKxg87OTuno6LCnvb19obGx8Sxw1BMg0Ip8wWEh1bJx9ZsaClrjKsFRsLy8/DHwPaA4ZBP4yxjkPIoUtGKvoHj3zCNSd2oIeYLvCKZoC0jzeKwJynFAWRF2TZLEmSxJI2TeCP+PZ5r5PZ1GKQdQBBr2rbJCC4iAUjwRBZzgkJ95Sv4D5N0i1pWuvSMAAAAASUVORK5CYII=", content: UI["Tracks"], title:"" }, items: UI["ListTrks"].map(AddMenuItem) });
ListTrks.events.add("expand", function (e) { AJAX("trkmenu", "", TrksMenu); });
ListTrks.events.add("click", function (e) {
switch (ListTrks.indexOf(e.get("target"))) {
case 0: { Dlg("auth"); break; }
case 1: { Dlg("auth"); break; }
case 2: { Dlg("auth"); break; }
case 3: { GPXSelTrks(); break; }
case 4: { RenSelTrks(); break; }
case 5: { DelSelTrks(); break; }}});
if(cw > 640) map.controls.add(ListTrks, { float:"left", floatIndex:6, itemSelectOnClick:false });
function TrksMenu(response) {
if(response == "") return;
if(response.substr(0,1) != "[") { Msg(response); return; }
while(ListTrks.get(6)) { ListTrks.remove(6); }
var items = eval(response);
for(var i = 0; i < items.length; i++) {
if(items[i][1] == "") {
var lbi = new ymaps.control.ListBoxItem({ options: { type:"separator" }});
ListTrks.add(lbi); continue; }
var lbi = new ymaps.control.ListBoxItem({ data: { id:items[i][0], content:items[i][1] }});
if(items[i][0] > 1e10) lbi.options.set("selectOnClick", true);
lbi.events.add("click", function (e) {
clearTimeout(viewTimer);
var id = e.get("target").data.get("id");
if(id > 1e10) viewTimer = setTimeout(WaitTrack, 3000);
if(id < 1e10 && id > 0) AJAX("trkmenu", "from=" + id, TrksMenu); });
ListTrks.add(lbi); }}
function WaitTrack() {
var ids = GetSelected(ListTrks);
tracks.removeAll(); ListTrks.collapse();
if(ids.length < 1) return;
ShowBanner(0); clearTimeout(mapTimer);
var did = Math.floor(ids[0]/1e10);
for(var i = 0; i < ids.length; i++) { ids[i] = ids[i] % 1e10; }
AJAX("trkget/" + did, "ids=" + ids.join(","), ShowTracks); }
function FindTrack() {
var dtime = ShowPrompt(UI["ListTrks"][0] + ":", "");
AJAX("trkmenu", "dtime=" + encodeURIComponent(dtime), TrksMenu); }
function GPXSelTrks() {
clearTimeout(viewTimer);
var ids = GetSelected(ListTrks);
if(ids.length < 1) { Msg(UI["NoTrksSel"]); return; }
var did = Math.floor(ids[0]/1e10);
for(var i = 0; i < ids.length; i++) { ids[i] = ids[i] % 1e10; }
Go("/gpxout/" + did + "?ids=" + ids.join(",")); }
function RenSelTrks() {
clearTimeout(viewTimer);
var ids = GetSelected(ListTrks);
var val = GetSelected(ListTrks,"content");
if(ids.length < 1) { Msg(UI["NoTrksSel"]); return; }
for(var i = 0; i < ids.length; i++) {
var p1 = val[i].indexOf(",")+2;
var p2 = val[i].lastIndexOf(",");
var did = Math.floor(ids[i]/1e10), id = ids[i] % 1e10;
var name = ShowPrompt(UI["RenTrack"], val[i].substring(p1,p2));
if(name == false || name == null) continue;
name = trim(name); if(name == val[i]) name = "";
AJAX("trkren/" + did, "from=" + id + "&name="+encodeURIComponent(name), AJAXResult); }
ListTrks.collapse(); ListTrks.expand(); }
function DelSelTrks() {
clearTimeout(viewTimer);
var ids = GetSelected(ListTrks);
if(ids.length < 1) { Msg(UI["NoTrksSel"]); return; }
var did = Math.floor(ids[0]/1e10);
Ask(UI["DelSelTrks"].replace("%",ids.length), 'AJAX("trkdel/'+did+'","ids='+ids.join(",")+'",AJAXResult)');
ListTrks.collapse(); }
var ListHard = new ymaps.control.ListBox({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACNFBMVEUAAAAAAAAAAAAAAAAAAAAjOjoASA0AAAAAAAAAAAAAAAAAIAEAAAAAAAAAAAAAPQgAAAAAAAAAAAAAAAAAAAAAAQQASBIAAAAABABRfYIATxMAUhgAHxMAFAMTEwcIXykrOzslLC5jiY0jKSsKDhEAFwFJYWEyUFIZcTgJNA0/TE4YHyMZRiUBGA4zNzpKVFQ6iFMqXTphXUFpbm86QkVkcnQWUx95hYc/YCZ5fYEVWyJEiE5vtn9IZTZpnHF4gYQ0hDtQW16enWGwt7wsiDTA1dc6hjKQxJNInEixubwzh08cIh8prjcysD41tURAh0lFS0xIm0pJkGFOtlJRnmZTmnRVhWVVmWNYk6JZem1ZfHtZiXpev1pfrFljmWNnfX1nw15psV1tw3JuxGtvjpBvprZvtlVvzHRxdXpxhXhyeHtylXJyzWp0q5Z1e4F1yn13ym94r3N4u3d5uH151Gt6xmt7joN7zW18f4R8oqV8zHN/uXiBt1CBzIGCt2uDxnqEu4+Ev4GFooGHzoKIi5CJrImJsK2Lq7GNnKCNpKyOo0CQpzeQxYiT0ZGT25aV25OWZDSWf06Wt5aZvpmbpqab05agckCgt8KkXDultaymo66mq62nvqyotLmssLSsvMSvucSv6KWv8qaw5ayx4aex5Ki0jpC2xbm4wL646LS567G8xsy+mJm+wMLIwj/K777T9cXV19jXzdDb4ujd1HHh/9Dl/9Pp5ens39/u9fn5/+L///89vkkVAAAAS3RSTlMAAQIFDAwNDhAREhUcJCkuLzAyMzQ1OUNISElaYmZqcXl7fYGCiIqMjpubnaGmp6eyuMfKzMzNztXW3+Dg4eXn7u7z9Pf4+fv8/P1TXes5AAAA80lEQVQYGQXBA2IEAQAAsamvtm3btm3btm3btm3s55oAutZiAIC0PCBlFtlroKylp29s4xLgKg5WgjAdFxWTNtL8/PUXJAK7x9ftjK3Vyqnqu5fPaDXwres5zlzZyWk8XV68PDcE96aJ+/zSoaXbzfXrtTMHcKo5+s0bHB27WNgXdsf9ZVDy/HmraK9PaSvv2qsdLtMBk4er2ezW+P6GouSWvgFb0Iz9PsnqLEzv7kiqmn/yAQnvyY3ckoTEghC/uY8wI8D04KY4NcLLUkU90E0bQDFcmHHUkAQURADg/H5oDwAAgKpFcKgcAAAAmHvIAgD8Azy1RuSt6SMJAAAAAElFTkSuQmCC", content: UI["Hard"], title:UI["ListHard"] }, items:[ UI["ListHard"],UI["ListDIY"],"","BOREAS-4 (4 датчика, 2 реле, 4 логических входа)","Wi-Fi термометр ESPMeteo mini","Уличная Wi-Fi метеостанция IQHA","Webcontrol: управление для Vaillant","Освежитель воздуха IQHA Fresher","Дозиметр IQHA Radmodule","Метеостанция IQHA мини","TE-MONITOR v8: Термометр Ethernet/WiFi","Уличный корпус-экран для датчика","Дозор Метео RF","Дозор Метео mini","WiFi Meteo Station","ESPGate868: шлюз беспроводной LoRa-сети","ESPCounter: счетчик импульсов двухканальный","ESP-TCouple: Модуль ввода сигнала термопары","Кситал GSM: Система GSM сигнализации","Измеритель мощности HN-PM3F","Измеритель мощности HN-PM1F","ONtOSbox: контроллер для Интернета вещей","ESPmeteo: WiFi метеомодуль"].map(AddMenuItem) });
ListHard.events.add("click", function (e) { switch (ListHard.indexOf(e.get("target"))) {
case 0: { Dlg("cathard"); break; }
case 1: { Dlg("catdiy"); break; }
case 3: { Dlg("cathard",1767109768); break; }
case 4: { Dlg("cathard",1740830100); break; }
case 5: { Dlg("cathard",1731329767); break; }
case 6: { Dlg("cathard",1724954255); break; }
case 7: { Dlg("cathard",1710335027); break; }
case 8: { Dlg("cathard",1708951207); break; }
case 9: { Dlg("cathard",1700477160); break; }
case 10: { Dlg("cathard",1688469411); break; }
case 11: { Dlg("cathard",1658480160); break; }
case 12: { Dlg("cathard",1592252607); break; }
case 13: { Dlg("cathard",1585644633); break; }
case 14: { Dlg("cathard",1581254280); break; }
case 15: { Dlg("cathard",1569494040); break; }
case 16: { Dlg("cathard",1533475951); break; }
case 17: { Dlg("cathard",1522348217); break; }
case 18: { Dlg("cathard",1506959172); break; }
case 19: { Dlg("cathard",1489044303); break; }
case 20: { Dlg("cathard",1489044300); break; }
case 21: { Dlg("cathard",1443512400); break; }
case 22: { Dlg("cathard",1428958800); break; }}});
map.controls.add(ListHard, { float:"left", floatIndex:5, itemSelectOnClick:false });
var ListSoft = new ymaps.control.ListBox({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABo0lEQVR4Xo2RMWsUURRGz33vTnQ3mV0iUcHCWAiaPxAUIY1gt2m0sBTsFGsRZLURmyD+DRuVBIKgjalEApaxsLMO6obNsszMva6bHQbZ2eiBV77zzuOTVnd7s6Gh4zjHEUQ4zGxrsZGsU4H+ufxsfRVzEKEWEUGD8Ojtp465j2UlWrhxujnHnVe7ZMODegEQQiAJgoNXJaCFwZn5EwwGPV7eula+iNR+AzSGv0o0d+fKOSUrnFQD9998Ic/6zCKKjCXm+CC3LTVjTOHwczBkOOzz4uZVwBFmIcQYeLz5uaNAaeDe6lkevDaWGgkPP3xHA1MSB3KDjRvnyc2oBO4AWOGMpuLS0gJRppdxP6pdPJmQm6NT0xXG9QuN0VnmX2QGmoSJIUrVCHzd28NFqEPcubyygrmjeb+3c+rpu7W5JFajA2mrhTNDgFOiBxu37wLt9pPtXQBCAGBhvonNEIRS4KDLz99/c+DH/v64JE5K2mlK4dTMUP1WBLSsLkvS7qQkKpHjSWJARgWUTEo+SrO1lhWGObUEObrsh70dYZqLQJv/49dvqHui3PS+2tAAAAAASUVORK5CYII=", content: UI["Soft"], title:UI["ListSoft"] }, items: [ UI["ListSoft"],UI["MyApps"],"","Модуль интеграции проекта с Home Assistant (ALL)","Мониторинг датчиков IoT (iOS 14+)","Бот для Telegram: narodmon20bot (iOS / Android)","Мониторинг датчиков в Андроид 2019-22 (Android)","Мониторинг датчиков для Windows (Windows)","Модуль для AnyBalance (Android, iOS)","Модуль для MajorDoMo (Win,Nix,RPi,Android)","Виджет народного мониторинга (WinXP - Win7)"].map(AddMenuItem) });
ListSoft.events.add("click", function (e) { switch (ListSoft.indexOf(e.get("target"))) {
case 0: { Dlg("catsoft"); break; }
case 1: { Dlg("auth"); break; }
case 3: { Dlg("catsoft",1645974651); break; }
case 4: { Dlg("catsoft",1641715600); break; }
case 5: { Dlg("catsoft",1577694240); break; }
case 6: { Dlg("catsoft",1548190800); break; }
case 7: { Dlg("catsoft",1479056040); break; }
case 8: { Dlg("catsoft",1479050013); break; }
case 9: { Dlg("catsoft",1435563635); break; }
case 10: { Dlg("catsoft",1396007700); break; }}});
map.controls.add(ListSoft, { float:"left", floatIndex:4, itemSelectOnClick:false });
var ListInfo = new ymaps.control.ListBox({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACZ0lEQVR4XpWTT0gUURzHv2/mrQ66tivqbqyKyhrkIVEKMlwIKrq0mUuXyCSwWIJVw8gIDDoEXaJQd7qYCRFB1sHAIOjPKQ+ejCCjQ2B1MCUUrd2dHXdmXr83DCEhkZ/Zz87j936/73ssLDYT7Uwr0YTevq97PH2099HcyStPlxKXnywduvBwrrXrXjqaSLdHO3UFW9GY0Kv2n72vd19/ZgwOvxJX9TdicOS1GLjzUvTdeiHO3ZgWHZceG61dY/ou6oWHm1bXMRKuriqbONBck6oJlWkOgKYIx6lYOc4crEBLvQbGgFC5X9tdV5Eq36FNNJxIh0Hw2mPDamWgZGhPYyjuUxVkjQKEANqbqxEIBEDQex1vP87Dsh0o1FMbCsQN0xqqPz46oBT51LaGSDCpqgxZ06ImAdtx8OFrDsFg0PX9QoZqVKe9DcumEIbKYEmSq6yNtZweG93btLNPpeQ/CMCRj01vIRVwKNQNsRx5Ezfoy/f1NC8rKYoBDIWCAwkjU/FqlJaWwufzQWIYBq49mIdp2jALNgo0LG8phIhxrdgXKdg2hAMoCoPk9tQ3jFyMgXMOSSaTwaeFFW8IpICEMRbhskgfSnWQy5lY/ZXHWsaEpmnw+/3wcE91AXNlDC48m9tYXFnLhZdXs/hJgxalKbRrWRY2w6i2BYt8LZOfoVNb5QmqooCrCrbBDLdsMSkgkjRYjO1hkpPytrP0NYZNTN887P6AHnLt1v5Czswy738QBjBOxvF/PCfPf57qXVZAyAWAHvIumf/HYN7r6fFm4AZ4IT8A9JNHSJ18Ry5LvbXu7fW7vR6/AcEVCYDAQ3OAAAAAAElFTkSuQmCC", content: UI["Help"], title:"" }, items: UI["ListInfo"].map(AddMenuItem) });
ListInfo.get(15).select();
ListInfo.events.add("click", function (e) { switch (ListInfo.indexOf(e.get("target"))) {
case 0: { Dlg("about"); break; }
case 1: { Dlg("history"); break; }
case 2: { Dlg("devdoc"); break; }
case 3: { Dlg("devctrl"); break; }
case 4: { Dlg("appdoc"); break; }
case 5: { Dlg("auth"); break; }
case 6: { Dlg("howsens"); break; }
case 7: { Dlg("howcams"); break; }
case 8: { Dlg("howsite"); break; }
case 9: { Dlg("howtrks"); break; }
case 10:{ Dlg("exampls"); break; }
case 11:{ Dlg("kbsens"); break; }
case 12:{ Dlg("howalice");break; }
case 14:{ Dlg("coops"); break; }
case 15:{ Dlg("payment"); break; }
case 16:{ Dlg("rules"); break; }
case 17:{ Dlg("privacy"); break; }
case 19:{ Go("youtube.com/results%3Fsearch_query=narodmon",1); break; }
case 20:{ Go("zen.yandex.ru/search%3Fquery=narodmon",1); break; }
case 21:{ Go("GitHub.com/search%3Fq=narodmon%26type=repositories",1); break; }
case 22:{ Go("t.me/narodmon",1); break; }
case 23:{ Go("vk.ru/narodmon",1); break; }}});
map.controls.add(ListInfo, { float:"left", floatIndex:3, itemSelectOnClick:false });
var btnPay = new ymaps.control.Button({ data: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAZCAYAAAAv3j5gAAAACXBIWXMAAADsAAAA7AF5KHG9AAAE1UlEQVRIx62WfWxTVRjGf+fe2/Z27T7YBlsZuA8CS1xGTGQqztmOBBJIUFCiEOKMhBCBCBITE0EhGg1gDAYxYCLJRPmDBAMGP9CYuDvAjCgBw6BDWNj42jq2so926217e49/ILrGFbbE8/fznud93vd57rnCMAwmcgJVh70MBy2jc5s5kTqFCR45EtslRel7E63Txgv0l3+1GGFvQop6EJZfb1iK6tnbPLzv4/9VkYjfbkEyHSTEeiAezhOOvKMTUhQo+ybPlkPlQlW15qsrfx8LaHS90UfFgZPEesoI/RhFL24zBrZ3jrnHMkOXSmc1yX5d3DjWYtBkaQC2HCoXijyLTEVB5ICUY7bV/0cI29yAp0JHJssz9x/MQ3p+I2laZD/qI0KfAiDMgZcYuW4ycN7ye159PVN59OqFnbL3UpE92J4tRoa2ZjSM4l4KwiTaaUp7aDOAuGdvv2fVLlTPz81De46PLnoqGVglFB5BEkWyAoHv7m10ITgkBLm2zZlTDqMxzTy5697CToaaI583phGN6bR4YLGtchiBVLKKLLylGmr2XadaEYvha5Y90qMhEVKIZafUpu8ymikTUd2I34cuvlccuTMp8uu4CsaOQrzPoqfZtONDl0WYZSeKjI5x27vOCryJUwQVV+FMpj3jzUgC4CrUmPasV9HyK+K9nKvtDBwZF1GA+kLgXUVVwLfAizKOTCsaTCrTHDoxa4j6x28GZj7wy2CRSoEiKJyjo7r45P3GbRtWOwrRS7V9n7ZH126cXbxv9/nQ2o2zi2tqWy/LlBSvLCd7/ZrStWpFgZ68EMblwHqgIjuhliCQeGboAANh9N17k+4dO9pDI1F83R2twUNHUbs7WoPhQafnwC4e/mD/LPf1P6/dgLAQCqlEguoHKBJCVeQeRcuyUHUA1q8WiccWZd2xydKbDvZ6RqMjVBUsf+3cRYHqm5RLsW2jO3LoTcTYC+Lb0cFX0vezqAiYe48EoKCqYcswFV6TyXllcxYsHI3P5mL4689k9dXjbfM9WWQBKE5hYeKp7aqflXF0Bj/0SEkLKTNt08/7Wwcb5gd19Km60yGFpiKcDinKi+Kuypqnn3M4eOjf0UtNuIn+OrXp8n1zVJuYV6Wo9hmlfIX+j7LYjXPEblnkP1GDnYzSffQ4vqULrc6Dv6iSedLGAaAomPEgFrmsOj3dOJaRyP/izsVo9iYq79ThzAFndmZvp0ww+y2kDZa0IiciHSl0zQbNxm25YP9ZY8eHY5tBU2tIUU+w8F7s7/dCAfkawEBoMBylcEq6y+TcdHT5C8XSjHwJkOwerHAU584Y9/sci0fvDMaHR8bIoxsSBb6cCwBCz27QjMZ1IVZ+dJpU6p1h6PGEBm4qiJRa5u2ioK8a3amhCw05KoNSQOvttsigW1NwaFkgQKg2bkui5NgI5a4o5pNKbTUa14XSOulFOM8jcnREIvbF5rInrwQaUzGWCIF0TXUNk+fxov5NaDumZ/eHovEu0yMlQvFwrGWG8bI78PaAiXROQcTzQwM3RUmB4z+jY9C0ekbi5RFk3y1jex3A3EuBn6SkEoWEjDM5be4uerFxCpW2llnGQoCSwJaTHihWEVIFq0CT7WJ6yRoxkf+6OR3zKrW4fQTA6WTJiQrjynhr/wIQcv70EJ0utAAAAABJRU5ErkJggg==", content: UI["Payment"], title: UI["VIP"] }});
btnPay.events.add("click", function (e) { Dlg("payment"); });
map.controls.add(btnPay, { float:"left", floatIndex:2, selectOnClick:false });
UI["ListAuth"] = ["Войти по логину","Войти через ВКонтакте","Войти через MailRu","Войти через Яндекс","Я тут впервые (регистрация)"];var ListAuth = new ymaps.control.ListBox({ data: { image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC+UlEQVR42oWTe0hTYRjGn29u55ydLbe5s625HDort05lsTIvuSitSAW7qWk3g6CiYBBpYWZ0IcLwH42KIu0GqX+EBBVFIEFlpN3E0squWoLD4W3Nbe6cZhEVXXz+eT/4eH887/e8H8EvyszMXGowGIp0Ol1qqI5oNJoWl8tVUVxcfB3/EPlxsNvtOzmOq7BarUhJSYHRaIQoivB6vejo6DjkdDrLxgO0syxrTVu4ANToAGjhCxhKBk9Q5u0aRHtVVZX9v4CEuXP6RRBV9nwr8levQASnByOV4PmzZqGoqsHR2Nh477+A+UkJ3ZlJcaYoTg4+NEZkjA1UCBD0ewc4+3L1uG+QviCxcn06v4OCn+gNkeB0BignqCAKgVeTl2yNGxfA8zyV74juNqlpnUIZDnWEFgwjH7s679h0uHBcwJhOFS2eIqdUrwRRQJhUBkauEIWgkLym9NwDsR4UCH0EuvhNQjBIJJ6Pl3p6XHt+OqgXqRwe5W93JznjJ7FQsHKop8zt8i3bn7cxmjSJV+hjiMraNfymze0dGipTGiamj/a2DX8DxFx2p6ZZ1HWJWmKcpfTi2t5sWMwmZBQW4+SNFmgdOdVbPydng43WDna/fqrKbZsttpVsGHp2sZJQB+8X2KdZqlfyetrtA1aZCQIjHtgC76E02VB++jx0i/KxrivNx+jn0YIAkRDymLCG2L77J2REWnLr07as5EjPKIE8ZDs+FJhZQZDKAULI3YHKM4h1pGLth2xxgi2XgDUDEhn8rna47x5vImG7GgL71mVIr77sgzFCBYuGQbSSYOYYSOJBzcVKbAlvgHZWAUYeloLWT/UERnzE5/7QKpMOLyZhzlpxe24GLrT2wshpYObUiAk5sIYTxPXehLW9BKacOvQ3n0Vj7VHk1fyeHJFsqwna+OmSTj8LolQj9AOhYWnkmiXY3DID2qR9+NL7Drdr9vzR/H0PSu/ESP39F8RRPw8ZI5fQCgo0G4zVUMEXlkKm89EnPOns+2vzmL4C25X95r5yq84AAAAASUVORK5CYII=", content: UI["SignIn"], title:"" }, items: UI["ListAuth"].map(AddMenuItem) });
ListAuth.events.add("click", function (e) { switch (ListAuth.indexOf(e.get("target"))) {
case 0: { Dlg("auth"); break; }
case 1: { Go("/authvk"); break; }
case 2: { Go("/authmm"); break; }
case 3: { Go("/authya"); break; }
case 4: { Dlg('auth',1); break; }}});
map.controls.add(ListAuth, { float:"left", floatIndex:1, popupFloat:"right", itemSelectOnClick:false });
function GetPMColor(type, value) {
if(type != 1) return "#666";
if(value <= -20) return "#36c";
if(value < 0) return "#39f";
if(value >= 30) return "#f33";
if(value >= 20) return "#c63";
return "#090"; }
sensors = new ymaps.Clusterer({ gridSize:64, margin:16, clusterNumbers:[999], zoomMargin:[75,25,25,5],
showInAlphabeticalOrder: true, clusterIconLayout: "default#pieChart", iconPieChartCoreRadius: 17,
clusterBalloonLeftColumnWidth: 180, clusterBalloonContentLayoutWidth:500, clusterBalloonContentLayoutHeight: 300,
clusterBalloonItemContentLayout: "cluster#balloonTwoColumnsItemContent" });
sensors.createCluster = function (center, objs) {
var PM = ymaps.Clusterer.prototype.createCluster.call(this, center, objs);
var sum = 0, cnt = 0, unit = "", avg = "", data = [], props = null, type = 0;
for(var i = 0; i < objs.length; i++) {
props = objs[i].properties;
if(props.get("type") == 23) continue;
if(props.get("type") == 255) continue;
if(props.get("value") == "") continue;
if(type == 0) type = props.get("type");
if(type != props.get("type")) continue;
data.push({ weight: 1, color: GetPMColor(props.get("type"), props.get("value")) });
sum += parseInt(props.get("value"));
unit = props.get("unit"); cnt++; }
if(cnt < 1) {
avg = "x" + objs.length;
data.push({ weight: 1, color: "#630" }); }
if(cnt > 0) {
avg = Math.round(sum/cnt);
if(avg < 100 && unit.length < 3) avg += "" + unit; }
PM.properties.set("hintContent", UI["SensArea"]);
PM.properties.set("iconContent", avg);
PM.properties.set("data", data);
return PM; };
sensors.events.add("balloonopen", function (e) {
if(e.get("cluster")) GetClusterInfo(e.get("cluster")); });
map.geoObjects.add(sensors);
var wIconLayout = ymaps.templateLayoutFactory.createClass(
'<div class="sprite" style="background-position:-256px -16px; width:32px; height:32px"></div>');
webcams = new ymaps.Clusterer({ gridSize:100, margin:16, clusterNumbers:[999], zoomMargin:[75,25,25,5],
clusterIconShape: { type: "Rectangle", coordinates: [[0,0], [32,32]] },
clusterBalloonContentLayout: "cluster#balloonCarousel",
clusterBalloonContentLayoutWidth:420, clusterBalloonContentLayoutHeight:320,
clusterIconLayout: wIconLayout });
webcams.createCluster = function (center, objs) {
var PM = ymaps.Clusterer.prototype.createCluster.call(this, center, objs);
PM.properties.set("hintContent", UI["CamsArea"]);
PM.properties.set("iconContent", "");
return PM; };
webcams.events.add("balloonopen", function (e) {
if(e.get("cluster")) GetClusterInfo(e.get("cluster")); });
map.geoObjects.add(webcams);
places = new ymaps.Clusterer({ gridSize:64, margin:16, clusterNumbers:[999],
showInAlphabeticalOrder:true, groupByCoordinates:true,
clusterBalloonLeftColumnWidth:180, clusterBalloonContentLayoutWidth:500, clusterBalloonContentLayoutHeight:300,
clusterBalloonItemContentLayout: "cluster#balloonTwoColumnsItemContent" });
map.geoObjects.add(places);
GetMarkers(); }
function GetSelected(List, fld) {
var i = 0, ids = [], obj;
if(!fld) fld = "id";
while(obj = List.get(i)) { i++;
if(!obj.data.get(fld)) continue;
if(!obj.isSelected()) continue;
ids.push(obj.data.get(fld)); }
return ids; }
function GetShown() {
var ids = GetSelected(ListType);
if(ids.length == 0) return "-1";
if(ids.length >= 27) return "";
return ids.join(","); }
function GetPM(id) {
var objs = [];
if(id < 0) {
objs = webcams.getGeoObjects(); }
else if(id < 9e9) {
objs = sensors.getGeoObjects(); }
else if(id > 9e9) {
objs = places.getGeoObjects(); }
for(var i = 0; i < objs.length; i++) {
if(id == objs[i].properties.get("id")) return objs[i]; }
return false; }
function WaitMarkers() {
clearTimeout(mapTimer);
mapTimer = setTimeout(GetMarkers, 2000); }
function GetMarkers(txt) {
clearTimeout(mapTimer);
if(txt && txt != "" && typeof(txt) != "object") Msg(txt);
var typecnt = ListType.getAll().length;
var lst = "map"; if(pmid != 0) lst += "/"+ pmid;
var params = "types=" + GetShown() + "&cw=" + cw + "&tz=" + tz;
if(ListType.get(typecnt - 4).isSelected()) params += "&places=1";
if(ListType.get(typecnt - 3).isSelected()) params += "&ourcam=1";
if(ListType.get(typecnt - 2).isSelected()) params += "&windy=1";
if(ListType.get(typecnt - 1).isSelected()) params += "&metar=1";
var gps = new String(map.getBounds()); gps = gps.split(",");
for(i = 0; i < 6; i++) {
if(!isNaN(gps[i])) gps[i] = Math.round(gps[i]*1e6)/1e6; }
AJAX(lst, params + "&bounds=" + gps.join(","), ShowMarkers); }
function ShowMarkers(response) {
if(response == "STOP") return;
if(response == "") {
mapTimer = setTimeout(GetMarkers, 5*60*1000);
return; }
var data = eval(response), itm = null;
if(data.length > 1) {
sensors.removeAll(); webcams.removeAll(); places.removeAll(); }
while(data.length > 1) {
itm = data.pop();
if(itm == "MYIP") {
Ask(UI["DevFound"].replace("%",itm),'RegDevice()','SetCookie(\"MYIP\",1,60)');
continue; }
if(!isNaN(itm) && itm > 0) {
Ask(UI["UnReaded"].replace("%",itm),'Dlg(\"dialog\")','SetCookie(\"unread\",1,5)');
continue; }
AddMarker(itm); }
if(GetObj("banner").style.display == "block") ShowCamNear(data.pop());
if(pmid != 0) OpenPM(pmid);
mapTimer = setTimeout(GetMarkers, 5*60*1000); }
function GetPreset(type, value) {
if(type != 1) return "islands#brownStretchyIcon";
if(value <= -20) return "islands#darkBlueStretchyIcon";
if(value < 0) return "islands#blueStretchyIcon";
if(value >= 30) return "islands#redStretchyIcon";
if(value >= 20) return "islands#darkOrangeStretchyIcon";
return "islands#darkGreenStretchyIcon"; }
function AddMarker(data) {
var id = parseInt(data[0]);
var GP = [data[2]/1e6, data[3]/1e6];
var PM = new ymaps.Placemark(GP, { id:id, type:data[1], time:data[4], name:data[5], info:data[6], value:data[7],
unit:data[8], hintContent:data[5] + " " + data[6], iconContent:data[7] + data[8], balloonContentBody:"", loaded:0 });
if(id < 0) {
PM.options.set(webcam);
PM.options.set("balloonCloseButton", false); }
if(id > 0 && id < 9e9) {
PM.options.set("balloonCloseButton", false);
PM.options.set("preset", GetPreset(data[1], data[7])); }
if(id > 9e9) {
PM.properties.set("hintContent", "");
PM.properties.set("iconCaption", data[5]);
PM.properties.set("clusterCaption", data[5]);
PM.options.set("preset", "islands#blueDotIcon");
PM.properties.set("balloonContentBody", UI["Place"] + data[5] + "<br>" + data[7]); }
PM.properties.set("balloonContentFooter", PMFooter(id));
PM.events.add("hintopen", function(e) {
var props = e.get("target").properties;
var id = props.get("id"), hint = props.get("name"), info = props.get("info");
if(hint != "" && info != "") hint += ", "; hint += info;
if(id < 9e9) hint += ", " + Elapsed(props.get("time"));
props.set("hintContent", hint); });
PM.events.add("balloonopen", function(e) {
var props = e.get("target").properties;
var name = props.get("name"), info = props.get("info");
document.title = name + " - " + UI["ProjName"];
if(name != "" && info != "") name += ", ";
pmid = props.get("id");
if(pmid < 9e9) GetPMInfo(pmid); });
PM.events.add("balloonclose", function(e) {
document.title = UI["ProjName"];
pmid = 0; });
if(id < 0) { webcams.add(PM); }
else if(id < 9e9) { sensors.add(PM); }
else if(id > 9e9) { places.add(PM); }
return id; }
function OpenPM(id) {
if(!id) id = pmid;
pmid = id; if(id == 0) return;
var obj = null, PM = GetPM(id);
if(!PM) { pmid = 0; return; }
if(id < 0) {
obj = webcams.getObjectState(PM); }
else if(id < 9e9) {
obj = sensors.getObjectState(PM); }
else if(id > 9e9) {
obj = places.getObjectState(PM); }
if(!obj) return;
if(!obj.isShown) {
map.setCenter(PM.geometry.getCoordinates(), 11).then(GetMarkers);
return; }
if(!obj.isClustered) {
PM.balloon.open();
return; }
GetClusterInfo(obj.cluster);
if(id < 0) {
webcams.balloon.open(obj.cluster); }
else if(id < 9e9) {
sensors.balloon.open(obj.cluster); }
else if(id > 9e9) {
places.balloon.open(obj.cluster); }
obj.cluster.state.set("activeObject", PM); }
function GetClusterInfo(cluster) {
var IDS = [];
var objs = cluster.properties.get("geoObjects");
for(i = 0; i < objs.length; i++) {
IDS.push(objs[i].properties.get("id")); }
var params = "ids=" + IDS.join(",");
AJAX("cluster", params, ShowCluster); }
function ShowCluster(txt) {
var data = new String(txt);
var objs = data.split(/\n/);
for(var i = 0; i < objs.length; i++) {
var p = objs[i].indexOf("|");
var id = parseInt(objs[i].substring(0,p));
objs[i] = objs[i].substring(p+1);
p = objs[i].indexOf("|");
if(PM = GetPM(id)) {
PM.properties.set("clusterCaption", objs[i].substring(0,p));
PM.properties.set("balloonContentBody", objs[i].substring(p+1)); }}}
function GetPMInfo(id, force) {
var mode = "", params = "";
var PM = GetPM(id);
if(PM == false) return;
var dt = new Date();
if(!force && (dt.getTime()/1e3 - PM.properties.get("loaded")) < 60) return;
if(id < -1e9) { mode = "camwindy";}
else if(id < 0) { mode = "cammap"; }
else if(id < 1e9) { mode = "devmap"; }
else if(id < 9e9) { mode = "usermap"; }
if(force) params = "force=1";
AJAX(mode + "/" + Math.abs(id), params, ShowPMInfo); }
function ShowPMInfo(response) {
var res = new String(response);
var p = res.indexOf("|");
if(p < 1) { Msg(response); return; }
var id = parseInt(res.substring(0,p));
var txt = res.substring(p+1);
var PM = GetPM(id); if(!PM) return;
var dt = new Date();
PM.properties.set("loaded", dt.getTime()/1e3);
PM.properties.set("balloonContentBody", txt); }
function ZoomIn(id) {
var PM = GetPM(id); if(!PM) return;
map.setBounds(PM.geometry.getBounds(), { checkZoomRange:true }); }
function ZoomOut(id) {
var PM = GetPM(id); if(!PM) return;
map.setCenter(PM.geometry.getCoordinates(), 11, { checkZoomRange:true }); }
function MoveObject(id) {
var PM = GetPM(id); if(PM == false) return;
clearTimeout(mapTimer);
HideDlg(); PM.balloon.close();
pmid = 0; Msg(UI["MoveObject"]);
PM.options.set("draggable", true);
PM.events.add("dragend", function (e) {
PM.options.set("draggable", false);
var GP = e.get("target").geometry.getCoordinates();
var lat = Math.round(GP[0]*1e6), lon = Math.round(GP[1]*1e6);
var todo = "move";
if(id > 1e9) todo = "poimove";
if(id > 0 && id < 1e9) todo = "devmove";
if(id < 0 && id > -1e9) { todo = "cammove"; id = -id; }
Ask(UI["AskNewPos"], 'AJAX("'+todo+'/'+id+'","lat='+lat+'&lon='+lon+'",GetMarkers)', 'GetMarkers()'); }); }
function MapLink() {
var GP = map.getCenter();
var url = "https://narodmon.ru/";
url += "?lat=" + GP[0].toFixed(4);
url += "&lon=" + GP[1].toFixed(4);
url += "&zoom=" + map.getZoom();
var maptype = map.getType().toString();
var p = maptype.indexOf("#");
if(p > 0) maptype = maptype.substr(p+1);
url += "&map=" + maptype;
var ids = GetSelected(ListType);
if(ids.length > 0 && ids.length < 27) {
url += "&types=" + ids.join(","); }
Input(UI["CopyLink"], url); }
function AddTrkPoint(GP, style, hint, info) {
var PM = new ymaps.Placemark(GP, { hintContent:hint });
PM.options.set(style);
if(info && info != "") {
PM.properties.set("balloonContentBody", info); }
return PM; }
</script><div id="loading-div" style="display:none"><img width="35" height="35" src="data:image/gif;base64,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" alt="Загрузка данных..." title="Загрузка данных..." /> <span style="font-weight:bold" id="loading-text"></span></div>
<div id="shadow" style="display:none"></div>
<div id="msg" style="display:none; z-index:9"></div>
<div id="dialog" style="display:none; z-index:5"></div>
<div id="map" style="position:absolute; z-index:1; left:0px; top:0px"></div>
<div id="link" onclick="MapLink()" style="bottom:35px; left:10px; display:none">Ссылка на карту</div><div id="chart" style="display:none; z-index:2">
<div align="right" style="position:relative; z-index:10"><div class="sprite" style="background-position:-144px -16px" onclick="HideDiv('chart')" title="Закрыть"></div></div>
<div id="chartdiv" style="margin-top:-14px"></div>
</div><div id="banner" style="display:none; z-index:2"><div align="right"><div class="sprite" style="background-position:-144px -16px" onclick="ShowBanner(0)" title="Закрыть"></div></div>
<div style="margin-top:-17px">
<div id="camname" style="margin-top:2px; margin-bottom:2px; max-width:400px; font-weight:bold">Ближайшая веб-камера</div>
<img id="webcam" width="400" src="https://vernet.narodmon.ru/img/camload.png" style="cursor:pointer" title="Клик - просмотр фотоархива веб-камеры" alt="Клик - просмотр фотоархива веб-камеры" onclick="CamView(this.alt)">
</div>
<div style="margin-top:7px; margin-bottom:0px"><b>Новости проекта:</b>
<div class="sprite" style="background-position:-160px -16px" onclick="Go('/rss/ru',1)" title="RSS-канал"></div> <div class="sprite" style="background-position:-352px -16px" onclick="Go('t.me/narodmon',1)" title="Telegram"></div> <div class="sprite" style="background-position:-112px -32px" onclick="Go('vk.ru/narodmon',1)" title="ВКонтакте"></div></div>
<div id="news" style="display:block"><ul><li><a href="/D6454" class="hover" title="D1_Mini_Станция, -3°, -4°, -4°">07.03.2026</a> Метеостанция в Овсянка, Красноярский край, Россия</li><li><a href="/D3684" class="hover" title="SLT_01, -6°, -5°, 82%">06.03.2026</a> Метеостанция в Балашиха, Московская обл., Россия</li><li><a href="#" class="hover" title="Городской парк" onclick="CamView(195991)">05.03.2026</a> Веб-камера в Надым, Ямало-Ненецкий АО, Россия</li><li><a href="/D6712" class="hover" title="MUsa, 755mmHg">04.03.2026</a> Метеостанция в Сбоево, Московская обл., Россия</li><li><a href="/D3363" class="hover" title="термометр, -24°">04.03.2026</a> Метеостанция в Новая Ляля, Свердловская обл., Россия <a onclick="ShowNews(1772621353)" href="#">>></a></li></ul></div>
<div style="margin-top:5px; margin-bottom:0px"><a href="/payment"><b>Краудфандинг. Цели сбора:</b></a></div>
<ul>
<li>Текущее сопровождение проекта: 6.1K₽(9)/25K₽</li>
<li>Ускорение обработки показаний и триггеров: 4.1K₽(13)/25K₽</li>
<li>Разработка настраиваемого дашборда и графиков: 7.4K₽(22)/25K₽</li>
<li>Поддержка и обновление ботов для ВК и Телеграм: 7.1K₽(15)/25K₽</li>
</ul>
<div style="margin-top:5px; margin-bottom:0px"><b>Народный мониторинг - это:</b></div>
<ul>
<li>удаленный мониторинг в помещении и на местности;</li>
<li>отображение показаний датчиков и веб-камер на карте мира;</li>
<li>публичный и приватный доступ к датчикам и веб-камерам;</li>
<li>ведение фотоархива изображений с веб-камер;</li>
<li>интерактивные графики показаний за сутки, неделю, месяц, год;</li>
<li><a href="#" title="eMail, SMS, PUSH, VK, Viber, Telegram">уведомления</a> о поломке и выходе за пределы;</li>
<li>каталог <a onclick="Dlg('cathard')" href="#">готовых решений</a> для мониторинга среды;</li>
<li>примеры <a onclick="Dlg('catdiy')" href="#">бюджетных решений</a> от участников проекта;</li>
<li><a onclick="Dlg('devdoc')" href="#" title="TCP, UDP, MQTT, HTTP GET/POST, JSON">API</a> для разработки приборов мониторинга;</li>
<li><a onclick="Dlg('appdoc')" href="#" title="HTTP GET/POST JSON">REST API</a> для разработчиков приложений, виджетов, сайтов;</li>
<li>каталог <a onclick="Dlg('catsoft')" href="#">приложений</a> для Android, iOS, Windows, Linux, MacOS.</li>
</ul>
<div style="margin-top:5px; margin-bottom:0px"><b>Приглашаем к сотрудничеству:</b></div>
<ul>
<li>IT-специалистов (в 1ю очередь <b>QT/Android</b>);</li>
<li>модераторов (контроль Правил и помощь пользователям);</li>
<li>техписателей (публикация обзоров, подготовка документации);</li>
<li>разработчиков электроники (расширение каталога приборов);</li>
<li>переводчиков (локализация интерфейса) и дизайнеров иконок;</li>
<li>спонсоров (куда же без них) для дальнейшего развития проекта.</li>
</ul></div>
<script type="text/javascript">
function bodyLoad() {
cw = document.documentElement.clientWidth;
ch = document.documentElement.clientHeight;
Dlg("welcome"); ShowBanner(1); SetCookie("nobanner",1,60); if(window.location.hash != "") {
var hash = new String(window.location.hash);
if(hash.substr(0,2) == "#!") { hash = hash.substr(2); } else hash = hash.substr(1);
if(hash == "alice") hash = "howalice";
if(hash.match(/^[a-z_]+$/i)) Dlg(hash);
var dlg = hash.match(/^([a-z]+)(\d+)$/i);
if(dlg) {
if(dlg[1] == "graph") Chart(dlg[2]);
if(dlg[1] == "mysens") Dlg("mysens",0,dlg[2]);
if(dlg[1] == "tracks") {
var did = Math.floor(dlg[2]/1e10);
clearTimeout(mapTimer); ShowBanner(0);
AJAX("trkget/" + did, "ids=" + (dlg[2] % 1e10), ShowTracks); }
if(dlg[1] != "graph" && dlg[1] != "mysens" && dlg[1] != "tracks") Dlg(dlg[1], dlg[2]); }}
if(ymaps == null) {
AJAX("ymaps", "ymaps=null");
Ask(UI['YandexBad'], 'Go("https://narodmon.com")'); }
else { ymaps.ready(initMap); }
}
</script>
</body>
</html>
Спасибо!