]> ToastFreeware Gitweb - chrisu/seepark.git/blob - web/static/seepark_web.js
aesthetic sugar: set width of charts to 80% of parent
[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) {
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: '%Y-%m-%d %H:%M',
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                         }
80                 },
81                 grid: {
82                         y: {
83                                 show: true
84                         }
85                 },
86                 regions: [
87                         {axis: 'y', start: -999, end:   0, class: 'region-frozen'},
88                         {axis: 'y', start:    0, end:  25, class: 'region-ok'},
89                         {axis: 'y', start:   25, end: 100, class: 'region-warm'},
90                         {axis: 'y', start:  100, end: 999, class: 'region-boiling'}
91                 ]
92         });
93         };
94
95 function loaddays(days) {
96         chart.load({
97                 url: api_base_url + beginend(days),
98                 mimeType: 'json'
99         });
100 }
101
102 function beginend(days) {
103         var now = Date.now();
104         var end = new Date(now).toISOString().substr(0, 19); // 2018-06-13T16:52:30.995Z
105         var begin = new Date(now - days * 60*60*24 * 1000).toISOString().substr(0, 19);
106         return '&begin=' + begin + '&end=' + end;
107 }
108
109 dayschart('chart1',   'Tag',     1);
110 dayschart('chart7',   'Woche',   7);
111 dayschart('chart31',  'Monat',  31);
112 dayschart('chart365', 'Jahr',  365);