def GET(self, pid): try: pos = Agent.get(pid) except SQLObjectNotFound: return web.notfound() pics = [] if pos.table_name in CCTV_POS: # mendapatkan 3 nama file terakhir dari CCTV FTP Server try: ftp = FTP(FTP_HOST) ftp.login() ftp.cwd(CCTV_IMG_DIR + '/' + pos.table_name) #ftp.cwd(CCTV_IMG_DIR + '/' + pos.table_name + '/' +datetime.datetime.today().strftime("%Y%m%d") + '/images') nlst = ftp.nlst() pics = nlst[-3:] except: pics = [ 'Fail to Connect CCTV Server', 'Fail to Connect CCTV Server', 'Fail to Connect CCTV Server' ] try: dari = to_date(web.input().dari) dari = datetime.datetime.combine(dari, datetime.time(7, 0, 0)) hingga = to_date(web.input().hingga) hingga = datetime.datetime.combine(hingga, datetime.datetime.now().time()) except: hingga = datetime.datetime.now() dari = hingga - datetime.timedelta(days=3) dari = dari.replace(hour=7, minute=0, second=0) tma_trend = pos.get_log_tma(dari, hingga) # membuat pola waktu per jam ch_patt = [] t = int(dari.strftime('%s')) thingga = int(hingga.strftime('%s')) while t <= thingga: ch_patt.append([t, 0]) t += 60 * 60 # 60 * 60 = 60 menit/1 jam ch_patt = dict(ch_patt) series = [[a[0], a[1], float(a[2] or 0) * 0.01] for a in tma_trend] print(len(ch_patt), len(series)) data_series = [{'nama': pos.cname, 'series': series, 'satuan': 'M'}] # menghitung Debit if pos.table_name in DEBIT_POS.keys(): formula = DEBIT_POS.get(pos.table_name) if formula: series = [] # series of debit for tgl, jam, tma in data_series[0].get('series'): tma_lokal = tma - pos.DPL if tma_lokal - formula.get('b') > 0: deb = formula.get('a') * ( tma_lokal - formula.get('b'))**formula.get('c') else: deb = 0 #dt = datetime.datetime.combine(tgl, datetime.time(0)) + jam - datetime.timedelta(hours=7) _d = { 'sampling': int(tgl.strftime('%s')) + jam.seconds, 'tma': tma, 'debit': deb } series.append( '{x: %(sampling)s, y: %(tma)s, debit: %(debit)s}' % _d) data_series[0]['series'] = '[' + ','.join(series) + ']' else: series = [] for tgl, jam, tma in data_series[0].get('series'): #dt = datetime.datetime.combine(tgl, datetime.time(0)) + jam - datetime.timedelta(hours=7) #epoch = datetime.datetime.utcfromtimestamp(0) #_d = {'sampling': timedelta_total_seconds((dt - epoch)), # 'tma': tma} _d = { 'sampling': int(tgl.strftime('%s')) + jam.seconds, 'tma': tma } series.append('{x: %(sampling)s, y: %(tma)s}' % _d) data_series[0]['series'] = '[' + ','.join(series) + ']' # mencari data CH data_ch = {'nama': '', 'series': [], 'satuan': 'mm'} if pos.table_name in CAUSE_TABLE.keys(): ch_list = CAUSE_TABLE.get(pos.table_name) AGENT_TABLE = dict([ (a.table_name, a.AgentId) for a in Agent.select( OR(Agent.q.AgentType == 0, Agent.q.AgentType == 1, Agent.q.AgentType == 2)) ]) for ch in ch_list: print('CH', ch) pos_ch = Agent.get(AGENT_TABLE.get(ch)) ch_trend = pos_ch.get_log(dari, hingga, False) series = [(int(a[0].strftime('%s')) + a[1].seconds, float(a[2] or 0)) for a in ch_trend] for s in series: nilai = ch_patt.get(s[0]) if not nilai: ch_patt[s[0]] = s[1] else: ch_patt[s[0]] = nilai > s[1] and nilai or s[1] _t = {'nama': pos_ch.cname, 'series': series} #print(ch, _t['series']) if not _t.get('series'): _t['series'] = [] data_ch['nama'] += ', ' + pos_ch.cname data_ch['series'] = '[' + ','.join( ['{x: %s, y: %s}' % (k, v) for k, v in ch_patt.items()]) + ']' data_series.append(data_ch) # print(len(data_series[0]['series'])) return render.tma.show_tma_ch({ 'pos': pos, 'data': data_series, 'dari': dari, 'hingga': hingga, 'pics': pics })
def GET(self): tanggal = web.input().get('d') if not tanggal: tanggal = datetime.date.today() else: try: tanggal = datetime.datetime.strptime(tanggal, "%Y-%m-%d").date() except: tanggal = datetime.datetime.strptime(tanggal, "%d %b %y").date() #HIDE_THIS = [a.strip() for a in open('HIDE_AWLR.txt').read().split(',')] PIKET_BANJIR = [ a.strip() for a in open('PIKET_BANJIR.txt').read().split(',') ] agents = Agent.select( AND(OR(Agent.q.AgentType == HIDROLOGI, Agent.q.AgentType == 0), Agent.q.expose == True)).orderBy(["wilayah", "urutan"]) agents = [a for a in agents if a.table_name in PIKET_BANJIR] data = [ Struct(**{ 'pos': a, 'tma': Struct(**a.get_segmented_wl(tanggal)) }) for a in agents ] js = """ <script type="text/javascript"> $(function(){ $('.tanggal').datepicker({dateFormat: 'd M y'}); $('.show-current-date').bind('change', function () { $(this).parent().submit()}); }); </script>""" sebelum = tanggal - datetime.timedelta(days=1) sesudah = tanggal + datetime.timedelta(days=1) if web.ctx.env.get('HTTP_X_PJAX') is not None: return render_plain.tma.index_table( tma=data, meta={ 'now': tanggal.strftime('%d %b %y'), 'before': sebelum.strftime('%d %b %y'), 'after': sesudah.strftime('%d %b %y') }, wilayah=WILAYAH) # water level tertinggi sql = "SELECT MAX(pagi), agent_id, waktu FROM tma" res = Agent._connection.queryAll(sql) if res: try: (total, agent_id, waktu) = res[0] tertinggi = Struct(**{ 'agent': Agent.get(agent_id), 'total': total, 'waktu': waktu }) except IndexError: tertinggi = Struct() return render.tma.piket_banjir(tma=data, meta={ 'now': tanggal.strftime('%d %b %y'), 'before': sebelum.strftime('%d %b %y'), 'after': sesudah.strftime('%d %b %y'), 'tertinggi': tertinggi }, wilayah=WILAYAH, js=js)
def menitKeJamRain(tgl=datetime.date.today(), timpa=False): for a in AgentCh.select( OR(AgentCh.q.AgentType == 1, AgentCh.q.AgentType == 0)): salinKeJamjaman(a.table_name, tgl, timpa)
def _get_expression(self): """Combine filters with OR""" return OR(*[x._get_expression() for x in self])
def curah_hujan_pos(self, pos_id, tahun=datetime.date.today().year, bulan=''): ''' Jika bulan valid, otomatis tahun juga valid, tampilkan curah hujan setiap hari pada bulan terpilih sumbu mendatar berisi tanggal Jika tahun valid, bulan kosong, tampilkan curah hujan 3 tahun lalu, dari tahun terpilih, sumbu mendatar berisi bulan-bulan ''' try: agent = AgentCh.get(pos_id) except SQLObjectNotFound: return web.notfound() if agent.AgentType not in (1.0, 0.0): return web.notfound() HIDE_THIS = [a.strip() for a in open('HIDE_ARR.txt').read().split(',')] agents = AgentCh.select( AND( OR(AgentCh.q.AgentType == KLIMATOLOGI, AgentCh.q.AgentType == 0.0), AgentCh.q.expose == True)).orderBy(( 'wilayah', 'urutan', )) agents = [a for a in agents if a.table_name not in HIDE_THIS] ch = agent.get_ch(tahun, bulan) data = [] for a in ch: try: data.append((a[0], a[2] or 0)) except: data.append((a[0], 0)) series = {} to_render = render.curahhujan.bulanan if bulan: # hujan per hari pada 'bulan' series = [ 0 for r in range(calendar.monthrange(tahun, int(bulan))[1]) ] sql = "SELECT waktu, manual, pagi, sore, malam, tmalam FROM curahhujan \ WHERE agent_id=%s AND YEAR(waktu)=%s AND MONTH(waktu)=%s" % ( pos_id, tahun, bulan) for d in conn.queryAll(sql): series[d[0].day - 1] = d[1] data = Struct( **{ 'series': series, 'categories': [s + 1 for s in range(len(series))], 'bulan': datetime.date(tahun, int(bulan), 1) }) to_render = render.curahhujan.harian elif data: # hujan per bulan pada 'tahun' th = data[0][0].year series[th] = [0 for r in range(0, 12)] for d in data: if d[0].year != th: th = d[0].year series[th] = [0 for r in range(0, 12)] series[th][d[0].month - 1] = d[1] else: series[th][d[0].month - 1] = d[1] data = [ Struct(**{ 'tahun': k, 'series': v }) for k, v in sorted(series.items()) ] ctx = {'pos': agent, 'data': data, 'poses': agents, 'wilayah': WILAYAH} return to_render(ctx)
def GET(self): HIDE_THIS = [ a.strip() for a in open('HIDE_AWLR.txt').read().split(',') ] agents = Agent.select( AND(OR(Agent.q.AgentType == HIDROLOGI, Agent.q.AgentType == 0), Agent.q.expose == True)).orderBy( ["wilayah", "-DPL", "-siaga3"]) agents = [a for a in agents if a.table_name not in HIDE_THIS] all_pos = [{ 'id': a.AgentId, 'name': a.cname, 'll': a.ll } for a in agents] js_foot = """ <script type="text/template" id="pos_infowindow"> <div class="item infowindow" id="pos_<%= index %>"> <span class="pos"><%= name %> </span> <span class="meter"> </span> </div> </script> <script> var ws = new WebSocket('ws://mqtt.bbws-bsolo.net:22286'); ws.onmessage = function (event) { var data = JSON.parse(event.data); if (data.device === undefined) { return; } var device_id = data.device.split('/')[1]; var marker = undefined; for (m in markers) { if (markers[m].did == device_id) { marker = markers[m].markerObj; break; } } } function init_map() { var my_options = { center: new google.maps.LatLng(-7.49592,111.568909), zoom: 9, styles: [ { "featureType": "all", "elementType": "geometry.fill", "stylers": [ { "weight": "2.00" } ] }, { "featureType": "all", "elementType": "geometry.stroke", "stylers": [ { "color": "#9c9c9c" } ] }, { "featureType": "all", "elementType": "labels.text", "stylers": [ { "visibility": "on" } ] }, { "featureType": "landscape", "elementType": "all", "stylers": [ { "color": "#f2f2f2" } ] }, { "featureType": "landscape", "elementType": "geometry.fill", "stylers": [ { "color": "#ffffff" } ] }, { "featureType": "landscape.man_made", "elementType": "geometry.fill", "stylers": [ { "color": "#ffffff" } ] }, { "featureType": "poi", "elementType": "all", "stylers": [ { "visibility": "off" } ] }, { "featureType": "road", "elementType": "all", "stylers": [ { "saturation": -100 }, { "lightness": 45 } ] }, { "featureType": "road", "elementType": "geometry.fill", "stylers": [ { "color": "#eeeeee" } ] }, { "featureType": "road", "elementType": "labels.text.fill", "stylers": [ { "color": "#7b7b7b" } ] }, { "featureType": "road", "elementType": "labels.text.stroke", "stylers": [ { "color": "#ffffff" } ] }, { "featureType": "road.highway", "elementType": "all", "stylers": [ { "visibility": "simplified" } ] }, { "featureType": "road.arterial", "elementType": "labels.icon", "stylers": [ { "visibility": "off" } ] }, { "featureType": "transit", "elementType": "all", "stylers": [ { "visibility": "off" } ] }, { "featureType": "water", "elementType": "all", "stylers": [ { "saturation": 100 }, { "lightness": 15 }, { "color": "#88b6f2" /* "#466cec" */ }, { "visibility": "on" } ] }, { "featureType": "water", "elementType": "geometry.fill", "stylers": [ { "color": "#88b6f2" } ] }, { "featureType": "water", "elementType": "labels.text.fill", "stylers": [ { "color": "#000000" } ] }, { "featureType": "water", "elementType": "labels.text.stroke", "stylers": [ { "color": "#ffffff" } ] } ], mapTypeId: google.maps.MapTypeId.TERRAIN }; var map = new google.maps.Map(document.getElementById('map'), my_options); var lamong_line = new google.maps.KmlLayer( {url: 'http://hidrologi.bbws-bsolo.net/static/lamong.kml?v=1', preserveViewport: true, map: map}); var pantura_line = new google.maps.KmlLayer( {url: 'http://hidrologi.bbws-bsolo.net/static/pantura.kml?v=1', preserveViewport: true, map: map}); var hilir_line = new google.maps.KmlLayer( {url: 'http://hidrologi.bbws-bsolo.net/static/hilir.kml?v=1', preserveViewport: true, map: map}); var madiun_line = new google.maps.KmlLayer( {url: 'http://hidrologi.bbws-bsolo.net/static/madiun.kml?v=1', preserveViewport: true, map: map}); var hulu_line = new google.maps.KmlLayer( {url: 'http://hidrologi.bbws-bsolo.net/static/hulu.kml?v=1', preserveViewport: true, map: map}); var allPos = """ + str(all_pos) + """; var markers = {}; var infoWindow = new google.maps.InfoWindow; _.each(allPos, function(pos) { var lat = parseFloat(pos.ll.split(',')[0]); var lng = parseFloat(pos.ll.split(',')[1]); var point = new google.maps.LatLng(lat, lng); var marker = new google.maps.Marker({ icon: 'http://maps.google.com/mapfiles/ms/icons/blue-dot.png', map: map, position: point }); markers[pos.id] = marker; bind_info_window(marker, map, infoWindow, "<a href='/tma/"+pos.id+"' style='font-weight: bold;font-size: 16px;'>"+ pos.name + "</a>"); }); }; function bind_info_window(marker, map, infowindow, html) { google.maps.event.addListener(marker, 'click', function() { infowindow.setContent(html); infowindow.open(map, marker); }) }; </script> <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAmnJGdC-ZhVd98H3mwMRv2GU2dlv1D7IA&callback=init_map"></script> """ return render.map.tma({'poses': agents, 'js_foot': js_foot})
def GET(self): HIDE_THIS = [a.strip() for a in open('HIDE_ARR.txt').read().split(',')] agents = Agent.select( AND(OR(Agent.q.AgentType == KLIMATOLOGI, Agent.q.AgentType == 0.0), Agent.q.expose == True)) agents = [a for a in agents if a.table_name not in HIDE_THIS] sql = "SELECT prima_id, AgentName FROM agent WHERE AgentType IN (0, 1) AND LENGTH(prima_id)>4" try: rst = Agent._connection.queryAll(sql) all_prima = dict([(a[1].lower().replace('.', '_').replace(' ', '_'), a[0]) for a in rst]) except: all_prima = {} #all_prima = dict(map(lambda x: (x[1], x[0]), [p.strip().split('\t') for p in open('PRIMA_ID.txt').readlines()])) all_pos = [] for a in agents: sql = "SELECT Rain, CONCAT(SamplingDate, ' ', SamplingTime) AS sampling FROM %s ORDER BY SamplingDate DESC, SamplingTime DESC LIMIT 0, 1" % ( a.table_name, ) try: rst = Agent._connection.queryAll(sql) except: rst = None if rst: rain, sampling = rst[0] print rst[0] sampling = datetime.datetime.strptime(sampling, '%Y-%m-%d %H:%M:%S') if datetime.datetime.now() - sampling > datetime.timedelta( minutes=10): rain = 0 else: rain = float(rain or 0) else: rain = 0 p_ = { 'id': a.AgentId, 'lrain': rain, 'name': a.cname, 'll': a.ll, 'tname': a.table_name } if a.table_name in all_prima.keys(): p_.update({'device': all_prima.get(a.table_name)}) all_pos.append(p_) js_foot = """ <script type="text/template" id="pos_infowindow"> <div class="item infowindow" id="pos_<%= index %>"> <span class="pos"><%= name %> </span> <span class="meter"> </span> <div class=""> <ul> <li><i class="fa fa-bar-chart"></i> <a href="/curahhujan/<%= id %>">Hujan Tahunan</a></li> <li><i class="fa fa-calendar"></i> <a href="/curahhujan/<%= id %><% print('/' + sampling.split('-')[0] + '/' + sampling.split('-')[1]) %>">Hujan Bulan</a></li> </div> </div> </script> <script> var ws = new WebSocket('ws://mqtt.bbws-bsolo.net:22286'); ws.onmessage = function (event) { var data = JSON.parse(event.data); if (data.device === undefined) { return; } var device_id = data.device.split('/')[1]; var marker = undefined; for (m in markers) { if (markers[m].did == device_id) { marker = markers[m].markerObj; break; } } var icon_src = 'http://maps.google.com/mapfiles/ms/icons/green-dot.png'; if (data.tick > 0) { // put did into rains_in var index = rains_in.indexOf(device_id); if (index == -1) { rains_in.push(device_id); } icon_src = 'http://maps.google.com/mapfiles/ms/icons/yellow-dot.png'; //icon_src = '/static/images/marker/gray_rain_2.gif'; } else { var index = rains_in.indexOf(device_id); if (index > -1) { rains_in.splice(device_id, 1); } } if (marker != undefined) { setIcon(marker, icon_src); } } var markers = []; var rains_in = []; var primaIds = """ + str(all_prima) + """; function setIcon(marker, icon_src='http://maps.google.com/mapfiles/ms/icons/green-dot.png') { marker.setIcon(icon_src); } function init_map() { var my_options = { center: new google.maps.LatLng(-7.49592,111.568909), zoom: 9, styles: [ { "featureType": "all", "elementType": "geometry.fill", "stylers": [ { "weight": "2.00" } ] }, { "featureType": "all", "elementType": "geometry.stroke", "stylers": [ { "color": "#9c9c9c" } ] }, { "featureType": "all", "elementType": "labels.text", "stylers": [ { "visibility": "on" } ] }, { "featureType": "landscape", "elementType": "all", "stylers": [ { "color": "#f2f2f2" } ] }, { "featureType": "landscape", "elementType": "geometry.fill", "stylers": [ { "color": "#ffffff" } ] }, { "featureType": "landscape.man_made", "elementType": "geometry.fill", "stylers": [ { "color": "#ffffff" } ] }, { "featureType": "poi", "elementType": "all", "stylers": [ { "visibility": "off" } ] }, { "featureType": "road", "elementType": "all", "stylers": [ { "saturation": -100 }, { "lightness": 45 } ] }, { "featureType": "road", "elementType": "geometry.fill", "stylers": [ { "color": "#eeeeee" } ] }, { "featureType": "road", "elementType": "labels.text.fill", "stylers": [ { "color": "#7b7b7b" } ] }, { "featureType": "road", "elementType": "labels.text.stroke", "stylers": [ { "color": "#ffffff" } ] }, { "featureType": "road.highway", "elementType": "all", "stylers": [ { "visibility": "simplified" } ] }, { "featureType": "road.arterial", "elementType": "labels.icon", "stylers": [ { "visibility": "off" } ] }, { "featureType": "transit", "elementType": "all", "stylers": [ { "visibility": "off" } ] }, { "featureType": "water", "elementType": "all", "stylers": [ { "color": "#46bcec" }, { "visibility": "on" } ] }, { "featureType": "water", "elementType": "geometry.fill", "stylers": [ { "color": "#88b6f2" /* "#c8d7d4" */ } ] }, { "featureType": "water", "elementType": "labels.text.fill", "stylers": [ { "color": "#000000" } ] }, { "featureType": "water", "elementType": "labels.text.stroke", "stylers": [ { "color": "#ffffff" } ] } ], mapTypeId: google.maps.MapTypeId.TERRAIN }; var map = new google.maps.Map(document.getElementById('map'), my_options); var lamong_line = new google.maps.KmlLayer( {url: 'http://hidrologi.bbws-bsolo.net/static/lamong.kml?v=1', preserveViewport: true, map: map}); var lamong_line = new google.maps.KmlLayer( {url: 'http://hidrologi.bbws-bsolo.net/static/grindulu_lorog.kml?v=1', preserveViewport: true, map: map}); var pantura_line = new google.maps.KmlLayer( {url: 'http://hidrologi.bbws-bsolo.net/static/pantura.kml?v=2', preserveViewport: true, map: map}); var hilir_line = new google.maps.KmlLayer( {url: 'http://hidrologi.bbws-bsolo.net/static/hilir.kml?v=2', preserveViewport: true, map: map}); var madiun_line = new google.maps.KmlLayer( {url: 'http://hidrologi.bbws-bsolo.net/static/madiun.kml?v=2', preserveViewport: true, map: map}); var hulu_line = new google.maps.KmlLayer( {url: 'http://hidrologi.bbws-bsolo.net/static/hulu.kml?v=2', preserveViewport: true, map: map}); var allPos = """ + str(all_pos) + """; var infoWindow = new google.maps.InfoWindow; _.each(allPos, function(pos) { var lat = parseFloat(pos.ll.split(',')[0]); var lng = parseFloat(pos.ll.split(',')[1]); var point = new google.maps.LatLng(lat, lng); var marker = new google.maps.Marker({ icon: 'http://maps.google.com/mapfiles/ms/icons/green-dot.png', map: map, optimized: false, title: pos.name + ' (' + pos.device + ')', position: point }) markers.push({id: pos.id, did: pos.device, markerObj: marker}); bind_info_window(marker, map, infoWindow, "<a href='/curahhujan/"+pos.id+"' style='font-weight: bold;font-size: 16px;'>"+ pos.name + "</a>"); }); }; function bind_info_window(marker, map, infowindow, html) { google.maps.event.addListener(marker, 'click', function() { infowindow.setContent(html); infowindow.open(map, marker); }) }; </script> <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAmnJGdC-ZhVd98H3mwMRv2GU2dlv1D7IA&callback=init_map"></script> """ return render.map.curahhujan({'poses': agents, 'js_foot': js_foot})
def GET(self): HIDE_THIS = [a.strip() for a in open('HIDE_ARR.txt').read().split(',')] agents = Agent.select( AND(OR(Agent.q.AgentType == KLIMATOLOGI, Agent.q.AgentType == 0.0), Agent.q.expose == True)) agents = [a for a in agents if a.table_name not in HIDE_THIS] sql = "SELECT prima_id, AgentName FROM agent WHERE AgentType IN (0, 1) AND LENGTH(prima_id)>4" try: rst = Agent._connection.queryAll(sql) all_prima = dict([(a[1].lower().replace('.', '_').replace(' ', '_'), a[0]) for a in rst]) except: all_prima = {} #all_prima = dict(map(lambda x: (x[1], x[0]), [p.strip().split('\t') for p in open('PRIMA_ID.txt').readlines()])) all_pos = [] for a in agents: sql = "SELECT Rain, CONCAT(SamplingDate, ' ', SamplingTime) AS sampling FROM %s ORDER BY SamplingDate DESC, SamplingTime DESC LIMIT 0, 1" % ( a.table_name, ) try: rst = Agent._connection.queryAll(sql) except: rst = None if rst: rain, sampling = rst[0] # print(rst[0]) sampling = datetime.datetime.strptime(sampling, '%Y-%m-%d %H:%M:%S') if datetime.datetime.now() - sampling > datetime.timedelta( minutes=10): rain = 0 else: rain = float(rain or 0) else: rain = 0 if a.kab == None: kab = "-" else: kab = a.kab ch = a.get_segmented_rain(datetime.date.today()) p_ = { 'id': a.AgentId, 'lrain': rain, 'name': a.cname + ' (' + kab + ')', 'll': a.ll, 'tname': a.table_name, 'petugas': [p.nama for p in a.petugas], 'kode': [p.kode for p in a.petugas], 'ch_today': float(ch.get("total")) } if a.table_name in all_prima.keys(): p_.update({'device': all_prima.get(a.table_name)}) all_pos.append(p_) js_foot = """ <script> var allPos = """ + str(all_pos) + """; for (var i = 0; i < allPos.length; i++) { var iw = `<div class="panel panel-default"> <div class="panel-heading"> <div class="panel-title"><h6>${allPos[i].name}</h6></div></div> <div class="panel-body"> <table class="table"> <tr><td><b>Curah Hujan</b></td><td><b>${allPos[i].ch_today} mm</b> <a href="/curahhujan/${allPos[i].id}">(Detail)</a></td></tr> <tr><td>Prima ID</td><td>${allPos[i].device}</td></tr> <tr><td>Koordinat</td><td>${allPos[i].ll}</td></tr> </table> </div> <div class="panel-footer"><span class="icofont-user"></span> ${allPos[i].petugas} <br> <span class="icofont-barcode"></span> <b>${allPos[i].kode}</b></div> </div>` var lat = parseFloat(allPos[i].ll.split(',')[0]); var lng = parseFloat(allPos[i].ll.split(',')[1]); var name = allPos[i].name, marker = new L.Marker(new L.latLng([lat,lng]), {title: name,icon: ch_icon} );//se property searched; marker.bindPopup(iw); markersLayer.addLayer(marker); } </script> <script> var ws = new WebSocket('ws://mqtt.bbws-bsolo.net:22286'); ws.onmessage = function (event) { var data = JSON.parse(event.data); if (data.device === undefined) { return; } var device_id = data.device.split('/')[1]; for (ap in allPos) { if (allPos[ap].device == device_id) { //console.log(device_id+" "+allPos[ap].name); var pos_hujan = 1; if (pos_hujan ==1) { var lat_ws = parseFloat(allPos[ap].ll.split(',')[0]); var lng_ws = parseFloat(allPos[ap].ll.split(',')[1]); } break; } else { var pos_hujan = 0; } } if (data.tick > 0) { if (pos_hujan == 1){ icon_hujan = ch_icon_rain; } } else { icon_hujan = ch_icon; } //marker = new L.Marker(new L.latLng([lat_ws,lng_ws]), {icon: icon_hujan} );//se property searched; //marker.bindPopup(iw); //markersLayer.addLayer(marker); } </script> <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> """ return rendermap.map.curahhujan({'js_foot': js_foot})
def GET(self): HIDE_THIS = [ a.strip() for a in open('HIDE_AWLR.txt').read().split(',') ] agents = Agent.select( AND(OR(Agent.q.AgentType == HIDROLOGI, Agent.q.AgentType == 0), Agent.q.expose == True)).orderBy( ["wilayah", "-DPL", "-siaga3"]) agents = [a for a in agents if a.table_name not in HIDE_THIS] all_pos = [] for a in agents: try: petugas = a.petugas[0].nama petugas_kode = a.petugas[0].kode except: petugas = '-' petugas_kode = '-' if a.kab == None: kab = "-" else: kab = a.kab row = { 'id': a.AgentId, 'name': a.cname + ' (' + kab + ')', 'll': a.ll, 'device': a.prima_id, 'petugas': petugas, 'kode': petugas_kode } all_pos.append(row) all_pos = json.dumps(all_pos) js_foot = """ <script> var allPos = """ + str(all_pos) + """; for (var i = 0; i < allPos.length; i++) { var iw = `<div class="panel panel-default"> <div class="panel-heading"> <div class="panel-title"><h6>${allPos[i].name}</h6></div></div> <div class="panel-body"> <table class="table"> <tr><td>Prima ID</td><td>${allPos[i].device}</td></tr> <tr><td>Koordinat</td><td>${allPos[i].ll}</td></tr> </table> </div> <div class="panel-footer"><span class="icofont-user"></span> ${allPos[i].petugas} <br> <span class="icofont-barcode"></span> <b>${allPos[i].kode}</b></div> </div>` var lat = parseFloat(allPos[i].ll.split(',')[0]); var lng = parseFloat(allPos[i].ll.split(',')[1]); var name = allPos[i].name, marker = new L.Marker(new L.latLng([lat,lng]), {title: name,icon: tma_icon} );//se property searched; marker.bindPopup(iw); markersLayer.addLayer(marker); } </script> <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> """ return rendermap.map.tma({'js_foot': js_foot})