LASS Field Try 1 之即時PM2.5資訊儀表板介面

最後編輯:2015-12-13 建立:2015-10-31 歷史紀錄

 

CCLLJJ@G前情提要

 

準備步驟

  • 方法一:
    • 請參考 LASS Field Try 1 之即時數據呈現系統 文件之說明,並完成所有步驟
    • 登入 ThingSpeak.com 後,選擇 Apps -> Plugins -> New,然後選擇 Google Gauge,並點擊 Create
    • 在出現的網頁中,首先於 Name 欄位輸入 "PM2.5 量測 @ XXX(YYYZZZ)",其中XXX為您的裝設地點的簡稱,YYY為縣市名稱,ZZZ為鄉鎮區名稱
    • 在 HTML 欄位中輸入下列內容,其中 <title></title> 中的 YYY為縣市名稱,ZZZ為鄉鎮區名稱;內文中地點後方的XXX為您的裝設地點的簡稱,YYY為縣市名稱,ZZZ為鄉鎮區名稱
    • <html>
    • <head>
    • <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    • <script type="text/javascript" src="//thingspeak.com/highcharts-3.0.8.js"></script>
    • <script type="text/javascript" src="//thingspeak.com/exporting.js"></script>
    • <title>PM2.5 即時資訊 @ YYYZZZ</title>
    • %%PLUGIN_CSS%%
    • %%PLUGIN_JAVASCRIPT%%
    • </head>
    • <body>
    • <center>
    • <h1>PM2.5 即時資訊:XXX(YYYZZZ)</h1>
    • <font size="+2">
    • 時間:<span id="lastupdate"> </span><br>
    • 溫度:</b><span id="temperature"></span>&#8451;;濕度:</b><span id="humidity"></span>%
    • </font>
    • </center>
    • <center>
    • <table border=0 width=800><tr>
    • <td width=450>
    • <div id="inner">
    • <div id="gauge_div"></div>
    • </div>
    • </td>
    • <td width=350>
    • <ul>
    • <li><b>針對一般民眾的活動建議:</b><span id="suggestion1"></span></li>
    • <li><b>針對敏感性族群的活動建議:</b><span id="suggestion2"></span></li>
    • </ul>
    • </td>
    • </tr></table>
    • <div id="chart-container">
    • <img alt="Ajax loader" src="//thingspeak.com/assets/loader-transparent.gif"/>
    • </div>
    • <hr>
    • 註:以上量測結果仍屬實驗階段,其正確性與代表性僅供參考,正確資料仍以環保署公佈為主。
    • <br>
    • Powered by <a href="https://www.facebook.com/groups/1607718702812067/">LASS</a> & <A href="https://sites.google.com/site/cclljj/NRL">IIS-NRL</a> & <a href="https://thingspeak.com">ThingSpeak.com</a>
    • </center>
    • </body>
    • </html>
    • 在 CSS 的欄位中輸入
    • <style type="text/css">
    • body { background-color: white; }
    • #container { width: 100%; display: table; }
    • #inner { vertical-align: top; display: table-cell; }
    • #gauge_div { width: 450px; margin: 0 auto; }
    • #chart-container { width: 800px; height: 250px; display: block; margin: 5px 15px 15px 0; overflow: hidden; }
    • </style>
    • 在 JavaScript 的欄位中輸入下列內容,其中 channel_id 為您的LASS設備在 ThingSpeak 中的 Channel 代碼(並非 Channel 名稱),api_key 則為該 Channel 的 API Key
    • <script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'></script>
    • <script type='text/javascript' src='https://www.google.com/jsapi'></script>
    • <script type='text/javascript'>
    • // set your channel id here
    • var channel_id = 12345;
    • // set your channel's read api key here if necessary
    • var api_key = '1234567890ABCDEF';
    • // maximum value for the gauge
    • var max_gauge_value = 100;
    • // name of the gauge
    • var gauge_name = 'PM2.5';
    • // global variables
    • var chart, charts, data;
    • // load the google gauge visualization
    • google.load('visualization', '1', {packages:['gauge']});
    • google.setOnLoadCallback(initChart);
    • // display the data
    • function displayData(point) {
    • data.setValue(0, 0, gauge_name);
    • data.setValue(0, 1, point);
    • chart.draw(data, options);
    • }
    • // load the data
    • function loadData() {
    • // variable for the data point
    • var p;
    • // get the data from thingspeak
    • $.getJSON('https://api.thingspeak.com/channels/' + channel_id + '/feed/last.json?api_key=' + api_key, function(data) {
    • // get the data point
    • p = data.field1;
    • if (p<=35){
    • $('#suggestion1').html("正常戶外活動。");
    • $('#suggestion2').html("正常戶外活動。");
    • } else if (p<=53){
    • $('#suggestion1').html("正常戶外活動。");
    • $('#suggestion2').html("有心臟、呼吸道及心血管疾病的成人與孩童感受到癥狀時,應考慮減少體力消耗,特別是減少戶外活動。");
    • } else if (p<=70){
    • $('#suggestion1').html("任何人如果有不適,如眼痛,咳嗽或喉嚨痛等,應該考慮減少戶外活動。");
    • $('#suggestion2').html("<ol><li>有心臟、呼吸道及心血管疾病的成人與孩童,應減少體力消耗,特別是減少戶外活動。</li><li>老年人應減少體力消耗。</li><li>具有氣喘的人可能需增加使用吸入劑的頻率。</li></ol>");
    • } else {
    • $('#suggestion1').html("任何人如果有不適,如眼痛,咳嗽或喉嚨痛等,應減少體力消耗,特別是減少戶外活動。");
    • $('#suggestion2').html("<ol><li>有心臟、呼吸道及心血管疾病的成人與孩童,以及老年人應避免體力消耗,特別是避免戶外活動。</li><li>具有氣喘的人可能需增加使用吸入劑的頻率。</li></ol>");
    • }
    • // if there is a data point display it
    • if (p) {
    • p = Math.round((p / max_gauge_value) * 100);
    • displayData(p);
    • }
    • p = data.field2;
    • $('#temperature').html(p);
    • p = data.field3;
    • $('#humidity').html(p);
    • });
    • $.getJSON('https://api.thingspeak.com/channels/' + channel_id + '/fields/1/last.json?timezone=Asia%2FTaipei', function(data) {
    • var now = new Date(data.created_at)
    • $('#lastupdate').html(now.toString());
    • });
    • }
    • // initialize the chart
    • function initChart() {
    • data = new google.visualization.DataTable();
    • data.addColumn('string', 'Label');
    • data.addColumn('number', 'Value');
    • data.addRows(1);
    • chart = new google.visualization.Gauge(document.getElementById('gauge_div'));
    • options = {width: 450, height: 450, redFrom: 53, redTo: 100, yellowFrom:35, yellowTo: 53, greenFrom:0, greenTo:35, minorTicks: 5};
    • loadData();
    • // load new data every 15 seconds
    • setInterval('loadData()', 15000);
    • }
    • </script>
    • <script type="text/javascript">
    • var series_1_channel_id = channel_id;
    • var series_1_field_number = 1;
    • var series_1_read_api_key = '';
    • var series_1_results = 2000;
    • var series_1_color = '#ff0000';
    • // chart title
    • var chart_title = '';
    • // y axis title
    • var y_axis_title = 'PM2.5';
    • // user's timezone offset
    • var my_offset = new Date().getTimezoneOffset();
    • // chart variable
    • var my_chart;
    • // when the document is ready
    • $(document).on('ready', function() {
    • // add a blank chart
    • addChart();
    • // add the first series
    • addSeries(series_1_channel_id, series_1_field_number, series_1_read_api_key, series_1_results, series_1_color);
    • });
    • // add the base chart
    • function addChart() {
    • // variable for the local date in milliseconds
    • var localDate;
    • // specify the chart options
    • var chartOptions = {
    • chart: {
    • renderTo: 'chart-container',
    • defaultSeriesType: 'line',
    • backgroundColor: '#ffffff',
    • events: { }
    • },
    • title: { text: chart_title },
    • plotOptions: {
    • series: {
    • marker: { radius: 3 },
    • animation: true,
    • step: false,
    • borderWidth: 0,
    • turboThreshold: 0
    • }
    • },
    • tooltip: {
    • // reformat the tooltips so that local times are displayed
    • formatter: function() {
    • var d = new Date(this.x + (my_offset*60000));
    • var n = (this.point.name === undefined) ? '' : '<br>' + this.point.name;
    • return this.series.name + ':<b>' + this.y + '</b>' + n + '<br>' + d.toDateString() + '<br>' + d.toTimeString().replace(/\(.*\)/, "");
    • }
    • },
    • xAxis: {
    • type: 'datetime',
    • title: { text: 'Date' }
    • },
    • yAxis: { title: { text: y_axis_title } },
    • exporting: { enabled: false },
    • legend: { enabled: false },
    • credits: {
    • // text: 'ThingSpeak.com',
    • // href: 'https://thingspeak.com/',
    • text: '',
    • href: '',
    • style: { color: '#D62020' }
    • }
    • };
    • // draw the chart
    • my_chart = new Highcharts.Chart(chartOptions);
    • }
    • // add a series to the chart
    • function addSeries(channel_id, field_number, api_key, results, color) {
    • var field_name = 'field' + field_number;
    • // get the data with a webservice call
    • $.getJSON('https://api.thingspeak.com/channels/' + channel_id + '/fields/' + field_number + '.json?offset=0&round=2&results=' + results + '&api_key=' + api_key, function(data) {
    • // blank array for holding chart data
    • var chart_data = [];
    • // iterate through each feed
    • $.each(data.feeds, function() {
    • var point = new Highcharts.Point();
    • // set the proper values
    • var value = this[field_name];
    • point.x = getChartDate(this.created_at);
    • point.y = parseFloat(value);
    • // add location if possible
    • if (this.location) { point.name = this.location; }
    • // if a numerical value exists add it
    • if (!isNaN(parseInt(value))) { chart_data.push(point); }
    • });
    • // add the chart data
    • my_chart.addSeries({ data: chart_data, name: data.channel[field_name], color: color });
    • });
    • }
    • // converts date format from JSON
    • function getChartDate(d) {
    • // offset in minutes is converted to milliseconds and subtracted so that chart's x-axis is correct
    • return Date.parse(d) - (my_offset * 60000);
    • }
    • </script>
    • 點選 Make Public,接著點選 Save
    • 點選網頁上方 Apps/Plugins/ 後方,/Edit前方的連結,即可看到類似範例中使用儀表板介面的即時 PM2.5資訊
  • 方法二:
    • 若您的 ThingSpeak.com帳號不支援製作儀表板介面,亦可直接使用下列連結製作,其中 site 是感測點的安裝位置(可為機關行號名稱、明顯地標、或其他顯而易懂的名稱),city 為感測點的安裝城市,district 為感測點的安裝鄉鎮區,channel 為 ThingSpeak 的 channel ID,apikey 為該channel 的讀取 API KEY
  • 方法三:
    • 若您沒有ThingSpeak帳號,或者不方便自行執行lass_pm25_to_thinkspeak.py的程式,您可以跳過ThingSpeak相關的步驟,直接使用 LASS 為您備份的上傳資料內容,並依照下列方法(二選一)製作儀表板網頁,其中device_id即為設備的編號:
      1. 若您想指定地理位置資訊(例如:台北市南港區中央研究院)
      • http://nrl.iis.sinica.edu.tw/LASS/show.php?site=中央研究院&city=台北市&district=南港區&device_id=FT1_001
      1. 若您不想指定地理位置資訊,允許系統依照您上傳資料中的GPS座標自行辨認位置
      • http://nrl.iis.sinica.edu.tw/LASS/show.php?device_id=FT1_001

 

常見問題與答案