Skip to content

Instantly share code, notes, and snippets.

@dwd0tcom
Last active June 27, 2023 12:53
Show Gist options
  • Star 41 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save dwd0tcom/00a7aa6d41f6f945d16171249a50a29d to your computer and use it in GitHub Desktop.
Save dwd0tcom/00a7aa6d41f6f945d16171249a50a29d to your computer and use it in GitHub Desktop.
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;
}
}
@dwd0tcom
Copy link
Author

dwd0tcom commented Dec 30, 2020

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

@NetRat88
Copy link

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

zieht keine neuen daten mehr fuer die incidence

@erzengelsamael
Copy link

Daten nicht verfügbar

98D509A2-8402-4D40-A3D8-E398344F8066

@TrafalgaT
Copy link

klappt wieder !

@schmiddi99
Copy link

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

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

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

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 via email

@TrafalgaT
Copy link

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

Geht wieder

@ungarbaron
Copy link

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

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

@dwd0tcom
Copy link
Author

Wurde gefixt!

@dwd0tcom
Copy link
Author

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

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

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

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

@dwd0tcom
Copy link
Author

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

@slovenija2505
Copy link

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

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