-
-
Save dwd0tcom/00a7aa6d41f6f945d16171249a50a29d to your computer and use it in GitHub Desktop.
// 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; | |
} | |
} |
@NetRat88 & @MANFahrer-GF: Ist gefixt :)
Perfekt und danke für die rasche Behebung und das tolle Skript!
Einen guten Rutsch ins neue Jahr und gesund bleiben! ;)
Kann man eine feste Location definieren?
zieht keine neuen daten mehr fuer die incidence
klappt wieder !
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!
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? :)
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 🙈
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.
Kann dieses Script auch auf Andriod Handys laufen?
Wenn ja, was muss man tun?
Wenn nein, was muss man tun?😉😀
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.
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')
`
Geht wieder
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
I guess! Ich warte mal ab und update dann hier, sobald die API wieder steht.
Wurde gefixt!
Version 1.2
Gab ein kleines Update:
- Kommastelle für Neuinfektionen
- Die Farben für die Inzidenz wurden an das RKI angeglichen
Jepp. Astrein
RKI API scheint offline zu sein, ich schreibe hier Updates!
Script klappt wieder nicht bzw die rki api scheint wieder einen Fehler zu haben :(
Ja, das RKI hat einen neuen Datensatz veröffentlicht und den alten einfach komplett gelöscht 🙄😅. Hab’s gefixt. Sollte wieder gehen! @TrafalgaT
👍🏻 Astrein
Hast textColot gepimpt? Oder ist mir das vorher nicht aufgefallen?
Ja, hab die Farben an die vom RKI angepasst aber davor schon 😃
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 🥲
Super, vielen Dank für den Tip.
Jetzt habe ich wenigstens die Inzidenz wieder!
👍🏼
@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!