// Utility routine for plotting the data import {DateTime} from './luxon.min.js' export const colors = {'eq': '#0000FF', 'max': '#FF0000', 'min': '#008000', 'peaks': '#DAA520'}; // Defaults für die Mittelwertbildungen let txtMeldung = false; // falls keine Daten da sind, Text melden const avgTime = 30; // defaul average time für particulate matter let doUpdate = true; // update every 5 min let optSidsArray = []; // Arrray der letzten 5 Einträge let nbrofdaysforavg = 8; // Stundenmittel Anzahl Tagte (default = 5) let nbrofdaysfordaynight = 30; // use 30 days or day/night graphic let stucols = 1; // Anzeige nur Balken (StundenMittel) export const noise_ymin = 30; // lowest value on y-axis for noise export const noise_ymax = 120; // highest value on y-axis for noise let activeTab = 'maptab'; // active TAB ID export let peaklim = 70; // threshold for peak count export const url = '/api' export function createGlobObtions() { // Options, die für alle Plots identisch sind let globObject = { chart: { accessibility: { enabled: false }, height: 600, // width: 1000, spacingRight: 20, spacingLeft: 20, spacingTop: 25, backgroundColor: { linearGradient: [0, 400, 0, 0], stops: [ [0, '#eee'],//[0, '#ACD0AA'], //[0, '#A18D99'], // [0, '#886A8B'], // [0, '#F2D0B5'], [1, '#fff'] ] }, type: 'line', borderWidth: '2', events: { selection: function (event) { if (event.xAxis) { doUpdate = false; } else { doUpdate = true; } } } }, title: { // text: 'Feinstaub über 1 Tag', align: 'left', style: {'fontSize': '25px'}, useHTML: true, }, subtitle: { // text: 'Gemessene Werte und ' + avgTime + 'min-gleitende Mittelwerte', align: 'left', }, tooltip: { valueDecimals: 1, backgroundColor: 0, borderWidth: 0, borderRadius: 0, useHTML: true, }, xAxis: { type: 'datetime', title: { text: 'date/time', }, gridLineWidth: 2, labels: { formatter: function () { let v = this.axis.defaultLabelFormatter.call(this); if (v.indexOf(':') == -1) { return '' + v + ''; } else { return v; } } }, }, legend: { enabled: true, layout: 'horizontal', // verticalAlign: 'top', borderWidth: 1, align: 'center', }, plotOptions: { series: { animation: false, turboThreshold: 0, marker: { enabled: false, }, }, } }; return globObject; } export function calcWeekends(data, isyear) { let weekend = []; let oldDay = 8; for (let i = 0; i < data.length; i++) { let mom = moment(data[i].date); if (isyear) { mom = moment(data[i]._id) } let day = mom.day(); let st = mom.startOf('day'); if (day != oldDay) { if (day == 6) { weekend.push({ color: 'rgba(169,235,158,0.4)', from: st.valueOf(), to: st.add(1, 'days').valueOf(), zIndex: 0 }) } else if (day == 0) { weekend.push({ color: 'rgba(169,235,158,0.4)', from: st.valueOf(), to: st.add(1, 'days').valueOf(), zIndex: 0 }) } oldDay = day; } } return weekend; } export function calcDays(data, isyear) { let days = []; if (data.length == 0) { return days } let oldday = moment(data[0].date).day(); if (isyear) { oldday = moment(data[0]._id).day(); } for (let i = 0; i < data.length; i++) { let m = moment(data[i].date); if (isyear) { m = moment(data[i]._id); } let tag = m.day() if (tag != oldday) { m.startOf('day'); days.push({color: 'lightgray', value: m.valueOf(), width: 1, zIndex: 2}); oldday = tag; } } return days; }; export async function addSensorID2chart(chart, sensor, width) { let indoor = sensor.indoor || false let addr = await addAddress(sensor.sid) let sens = chart.renderer.label( `Sensor: ${sensor.sid} ${indoor ? ' (indoor)' : ''}    ${addr}`, width / 2 - 100, 65, 'text', 0, 0, true) .css({ fontSize: '12pt', 'font-weight': 'bold', }) .attr({ zIndex: 2, }).add(); } export const showError = (err) => { document.querySelector('#dialogError .modal-dialog .modal-content .modal-body').setHTML(err) let myModal = new bootstrap.Modal(document.getElementById('dialogError')) myModal.show() } export const showReset = () => { let myModal = new bootstrap.Modal(document.getElementById('dialogReset')) myModal.show() } // remove the taps (if shownig the map) export const removeTabs = () => { document.querySelector('#navi').style.display = 'none' } // show thw tabs again export const showTabs = () => { document.querySelector('#navi').style.display = 'block' } export const setCurrentTab = (tab) => { activeTab = tab } export const getCurrentTab = () => { return activeTab } export const fetchfromserver = async (url) => { const ret = await fetch(url) .catch(e => { showError(e) }); // return await ret.json() let x = await ret.json() return x } export const addAddress = async (sid) => { let url = `/api/getaddress?sensorid=${sid}` let erg = await fetchfromserver(url) if (!erg.err) { return erg.address } else { return "no address" } }