From 5f988973c4c3cba34b4806335f03805053407900 Mon Sep 17 00:00:00 2001 From: Mitchell Date: Thu, 19 May 2016 23:07:50 -0500 Subject: [PATCH] finished graph information --- controller/api/sensor.go | 7 +- model/daily_sensor/daily_sensor.go | 39 +++--- model/raw_sensor/raw_sensor.go | 2 +- public/css/style.css | 8 ++ public/favicon.ico | Bin 0 -> 894 bytes public/images/loading.gif | Bin 0 -> 31012 bytes public/js/IndexController.js | 35 +++++ public/js/SensorInfoController.js | 202 +++++++++++++++++++++++++++++ public/js/SensorsController.js | 34 +++++ public/js/app.js | 124 ------------------ public/view/sensor_info.html | 13 +- public/view/template.html | 9 +- route/route.go | 2 +- 13 files changed, 319 insertions(+), 156 deletions(-) create mode 100644 public/favicon.ico create mode 100644 public/images/loading.gif create mode 100644 public/js/IndexController.js create mode 100644 public/js/SensorInfoController.js create mode 100644 public/js/SensorsController.js diff --git a/controller/api/sensor.go b/controller/api/sensor.go index cd987f8..6a28cff 100644 --- a/controller/api/sensor.go +++ b/controller/api/sensor.go @@ -58,7 +58,8 @@ func HandleSensorRequest(w http.ResponseWriter, r *http.Request, ps httprouter.P storedData.MaxTemp = temperature storedData.MinTemp = temperature storedData.Day = t.Day() - storedData.Month = t.Month().String() + storedData.Month = int(t.Month()) + storedData.MonthName = t.Month().String() storedData.Year = t.Year() err := storedData.StoreData() @@ -184,11 +185,11 @@ func HandleSensorByLocationMonth(w http.ResponseWriter, r *http.Request, ps http location := ps.ByName("location") year, _ := strconv.Atoi(ps.ByName("year")) - month := ps.ByName("month") + monthname := ps.ByName("monthname") w.Header().Set("Content-Type", "application/json") - s, err := daily_sensor.GetAllSensorInfoByMonth(location, year, month) + s, err := daily_sensor.GetAllSensorInfoByMonth(location, year, monthname) var response string diff --git a/model/daily_sensor/daily_sensor.go b/model/daily_sensor/daily_sensor.go index 7d3c504..afc3b21 100644 --- a/model/daily_sensor/daily_sensor.go +++ b/model/daily_sensor/daily_sensor.go @@ -15,13 +15,14 @@ const ( ) type Data struct { - ID bson.ObjectId `bson:"_id,omitempty"` - MaxTemp float64 `json:"maxtemp" bson:"maxtemp"` - MinTemp float64 `json:"mintemp" bson:"mintemp"` - Location string `json:"location" bson:"location"` - Month string `json:"month" bson:"month"` - Day int `json:"day" bson:"day"` - Year int `json:"year" bson:"year"` + ID bson.ObjectId `bson:"_id,omitempty"` + MaxTemp float64 `json:"maxtemp" bson:"maxtemp"` + MinTemp float64 `json:"mintemp" bson:"mintemp"` + Location string `json:"location" bson:"location"` + Month int `json:"month" bson:"month"` + MonthName string `json:"monthname" bson:"monthname"` + Day int `json:"day" bson:"day"` + Year int `json:"year" bson:"year"` } //convert struct to json string @@ -70,7 +71,7 @@ func (s *Data) UpdateData() error { c := session.DB(db.Mongo.Info.Database).C(collection) - colQuerier := bson.M{"location": s.Location} + colQuerier := bson.M{"location": s.Location, "month": s.Month, "monthname": s.MonthName, "day": s.Day, "year": s.Year} change := bson.M{"$set": bson.M{"maxtemp": s.MaxTemp, "mintemp": s.MinTemp}} err := c.Update(colQuerier, change) @@ -87,10 +88,12 @@ func (s *Data) UpdateData() error { func GetDailySensorInfo(sensor_location string) (Data, error) { d := Data{} + t := time.Now() - day := time.Now().Day() - month := time.Now().Month().String() - year := time.Now().Year() + day := t.Day() + month := int(t.Month()) + monthname := t.Month().String() + year := t.Year() if db.Mongo.Connected() == true { @@ -99,7 +102,7 @@ func GetDailySensorInfo(sensor_location string) (Data, error) { c := session.DB(db.Mongo.Info.Database).C(collection) - err := c.Find(bson.M{"location": sensor_location, "day": day, "month": month, "year": year}).One(&d) + err := c.Find(bson.M{"location": sensor_location, "day": day, "month": month, "monthname": monthname, "year": year}).One(&d) if err != nil { fmt.Println(err) @@ -124,7 +127,9 @@ func GetAllSensorInfo(sensor_location string) ([]Data, error) { c := session.DB(db.Mongo.Info.Database).C(collection) - err := c.Find(bson.M{"location": sensor_location}).All(&d) + //err := c.Find(bson.M{"location": sensor_location}).Sort("-year, -month").All(&d) + err := c.Pipe([]bson.M{{"$match": bson.M{"location": sensor_location}}, + {"$sort": bson.M{"year": -1, "month": 1}}}).All(&d) if err != nil { fmt.Println(err) @@ -148,7 +153,8 @@ func GetAllSensorInfoByYear(sensor_location string, year int) ([]Data, error) { c := session.DB(db.Mongo.Info.Database).C(collection) - err := c.Find(bson.M{"location": sensor_location, "year": year}).All(&d) + err := c.Pipe([]bson.M{{"$match": bson.M{"location": sensor_location, "year": year}}, + {"$sort": bson.M{"year": -1, "month": 1}}}).All(&d) if err != nil { fmt.Println(err) @@ -162,7 +168,7 @@ func GetAllSensorInfoByYear(sensor_location string, year int) ([]Data, error) { } } -func GetAllSensorInfoByMonth(sensor_location string, year int, month string) ([]Data, error) { +func GetAllSensorInfoByMonth(sensor_location string, year int, monthname string) ([]Data, error) { d := []Data{} if db.Mongo.Connected() == true { @@ -172,7 +178,8 @@ func GetAllSensorInfoByMonth(sensor_location string, year int, month string) ([] c := session.DB(db.Mongo.Info.Database).C(collection) - err := c.Find(bson.M{"location": sensor_location, "year": year, "month": month}).All(&d) + err := c.Pipe([]bson.M{{"$match": bson.M{"location": sensor_location, "year": year, "monthname": monthname}}, + {"$sort": bson.M{"year": -1, "month": 1}}}).All(&d) if err != nil { fmt.Println(err) diff --git a/model/raw_sensor/raw_sensor.go b/model/raw_sensor/raw_sensor.go index 9b45391..1416123 100644 --- a/model/raw_sensor/raw_sensor.go +++ b/model/raw_sensor/raw_sensor.go @@ -10,7 +10,7 @@ import ( ) const ( - collection = "temperatures" + collection = "raw_sensor" ) type Data struct { diff --git a/public/css/style.css b/public/css/style.css index 0feff06..56f4923 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -327,4 +327,12 @@ body.loading .modal { input[readonly] { background-color: white !important; cursor: text !important; +} + +.hide { + display: none; +} + +.show { + display: inline; } \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5c788a889ea7a9d5a694ec99b736e2923f62b667 GIT binary patch literal 894 zcmZQzU<5(|0R|u`!H~hsz#zuJz@P!dKp_SNAO?wp0ZZa&0hp#1+9 zD8f{WEHzx!L;MKwJ3;@#6#yA%L5CSW$coX}K)txsqqzj45tn+1VoWVq)gvoL(}JlU zQ!%m@Wc9dIqKQNNOA-k(q5dBOgZm>)?3Tp9;G)F9;K0Pd;Ml~#;Cu+8#{UyU4@fTn De03v< literal 0 HcmV?d00001 diff --git a/public/images/loading.gif b/public/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..e71ec0ad173db874bbb754cc810dc1e527947e24 GIT binary patch literal 31012 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 0) { + $scope.selectedObject = $scope.list[0]; + $scope.selectedMonth = $scope.list[0].months[0]; + + $scope.loadingMonth = true; + $scope.loadingYear = true; + + displayChart("info-chart-year", "legend-year", $scope.location, $scope.list[0].year, null, function() { + $scope.$apply(function() { + $scope.loadingYear = false; + }); + }); + displayChart("info-chart-month", "legend-month", $scope.location, $scope.list[0].year, $scope.list[0].months[0], function() { + $scope.$apply(function() { + $scope.loadingMonth = false; + }); + }); + + } else { + $scope.selectedObject = {}; + $scope.selectedMonth = ""; + } + + + }, function errorCallback(response) {}); + + $scope.onYearChange = function() { + resetCanvas("info-chart-year", "canvas1-id"); + resetCanvas("info-chart-month", "canvas2-id"); + + $scope.loadingMonth = true; + $scope.loadingYear = true; + + displayChart("info-chart-year", "legend-year", $scope.location, $scope.selectedObject.year, null, function() { + $scope.$apply(function() { + $scope.loadingYear = false; + }); + }); + + displayChart("info-chart-month", "legend-month", $scope.location, $scope.selectedObject.year, $scope.selectedObject.months[0], function() { + $scope.$apply(function() { + $scope.loadingMonth = false; + }); + }); + } + + $scope.onMonthChange = function() { + resetCanvas("info-chart-month", "canvas2-id"); + $scope.loadingMonth = true; + + displayChart("info-chart-month", "legend-month", $scope.location, $scope.selectedObject.year, $scope.selectedMonth, function() { + $scope.$apply(function() { + $scope.loadingMonth = false; + }); + }); + } +}); + +function createYearObjects(data) { + var list = []; + + for (i in data) { + + var exists = false, + index = 0; + + for (j in list) { + + if (data[i].year == list[j].year) { + exists = true; + index = j; + break; + } + + } + + if (exists == true) { + + if (list[index].months.indexOf(data[i].monthname) < 0) { + list[index].months.push(data[i].monthname); + } + + } else { + list.push({ year: data[i].year, months: [data[i].monthname] }); + } + + } + + return list; +} + +function resetCanvas(canvas_id, container_id) { + $("#" + canvas_id).remove(); // this is my element + $("#" + container_id).append(''); +} + +function displayChart(chart_id, chart_legend_id, location, year, month, callback) { + + var api_url = "/api"; + + if (month == null) { + api_url += "/sensor/" + location + "/" + year; + } else { + api_url += "/sensor/" + location + "/" + year + "/" + month; + } + $.ajax({ + type: 'GET', + url: api_url, + data: {}, + beforeSend: function() { + }, + success: function(response) { + var json = response; + var data = { labels: [], datasets: [] }; + + var ctx = $('#' + chart_id); + + data.datasets.push({ + label: "Max Temperature °F", + fill: false, + lineTension: 0.1, + backgroundColor: "rgba(255,100,100,1)", + borderColor: "rgba(255,100,100,1)", + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + pointBorderColor: "rgba(255,100,100,1)", + pointBackgroundColor: "#fff", + pointBorderWidth: 1, + pointHoverRadius: 5, + pointHoverBackgroundColor: "rgba(255,100,100,1)", + pointHoverBorderColor: "rgba(255,100,100,1)", + pointHoverBorderWidth: 2, + pointRadius: 1, + pointHitRadius: 10, + data: [] + }, { + label: "Min Temperature °F", + fill: false, + lineTension: 0.1, + backgroundColor: "rgba(151,187,205,1)", + borderColor: "rgba(151,187,205,1)", + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + pointBorderColor: "rgba(151,187,205,1)", + pointBackgroundColor: "#fff", + pointBorderWidth: 1, + pointHoverRadius: 5, + pointHoverBackgroundColor: "rgba(151,187,205,1)", + pointHoverBorderColor: "rgba(151,187,205,1)", + pointHoverBorderWidth: 2, + pointRadius: 1, + pointHitRadius: 10, + data: [] + }); + + for (var i in json) { + + if (month == null) { + data.labels.push(json[i].month + "/" + json[i].day); + } else { + data.labels.push(json[i].day); + } + + data.datasets[0].data.push(json[i].maxtemp); + data.datasets[1].data.push(json[i].mintemp); + + } + + var myChart = new Chart(ctx, { + type: 'line', + data: data, + options: { + scales: { + yAxes: [{ + ticks: { + suggestedMax: 100, + suggestedMin: 0 + } + }] + } + } + }); + + callback(); + } + }); + +} diff --git a/public/js/SensorsController.js b/public/js/SensorsController.js new file mode 100644 index 0000000..5f93634 --- /dev/null +++ b/public/js/SensorsController.js @@ -0,0 +1,34 @@ +app.controller('SensorsController', function($scope, $http) { + + $http({ + method: 'GET', + url: '/api/allsensors' + }).then(function successCallback(response) { + // this callback will be called asynchronously + // when the response is available + + $scope.information = response.data; + + for (i in $scope.information) { + + var date = new Date($scope.information[i].updated); + var options = { month: 'numeric', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true }; + + $scope.information[i].date = date.toLocaleString('en-US', options); + + if ((Date.now() - date) < 120000) { + $scope.information[i].status = "Connected"; + $scope.information[i].css = "colorGreen"; + } else { + $scope.information[i].status = "Disconnected"; + $scope.information[i].css = "colorRed"; + } + + } + + }, function errorCallback(response) { + // called asynchronously if an error occurs + // or server returns response with an error status. + }); + +}); \ No newline at end of file diff --git a/public/js/app.js b/public/js/app.js index 0cf088f..e424aac 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -31,130 +31,6 @@ app.config(['$routeProvider', '$locationProvider', function($routeProvider, $loc }); }]); -app.controller('IndexController', function($scope, $http) { - - var title = ["1-4-16", "1-1-16", "12-29-15", "12-18-15", "10-28-15", "8-13-15", "7-28-15", "7-21-15"]; - $scope.posts = []; - - for (p in title) { - - var postName = title[p]; - - //use anonymous function calls to pass - //postName to the http callback function - $http({ - method: 'GET', - url: '/public/posts/' + postName + '.html' - }).then((function(postName) { - return function(response) { - console.log(postName); - - var html = response.data; - var partial = {}; - - partial.name = postName; - partial.title = $(html).find('#title').html(); - partial.date = $(html).find('#date').html(); - partial.intro = $(html).find('#intro').html(); - - $scope.posts.push(partial); - } - })(postName), function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - console.log("Error Loading Post"); - }); - } - -}); - -app.controller('SensorsController', function($scope, $http) { - - $http({ - method: 'GET', - url: '/api/allsensors' - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $scope.information = response.data; - - for (i in $scope.information) { - - var date = new Date($scope.information[i].updated); - var options = { month: 'numeric', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true }; - - $scope.information[i].date = date.toLocaleString('en-US', options); - - if ((Date.now() - date) < 120000) { - $scope.information[i].status = "Connected"; - $scope.information[i].css = "colorGreen"; - } else { - $scope.information[i].status = "Disconnected"; - $scope.information[i].css = "colorRed"; - } - - } - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - }); - -}); - -app.controller('SensorInfoController', function($scope, $http, $routeParams) { - - $scope.location = $routeParams.location; - - $http({ - method: 'GET', - url: '/api/sensor/' + $scope.location - }).then(function successCallback(response) { - // this callback will be called asynchronously - // when the response is available - - $scope.information = response.data; - - var list = []; - - for (i in $scope.information) { - - var exists = false, - index = 0; - - for (j in list) { - - if ($scope.information[i].year == list[j].year) { - exists = true; - index = j; - break; - } - - } - - if (exists == true) { - - if (list[index].months.indexOf($scope.information[i].month) < 0) { - list[index].months.push($scope.information[i].month); - } - - } else { - //console.log("pusing" + $scope.information[i].year); - list.push({ year: $scope.information[i].year, months: [$scope.information[i].month] }); - } - - } - - console.log(JSON.stringify(list)); - - }, function errorCallback(response) { - // called asynchronously if an error occurs - // or server returns response with an error status. - }); - -}); - //handle each post page after individual posts are selected app.controller('PostController', function($scope, $route, $routeParams) { diff --git a/public/view/sensor_info.html b/public/view/sensor_info.html index 3630c48..8d3dca9 100644 --- a/public/view/sensor_info.html +++ b/public/view/sensor_info.html @@ -5,9 +5,10 @@
- + loading

@@ -15,20 +16,18 @@
-
- + loading

-
-


diff --git a/public/view/template.html b/public/view/template.html index f869a4c..6e0c268 100644 --- a/public/view/template.html +++ b/public/view/template.html @@ -3,6 +3,7 @@ mitchel.io + @@ -68,10 +69,6 @@

Site created and managed by Mitchell Gerber

©2015-2016 -
- Glyphicons provided by -
- glyphicons.com
@@ -80,6 +77,10 @@ + + + + diff --git a/route/route.go b/route/route.go index a7ca5c1..672399b 100644 --- a/route/route.go +++ b/route/route.go @@ -19,7 +19,7 @@ func Routes() *httprouter.Router { r.GET("/api/allsensors", api.HandleAllSensors) r.GET("/api/sensor/:location", api.HandleSensorByLocation) r.GET("/api/sensor/:location/:year", api.HandleSensorByLocationYear) - r.GET("/api/sensor/:location/:year/:month", api.HandleSensorByLocationMonth) + r.GET("/api/sensor/:location/:year/:monthname", api.HandleSensorByLocationMonth) r.GET("/discord", controller.Discord)