244 lines
6.7 KiB
JavaScript
244 lines
6.7 KiB
JavaScript
|
|
moment.tz('Europe/Berlin')
|
|
Chart.defaults.font.size = 24;
|
|
|
|
let humChart, pwrChart
|
|
|
|
function toMoment(time) {
|
|
|
|
|
|
let m = moment(time);
|
|
m = m.subtract({hours: 1});
|
|
return m
|
|
}
|
|
|
|
async function fetchTags() {
|
|
let res = await fetch("/tags");
|
|
let tags = await res.json();
|
|
return tags;
|
|
}
|
|
|
|
async function fetchChartData(series, tag, from) {
|
|
|
|
const queryParams = new URLSearchParams({tag, from});
|
|
const url = `/${series}?${queryParams.toString()}`
|
|
let res = await fetch(url);
|
|
let data = await res.json();
|
|
|
|
return data;
|
|
}
|
|
|
|
async function fetchTagData(tag, from) {
|
|
|
|
let humidityDataPromise = fetchChartData("humidity",tag, from);
|
|
let powerDataPromise = fetchChartData("power",tag, from);
|
|
let stateDataPromise = fetchChartData("state",tag, from);
|
|
|
|
let [humidityData, powerData, stateData] = await Promise.all([humidityDataPromise, powerDataPromise,stateDataPromise])
|
|
return {
|
|
humidityData, powerData, stateData
|
|
}
|
|
|
|
}
|
|
|
|
function initHumChart({humidityData, powerData, stateData}) {
|
|
|
|
// let humidityData = await fetchChartData("humidity",tag, new Date().getTime());
|
|
// let powerData = await fetchChartData("power",tag, new Date().getTime());
|
|
// let stateData = await fetchChartData("state",tag, new Date().getTime());
|
|
|
|
let humidityDataSet = {
|
|
label: 'Luftfeuchtigkeit',
|
|
yAxisID: 'humidity',
|
|
data: humidityData.map(v => ({x: toMoment(v.Time), y: v.Humidity})),
|
|
backgroundColor: 'rgba(8,62,236,0.2)',
|
|
borderColor: 'rgb(101,119,234)',
|
|
borderWidth: 1
|
|
}
|
|
|
|
|
|
let powerDataSet = {
|
|
label: 'Apparent Power',
|
|
yAxisID: 'power',
|
|
data: powerData.map(v => ({x: toMoment(v.Time), y: v.ApparentPower})),
|
|
backgroundColor: 'rgba(193,151,91,0.2)',
|
|
borderColor: 'rgb(207,179,106)',
|
|
borderWidth: 1
|
|
}
|
|
|
|
// let stateDataSet = {
|
|
// label: 'An/Aus',
|
|
// data: stateData.map(v => ({x: v.Time, y: v.SwitchState})),
|
|
// backgroundColor: 'rgba(125,158,124,0.2)',
|
|
// borderColor: 'rgb(8,255,0)',
|
|
// borderWidth: 1
|
|
// }
|
|
|
|
chart = new Chart(document.getElementById('humChart').getContext('2d'), {
|
|
type: 'line',
|
|
data: {
|
|
datasets: [humidityDataSet, powerDataSet]
|
|
},
|
|
options: {
|
|
scales:{
|
|
x:{
|
|
type: 'time',
|
|
ticks: {
|
|
autoSkip: true,
|
|
maxTicksLimit: 20
|
|
},
|
|
time: {
|
|
displayFormats: {minute: 'HH:mm'}
|
|
}
|
|
},
|
|
|
|
humidity: {
|
|
type: 'linear',
|
|
position: 'left',
|
|
ticks:
|
|
{
|
|
beginAtZero: true,
|
|
},
|
|
grid: { display: false }
|
|
},
|
|
power: {
|
|
type: 'linear',
|
|
position: 'right',
|
|
ticks:
|
|
{
|
|
beginAtZero: true,
|
|
},
|
|
grid: { display: false }
|
|
},
|
|
}
|
|
}
|
|
});
|
|
return chart
|
|
}
|
|
|
|
function initPwrChart({humidityData, powerData, stateData}) {
|
|
|
|
//
|
|
// let humidityDataSet = {
|
|
// label: 'Luftfeuchtigkeit',
|
|
// yAxisID: 'humidity',
|
|
// data: humidityData.map(v => ({x: toMoment(v.Time), y: v.Humidity})),
|
|
// backgroundColor: 'rgba(8,62,236,0.2)',
|
|
// borderColor: 'rgb(101,119,234)',
|
|
// borderWidth: 1
|
|
// }
|
|
|
|
|
|
let totalDataset = {
|
|
label: 'Total KWh',
|
|
yAxisID: 'total',
|
|
data: powerData.map(v => ({x: toMoment(v.Time), y: v.Total})),
|
|
backgroundColor: 'rgba(193,151,91,0.2)',
|
|
borderColor: 'rgb(207,179,106)',
|
|
borderWidth: 1
|
|
}
|
|
|
|
let yesterdayDataset = {
|
|
label: 'Gestern KWh',
|
|
yAxisID: 'yesterday',
|
|
data: powerData.map(v => ({x: toMoment(v.Time), y: v.Yesterday})),
|
|
backgroundColor: 'rgba(110,70,70,0.2)',
|
|
borderColor: 'rgb(207,106,114)',
|
|
borderWidth: 1
|
|
}
|
|
|
|
|
|
|
|
chart = new Chart(document.getElementById('pwrChart').getContext('2d'), {
|
|
type: 'line',
|
|
data: {
|
|
datasets: [totalDataset, yesterdayDataset]
|
|
},
|
|
options: {
|
|
scales:{
|
|
x:{
|
|
type: 'time',
|
|
ticks: {
|
|
autoSkip: true,
|
|
maxTicksLimit: 20
|
|
},
|
|
time: {
|
|
displayFormats: {minute: 'HH:mm'}
|
|
}
|
|
},
|
|
|
|
total: {
|
|
type: 'linear',
|
|
position: 'left',
|
|
ticks:
|
|
{
|
|
beginAtZero: true,
|
|
},
|
|
grid: { display: false }
|
|
},
|
|
yesterday: {
|
|
type: 'linear',
|
|
position: 'right',
|
|
ticks:
|
|
{
|
|
beginAtZero: true,
|
|
},
|
|
grid: { display: false }
|
|
},
|
|
}
|
|
}
|
|
});
|
|
return chart
|
|
}
|
|
|
|
async function loadChartData(tag, date) {
|
|
console.log(date)
|
|
let data = await fetchTagData(tag, date);
|
|
|
|
humChart = initHumChart(data);
|
|
pwrChart = initPwrChart(data);
|
|
}
|
|
|
|
|
|
async function populateOptions() {
|
|
|
|
let tagSelectElement = document.getElementById("tag-select")
|
|
tagSelectElement.active = false
|
|
let tags = await fetchTags();
|
|
tagSelectElement.innerHTML = '';
|
|
for (let tag of tags) {
|
|
let option = document.createElement("option");
|
|
option.value = tag;
|
|
option.text = tag;
|
|
tagSelectElement.appendChild(option);
|
|
}
|
|
tagSelectElement.active = true
|
|
let rangeSelectElement = document.getElementById("range-select")
|
|
document.getElementById("submit-select").addEventListener("click", function(event){
|
|
event.preventDefault();
|
|
console.log("submit clicked", rangeSelectElement.value, tagSelectElement.value);
|
|
let m = moment().subtract({hours: rangeSelectElement.value});
|
|
console.log(m);
|
|
var fromDate = m.toDate();
|
|
console.log(fromDate.toISOString());
|
|
if (humChart !== undefined) {
|
|
humChart.destroy();
|
|
}
|
|
if (pwrChart !== undefined) {
|
|
pwrChart.destroy();
|
|
}
|
|
|
|
loadChartData(tagSelectElement.value, fromDate.toISOString());
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
populateOptions();
|
|
|
|
let m = moment().subtract({hours: 3});
|
|
var fromDate = m.toDate();
|
|
|
|
loadChartData("Bad Unten", fromDate.toISOString()); |