Update dynamically teleinfo graph.
This commit is contained in:
parent
8378253574
commit
213e1305d9
|
|
@ -8,6 +8,7 @@ import (
|
|||
|
||||
"html/template"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
//——————————————————————————————————————————————————————————————————————————————
|
||||
|
|
@ -62,7 +63,8 @@ func (c *ViewTeleinfoController) Prepare() {
|
|||
}
|
||||
|
||||
func (c *ViewTeleinfoController) Get() {
|
||||
c.Data["compteurs"] = teleinfo.GetAllCompteur()
|
||||
compteurs := teleinfo.GetAllCompteur()
|
||||
c.Data["compteurs"] = compteurs
|
||||
|
||||
adresse := c.Ctx.Input.Param(":compteur")
|
||||
cpt := teleinfo.GetCompteurByAdresse(adresse)
|
||||
|
|
@ -75,13 +77,47 @@ func (c *ViewTeleinfoController) Get() {
|
|||
desc = cpt.AdresseCompteur
|
||||
}
|
||||
c.Data["compteurDescription"] = desc
|
||||
dataPower := formatDataSensorTeleInfo(teleinfo.GetAllDataForCompteur(cpt.AdresseCompteur))
|
||||
compteurs := teleinfo.GetAllDataForCompteur(cpt.AdresseCompteur)
|
||||
c.Data["lastHorodate"] = getHorodateHighchart(compteurs[len(compteurs)-1].HorodateGMT)
|
||||
dataPower := formatDataSensorTeleInfo(compteurs)
|
||||
c.Data["dataPower"] = template.JS(dataPower)
|
||||
}
|
||||
|
||||
c.TplName = "teleinfo.tpl"
|
||||
}
|
||||
|
||||
func (c *ViewTeleinfoController) Post() {
|
||||
currentTimeStr := c.GetString("currentTime")
|
||||
adresse := c.Ctx.Input.Param(":compteur")
|
||||
currentTime, err := strconv.ParseInt(currentTimeStr, 10, 64)
|
||||
if err == nil {
|
||||
dateGMT := time.Unix(currentTime/1000-int64(timezoneOffset), 0)
|
||||
data := teleinfo.GetNextData(adresse, dateGMT)
|
||||
dataStr := formatDataToJsonTeleInfo(data)
|
||||
c.Ctx.Output.Body([]byte(dataStr))
|
||||
}
|
||||
}
|
||||
|
||||
func getHorodateHighchart(date time.Time) string {
|
||||
return strconv.FormatInt((date.Unix()+int64(timezoneOffset))*1000, 10)
|
||||
|
||||
}
|
||||
|
||||
func formatDataToJsonTeleInfo(values []teleinfo.TeleinfoTable) string {
|
||||
ret := ""
|
||||
ret += "{\"values\": ["
|
||||
for i := 0; i < len(values); i++ {
|
||||
if i > 0 {
|
||||
ret += ","
|
||||
}
|
||||
horodate := getHorodateHighchart(values[i].HorodateGMT)
|
||||
value := strconv.FormatInt(values[i].PuissanceApparente, 10)
|
||||
ret += "[" + horodate + "," + value + "]"
|
||||
}
|
||||
ret += "]}"
|
||||
return ret
|
||||
}
|
||||
|
||||
func formatDataSensorTeleInfo(values []teleinfo.TeleinfoTable) string {
|
||||
ret := ""
|
||||
ret += "{name : \"Puissance apparente (VA)\",marker : {enabled : true, radius : 3}, data : ["
|
||||
|
|
|
|||
|
|
@ -124,6 +124,38 @@ func GetLastDataForCompteur(adresseCompteur string) *TeleinfoTable {
|
|||
return data
|
||||
}
|
||||
|
||||
func GetNextData(addressCompteur string, from time.Time) []TeleinfoTable {
|
||||
o := orm.NewOrm()
|
||||
o.Using(database.Alias)
|
||||
|
||||
var dataArray []TeleinfoTable
|
||||
var maps []orm.Params
|
||||
_, err := o.QueryTable(new(TeleinfoTable)).Filter("AdresseCompteur", addressCompteur).Filter("HorodateGMT__gt", from).OrderBy("HorodateGMT").Values(&maps)
|
||||
if err == nil {
|
||||
for _, m := range maps {
|
||||
dataTime := utils.GetTime(m, "HorodateGMT")
|
||||
if dataTime.After(from) {
|
||||
d := new(TeleinfoTable)
|
||||
d.Id = utils.GetInt(m, "Id")
|
||||
d.HorodateGMT = dataTime
|
||||
|
||||
d.AdresseCompteur = utils.GetString(m, "AdresseCompteur")
|
||||
d.OptionTarifaire = optionTarifaireTranslate[utils.GetString(m, "OptionTarifaire")]
|
||||
d.OptionBase = utils.GetInt(m, "OptionBase")
|
||||
|
||||
d.IntensiteSouscrite = utils.GetInt(m, "IntensiteSouscrite")
|
||||
d.IntensiteInstantanne = utils.GetInt(m, "IntensiteInstantanne")
|
||||
d.IntensiteMax = utils.GetInt(m, "IntensiteMax")
|
||||
|
||||
d.PuissanceApparente = utils.GetInt(m, "PuissanceApparente")
|
||||
|
||||
dataArray = append(dataArray, *d)
|
||||
}
|
||||
}
|
||||
}
|
||||
return dataArray
|
||||
}
|
||||
|
||||
func DeleteDataCompteur(adresseCompteur string) {
|
||||
o := orm.NewOrm()
|
||||
o.Using(database.Alias)
|
||||
|
|
|
|||
|
|
@ -4,93 +4,125 @@
|
|||
<script type="text/javascript" src="/static/highstock/js/highstock.js"></script>
|
||||
<script type="text/javascript" src="/static/highstock/js/themes/grid.js"></script>
|
||||
<script type="text/javascript" src="/static/highstock/js/modules/exporting.js"></script>
|
||||
<script src="http://code.highcharts.com/highcharts.js"></script>
|
||||
<script type="text/javascript">
|
||||
$(function () {
|
||||
chart1 = new Highcharts.StockChart({
|
||||
chart: {
|
||||
renderTo : 'graphe',
|
||||
load : function () {
|
||||
// set up the updating of the chart each second
|
||||
var series = this.series[0];
|
||||
setInterval(function () {
|
||||
var x = (new Date()).getTime(), // current time
|
||||
y = Math.round(Math.random() * 100);
|
||||
series.addPoint([x, y], true, true);
|
||||
}, 1000);
|
||||
}
|
||||
},
|
||||
rangeSelector: {
|
||||
buttons: [{
|
||||
count: 3,
|
||||
type: 'hour',
|
||||
text: '3h'
|
||||
},{
|
||||
count: 6,
|
||||
type: 'hour',
|
||||
text: '6h'
|
||||
},{
|
||||
count: 12,
|
||||
type: 'hour',
|
||||
text: '12h'
|
||||
}, {
|
||||
count: 1,
|
||||
type: 'day',
|
||||
text: '1j'
|
||||
}, {
|
||||
count: 2,
|
||||
type: 'day',
|
||||
text: '2j'
|
||||
}, {
|
||||
count: 3,
|
||||
type: 'day',
|
||||
text: '3j',
|
||||
}, {
|
||||
count: 5,
|
||||
type: 'day',
|
||||
text: '5j'
|
||||
}, {
|
||||
count: 7,
|
||||
type: 'day',
|
||||
text: '7j'
|
||||
}, {
|
||||
count: 1,
|
||||
type: 'month',
|
||||
text: '1m'
|
||||
}, {
|
||||
type: 'all',
|
||||
text: 'All'
|
||||
}],
|
||||
selected: 5
|
||||
},
|
||||
yAxis: {
|
||||
title: {
|
||||
text: 'Puissance (W)'
|
||||
}
|
||||
},
|
||||
xAxis: {
|
||||
type: 'datetime'
|
||||
},
|
||||
scrollbar : {
|
||||
enabled : false
|
||||
},
|
||||
legend : {
|
||||
enabled : true,
|
||||
layout: 'vertical',
|
||||
verticalAlign : 'middle',
|
||||
align : 'right'
|
||||
},
|
||||
series : [ {{.dataPower}} ]
|
||||
});
|
||||
});
|
||||
Highcharts.setOptions({
|
||||
global: {
|
||||
useUTC: false
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{{end}}
|
||||
{{define "extrajs"}}
|
||||
<script type="text/javascript">
|
||||
var lastTimeStamps = {{.lastHorodate}};
|
||||
|
||||
var initData = function(series) {
|
||||
//loadNewData(series);
|
||||
setInterval(function() {
|
||||
loadNewData(series);
|
||||
}, 30000);
|
||||
};
|
||||
|
||||
var loadNewData = function(series) {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
data: {
|
||||
currentTime: lastTimeStamps
|
||||
},
|
||||
success: function(json) {
|
||||
console.log(json);
|
||||
var obj = JSON.parse(json);
|
||||
for (var i=0; i<obj.values.length; i++) {
|
||||
var arrayVal = [obj.values[i][0], obj.values[i][1]];
|
||||
console.log(arrayVal);
|
||||
series.addPoint(arrayVal, true, false);
|
||||
|
||||
if (i == obj.values.length-1) {
|
||||
lastTimeStamps = obj.values[i][0] + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
$(function () {
|
||||
|
||||
Highcharts.setOptions({
|
||||
global: {
|
||||
useUTC: false
|
||||
}
|
||||
});
|
||||
|
||||
// Create the chart
|
||||
Highcharts.StockChart({
|
||||
chart: {
|
||||
renderTo: "graphe",
|
||||
events: {
|
||||
load: function () {
|
||||
// set up the updating of the chart each second
|
||||
var series = this.series[0];
|
||||
initData(series);
|
||||
}
|
||||
}
|
||||
},
|
||||
rangeSelector: {
|
||||
buttons: [{
|
||||
count: 3,
|
||||
type: 'hour',
|
||||
text: '3h'
|
||||
},{
|
||||
count: 6,
|
||||
type: 'hour',
|
||||
text: '6h'
|
||||
},{
|
||||
count: 12,
|
||||
type: 'hour',
|
||||
text: '12h'
|
||||
}, {
|
||||
count: 1,
|
||||
type: 'day',
|
||||
text: '1j'
|
||||
}, {
|
||||
count: 2,
|
||||
type: 'day',
|
||||
text: '2j'
|
||||
}, {
|
||||
count: 3,
|
||||
type: 'day',
|
||||
text: '3j',
|
||||
}, {
|
||||
count: 5,
|
||||
type: 'day',
|
||||
text: '5j'
|
||||
}, {
|
||||
count: 7,
|
||||
type: 'day',
|
||||
text: '7j'
|
||||
}, {
|
||||
count: 1,
|
||||
type: 'month',
|
||||
text: '1m'
|
||||
}, {
|
||||
type: 'all',
|
||||
text: 'All'
|
||||
}],
|
||||
selected: 5
|
||||
},
|
||||
yAxis: {
|
||||
title: {
|
||||
text: 'Puissance (VA)'
|
||||
}
|
||||
},
|
||||
xAxis: {
|
||||
type: 'datetime'
|
||||
},
|
||||
scrollbar : {
|
||||
enabled : false
|
||||
},
|
||||
legend : {
|
||||
enabled : true,
|
||||
layout: 'vertical',
|
||||
verticalAlign : 'middle',
|
||||
align : 'right'
|
||||
},
|
||||
|
||||
series : [ {{.dataPower}} ]
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{{end}}
|
||||
{{define "body"}}
|
||||
<div class="row">
|
||||
|
|
|
|||
Loading…
Reference in New Issue