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: syringe;
// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
// Vaccine API by @_ThisIsBenny_
// Version 1.3
// For updates check:
// https://gist.github.com/dwd0tcom/00a7aa6d41f6f945d16171249a50a29d/
// Define URLs based on the corona.rki.de webpage
const newCasesApiUrl = `https://services7.arcgis.com/mOBPykOjAyBO2ZKk/ArcGIS/rest/services/Covid19_hubv/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);
header.minimumScaleFactor = 0.9;
label = list.addText("+" + newCasesData.value.toLocaleString());
label.font = Font.mediumSystemFont(24);
label.minimumScaleFactor = 0.9;
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 >= 1000) {
label.textColor = new Color('#6E1472');
} else if (incidenceData.value >= 500) {
label.textColor = new Color('#C82B81');
} else if (incidenceData.value >= 250) {
label.textColor = new Color('#8c0801');
} else if (incidenceData.value >= 100) {
label.textColor = new Color('#cc0a00');
} else if (incidenceData.value >= 50) {
label.textColor = new Color('#ff3d33');
} else if (incidenceData.value >= 25) {
label.textColor = new Color('#f9af4d');
} else if (incidenceData.value >= 5) {
label.textColor = new Color('#fcf39f')
} else if (incidenceData.value >= 0) {
label.textColor = new Color('#000000');
}
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();
let amount = number.value.toLocaleString();
header = list.addText("💉 " + amount + " geimpfte");
header.font = Font.mediumSystemFont(8);
header.textColor = Color.gray()
return list;
}
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;
}
}
// 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;
}
}
@MANFahrer-GF
Copy link

MANFahrer-GF commented Dec 30, 2020

Gleicher Fehler

@dwd0tcom
Copy link
Author

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
Copy link
Author

dwd0tcom commented Dec 30, 2020

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

@NetRat88
Copy link

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
Copy link

joef75 commented Jan 8, 2021

Kann man eine feste Location definieren?

@TrafalgaT
Copy link

TrafalgaT commented Jan 14, 2021

zieht keine neuen daten mehr fuer die incidence

@erzengelsamael
Copy link

erzengelsamael commented Jan 14, 2021

Daten nicht verfügbar

98D509A2-8402-4D40-A3D8-E398344F8066

@TrafalgaT
Copy link

TrafalgaT commented Jan 14, 2021

klappt wieder !

@schmiddi99
Copy link

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
Copy link

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
Copy link

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
Copy link

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
Copy link

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
Copy link
Author

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
Copy link

SmartGR59 commented Mar 31, 2021

@TrafalgaT
Copy link

TrafalgaT commented Sep 9, 2021

Gibt wieder ein Problem

`

2021-09-09 08:21:54: Error on line 36:48: TypeError: null is not an object (evaluating 'newCasesData.value.toLocaleString')

`

@TrafalgaT
Copy link

TrafalgaT commented Sep 14, 2021

Geht wieder

@ungarbaron
Copy link

ungarbaron commented Jan 19, 2022

Error on line 81:29: TypeError: undefined is not an object (evaluating 'number.value.toLocaleString')
kann das mit der Einführung von novovax zu tun haben? Tabellen Erweiterung beim rki

@dwd0tcom
Copy link
Author

dwd0tcom commented Jan 19, 2022

I guess! Ich warte mal ab und update dann hier, sobald die API wieder steht.

@dwd0tcom
Copy link
Author

dwd0tcom commented Jan 20, 2022

Wurde gefixt!

@dwd0tcom
Copy link
Author

dwd0tcom commented Jan 20, 2022

Version 1.2
Gab ein kleines Update:

  • Kommastelle für Neuinfektionen
  • Die Farben für die Inzidenz wurden an das RKI angeglichen

@ungarbaron
Copy link

ungarbaron commented Jan 21, 2022

Jepp. Astrein

@dwd0tcom
Copy link
Author

dwd0tcom commented Feb 2, 2022

RKI API scheint offline zu sein, ich schreibe hier Updates!

@TrafalgaT
Copy link

TrafalgaT commented Feb 16, 2022

Script klappt wieder nicht bzw die rki api scheint wieder einen Fehler zu haben :(

@dwd0tcom
Copy link
Author

dwd0tcom commented Feb 19, 2022

Ja, das RKI hat einen neuen Datensatz veröffentlicht und den alten einfach komplett gelöscht 🙄😅. Hab’s gefixt. Sollte wieder gehen! @TrafalgaT

@ungarbaron
Copy link

ungarbaron commented Feb 20, 2022

👍🏻 Astrein
Hast textColot gepimpt? Oder ist mir das vorher nicht aufgefallen?

@dwd0tcom
Copy link
Author

dwd0tcom commented Feb 21, 2022

Ja, hab die Farben an die vom RKI angepasst aber davor schon 😃

@slovenija2505
Copy link

slovenija2505 commented May 8, 2022

Hallo zusammen,
hat vielleicht noch jemand diesen Fehler?
Was muss den geändert werden, damit es wieder geht?
C3B1B746-BE8A-4CC0-A4F7-3229667DC79F

@dwd0tcom
Copy link
Author

dwd0tcom commented May 8, 2022

Hallo, das Problem ist, dass das RKI den kompletten Datensatz geändert hat und die API von @ThisIsBenny eingestellt wurde. Ein Quickfix wäre, die Zeile 97 - 103 auszukommentieren. Ich weiß nicht wie sinnvoll es ist, die Impfdaten noch reinzuladen, die stehen seit Monaten fast gleich. Was echt traurig ist 🥲

@slovenija2505
Copy link

slovenija2505 commented May 8, 2022

Super, vielen Dank für den Tip.
Jetzt habe ich wenigstens die Inzidenz wieder!
👍🏼

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