Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
A scriptable widget to display and show the current incidence and vaccine status.
// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: deep-gray; icon-glyph: magic;
// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
// Vaccine API by @_ThisIsBenny_
// Define URLs based on the corona.rki.de webpage
const newCasesApiUrl = `https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_COVID19/FeatureServer/0/query?f=json&where=NeuerFall%20IN(1%2C%20-1)&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22AnzahlFall%22%2C%22outStatisticFieldName%22%3A%22value%22%7D%5D&resultType=standard&cacheHint=true`;
const incidenceUrl = (location) =>
`https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,cases7_per_100k&geometry=${location.longitude.toFixed(
3
)}%2C${location.latitude.toFixed(
3
)}&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnGeometry=false&outSR=4326&f=json`;
const incidenceUrlStates =
"https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/Coronaf%E4lle_in_den_Bundesl%E4ndern/FeatureServer/0/query?where=1%3D1&outFields=cases7_bl_per_100k&returnGeometry=false&outSR=4326&f=json";
const vaccineStatus = "https://rki-vaccination-data.vercel.app/api";
// Initialize Widget
let widget = await createWidget();
if (!config.runsInWidget) {
await widget.presentSmall();
}
Script.setWidget(widget);
Script.complete();
// Build Widget
async function createWidget(items) {
const list = new ListWidget();
let header, label;
// fetch new cases
const newCasesData = await getNewCasesData();
header = list.addText("🦠 Neuinfektionen".toUpperCase());
header.font = Font.mediumSystemFont(10);
label = list.addText("+" + newCasesData.value.toLocaleString());
label.font = Font.mediumSystemFont(24);
const country = list.addText(newCasesData.areaName);
country.font = Font.mediumSystemFont(12);
country.textColor = Color.gray();
list.addSpacer();
// fetch new incidents
const incidenceData = await getIncidenceData();
header = list.addText("🦠 Inzidenz".toUpperCase());
header.font = Font.mediumSystemFont(10);
if (incidenceData) {
label = list.addText(incidenceData.value + "");
label.font = Font.mediumSystemFont(24);
if (incidenceData.value >= 50) {
label.textColor = Color.red();
} else if (incidenceData.value >= 25) {
label.textColor = Color.orange();
}
const city = list.addText(incidenceData.areaName);
city.font = Font.mediumSystemFont(12);
city.textColor = Color.gray();
if (incidenceData.shouldCache) {
list.refreshAfterDate = new Date(Date.now() + 60 * 60 * 1000);
}
} else {
list.addText("Daten nicht verfügbar");
}
list.addSpacer();
// fetch new vaccines
const number = await getVaccineData();
console.log(number);
let amount = number.value.toLocaleString();
console.log(amount);
header = list.addText("💉 " + amount + " geimpfte");
header.font = Font.mediumSystemFont(10);
header.textColor = Color.gray()
return list;
}
// Get vaccine Status
async function getVaccineData() {
let data = await new Request(vaccineStatus).loadJSON();
const attr = data.vaccinated;
return {
value: attr,
};
}
async function getNewCasesData() {
let data = await new Request(newCasesApiUrl).loadJSON();
const attr = data.features[0].attributes;
return {
value: attr.value,
areaName: "Deutschland",
shouldCache: false,
};
}
async function getIncidenceData() {
try {
const location = await getLocation();
if (location) {
let data = await new Request(incidenceUrl(location)).loadJSON();
const attr = data.features[0].attributes;
return {
value: attr.cases7_per_100k.toFixed(1),
areaName: attr.GEN,
shouldCache: true,
};
} else {
let data = await new Request(incidenceUrlStates).loadJSON();
const incidencePerState = data.features.map(
(f) => f.attributes.cases7_bl_per_100k
);
const averageIncidence =
incidencePerState.reduce((a, b) => a + b) / incidencePerState.length;
return {
value: averageIncidence.toFixed(1),
areaName: "Deutschland",
shouldCache: false,
};
}
} catch (e) {
return null;
}
}
async function getLocation() {
try {
if (args.widgetParameter) {
const fixedCoordinates = args.widgetParameter.split(",").map(parseFloat);
return { latitude: fixedCoordinates[0], longitude: fixedCoordinates[1] };
} else {
Location.setAccuracyToThreeKilometers();
return await Location.current();
}
} catch (e) {
return null;
}
}
@NetRat88

This comment has been minimized.

Copy link

@NetRat88 NetRat88 commented Dec 30, 2020

Ich erhalte folgenden Fehler siehe Anhang

172D9C3A-8E54-437E-A4B0-DFA975BAD846

@MANFahrer-GF

This comment has been minimized.

Copy link

@MANFahrer-GF MANFahrer-GF commented Dec 30, 2020

Gleicher Fehler

@dwd0tcom

This comment has been minimized.

Copy link
Owner Author

@dwd0tcom dwd0tcom commented Dec 30, 2020

@NetRat88 Danke! Das ursprüngliche Script zieht die Daten von der RKI Seite über das HTML und das RKI hat heute die Seite geändert. Ich muss es auf die API umschreiben. Ich schau, dass ich es heute noch schaff!

@dwd0tcom

This comment has been minimized.

Copy link
Owner Author

@dwd0tcom dwd0tcom commented Dec 30, 2020

@NetRat88 & @MANFahrer-GF: Ist gefixt :)

@NetRat88

This comment has been minimized.

Copy link

@NetRat88 NetRat88 commented Dec 30, 2020

Perfekt und danke für die rasche Behebung und das tolle Skript!

Einen guten Rutsch ins neue Jahr und gesund bleiben! ;)

@joef75

This comment has been minimized.

Copy link

@joef75 joef75 commented Jan 8, 2021

Kann man eine feste Location definieren?

@TrafalgaT

This comment has been minimized.

Copy link

@TrafalgaT TrafalgaT commented Jan 14, 2021

zieht keine neuen daten mehr fuer die incidence

@erzengelsamael

This comment has been minimized.

Copy link

@erzengelsamael erzengelsamael commented Jan 14, 2021

Daten nicht verfügbar

98D509A2-8402-4D40-A3D8-E398344F8066

@TrafalgaT

This comment has been minimized.

Copy link

@TrafalgaT TrafalgaT commented Jan 14, 2021

klappt wieder !

@schmiddi99

This comment has been minimized.

Copy link

@schmiddi99 schmiddi99 commented Jan 16, 2021

Hi,
weiß einer von euch, wie ich mit einem Skript einfach die Zahl der Neuinfizierten ausgeben lassen kann, damit ich die Zahl über einen Kurzbefehl von Siri vorlesen lassen kann?
Danke euch!

@marsc

This comment has been minimized.

Copy link

@marsc marsc commented Jan 16, 2021

Hi,
weiß einer von euch, wie ich mit einem Skript einfach die Zahl der Neuinfizierten ausgeben lassen kann, damit ich die Zahl über einen Kurzbefehl von Siri vorlesen lassen kann?
Danke euch!

Kopier doch den entsprechenden Teil bzw. lösch den Rest oder sind Scriptsprachen nicht so deins? :)

@schmiddi99

This comment has been minimized.

Copy link

@schmiddi99 schmiddi99 commented Jan 16, 2021

Hi,
weiß einer von euch, wie ich mit einem Skript einfach die Zahl der Neuinfizierten ausgeben lassen kann, damit ich die Zahl über einen Kurzbefehl von Siri vorlesen lassen kann?
Danke euch!

Kopier doch den entsprechenden Teil bzw. lösch den Rest oder sind Scriptsprachen

Welchen Teil muss ich denn Kopieren? Kenne mich mit dem Coden Null aus 🙈

@vollkorntomate

This comment has been minimized.

Copy link

@vollkorntomate vollkorntomate commented Mar 17, 2021

Ich hab für die Anzeige der Inzidenz den Dezimalpunkt durch ein Komma ersetzt. Nachdem die Anzahl der Neuinfektionen und Impfungen bereits im deutschen Format mit einem Punkt als Tausendertrennzeichen dargestellt werden, schien mir das am konsistentesten.

Wenn du möchtest, kannst du die Änderung übernehmen @dwd0tcom.
https://gist.github.com/vollkorntomate/eaf0a2e05fb8364e6f6de0a568c35699

Kleine Anmerkung noch: Das Feld incidenceData.value ist bereits ein String, muss also nicht noch extra mit + "" zu einem gemacht werden.

@SmartGR59

This comment has been minimized.

Copy link

@SmartGR59 SmartGR59 commented Mar 30, 2021

Kann dieses Script auch auf Andriod Handys laufen?

Wenn ja, was muss man tun?

Wenn nein, was muss man tun?😉😀

@dwd0tcom

This comment has been minimized.

Copy link
Owner Author

@dwd0tcom dwd0tcom commented Mar 31, 2021

Kann dieses Script auch auf Andriod Handys laufen?

Wenn ja, was muss man tun?

Wenn nein, was muss man tun?😉😀

Nein, das Script ist für die iOS App Scriptable gemacht.

@SmartGR59

This comment has been minimized.

Copy link

@SmartGR59 SmartGR59 commented Mar 31, 2021

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment