]> ToastFreeware Gitweb - chrisu/seepark.git/blob - web/static/seepark_web.js
format x tick values (datetime) differently according to interval
[chrisu/seepark.git] / web / static / seepark_web.js
1 var api_base_url = '/api/1/sensor/type/Wassertemperatur?mode=consolidated&format=c3';
2
3 function dayschart(element, interval, days, xtickformat) {
4         var chart = c3.generate({
5                 bindto: '#' + element,
6                 size: {
7                         width: document.getElementById(element).parentElement.clientWidth * 80 / 100
8                 },
9                 transition: {
10                         duration: null
11                 },
12                 title: {
13                         text: 'Der See (' + interval + ')'
14                 },
15                 data: {
16                         url: api_base_url + beginend(days),
17                         mimeType: 'json',
18                         xs: {
19                                 '0316a2193bff': '0316a2193bff_x',
20                                 '0316a21383ff': '0316a21383ff_x'
21                         },
22                         names: {
23                                 '0316a2193bff': 'Wassertemperatur in 4 m Tiefe',
24                                 '0316a21383ff': 'Wassertemperatur in 5 m Tiefe'
25                         },
26                         xFormat: '%Y-%m-%d %H:%M:%S',
27                         colors: {
28                                 '0316a2193bff': 'lightblue',
29                                 '0316a21383ff': 'darkblue'
30                         }
31                 },
32                 axis: {
33                         x: {
34                                 type: 'timeseries',
35                                 tick: {
36                                         format: xtickformat,
37                                         fit: false,
38                                         multiline: true, // broken? so →
39                                         rotate: -90
40                                 }
41                         },
42                         y: {
43                                 label: {
44                                         text: 'Temperatur in °C',
45                                         position: 'outer-middle'
46                                 },
47                                 tick: {
48                                         format: function (d) {
49                                                 return d.toFixed(1) + '°';
50                                         }
51                                 }
52                         }
53                 },
54                 zoom: {
55                         enabled: true,
56                         onzoomend: function (domain) {
57                                 // UNIX epoch
58                                 var start = domain[0].getTime()/1000;
59                                 var end   = domain[1].getTime()/1000;
60                                 var duration = end - start;
61                                 // duration is now the diff of the "viewport in seconds"
62                                 // FIXME
63                                 var days = Math.round(duration / 86400 / 2);
64                                 if (days > 0) {
65                                         loaddays(days);
66                                 }
67                         }
68                 },
69                 tooltip: {
70                         format: {
71                                 name: function (name, ratio, id, index) {
72                                         var re = /\d m/;
73                                         var res = re.exec(name);
74                                         return res;
75                                 },
76                                 value: function (value, ratio, id, index) {
77                                         return value.toFixed(2) + '°';
78                                 },
79                                 title: function (x) {
80                                         // TODO: format datetime into something readable
81                                         return x;
82                                 }
83                         }
84                 },
85                 grid: {
86                         y: {
87                                 show: true
88                         }
89                 },
90                 regions: [
91                         {axis: 'y', start: -999, end:   0, class: 'region-frozen'},
92                         {axis: 'y', start:    0, end:  25, class: 'region-ok'},
93                         {axis: 'y', start:   25, end: 100, class: 'region-warm'},
94                         {axis: 'y', start:  100, end: 999, class: 'region-boiling'}
95                 ]
96         });
97         };
98
99 function loaddays(days) {
100         chart.load({
101                 url: api_base_url + beginend(days),
102                 mimeType: 'json'
103         });
104 }
105
106 function beginend(days) {
107         var now = Date.now();
108         var end = new Date(now).toISOString().substr(0, 19); // 2018-06-13T16:52:30.995Z
109         var begin = new Date(now - days * 60*60*24 * 1000).toISOString().substr(0, 19);
110         return '&begin=' + begin + '&end=' + end;
111 }
112
113 dayschart('chart1',   'Tag',     1, '%H:%M');
114 dayschart('chart7',   'Woche',   7, '%a %d');
115 dayschart('chart31',  'Monat',  31, 'Woche %V');
116 dayschart('chart365', 'Jahr',  365, '%b %d');