MMM-MyCovid19/MMM-covid19.js

129 lines
3.8 KiB
JavaScript

/* Magic Mirror
* Module: MMM-covid19
*
* Author: Sebastian Mark
* CC-BY-SA (https://creativecommons.org/licenses/by-sa/4.0/deed.de)
* for civil use only
*/
Module.register("MMM-covid19", {
defaults: {
region: "Bonn",
updateInterval: 3 * 60 * 60 * 1000, // 4h
fadeSpeed: 0,
showHeader: true,
appendLocationNameToHeader: true,
data_url: "https://rp-online.de/app/interaktiv_server/data/rki_nrw_mapped.json.php",
},
cases: {
new7: "N/A",
active: "N/A",
total: "N/A",
death: "N/A",
cured: "N/A",
trend: "N/A",
ts: "N/A",
},
start: function() {
// init module and set update intervall
var self = this;
Log.log(this.name + ' is started!');
setInterval(function() {
self.updateDom(this.config.fadeSpeed);
}, this.config.updateInterval);
},
getStyles: function () {
// load custom css for module
return ["MMM-covid19.css"];
},
getHeader: function() {
// set module header
if (this.config.showHeader) {
this.data.header = "COVID-19 Daten";
if (this.config.appendLocationNameToHeader) {
this.data.header += " für " + this.config.region;
}
}
return this.data.header;
},
getDom: function() {
// get/update covid data
this.update_data();
// create layout and output
var wrapper = document.createElement("div");
var new7_wrapper = document.createElement("span");
var active_wrapper = document.createElement("span");
var total_wrapper = document.createElement("span");
var death_wrapper = document.createElement("span");
var cured_wrapper = document.createElement("span");
var ts_wrapper = document.createElement("div");
wrapper.className = "covid19";
new7_wrapper.className = "new7";
new7_wrapper.innerHTML = "Neu: " + this.cases.new7 + " " + this.cases.trend + "<br>";
wrapper.appendChild(new7_wrapper);
active_wrapper.className = "active";
active_wrapper.innerHTML = "Aktiv: " + this.cases.active + "<br>";
wrapper.appendChild(active_wrapper);
total_wrapper.className = "total";
total_wrapper.innerHTML = "Gesamt: " + this.cases.total + "<br>";
wrapper.appendChild(total_wrapper);
death_wrapper.className = "death";
death_wrapper.innerHTML = "Tote: " + this.cases.death + "<br>";
wrapper.appendChild(death_wrapper);
cured_wrapper.className = "cured";
cured_wrapper.innerHTML = "Genesen: " + this.cases.cured + "<br>";
wrapper.appendChild(cured_wrapper);
ts_wrapper.className = "ts";
ts_wrapper.innerHTML = "7-Tage Trend, Stand: " + this.cases.ts;
wrapper.appendChild(ts_wrapper);
return wrapper;
},
update_data: function() {
// get and parse json data from source
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", this.config.data_url, false ); // false for synchronous request
xmlHttp.send( null );
data = JSON.parse(xmlHttp.responseText);
// extract data
this.cases.new7 = data[this.config.region]["last_7"];
this.cases.active = data[this.config.region]["active"];
this.cases.total = data[this.config.region]["cases"];
this.cases.death = data[this.config.region]["tot"];
this.cases.cured = data[this.config.region]["gesund"];
this.cases.ts = data[this.config.region]["date"];
// determine trend:
// calc this and last weeks cases and substract
// result is the difference of new cases between this and last week
// +10: red (arrow up)
// +0: orange (arrow up)
// 0: normal (arrow right)
// -0: green (arrow down)
currentToLastWeekDiff = (data[this.config.region]["last_7"] * 2) - data[this.config.region]["last_14"]
if (currentToLastWeekDiff < 0) {
this.cases.trend = "<span class=good>&searr;</span>";
} else if (currentToLastWeekDiff == 0) {
this.cases.trend = "&#rarr;";
} else if (currentToLastWeekDiff > 10) {
this.cases.trend = "<span class=bad>&nearr;</span>";
} else if (currentToLastWeekDiff > 0) {
this.cases.trend = "<span class=warn>&nearr;</span>";
}
},
});