" + txt; if(id ==0) li.innerHTML = txt; if(id > 0) { li.innerHTML = " "; li.innerHTML += ""; } li.onclick = function(e) { clearTimeout(viewTimer); var idx = e.currentTarget.id; if(idx > 0) viewTimer = setTimeout(WaitChart, 2000); if(idx < 0) { AJAX("devmenu/" + Math.abs(idx), "", SensMenu); sensUpd = 0; }}; ListSens.appendChild(li); }} function CamsMenu(response) { if(response.substr(0,1) != "[") { Msg(response); return; } var ListCams = GetObj("ListCams"); while(ListCams.children.length > 5) { ListCams.lastChild.remove(); } var favs = 0, items = eval(response); for(var i = 0; i < items.length; i++) { var id = items[i][0], txt = items[i][1]; var li = document.createElement("li"); if(txt == "") txt = "
"; if(id != 0) li.id = id; li.className = "menu"; if(id > 0) { li.innerHTML = " "; li.innerHTML += ""; } else li.innerHTML = txt; li.onclick = function(e) { clearTimeout(viewTimer); var idx = e.currentTarget.id; if(idx > 0) viewTimer = setTimeout(WaitView, 2000); }; ListCams.appendChild(li); }} function TrksMenu(response) { if(response.substr(0,1) != "[") { Msg(response); return; } var ListTrks = GetObj("ListTrks"); while(ListTrks.children.length > 5) { ListTrks.lastChild.remove(); } var favs = 0, items = eval(response); for(var i = 0; i < items.length; i++) { var id = items[i][0], txt = items[i][1]; var li = document.createElement("li"); li.id = id; li.className = "menu"; if(txt == "") txt = "
"; if(id > 1e10) { li.innerHTML = " "; li.innerHTML += ""; } else li.innerHTML = txt; li.onclick = function(e) { clearTimeout(viewTimer); var idx = e.currentTarget.id; if(idx > 1e10) viewTimer = setTimeout(WaitTrack, 3000); if(idx < 1e10 && idx > 0) AJAX("trkmenu", "from=" + idx, TrksMenu); }; ListTrks.appendChild(li); }} function FindTrack() { var dtime = ShowPrompt(UI["ListTrks"][0] + ":", ""); AJAX("trkmenu", "dtime=" + encodeURIComponent(dtime), TrksMenu); } function GPXSelTrks() { clearTimeout(viewTimer); var ids = GetSelected("ListTrks"), did = 0; 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(","), 1); } function RenSelTrks() { clearTimeout(viewTimer); var ids = GetSelected("ListTrks"); var id=0, did=0, p1=0, p2=0, name=""; if(ids.length < 1) { Msg(UI["NoTrksSel"]); return; } for(var i = 0; i < ids.length; i++) { id = ids[i] % 1e10; did = Math.floor(ids[i]/1e10); name = GetObj("lb"+ids[i]).innerHTML; p1 = name.indexOf(",") + 2; p2 = name.lastIndexOf(","); name = ShowPrompt(UI["RenTrack"], name.substring(p1,p2)); if(name == false || name == null) continue; AJAX("trkren/" + did, "from=" + id + "&name="+encodeURIComponent(trim(name)), AJAXResult); }} 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);trksUpd=0'); } function MapLink() { var GP = map.getCenter(); var url = "https://narodmon.com/"; url += "?lat=" + Math.round(GP.lat()*1e4)/1e4; url += "&lon=" + Math.round(GP.lng()*1e4)/1e4; url += "&zoom="+ map.getZoom(); url += "&map=" + map.getMapTypeId(); var ids = GetSelected("ListType"); if(ids.length > 0 && ids.length < 27) { url += "&types=" + ids.join(","); } Input(UI["CopyLink"], url); } function ShowMenu(btn, divname) { clearTimeout(menuTimer); HideAllMenu(); var div = GetObj(divname); if(!div) return; div.style.display = "block"; div.style.zIndex = 10; div.style.top = (getPos(btn,"Top") + btn.offsetHeight + 5) + "px"; var mleft = getPos(btn,"Left"); if(mleft + 140 > cw) mleft = mleft - 140; div.style.left = mleft + "px"; var dt = new Date(), now = dt.getTime(); if(divname == "sens" && (now - sensUpd) >= 60000) { sensUpd = now; AJAX("devmenu", "", SensMenu); } if(divname == "cams" && (now - camsUpd) >= 60000) { camsUpd = now; AJAX("cammenu", "", CamsMenu); } if(divname == "trks" && (now - trksUpd) >= 60000) { trksUpd = now; AJAX("trkmenu", "", TrksMenu); } menuTimer = setTimeout("HideDiv('" + divname + "')", 10000); } function HideAllMenu() { HideDiv("lang"); HideDiv("view"); HideDiv("sens"); HideDiv("cams"); HideDiv("trks"); HideDiv("hard"); HideDiv("soft"); HideDiv("help"); HideDiv("auth"); HideDiv("profile"); HideDiv("adm"); } function MenuOut(divname) { menuTimer = setTimeout("HideDiv('" + divname + "')", 1000); } function AddTrkPoint(GP, style, hint, info) { var PM = new google.maps.Marker({ position:GP, icon:style, title:hint }); if(info && info != "") { balloon.setPosition(GP); balloon.setContent(info); balloon.open(map); } return PM; } Share map link
Nearest webcam

- 30.03.2025 Webcam in Sochi, Krasnodar Territory, Russia
- 28.03.2025 Weather station in Yelan, Volgograd Region, Russia
- 27.03.2025VIP Club for Internet of Things Enthusiasts
- 26.03.2025 Weather station in Gablitz, Niederösterreich, Austria
- 26.03.2025 Weather station in Niva-2 Gardening Community, Minskaja region, Belarus >>
Public monitoring is:
- remote monitoring indoors and on the ground;
- displaying readings of sensors and webcams on the world map;
- public and private access to sensors and webcams;
- maintaining a photo archive of images from webcams;
- interactive graphs of readings per day, week, month, year;
- notifications about breakdown and going beyond;
- catalog of ready-made solutions for monitoring the environment;
- examples of budget solutions from Project participants;
- API for the development of monitoring devices;
- REST API for developers of apps, widgets, sites;
- catalog of apps for Android, iOS, Windows, Linux, MacOS.
We invite to cooperation:
- IT specialists (first of all QT/Android);
- moderators (control of the Rules and help to users);
- technical writers (publication of reviews, preparation of documentation);
- electronics developers (expansion of the catalog of devices);
- translators (interface localization) and icon designers;
- sponsors (where without them) for the further development of the Project.