Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
COVID-19 Inzidenz-Widget für iOS innerhalb Deutschlands 🇩🇪
// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
// Thanks to @rphl (https://github.com/rphl) and @tzschies (https://github.com/tzschies) for their inspiring work on this widget. See https://gist.github.com/rphl/0491c5f9cb345bf831248732374c4ef5 and https://gist.github.com/tzschies/563fab70b37609bc8f2f630d566bcbc9.
class IncidenceWidget {
constructor() {
this.previousDaysToShow = 31;
this.apiUrlDistricts = (location) => `https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=RS,GEN,cases7_bl_per_100k,cases7_per_100k,BL&geometry=${location.longitude.toFixed(3)}%2C${location.latitude.toFixed(3)}&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnGeometry=false&outSR=4326&f=json`
this.apiUrlDistrictsHistory = (districtId) => `https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_COVID19/FeatureServer/0/query?where=IdLandkreis%20%3D%20%27${districtId}%27%20AND%20Meldedatum%20%3E%3D%20TIMESTAMP%20%27${this.getDateString(-this.previousDaysToShow)}%2000%3A00%3A00%27%20AND%20Meldedatum%20%3C%3D%20TIMESTAMP%20%27${this.getDateString(1)}%2000%3A00%3A00%27&outFields=Landkreis,Meldedatum,AnzahlFall&outSR=4326&f=json`
this.stateToAbbr = {
'Baden-Württemberg': 'BW',
'Bayern': 'BY',
'Berlin': 'BE',
'Brandenburg': 'BB',
'Bremen': 'HB',
'Hamburg': 'HH',
'Hessen': 'HE',
'Mecklenburg-Vorpommern': 'MV',
'Niedersachsen': 'NI',
'Nordrhein-Westfalen': 'NRW',
'Rheinland-Pfalz': 'RP',
'Saarland': 'SL',
'Sachsen': 'SN',
'Sachsen-Anhalt': 'ST',
'Schleswig-Holstein': 'SH',
'Thüringen': 'TH'
};
}
async run() {
let widget = await this.createWidget()
if (!config.runsInWidget) {
await widget.presentSmall()
}
Script.setWidget(widget)
Script.complete()
}
async createWidget(items) {
let data = await this.getData()
// Basic widget setup
let list = new ListWidget()
list.setPadding(0, 0, 0, 0)
let textStack = list.addStack()
textStack.setPadding(14, 14, 0, 14)
textStack.layoutVertically()
textStack.topAlignContent()
// Header
let header = textStack.addText("🦠 Inzidenz".toUpperCase())
header.font = Font.mediumSystemFont(13)
textStack.addSpacer()
if(data.error) {
// Error handling
let loadingIndicator = textStack.addText(data.error.toUpperCase())
textStack.setPadding(14, 14, 14, 14)
loadingIndicator.font = Font.mediumSystemFont(13)
loadingIndicator.textOpacity = 0.5
let spacer = textStack.addStack()
spacer.addSpacer();
} else {
// Enable caching
list.refreshAfterDate = new Date(Date.now() + 60*60*1000)
// Main stack for value and area name
let incidenceStack = textStack.addStack()
let valueStack = incidenceStack.addStack()
incidenceStack.layoutVertically()
let incidenceValueLabel = valueStack.addText(data.incidence + data.trend)
incidenceValueLabel.font = Font.boldSystemFont(24)
incidenceValueLabel.textColor = data.incidence >= 100 ? new Color("9e000a") : data.incidence >= 50 ? Color.red() : data.incidence >= 35 ? Color.yellow() : Color.green();
incidenceStack.addText(data.areaName)
// Chip for displaying state data
valueStack.addSpacer(4)
let stateStack = valueStack.addStack()
let stateText = stateStack.addText(data.incidenceBySide + "\n" + data.areaNameBySide)
stateStack.backgroundColor = new Color('888888', .5)
stateStack.cornerRadius = 4
stateStack.setPadding(2, 4, 2, 4)
stateText.font = Font.mediumSystemFont(9)
stateText.textColor = Color.white()
valueStack.addSpacer()
// Chart
let chart = new LineChart(400, 120, data.timeline).configure((ctx, path) => {
ctx.opaque = false;
ctx.setFillColor(new Color("888888", .25));
ctx.addPath(path);
ctx.fillPath(path);
}).getImage();
let chartStack = list.addStack()
chartStack.setPadding(0, 0, 0, 0)
let img = chartStack.addImage(chart)
img.applyFittingContentMode()
}
return list
}
async getData() {
try {
let location = await this.getLocation()
if(location) {
let currentData = await new Request(this.apiUrlDistricts(location)).loadJSON()
let attr = currentData.features[0].attributes
let historicalData = await new Request(this.apiUrlDistrictsHistory(attr.RS)).loadJSON()
let aggregate = historicalData.features.map(f => f.attributes).reduce((dict, feature) => {
dict[feature["Meldedatum"]] = (dict[feature["Meldedatum"]]|0) + feature["AnzahlFall"];
return dict;
}, {});
let timeline = Object.keys(aggregate).sort().map(k => aggregate[k]);
let casesYesterday7 = timeline.slice(-8, -1).reduce(this.sum);
let casesToday7 = timeline.slice(-7).reduce(this.sum);
let trend = (casesToday7 == casesYesterday7) ? '→' : (casesToday7 > casesYesterday7) ? '↑' : '↓';
return {
incidence: attr.cases7_per_100k.toFixed(0),
areaName: attr.GEN,
trend: trend,
incidenceBySide:
attr.cases7_bl_per_100k.toFixed(0),
areaNameBySide:
this.stateToAbbr[attr.BL],
timeline: timeline
};
}
return { error: "Standort nicht verfügbar." }
} catch(e) {
return { error: "Fehler bei Datenabruf." };
}
}
getDateString(addDays) {
addDays = addDays || 0;
return new Date(Date.now() + addDays * 24 * 60 * 60 * 1000).toISOString().substring(0, 10)
}
async getLocation() {
try {
if(args.widgetParameter) {
let fixedCoordinates = args.widgetParameter.split(",").map(parseFloat)
return { latitude: fixedCoordinates[0], longitude: fixedCoordinates[1] }
} else {
Location.setAccuracyToThreeKilometers()
return await Location.current()
}
} catch(e) {
return null;
}
}
sum(a, b) {
return a + b;
}
}
class LineChart {
constructor(width, height, values) {
this.ctx = new DrawContext()
this.ctx.size = new Size(width, height)
this.values = values;
}
_calculatePath() {
let maxValue = Math.max(...this.values);
let minValue = Math.min(...this.values);
let difference = maxValue - minValue;
let count = this.values.length;
let step = this.ctx.size.width / (count - 1);
let points = this.values.map((current, index, all) => {
let x = step*index
let y = this.ctx.size.height - (current - minValue) / difference * this.ctx.size.height;
return new Point(x, y)
});
return this._getSmoothPath(points);
}
_getSmoothPath(points) {
let path = new Path()
path.move(new Point(0, this.ctx.size.height));
path.addLine(points[0]);
for(var i = 0; i < points.length-1; i ++) {
let xAvg = (points[i].x + points[i+1].x) / 2;
let yAvg = (points[i].y + points[i+1].y) / 2;
let avg = new Point(xAvg, yAvg);
let cp1 = new Point((xAvg + points[i].x) / 2, points[i].y);
let next = new Point(points[i+1].x, points[i+1].y);
let cp2 = new Point((xAvg + points[i+1].x) / 2, points[i+1].y);
path.addQuadCurve(avg, cp1);
path.addQuadCurve(next, cp2);
}
path.addLine(new Point(this.ctx.size.width, this.ctx.size.height))
path.closeSubpath()
return path;
}
configure(fn) {
let path = this._calculatePath()
if(fn) {
fn(this.ctx, path);
} else {
this.ctx.addPath(path);
this.ctx.fillPath(path);
}
return this.ctx;
}
}
await new IncidenceWidget().run();
@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 17, 2020

Das Widget ermittelt den aktuellen Standort und nutzt die offizielle API des RKI um den Inzidenzwert für den aktuellen Landkreis zu ermitteln. Alternativ kann auch der Wert für einen festgelegten Landkreis angezeigt werden. Der Wert beschreibt die Neuinfektionen pro 100.000 Einwohner in den letzten sieben Tagen und wird zur Steuerung und Planung von Eindämmungsmaßnahmen durch die Politik genutzt. Das Script benötigt die kostenlose App Scriptable und kann damit auf dem Homescreen platziert werden.

9AE8CE52-0E77-480B-A014-51128C7A4355
DCDC10BE-AF49-4ACE-8751-FEB181A71154

Updates

28.10.2020

  • Neue Farbe: Dunkelrot für mehr als 100 Neuinfizierte auf 100.000 Einwohner in den letzten sieben Tagen
  • Trendpfeil zeigt die Entwicklung zum Vortag
  • Inzidenz des Bundeslandes wird angezeigt
  • Linien-Diagramm der Erkrankungen der letzten 31 Tage hinzugefügt

21.10.2020

  • Wenn kein Standort abgerufen werden kann, wird der Wert für Deutschland angezeigt
  • Vollständige Dark-/Lightmode Unterstützung
  • Der angezeigte Wert wird für eine Stunde gespeichert

Installation

Das Widget erfreut sich großer Beliebtheit und es wurden mehrere Anleitungen zur Installation verfasst:

Forks

Forks sind Anpassungen an dem Widget, die durch andere User vorgenommen worden sind und andere Informationen enthalten oder anders dargestellt werden.

Eine Alternative für Android wurde von @Botiplz entwickelt.

Die beiden aktivsten Forks stammen von @rphl und @tzschies.

8CCBB167-5421-4046-8B4E-3AB1878E344C
Fork von rphl mit lokaler Datenspeicherung und daraus abgeleiteten Trends sowie Offline-Modus.

39B1D8E0-0F33-4F9C-B1AB-AE5C9EE5EDE6
Fork von tzschies mit geschicktem Abruf der historischen Werte über mehrere Schnittstellen des RKI und Werten für Landkreis, Bundesland und ganz Deutschland.

Mehr Forks

68F7B9FC-EFE2-428F-BB30-27648753CA46
Fork von pichfl

922AB81B-0C8E-4C82-9E46-3C07B4EAB22F
Fork von marcelrebmann

7CFE3409-3725-4FD9-AE55-617EC5E164AE
Fork von MK-2001

00FEA2F9-4BE3-4134-95F6-A30DC8487017
Fork von m-arx

FBB1FF74-0034-4603-9811-6748462D9B10
Fork von schaechinger

C4C5AC12-7810-4AF1-8BA2-22132D1E42FD
Fork von allesmatze

A3E94ADC-1386-4841-91DD-EA71AE393583
Fork von andydingfelder

4E31229D-2C8E-49D5-A338-367D3FD398D8
Fork von achisto

897E6413-7272-4E73-BDD5-4258E506B7D2
Fork von Baumchen

31881DBC-C1FF-49BD-9BE7-4F00DCFEBF6C
Fork von oliverandrich

C6C17631-FBFD-44AD-8E0E-7189A0C4EBCE
Fork von malakka

Datenquelle

Das Widget nutzt die NPGEO Corona Schnittstelle des RKI.
Die Daten sind die „Fallzahlen in Deutschland“ des Robert Koch-Institut (RKI) und stehen unter der Open Data Datenlizenz Deutschland – Namensnennung – Version 2.0 zur Verfügung. Quellenvermerk: Robert Koch-Institut (RKI), dl-de/by-2-0

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 18, 2020

Neue Variante für Light-Mode hinzugefügt. Genauigkeit der Geo-Location weiter verringert um seltene Fehlermeldungen im Widget-Modus zu vermeiden.

607AAC05-8D50-446B-9672-1FD7DC00C9F9

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 18, 2020

In den Widget-Einstellungen können jetzt GEO-Koordinaten hinterlegt werden, damit keine Standortdaten übertragen werden. Wenn man sich außerhalb Deutschlands bewegt wird eine entsprechende Meldung angezeigt.

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 19, 2020

Der Inzidenzwert wird nun eingefärbt. Grün bei unter 35, Orange zwischen 35 und 50, Rot bei über 50.

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 19, 2020

Es gibt mittlerweile auch eine Anleitung von @achisto.

@pichfl

This comment has been minimized.

Copy link

@pichfl pichfl commented Oct 19, 2020

@kevinkub Danke für die Idee und das Script! Ich habe in meinem Fork die Location noch etwas transparenter gemacht und eine etwas zuverlässigere Option für Hell/Dunkel für den Text ergänzt: https://gist.github.com/pichfl/fabd10f8ce9791d0613410ac460bc404

@funkenstrahlen

This comment has been minimized.

Copy link

@funkenstrahlen funkenstrahlen commented Oct 19, 2020

Super cool! Wäre vielleicht noch eine coole Sache auch anzuzeigen, von welchem Tag der aktuell angezeigte Wert ist. Sonst weiß man nicht genau, wann es zuletzt aktualisiert wurde.

@joergchm

This comment has been minimized.

Copy link

@joergchm joergchm commented Oct 19, 2020

Super cool! Wäre vielleicht noch eine coole Sache auch anzuzeigen, von welchem Tag der aktuell angezeigte Wert ist. Sonst weiß man nicht genau, wann es zuletzt aktualisiert wurde.

+1 Super Idee

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 19, 2020

@funkenstrahlen das hatte ich während der Entwicklung bei mir drin... Es sind aber immer die „aktuellen“ Daten, die nächtlich einmalig aktualisiert werden. Daher gibt es da wenig Bewegung.

@P8DFxKfyJB

This comment has been minimized.

Copy link

@P8DFxKfyJB P8DFxKfyJB commented Oct 19, 2020

Das Widget ist richtig cool. Wir haben nur ein Problem, das Widget wird immer im Hell-Mode mit schwarzer Schrift angezeigt. Ich habe den Automodus für Hell/Dunkel-Modus aktiviert.

Wenn ich dauerhaft den Dunkel-Modus verwende, zeigt es das Widget mit weißer Schrift an.
Das Problem dazu wird https://talk.automators.fm/t/bug-device-isusingdarkappearance-in-widget-always-returns-true/8721 da auch diskutiert. es liegt wohl an Device.isUsingDarkAppearance()

@bennokress

This comment has been minimized.

Copy link

@bennokress bennokress commented Oct 19, 2020

Sehr genial 👍 Ein Feature wäre noch klasse: in Bayern (und vielleicht auch in anderen Bundesländern) gelten gewisse Regeln anhand des höchsten 7-Tage-Inzidenz-Werts der vergangenen 7 Tagen, also z.B. wenn letzten Freitag der Wert auf 51 war und heute ist er auf 47, dann sind bis Freitag immer noch die Regeln für Stufe "rot" in Kraft. Lassen sich die vergangenen Werte irgendwo abrufen oder zwischenspeichern und nutzen, so dass die gültige Stufe bspw. als roter/gelber/grüner Punkt hinter dem Wert angezeigt werden könnte?

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 19, 2020

@P8DFxKfyJB Kann Ich dich vielleicht um einen Gefallen bitten? Könntest du dir den Fork dieses Gists von @pichfl ansehen und gucken, ob das besser funktioniert bzw. den Farb-Fehler löst?

@bennokress Über etwas in der Art (Entwicklung zum Vortag) habe ich schon nachgedacht. Allerdings ist es sowohl schwierig in Scriptable Daten zu speichern (nur in einer Datei in iCloud möglich) und die Schnittstelle gibt leider keine historischen Werte her, soweit ich gesehen habe. Ein eigenes Backend wollte ich bislang noch nicht betreiben.

@bennokress

This comment has been minimized.

Copy link

@bennokress bennokress commented Oct 19, 2020

@bennokress Über etwas in der Art (Entwicklung zum Vortag) habe ich schon nachgedacht. Allerdings ist es sowohl schwierig in Scriptable Daten zu speichern (nur in einer Datei in iCloud möglich) und die Schnittstelle gibt leider keine historischen Werte her, soweit ich gesehen habe. Ein eigenes Backend wollte ich bislang noch nicht betreiben.

Schade, aber macht Sinn. Danke trotzdem!

@P8DFxKfyJB

This comment has been minimized.

Copy link

@P8DFxKfyJB P8DFxKfyJB commented Oct 19, 2020

@kevinkub

@P8DFxKfyJB Kann Ich dich vielleicht um einen Gefallen bitten? Könntest du dir den Fork dieses Gists von @pichfl ansehen und gucken, ob das besser funktioniert bzw. den Farb-Fehler löst?

Na klar, schon erledigt. Minimale Verbesserung. Zwar immer noch ein schwarzer Hintergrund im Widget, aber mit weißer und genauer Schrift.
Links der Fork, rechts dein Code:

IMG_1126

@funkenstrahlen

This comment has been minimized.

Copy link

@funkenstrahlen funkenstrahlen commented Oct 19, 2020

Für mich funktioniert der Wechsel zwischen Tag Modus und Nachtmodus problemlos. Alle Farben werden wie erwartet angezeigt.

@achisto

This comment has been minimized.

Copy link

@achisto achisto commented Oct 19, 2020

@P8DFxKfyJB Kann Ich dich vielleicht um einen Gefallen bitten? Könntest du dir den Fork dieses Gists von @pichfl ansehen und gucken, ob das besser funktioniert bzw. den Farb-Fehler löst?

@bennokress Über etwas in der Art (Entwicklung zum Vortag) habe ich schon nachgedacht. Allerdings ist es sowohl schwierig in Scriptable Daten zu speichern (nur in einer Datei in iCloud möglich) und die Schnittstelle gibt leider keine historischen Werte her, soweit ich gesehen habe. Ein eigenes Backend wollte ich bislang noch nicht betreiben.

Zum Zwischenspeichern nutze ich für einen anderen Zweck die App Data Jar, das könnte hierfür auch eine Lösung sein!

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 19, 2020

Also irgendeinen Bug mit Dark/Light-Mode scheint es zu geben. Bei mir funktioniert es manchmal und manchmal nicht. Der Fork ist zwar insofern besser, als dass man immer alles lesen kann, aber manchmal bekomme ich den Dark-Mode, obwohl das iPhone im Light-Mode ist.

@P8DFxKfyJB

This comment has been minimized.

Copy link

@P8DFxKfyJB P8DFxKfyJB commented Oct 19, 2020

Auf dem iPhone meiner Frau habe ich eben mal dein Script installiert, da wird es aktuell im Light-Mode als helles Widget angezeigt. Es ist ja nicht so dramatisch, grundsätzlich habe ich ja erst einmal eine Lösung mit dem Fork.

@rphl

This comment has been minimized.

Copy link

@rphl rphl commented Oct 19, 2020

@kevinkub. Danke fürs super Script 👍 Mich hat das Bundesland noch interessiert, habe es mal im Fork hinzugefügt. Falls also Interesse besteht... https://gist.github.com/rphl/0491c5f9cb345bf831248732374c4ef5

@michel0271

This comment has been minimized.

Copy link

@michel0271 michel0271 commented Oct 19, 2020

Bei mir kommt nach einer Zeit immer der Fehler im Widget, dass meine Location nicht ermittelt werden konnte.

@P8DFxKfyJB

This comment has been minimized.

Copy link

@P8DFxKfyJB P8DFxKfyJB commented Oct 19, 2020

Das kann ich bestätigen. Wie genau muss denn der Code für eine festgelegte Location aussehen.
Ich habe hier 51,16 11,12 als Lat/Long

@achisto

This comment has been minimized.

Copy link

@achisto achisto commented Oct 19, 2020

Das kann ich bestätigen. Wie genau muss denn der Code für eine festgelegte Location aussehen.
Ich habe hier 51,16 11,12 als Lat/Long

Format: XX.XX, XX.XX

In deinem Fall also 51.16, 11.12

@achisto

This comment has been minimized.

Copy link

@achisto achisto commented Oct 19, 2020

Bei mir kommt nach einer Zeit immer der Fehler im Widget, dass meine Location nicht ermittelt werden konnte.

Das ist leider ein Problem mit einigen Widgets, die Standorte abfragen. Am besten in dem Fall die Location manuell über Geokoordinaten hinterlegen. Das geht über die Widget-Einstellungen, siehe der beigefügte Screenshot.

B56F5957-CFC7-4287-A273-A04A25E0B29B

@P8DFxKfyJB

This comment has been minimized.

Copy link

@P8DFxKfyJB P8DFxKfyJB commented Oct 19, 2020

Danke euch Beiden, das funktioniert 😀

@michel0271

This comment has been minimized.

Copy link

@michel0271 michel0271 commented Oct 19, 2020

Danke euch!

@fbnk

This comment has been minimized.

Copy link

@fbnk fbnk commented Oct 19, 2020

Nur schade, dass die Zahlen vom RKI immer recht schnell inaktuell sind und im Laufe des Tages auch nicht mehr aktualisiert werden.

Hamburg

  • RKI: 42,9
  • tatsächlich: 52,0

Das macht dann doch einen ganz schönen Unterschied.

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 19, 2020

Also für Bielefeld sind es die tagesaktuellen Werte. Zumindest nach meiner Recherche. Das RKI bietet hier einen super Service, der in ganz Deutschland funktioniert. Schade, dass es scheinbar in vielen Städten größere Verzögerungen gibt.

@Reborn2

This comment has been minimized.

Copy link

@Reborn2 Reborn2 commented Oct 19, 2020

Tolles Widget

Ja Tagesaktuell, jedoch leider wie im Beispiel von Hamburg nicht Live.

@mkurte

This comment has been minimized.

Copy link

@mkurte mkurte commented Oct 20, 2020

Gute Arbeit! Schön wäre vielleicht noch ein parametrisierbarer Standort, sodass man bspw. mehrere Widgets (Standort/Zuhause/Arbeit) darstellen könnte. Ist eine Parametrisierung in Scriptable möglich?

@pedersla

This comment has been minimized.

Copy link

@pedersla pedersla commented Oct 20, 2020

Gute Arbeit! Schön wäre vielleicht noch ein parametrisierbarer Standort, sodass man bspw. mehrere Widgets (Standort/Zuhause/Arbeit) darstellen könnte. Ist eine Parametrisierung in Scriptable möglich?

Das ist möglich. Du musst nur in den Widget Einstellungen unter „Parameter“ die Koordinaten eingeben, dann ist der Standort fix
13783B6B-651B-4B77-978B-A92564820FF2

@P8DFxKfyJB

This comment has been minimized.

Copy link

@P8DFxKfyJB P8DFxKfyJB commented Oct 20, 2020

Gute Arbeit! Schön wäre vielleicht noch ein parametrisierbarer Standort, sodass man bspw. mehrere Widgets (Standort/Zuhause/Arbeit) darstellen könnte. Ist eine Parametrisierung in Scriptable möglich?

Ja, das ist möglich. Siehe https://gist.github.com/kevinkub/46caebfebc7e26be63403a7f0587f664#gistcomment-3495084 weiter oben hier in den Kommentaren. Du musst dir nur die Latitude, Longitude der betreffenden Standorten besorgen.

@pedersla

This comment has been minimized.

Copy link

@pedersla pedersla commented Oct 20, 2020

Also irgendeinen Bug mit Dark/Light-Mode scheint es zu geben. Bei mir funktioniert es manchmal und manchmal nicht. Der Fork ist zwar insofern besser, als dass man immer alles lesen kann, aber manchmal bekomme ich den Dark-Mode, obwohl das iPhone im Light-Mode ist.

Hast du Koordinaten festgelegt in Parameter? Wenn ja, Probier es mal mit Leerzeichen vor und hinter dem Komma, das hat bei mir geholfen

@pedersla

This comment has been minimized.

Copy link

@pedersla pedersla commented Oct 20, 2020

@kevinkub

@P8DFxKfyJB Kann Ich dich vielleicht um einen Gefallen bitten? Könntest du dir den Fork dieses Gists von @pichfl ansehen und gucken, ob das besser funktioniert bzw. den Farb-Fehler löst?

Na klar, schon erledigt. Minimale Verbesserung. Zwar immer noch ein schwarzer Hintergrund im Widget, aber mit weißer und genauer Schrift.
Links der Fork, rechts dein Code:

IMG_1126

Hast du Koordinaten festgelegt in Parameter? Wenn ja, Probier es mal mit Leerzeichen vor und hinter dem Komma, das hat bei mir geholfen

@clipse2004

This comment has been minimized.

Copy link

@clipse2004 clipse2004 commented Oct 20, 2020

Hello zusammen,
geile Idee das Widget, hab ihr aber vielleicht schon eine Lösung für den Light/Dark Mode Wechsel gefunden? Wäre schon mega wenn das noch funktionieren würde.
Andere Frage, wenn ich das Script mit Geofencing nutze (iPhone), wie kann ich die Standortfreigabe auf Immer stellen? Im iPhone unter Datenschutz kann ich lediglich "Beim verwenden der APP und Widgets auswählen.
Ab und an muss ich aber erneut aufs Widget klicken damit das angezeigt wird. Wenn ich die Parameter händisch eintragen passiert das nicht.

@KWeb2k16

This comment has been minimized.

Copy link

@KWeb2k16 KWeb2k16 commented Oct 20, 2020

Hello zusammen,
geile Idee das Widget.
Gibt es vielleicht auch eine Idee für ein Widget, das in Österreich funktioniert?

@justin10567

This comment has been minimized.

Copy link

@justin10567 justin10567 commented Oct 20, 2020

Ich bin kein Programmierer und habe daher eine Frage. Ich habe das Script installiert über Scriptable. Sehe aber in dem Widget nicht direkt die Werte, sondern erst nachdem ich auf dem Widget klicke. Siehe unten. Kann mir jemand erklären, wie man es erreichen kann, dass die Werte direkt auf dem Bildschirm des iPhones zu sehen sind, ohne darauf zu klicken?
IMG_A3FAA8106114-1

@pichfl

This comment has been minimized.

Copy link

@pichfl pichfl commented Oct 20, 2020

@clipse2004 was genau geht nicht beim Light/Dark Mode Wechsel? Evtl. funktioniert mein Fork für dich.

Es ist auf jeden Fall besser mit festen Koordinaten zu arbeiten, Geolocation und Widgets sollten zwar funktionieren, aber so richtig klappt's noch nicht.

@justin10567

This comment has been minimized.

Copy link

@justin10567 justin10567 commented Oct 20, 2020

Ich habe das Widget so konfiguriert:
IMG_A4CBCE4E038C-1

@pichfl

This comment has been minimized.

Copy link

@pichfl pichfl commented Oct 20, 2020

@justin10567 Wie ich dir schon in meinem Fork geschrieben habe: Du musst das Widget konfigurieren. Long Press / Force touch auf das Widget bis das Kontext-Menü erscheint, dann „Scriptable“ bearbeiten auswählen und dort das richtige Script auswählen und im besten Fall die Location als Parameter übergeben.

Die Geo-Koordinaten erfährst du z.B. wenn du in Google Maps am Rechner an eine beliebige Stelle klickst. Am Handy gibt es sicher auch ne Option, aber da muss ich passen. Wichtig für die Koordinaten ist, dass da kein Leerzeichen dazwischen steht: 52.52,13.41

@TiiFuchs

This comment has been minimized.

Copy link

@TiiFuchs TiiFuchs commented Oct 20, 2020

Btw: Ich habe festgestellt, dass iOS oder Scriptable sich auch selbst um einen Light und Darkmode kümmert und ich anfangs immer den gesehen habe. (Hat dann richtiges Schwarz als Hintergrund und keinen dunkelgrauen Farbverlauf), daher habe ich einfach die Zeilen 44-52 auskommentiert.

//  if(Device.isUsingDarkAppearance()){
//    const gradient = new LinearGradient()
//    gradient.locations = [0, 1]
//    gradient.colors = [
//      new Color("111111"),
//      new Color("222222")
//    ]
//    list.backgroundGradient = gradient
//  }

Dadurch hab ich jetzt zwar nicht den Farbverlauf, aber dafür stimmt der Light/Darkmode immer mit dem im System überein.
Ich habe allerdings schon die 14.1 GM installiert. (Unklar, ob das einen Unterschied macht.)

@justin10567

This comment has been minimized.

Copy link

@justin10567 justin10567 commented Oct 20, 2020

@justin10567 Wie ich dir schon in meinem Fork geschrieben habe: Du musst das Widget konfigurieren. Long Press / Force touch auf das Widget bis das Kontext-Menü erscheint, dann „Scriptable“ bearbeiten auswählen und dort das richtige Script auswählen und im besten Fall die Location als Parameter übergeben.

Die Geo-Koordinaten erfährst du z.B. wenn du in Google Maps am Rechner an eine beliebige Stelle klickst. Am Handy gibt es sicher auch ne Option, aber da muss ich passen. Wichtig für die Koordinaten ist, dass da kein Leerzeichen dazwischen steht: 52.52,13.41

Danke. Das habe ich auch gemacht, Dennoch sehe ich nicht direkt im Widget die Daten, sondern erst nachdem ich auf dem Widget klicke. (siehe Bild oben). Ich habe meine Koordinaten mit und ohne Leerzeichen probiert und auch bei "When interacting" mit Open App, runscript u.s.w. probiert. Nichts! Es funktioniert erst wenn ich auf dem Widget klicke. Muss ich vielleicht auch was in Scriptable etwas einstellen, damit das Widget direkt die Werte anzeigt ohne es anzuklicken?

@TiiFuchs

This comment has been minimized.

Copy link

@TiiFuchs TiiFuchs commented Oct 20, 2020

Danke. Das habe ich auch gemacht, Dennoch sehe ich nicht direkt im Widget die Daten, sondern erst nachdem ich auf dem Widget klicke. (siehe Bild oben). Ich habe meine Koordinaten mit und ohne Leerzeichen probiert und auch bei "When interacting" mit Open App, runscript u.s.w. probiert. Nichts! Es funktioniert erst wenn ich auf dem Widget klicke. Muss ich vielleicht auch was in Scriptable etwas einstellen, damit das Widget direkt die Werte anzeigt ohne es anzuklicken?

@justin10567: Du musst in dem Zustand eigentlich nur warten... Starte vielleicht mal das Gerät neu, nur um sicherzugehen. Ansonsten warte etwas.

@clipse2004

This comment has been minimized.

Copy link

@clipse2004 clipse2004 commented Oct 20, 2020

funktioniert

deinen habe ich auch drinnen, allerdings möchte ich das bei "hell" das Widget (Hintergrund) weiß angezeigt wird und bei "dunkel" dann schwarz

Edit: Ich hab meinen Fehler gefunden... ich hab bei "when interacting" -> Run script genommen anstatt Open APP.

@Gandalf8266

This comment has been minimized.

Copy link

@Gandalf8266 Gandalf8266 commented Oct 20, 2020

Super Skript, es wäre noch toll, wenn das Skript um ein "Label" ergänzt werden könnte:
z.B. "Regensburg Land" und "Regensburg Stadt"
Man müsste das Skript dahingehend erweitern, dass Unter Parameter noch ein Feld „Label“ auftaucht, welches dann, eben wie der Parameter, editiert werden kann. Diese Feld muss dann im Widget angezeigt werden, Platz wäre ja genug.

@achisto

This comment has been minimized.

Copy link

@achisto achisto commented Oct 20, 2020

Super Skript, es wäre noch toll, wenn das Skript um ein "Label" ergänzt werden könnte:
z.B. "Regensburg Land" und "Regensburg Stadt"
Man müsste das Skript dahingehend erweitern, dass Unter Parameter noch ein Feld „Label“ auftaucht, welches dann, eben wie der Parameter, editiert werden kann. Diese Feld muss dann im Widget angezeigt werden, Platz wäre ja genug.

Wenn ich die Scriptable Documentation richtig verstehe, wird das nicht gehen, da nur ein Parameter über die Widget-Settings übergeben werden kann. Sowas ließe sich dann nur lösen, wenn man das direkt im Code hinzufügt und darin belässt, ähnlich wie das @rphl in seinem weiter oben verlinkten Fork für das Bundesland gemacht hat:

Danke fürs super Script 👍 Mich hat das Bundesland noch interessiert, habe es mal im Fork hinzugefügt. Falls also Interesse besteht... https://gist.github.com/rphl/0491c5f9cb345bf831248732374c4ef5

Edit: sollte sich aber umgehen lassen, wenn über einen weiteren Seperator (z.B. ";") der nächste Parameter übergeben wird

@andydingfelder

This comment has been minimized.

Copy link

@andydingfelder andydingfelder commented Oct 20, 2020

Super cool! Wäre vielleicht noch eine coole Sache auch anzuzeigen, von welchem Tag der aktuell angezeigte Wert ist. Sonst weiß man nicht genau, wann es zuletzt aktualisiert wurde.

ich hab das mal eingebaut. Siehe meinen Fork

@TiiFuchs

This comment has been minimized.

Copy link

@TiiFuchs TiiFuchs commented Oct 20, 2020

Mega cooles Widget, aber es wäre toll, wenn es noch eine Pizza zu meinem aktuellen Standort bestellen könnte, wenn ich es antippe. 👍

@TiiFuchs

This comment has been minimized.

Copy link

@TiiFuchs TiiFuchs commented Oct 20, 2020

Btw: gerade gesehen, dass in der Doku zu "isUsingDeviceAppearance()" von Scriptable steht, dass das nicht in widgets unterstützt wird. Man sollte die Passage also wirklich auskommentieren, wie ich oben beschreiben habe.

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 20, 2020

Hey, ich wollte euch kurz einen Einblick in meine weitere Planung geben:
Ich würde das Widget heute Abend entsprechend des Vorschlags von @TiiFuchs anpassen um das Dark-Mode-Problem zu lösen.
Außerdem würde ich einen Screenshot jedes Forks anfertigen und die Forks als Alternativen im ersten Post auflisten und euren Erweiterungen damit die verdiente Sichtbarkeit zu geben.
Zuletzt würde ich dann noch Anleitungen verlinken wie man an das Widget kommt und wie man eine fixe Position hinterlegen kann.

Habt ihr noch weitere Ideen? Vielen Dank an dieser Stelle erstmal an alle, die hier fleißig Supporten, Mitdiskutieren und das Widget voran bringen.

@ralfboernemeier

This comment has been minimized.

Copy link

@ralfboernemeier ralfboernemeier commented Oct 20, 2020

Hallo zusammen,

Mich würde interessieren wie eine Beispiel URL mit eingesetzten Koordinaten aussieht? Ich würde das gerne mit Curl machen, bekomme es aber nicht hin die „geometry=„ Daten richtig zu interpretieren und dann einzusetzen.

Gruß

Ralf

@andydingfelder

This comment has been minimized.

Copy link

@andydingfelder andydingfelder commented Oct 20, 2020

Hallo nochmal,

gibt es eigentlich irgendwo eine Doku für den RKI Rest Service?

VG,
Andy

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 20, 2020

Hey @ralfboernemeier und @andydingfelder die entsprechende Doku findet ihr hier.

@ralfboernemeier

This comment has been minimized.

Copy link

@ralfboernemeier ralfboernemeier commented Oct 20, 2020

Hallo @kevinkub

Ja, da habe ich schon gestöbert und dann probiert, bekomme aber immer einen Fehler :-(
Da ich leider nicht JS Programme lesen und verstehen kann, könntest Du mir sagen/schreiben wie bei einer Beispiel Location die Variablen Ersetzung bei Dir genau aussieht? daraus müsste ich mir dann ja eigentlich den Curl Aufruf basteln können :-)

Gruß

Ralf

@cdraeger

This comment has been minimized.

Copy link

@cdraeger cdraeger commented Oct 20, 2020

Hey, ich wollte euch kurz einen Einblick in meine weitere Planung geben:
Ich würde das Widget heute Abend entsprechend des Vorschlags von @TiiFuchs anpassen um das Dark-Mode-Problem zu lösen.
Außerdem würde ich einen Screenshot jedes Forks anfertigen und die Forks als Alternativen im ersten Post auflisten und euren Erweiterungen damit die verdiente Sichtbarkeit zu geben.
Zuletzt würde ich dann noch Anleitungen verlinken wie man an das Widget kommt und wie man eine fixe Position hinterlegen kann.

Habt ihr noch weitere Ideen? Vielen Dank an dieser Stelle erstmal an alle, die hier fleißig Supporten, Mitdiskutieren und das Widget voran bringen.

Klingt nach einem guten Plan, besonders die schnelle Übersicht über die Forks mit Screenshots dürfte sehr hilfreich sein. Ggf. würde ich diesen ersten Kommentar immer updaten um alle relevanten neuen Infos immer gesammelt oben zu haben.

Danke für das Widget!

@pichfl

This comment has been minimized.

Copy link

@pichfl pichfl commented Oct 20, 2020

@kevinkub: Ich würde fast empfehlen aus dem Git ein richtiges Repo zu machen 😄 dann kann man Pull-Requests stellen. Meinen Fork musst du nicht vorstellen, das bisschen was ich geändert habe lässt sich entweder integrieren oder ist jetzt sowieso schon verbessert.

@mkurte

This comment has been minimized.

Copy link

@mkurte mkurte commented Oct 20, 2020

Gute Arbeit! Schön wäre vielleicht noch ein parametrisierbarer Standort, sodass man bspw. mehrere Widgets (Standort/Zuhause/Arbeit) darstellen könnte. Ist eine Parametrisierung in Scriptable möglich?

Das ist möglich. Du musst nur in den Widget Einstellungen unter „Parameter“ die Koordinaten eingeben, dann ist der Standort fix
13783B6B-651B-4B77-978B-A92564820FF2

Danke!

@martinharder

This comment has been minimized.

Copy link

@martinharder martinharder commented Oct 20, 2020

Danke für dieses tolle Widget. Leider funktioniert die Ortung nicht richtig trotz korrekter Einstellungen. Feste Koordinaten möchte ich nicht benutzen, da ich viel in Bewegung bin. Gibt es einen Tipp, wie man das Problem sonst lösen kann?

C0A3196E-FB60-4404-8B16-390FA0C225BD

@kater100

This comment has been minimized.

Copy link

@kater100 kater100 commented Oct 20, 2020

Super cool! Wäre vielleicht noch eine coole Sache auch anzuzeigen, von welchem Tag der aktuell angezeigte Wert ist. Sonst weiß man nicht genau, wann es zuletzt aktualisiert wurde.

ich hab das mal eingebaut. Siehe meinen Fork

Danke ! Ist nur etwas klein. Ich kann das nicht lesen

@kater100

This comment has been minimized.

Copy link

@kater100 kater100 commented Oct 20, 2020

Hey, ich wollte euch kurz einen Einblick in meine weitere Planung geben:
Ich würde das Widget heute Abend entsprechend des Vorschlags von @TiiFuchs anpassen um das Dark-Mode-Problem zu lösen.
Außerdem würde ich einen Screenshot jedes Forks anfertigen und die Forks als Alternativen im ersten Post auflisten und euren Erweiterungen damit die verdiente Sichtbarkeit zu geben.
Zuletzt würde ich dann noch Anleitungen verlinken wie man an das Widget kommt und wie man eine fixe Position hinterlegen kann.

Habt ihr noch weitere Ideen? Vielen Dank an dieser Stelle erstmal an alle, die hier fleißig Supporten, Mitdiskutieren und das Widget voran bringen.

Mir fällt nur das Datum ein. andydingfelder hat das ja bei sich eingebaut. hatte ja schon geschrieben das es etwas klein und kaum lesbar ist.

@andydingfelder

This comment has been minimized.

Copy link

@andydingfelder andydingfelder commented Oct 20, 2020

Super cool! Wäre vielleicht noch eine coole Sache auch anzuzeigen, von welchem Tag der aktuell angezeigte Wert ist. Sonst weiß man nicht genau, wann es zuletzt aktualisiert wurde.

ich hab das mal eingebaut. Siehe meinen Fork

Danke ! Ist nur etwas klein. Ich kann das nicht lesen

Einfach in folgender Zeile den Wert für die Schriftgrösse erhöhen:

label1.font = Font.mediumSystemFont(7)

@Assassinee

This comment has been minimized.

Copy link

@Assassinee Assassinee commented Oct 20, 2020

Hey, ich wollte euch kurz einen Einblick in meine weitere Planung geben:
Ich würde das Widget heute Abend entsprechend des Vorschlags von @TiiFuchs anpassen um das Dark-Mode-Problem zu lösen.
Außerdem würde ich einen Screenshot jedes Forks anfertigen und die Forks als Alternativen im ersten Post auflisten und euren Erweiterungen damit die verdiente Sichtbarkeit zu geben.
Zuletzt würde ich dann noch Anleitungen verlinken wie man an das Widget kommt und wie man eine fixe Position hinterlegen kann.

Habt ihr noch weitere Ideen? Vielen Dank an dieser Stelle erstmal an alle, die hier fleißig Supporten, Mitdiskutieren und das Widget voran bringen.

Was wäre mit der Idee, dass man auf dem Widget mehrere Städte gleichzeitig anzeigen kann?
Das wäre sicherlich für die beiden größeren Widget's sinnvoll. Man kann es ja einfach als eine Art Tabelle anzeigen.

@Baumchen

This comment has been minimized.

Copy link

@Baumchen Baumchen commented Oct 20, 2020

Sehr coole Idee, @kevinkub.

Hab hier noch eine Variante gebaut mit der man mehrere Regionen in ein Widget packen kann: https://gist.github.com/Baumchen/6d91df0a4c76c45b15576db0632e4329 .. Dann braucht das ganze nicht so viel Platz und man kann auch seinen eigenes Namenskürzel angeben.

Screenshot 2020-10-20 at 17 31 53

@kater100

This comment has been minimized.

Copy link

@kater100 kater100 commented Oct 20, 2020

Super cool! Wäre vielleicht noch eine coole Sache auch anzuzeigen, von welchem Tag der aktuell angezeigte Wert ist. Sonst weiß man nicht genau, wann es zuletzt aktualisiert wurde.

ich hab das mal eingebaut. Siehe meinen Fork

Danke ! Ist nur etwas klein. Ich kann das nicht lesen

Einfach in folgender Zeile den Wert für die Schriftgrösse erhöhen:

label1.font = Font.mediumSystemFont(7)

Vielen Dank - das geht!
Was muss ich machen damit die Uhrzeit weg ist. Das Datum reicht eigentlich

@Jeronimo654

This comment has been minimized.

Copy link

@Jeronimo654 Jeronimo654 commented Oct 20, 2020

Ich hab mal fix die Änderungen für letzte Aktualisierung und Bundesland zusammengefasst. Gefällt mir so eigentlich ganz gut. Uhrzeit hab ich mal weggelassen, da sowieso immer nur 0Uhr
B1BAA57F-C481-4647-B281-02EFD75BC910

@daseichi

This comment has been minimized.

Copy link

@daseichi daseichi commented Oct 20, 2020

Ich hab mal fix die Änderungen für letzte Aktualisierung und Bundesland zusammengefasst. Gefällt mir so eigentlich ganz gut. Uhrzeit hab ich mal weggelassen, da sowieso immer nur 0Uhr
B1BAA57F-C481-4647-B281-02EFD75BC910

Sieht echt gut aus. Würdest du dafür ein Fork anlegen?

@marcelrebmann

This comment has been minimized.

Copy link

@marcelrebmann marcelrebmann commented Oct 20, 2020

Ich hab auch mal ein paar Funktionen mit eingebaut:

  • Fallzahlen im Landkreis
  • Kreisstädte werden auch als solche markiert
  • Bundesland Inzidenz (Farbig)
  • Info zur Aktualität der Daten
  • Als dritter WidgetParameter kann ein eigener Name angegeben werden, der den eigentlichen vom Landkreis überschreibt (Beispiel: 49.01, 10.01,Arbeit)

image

Hab einen Fork hier gemacht:
https://gist.github.com/marcelrebmann/64494e453deaf26cab3c14c9ff711e1e

@NoTrace-Kai

This comment has been minimized.

Copy link

@NoTrace-Kai NoTrace-Kai commented Oct 20, 2020

Hey ...
das sieht ja klasse aus, vielen Dank für die Arbeit!
CU

@malakka

This comment has been minimized.

Copy link

@malakka malakka commented Oct 20, 2020

Schade das die API nicht den Wert für die Anzahl der zuletzt hinzugefügten Fälle pro Landkreis auswirft. So könnte man sich die Fälle von z.B Düsseldorf aktuell und im vergleich zu gestern mit + oder - anzeigen lassen. Oder übersehe ich etwas? ich sehe den Wert auf der Seite vom RKI aber kann diesen nicht auslesen lassen
Bildschirmfoto 2020-10-20 um 19 57 18

@stolli83

This comment has been minimized.

Copy link

@stolli83 stolli83 commented Oct 20, 2020

@marcelrebmann

Ich hab auch mal ein paar Funktionen mit eingebaut:

  • Fallzahlen im Landkreis
  • Kreisstädte werden auch als solche markiert
  • Bundesland Inzidenz (Farbig)
  • Info zur Aktualität der Daten
  • Als dritter WidgetParameter kann ein eigener Name angegeben werden, der den eigentlichen vom Landkreis überschreibt (Beispiel: 49.01, 10.01,Arbeit)

image

Hab einen Fork hier gemacht:
https://gist.github.com/marcelrebmann/64494e453deaf26cab3c14c9ff711e1e

Wirklich großartiger Fork. Mich würde aber unten anstatt des Bundeslandes die tägliche Fallzahl aller Bundesländer interessieren. Dann wäre es absolut perfekt für mich.

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 20, 2020

Ich poste erstmal hier die neue Version. Vielleicht hat ja jemand Lust zu testen. Die wichtigsten Änderungen:

  • Sämtliche Farben entfernt - Scriptable handhabt dann Dark/Light-Mode zuverlässig und von selbst
  • Wenn der Standort nicht ermittelt werden kann, wird der deutschlandweite Wert angezeigt
  • Die Anzeigewerte werden für eine Stunde zwischengespeichert, wenn der Standort ermittelt werden konnte

Wenn keine neuen Bugs auftauchen, würde ich die Version dann morgen übernehmen.

Code
// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
const apiUrl = (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 apiUrlStates = '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 widget = await createWidget()
if (!config.runsInWidget) {
await widget.presentSmall()
}
Script.setWidget(widget)
Script.complete()

async function createWidget(items) {
const data = await getData()
const list = new ListWidget()
const header = list.addText("🦠 Inzidenz".toUpperCase())
header.font = Font.mediumSystemFont(13)
list.addSpacer()
if(data) {
const label = list.addText(data.incidence+"")
label.font = Font.boldSystemFont(24)
label.textColor = data.incidence >= 50 ? Color.red() : data.incidence >= 35 ? Color.orange() : Color.green()
list.addText(data.areaName)
if(data.shouldCache) {
list.refreshAfterDate = new Date(Date.now() + 60601000)
}
} else {
list.addText("Daten nicht verfügbar")
}
return list
}

async function getData() {
try {
const location = await getLocation()
if(location) {
let data = await new Request(apiUrl(location)).loadJSON()
const attr = data.features[0].attributes
return { incidence: attr.cases7_per_100k.toFixed(1), areaName: attr.GEN, shouldCache: true };
} else {
let data = await new Request(apiUrlStates).loadJSON()
const incidencePerState = data.features.map((f) => f.attributes.cases7_bl_per_100k)
const averageIncidence = incidencePerState.reduce((a, b) => a + b) / incidencePerState.length
return { incidence: 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;
}
}

@scripomac

This comment has been minimized.

Copy link

@scripomac scripomac commented Oct 20, 2020

@kevinkub, wäre es irgendwie möglich noch das gesamte widget mittig zu zentrieren?

oder kann mir jemand die Codeschnippsel dafür sagen dann bastel ich mir das selbst :D

und Tolle Arbeit! weiter so! :)

@TiiFuchs

This comment has been minimized.

Copy link

@TiiFuchs TiiFuchs commented Oct 20, 2020

kann mir jemand die Codeschnippsel dafür sagen dann bastel ich mir das selbst :D

@scripomac: Du kannst dir die Variablen header, label u.s.w. raussuchen und in einer neuen Zeile .centerAlignText() aufrufen.

Sieht dann so aus:

  const header = list.addText("🦠 Inzidenz".toUpperCase())
  header.font = Font.mediumSystemFont(13)
  header.centerAlignText()
  
  list.addSpacer()
  
  const label = list.addText(incidence+"")
  label.font = Font.boldSystemFont(24)
  label.textColor = Color.green()
  label.centerAlignText()
  
  if(incidence >= 50) {
    label.textColor = Color.red()
  } else if(incidence >= 35) {
    label.textColor = Color.orange()
  }
  
  list.addText(cityName).centerAlignText()
@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 20, 2020

@scripomac Schau dir mal das hier an:

Code
 // Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
const apiUrl = (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 apiUrlStates = '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 widget = await createWidget()
if (!config.runsInWidget) {
await widget.presentSmall()
}
Script.setWidget(widget)
Script.complete()

async function createWidget(items) {
const data = await getData()
const list = new ListWidget()
const header = list.addText("🦠 Inzidenz".toUpperCase())
header.centerAlignText()
header.font = Font.mediumSystemFont(13)
list.addSpacer()
if(data) {
const label = list.addText(data.incidence+"")
label.font = Font.boldSystemFont(24)
label.textColor = data.incidence >= 50 ? Color.red() : data.incidence >= 35 ? Color.orange() : Color.green()
label.centerAlignText()
const areaName = list.addText(data.areaName)
areaName.centerAlignText()
if(data.shouldCache) {
list.refreshAfterDate = new Date(Date.now() + 60601000)
}
} else {
list.addText("Daten nicht verfügbar")
}
return list
}

async function getData() {
try {
const location = await getLocation()
if(location) {
let data = await new Request(apiUrl(location)).loadJSON()
const attr = data.features[0].attributes
return { incidence: attr.cases7_per_100k.toFixed(1), areaName: attr.GEN, shouldCache: true };
} else {
let data = await new Request(apiUrlStates).loadJSON()
const incidencePerState = data.features.map((f) => f.attributes.cases7_bl_per_100k)
const averageIncidence = incidencePerState.reduce((a, b) => a + b) / incidencePerState.length
return { incidence: 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;
}
}

@kater100

This comment has been minimized.

Copy link

@kater100 kater100 commented Oct 21, 2020

Ich hab auch mal ein paar Funktionen mit eingebaut:

  • Fallzahlen im Landkreis
  • Kreisstädte werden auch als solche markiert
  • Bundesland Inzidenz (Farbig)
  • Info zur Aktualität der Daten
  • Als dritter WidgetParameter kann ein eigener Name angegeben werden, der den eigentlichen vom Landkreis überschreibt (Beispiel: 49.01, 10.01,Arbeit)

image

Hab einen Fork hier gemacht:
https://gist.github.com/marcelrebmann/64494e453deaf26cab3c14c9ff711e1e

Gefällt mir sehr gut!
Hab noch ein Design Vorschlag. Anstatt "Daten: 20.10.2020" würde ich einfach nur "20-Okt-2020" hinschreiben. Somit ist jedem klar das es sich um das Datum handelt und die Oberfläche ist aufgeräumter mit "etwas" weniger Text.

@scripomac

This comment has been minimized.

Copy link

@scripomac scripomac commented Oct 21, 2020

@scripomac Schau dir mal das hier an:

Code

Guten Morgen Kevin, perfekt! Danke dir!

Bei mir sieht das jetzt so aus :) falls es jemanden interessiert :)

5BB8439F-2088-4D3F-B980-C8A3DC45962A

// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0 const apiUrl = (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 apiUrlStates = '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 widget = await createWidget()
if (!config.runsInWidget) {
await widget.presentSmall()
}
Script.setWidget(widget)
Script.complete()

async function createWidget(items) {
const data = await getData()
const list = new ListWidget()
const header = list.addText("🦠".toUpperCase())
header.centerAlignText()
header.font = Font.mediumSystemFont(33)
list.addSpacer()
if(data) {
const label = list.addText(data.incidence+"")
label.font = Font.boldSystemFont(35)
label.textColor = data.incidence >= 50 ? Color.red() : data.incidence >= 35 ? Color.orange() : Color.green()
label.centerAlignText()
const areaName = list.addText(data.areaName)
areaName.centerAlignText()
if(data.shouldCache) {
list.refreshAfterDate = new Date(Date.now() + 60601000)
}
} else {
list.addText("Daten nicht verfügbar")
}
return list
}

async function getData() {
try {
const location = await getLocation()
if(location) {
let data = await new Request(apiUrl(location)).loadJSON()
const attr = data.features[0].attributes
return { incidence: attr.cases7_per_100k.toFixed(1), areaName: attr.GEN, shouldCache: true };
} else {
let data = await new Request(apiUrlStates).loadJSON()
const incidencePerState = data.features.map((f) => f.attributes.cases7_bl_per_100k)
const averageIncidence = incidencePerState.reduce((a, b) => a + b) / incidencePerState.length
return { incidence: 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;
}
}
`

@Muffl000n

This comment has been minimized.

Copy link

@Muffl000n Muffl000n commented Oct 21, 2020

Tolle Sache und faszinierend wie alle die Idee mustergültig weiterentwickeln. Chapeau!
Gibt es eine ähnliche schicke und funktionierende App für den Androiden? Wie würde die Implementierung denn dort aussehen?

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 21, 2020

@Reborn2

This comment has been minimized.

Copy link

@Reborn2 Reborn2 commented Oct 21, 2020

Morgen kann mir jemand erklären warum Hamburg mit 46.1 angezeigt wird aber über 50 ist trotz Aktualisierung um Mitternacht

@jakob42

This comment has been minimized.

Copy link

@jakob42 jakob42 commented Oct 21, 2020

@kevinkub Hast Du einen Link zur API-Doku des RKI? Ich konnte das nicht finden.

@Muffl000n

This comment has been minimized.

Copy link

@Muffl000n Muffl000n commented Oct 21, 2020

@jakob42 ich spiel gerade selber damit rum, daher: https://developers.arcgis.com/rest/
Also das ist die Doku des API von ARCGIS, auf dem das RKI-Cockpit aufgebaut ist.

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 21, 2020

Hey @ralfboernemeier und @andydingfelder die entsprechende Doku findet ihr hier.

@jakob42 Das ist der direkte Link auf NPGEO Corona. Dort kann man auch durch die Daten stöbern und die API-Requests in einer Art Editor zusammenbauen und ausprobieren.

@jakob42

This comment has been minimized.

Copy link

@jakob42 jakob42 commented Oct 21, 2020

Danke euch!

@mpljevljak

This comment has been minimized.

Copy link

@mpljevljak mpljevljak commented Oct 21, 2020

Hallo, toller Skript. Kann mir jemand sagen warum ich vor dem Wort INZIDENZ zwei ?? Anstatt dem grünen Virus Bild habe?

image

@simonCGN

This comment has been minimized.

Copy link

@simonCGN simonCGN commented Oct 21, 2020

Ein sehr hilfreiches Widget.

Eine weitere Idee wäre noch die Anzahl der täglich gemeldeten Corona Fälle, also 7.595 bspw. heute.

@daseichi

This comment has been minimized.

Copy link

@daseichi daseichi commented Oct 21, 2020

Ein sehr hilfreiches Widget.

Eine weitere Idee wäre noch die Anzahl der täglich gemeldeten Corona Fälle, also 7.595 bspw. heute.

Schau mal hier: https://gist.github.com/oliverandrich/0f34c8d4e6de4b6ff32937c584009a65

Dort fehlt eigentlich nur noch das Datum der Daten, ansonsten perfekt.

@mathiasurbaniak

This comment has been minimized.

Copy link

@mathiasurbaniak mathiasurbaniak commented Oct 21, 2020

Ich poste erstmal hier die neue Version. Vielleicht hat ja jemand Lust zu testen. Die wichtigsten Änderungen:

  • Sämtliche Farben entfernt - Scriptable handhabt dann Dark/Light-Mode zuverlässig und von selbst
  • Wenn der Standort nicht ermittelt werden kann, wird der deutschlandweite Wert angezeigt
  • Die Anzeigewerte werden für eine Stunde zwischengespeichert, wenn der Standort ermittelt werden konnte

Wenn keine neuen Bugs auftauchen, würde ich die Version dann morgen übernehmen.

Code

Vielen Dank für dieses nützliche Widget! Würde gern die neue Version nutzen und mir zusätzlich die Inzidenz für das dazugehörige Bundesland anzeigen lassen. Im Fork von @rphl ist noch die alte Version integriert, oder?

@malakka

This comment has been minimized.

Copy link

@malakka malakka commented Oct 21, 2020

Ich habe auch mal einen fork angelegt

Bildschirmfoto 2020-10-21 um 12 12 02

@simonCGN

This comment has been minimized.

Copy link

@simonCGN simonCGN commented Oct 21, 2020

Ein sehr hilfreiches Widget.
Eine weitere Idee wäre noch die Anzahl der täglich gemeldeten Corona Fälle, also 7.595 bspw. heute.

Schau mal hier: https://gist.github.com/oliverandrich/0f34c8d4e6de4b6ff32937c584009a65

Dort fehlt eigentlich nur noch das Datum der Daten, ansonsten perfekt.

Danke! Das sieht super aus.

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 21, 2020

Ich habe auch mal einen fork angelegt

Bildschirmfoto 2020-10-21 um 12 12 02

Ist aufgenommen. Vielen Dank für deinen Beitrag.

@gunti-2020

This comment has been minimized.

Copy link

@gunti-2020 gunti-2020 commented Oct 21, 2020

Ganz tolles Script, aber ich bekomme teilweise einen Fehler angezeigt.
4EE4098B-325B-49C2-85BC-57287F31DBF9

Ich nutze das Coding von Kevin
Hat vielleicht jemand eine Idee, woran das liegt?

Gruß
Jens

@mgfall

This comment has been minimized.

Copy link

@mgfall mgfall commented Oct 21, 2020

Danke, das funktioniert super.
Weiß jemand ob es das für Österreich auch gibt?

@NormanKade

This comment has been minimized.

Copy link

@NormanKade NormanKade commented Oct 21, 2020

@kevin-kub
Moin, wenn ich als festen Geocode z.B. 54.4,9.59 für Neumünster in dein Widget eingebe, dann bekomme im Widget Rendsburg-Eckernfoerde angezeigt. Auch bei anderen Geodaten, die ich aus Wiki habe werden „falsche“ Kreise angezeigt. Wie kommt das?

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 21, 2020

@gunti-2020 Der Fehler ist mir neu. Er deutet auf einen Fehler bei der Location-Abfrage hin. Hast du deine Standortdaten für Scriptable freigegeben?

@mgfall Habe ich leider noch nicht von gehört. Vielleicht kannst du mal prüfen ob eure zuständige Behörde auch die Daten zur Verfügung stellt. Vielleicht ja sogar mit einer ähnlichen API :-). Dann müsste man nur die URL ändern.

@NormanKade Für Neumünster solltest du „54.07, 9.98“ verwenden. Grundsätzlich findest du die Koordinaten am einfachsten, wenn du in der Apple-Karten-App einen Pin setzt.

086A9BD2-8383-43EE-8491-13F992EFABFC

@NormanKade

This comment has been minimized.

Copy link

@NormanKade NormanKade commented Oct 21, 2020

@kevinkub
Danke! Mit den Koordinaten des PIN aus der Koordinationapp geht es. Mein Heimatort liegt eigentlich wo anders und ich möchte die Koordinaten nicht direkt nennen. Ich hatte hier zunächst die Koordinaten von der Kompassapp verwendet und auch von Wiki. Alle unterscheiden sich so, dass verschiedene Orte angegeben werden. Neben NMS hatte ich aus Wiki die HH Koordinaten genommen und dann wurde Harburg angezeigt.

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 21, 2020

@NormanKade Wenn du in Hamburg zu nah an der Elbe bist bekommst du auch keine Werte angezeigt... die API vom RKI ist an der Stelle zu präzise. Besser für diesen Anwendungsfall wäre immer das nächste Gebiet anzuzeigen. Aber schön, dass es mit den Koordinaten aus „Karten“ geht.

@gunti-2020

This comment has been minimized.

Copy link

@gunti-2020 gunti-2020 commented Oct 21, 2020

@kevinkub
Ich habe den Standort bei der Verwendung freigegeben. Es klappt ja nur manchmal nicht. Location ist Bielefeld

@rphl

This comment has been minimized.

Copy link

@rphl rphl commented Oct 21, 2020

Habe mal meinen Fork optisch aufgefrischt, und auf den neuen Stand von @kevinkub (thx). Darkmode-Wechsel scheint jetzt gut zu klappen 👍

IMG_0005
https://gist.github.com/rphl/0491c5f9cb345bf831248732374c4ef5

...

Hatte jemand schon ein Medium Widget angefangen/ausprobiert?

@ramenam88

This comment has been minimized.

Copy link

@ramenam88 ramenam88 commented Oct 21, 2020

Wie schaffe ich es, dass im dauerhaften Darkmode der Kreis in Schriftfarbe Weiß dargestellt wird?

@ramenam88

This comment has been minimized.

Copy link

@ramenam88 ramenam88 commented Oct 21, 2020

Code
// 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
// 
// NEW: Save lat/lon to iCloud to prevent location error.
//
const apiUrl = (location) => `https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,cases7_per_100k,BL&geometry=${location.longitude.toFixed(3)}%2C${location.latitude.toFixed(3)}&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnGeometry=false&outSR=4326&f=json`
const apiUrlLand = (landname) => `https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/Coronaf%C3%A4lle_in_den_Bundesl%C3%A4ndern/FeatureServer/0/query?where=LAN_ew_GEN+%3D+%27${encodeURIComponent(landname)}%27&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&resultType=none&distance=0.0&units=esriSRUnit_Meter&returnGeodetic=false&outFields=LAN_ew_GEN%2Cfaelle_100000_EW%2Ccases7_bl_per_100k&returnGeometry=false&returnCentroid=false&featureEncoding=esriDefault&multipatchOption=none&maxAllowableOffset=&geometryPrecision=&outSR=&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=false&returnDistinctValues=false&cacheHint=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount=&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=none&f=pjson&token=`

const saveIncidenceLatLon = (location) => {
let fm = FileManager.iCloud()
let path = fm.joinPath(fm.documentsDirectory(), "covid19latlon.json")
fm.writeString(path, JSON.stringify(location))
}

const getsavedIncidenceLatLon = () => {
let fm = FileManager.iCloud()
let path = fm.joinPath(fm.documentsDirectory(), "covid19latlon.json")
let data = fm.readString(path)
return JSON.parse(data)
}

let widget = await createWidget()
if (!config.runsInWidget) {
await widget.presentSmall()
}

Script.setWidget(widget)
Script.complete()

async function createWidget(items) {
let location

if(args.widgetParameter) {
console.log('get fixed lat/lon')
const fixedCoordinates = args.widgetParameter.split(",").map(parseFloat)
location = {
latitude: fixedCoordinates[0],
longitude: fixedCoordinates[1]
}
} else {
Location.setAccuracyToThreeKilometers()
try {
location = await Location.current()
console.log('get current lat/lon')
saveIncidenceLatLon(location)
} catch(e) {
console.log('using saved lat/lon')
location = getsavedIncidenceLatLon()
}
}

const data = await new Request(apiUrl(location)).loadJSON()

if(!data || !data.features || !data.features.length) {
const errorList = new ListWidget()
errorList.addText("Keine Ergebnisse für den aktuellen Ort gefunden.")
return errorList
}

const attr = data.features[0].attributes
const incidence = attr.cases7_per_100k.toFixed(1)
const cityName = attr.GEN
const list = new ListWidget()
let incidenceLand;
let landName;

if (!attr.BL) {
console.log('Kein Bundesland', attr);
} else {
const dataLand = await new Request(apiUrlLand(attr.BL)).loadJSON()

if(!dataLand || !dataLand.features || !dataLand.features.length) {
  const errorList = new ListWidget()
  errorList.addText("Keine Ergebnisse für den aktuellen Ort gefunden.")
  return errorList
}

const attrLand = dataLand.features[0].attributes
incidenceLand = attrLand.cases7_bl_per_100k.toFixed(1)
landName = attrLand.LAN_ew_GEN

}

const gradient = new LinearGradient()
gradient.locations = [0, 1]
gradient.colors = [
  new Color("111111"),
  new Color("222222")
]
list.backgroundGradient = gradient

const header = list.addText("🦠 Inzidenz".toUpperCase())
header.font = Font.mediumSystemFont(13)

list.addSpacer()

const label = list.addText(incidence+"")
label.font = Font.boldSystemFont(24)
label.textColor = Color.green()

if(incidence >= 50) {
label.textColor = Color.red()
} else if(incidence >= 35) {
label.textColor = Color.orange()
}
const citynameLabel = list.addText(cityName)
citynameLabel.font = Font.mediumSystemFont(14)

list.addSpacer()

let landLabel;
if (typeof landName !== 'undefined' && typeof incidenceLand !== 'undefined') {
landLabel = list.addText(incidenceLand + " " +landName)
} else {
landLabel = list.addText("Bundesland konnte nicht ermittelt werden.")
}

landLabel.font = Font.systemFont(12)
landLabel.textColor = Color.gray()

return list
}

@thor1986

This comment has been minimized.

Copy link

@thor1986 thor1986 commented Oct 22, 2020

@kevinkub

Hallo, ist es auch Möglich zu dem 7-Tages Inzidenz Wert auch die +neuen Fälle des Landkreises anzuzeigen? Danke! Also Inzidenz 49,3, +25 Fälle

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 22, 2020

@gunti-2020 Ich denke, dass es eine Einstellung sein muss - habe aber im Rahmen von Scriptable leider keine Chance den Fehler weiter zu debuggen. Der Fehler scheint auch nicht abgefangen werden zu können. Du verwendest doch die neuste Version von gestern Vormittag, oder?

@rphl Danke fürs Bescheid geben. Habe ausführlicher in deinem Gist gepostet. Bild ist angepasst :-).

@ramenam88 Weiß bekommst du nicht hin, wenn du eine Farbe zuweist, so wie du es mit label.color machst... wenn du keine Farbe setzt, dann ist die Schrift im Darkmode weiß und im Lightmode schwarz. Ein Mittelding funktioniert aktuell nicht.

@thor1986 Die Forks von @schaechinger und @allesmatze machen das. Die Links dazu findest du im ersten Post.

@ramenam88

This comment has been minimized.

Copy link

@ramenam88 ramenam88 commented Oct 22, 2020

@kevinkub
Danke für die schnelle Antwort, mit der ich aber mangels Fachwissen nicht ganz zurecht komme. Wenn ich den Darkmode permanent „auswähle“ (durch löschen if is using dark appearance), müsste ich dem Kreis auch eine permanente Farbe zuweisen können, oder warum ist es dann schwarz?

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 22, 2020

@ramenam88 Dann ist es ausreichend die Zeile landLabel.textColor = Color.gray() zu ändern. Wenn du „gray()“ löscht, sollten dir in Scriptable alle möglichen Farbwerte angezeigt werden.

@thor1986

This comment has been minimized.

Copy link

@thor1986 thor1986 commented Oct 22, 2020

@kevinkub

Danke für die Antwort.
Die Forks zeigen nur die Gesamtanzahl der Infektionen. Eine Anzeige der Tageszahlen wäre wünschenswert :-) Bei der Gesamtzahl muss man ja immer vergleichen gestern heute.

@gunti-2020

This comment has been minimized.

Copy link

@gunti-2020 gunti-2020 commented Oct 22, 2020

@ rphl
Dein Coding ist gut gelungen. Danke
Vielleicht kann man noch die Neuinfektionen für Deutschland einfügen.
Ich habe das leider nicht geschafft

@simonCGN

This comment has been minimized.

Copy link

@simonCGN simonCGN commented Oct 22, 2020

@kevinkub

Danke für die Antwort.
Die Forks zeigen nur die Gesamtanzahl der Infektionen. Eine Anzeige der Tageszahlen wäre wünschenswert :-) Bei der Gesamtzahl muss man ja immer vergleichen gestern heute.

Ja, hatte auch den gleichen Gedanken. Das wäre sehr hilfreich.

@willi84

This comment has been minimized.

Copy link

@willi84 willi84 commented Oct 22, 2020

welche Lizenz hat Dein script? Bzw. magst du eine als Kommentar ergänzen?

@achisto

This comment has been minimized.

Copy link

@achisto achisto commented Oct 22, 2020

@ rphl
Dein Coding ist gut gelungen. Danke
Vielleicht kann man noch die Neuinfektionen für Deutschland einfügen.
Ich habe das leider nicht geschafft

Schau mal in die Forks von @oliverandrich (Link) und @malakka (Link) die haben genau das bereits umgesetzt!

@rphl

This comment has been minimized.

Copy link

@rphl rphl commented Oct 22, 2020

@ rphl
Dein Coding ist gut gelungen. Danke
Vielleicht kann man noch die Neuinfektionen für Deutschland einfügen.
Ich habe das leider nicht geschafft

Danke. Neuinfektionen habe ich jetzt auch in meinen Fork drin.

@gunti-2020

This comment has been minimized.

Copy link

@gunti-2020 gunti-2020 commented Oct 22, 2020

@ rphl
Danke Dir, sieht gut aus

@TheSpirit

This comment has been minimized.

Copy link

@TheSpirit TheSpirit commented Oct 22, 2020

@entoryFB

This comment has been minimized.

Copy link

@entoryFB entoryFB commented Oct 22, 2020

hab auch mal ne variante gemacht
IMG_0882
Sieht gut aus. Hätte Interesse:-)

@TheSpirit

This comment has been minimized.

Copy link

@TheSpirit TheSpirit commented Oct 22, 2020

hab auch mal ne variante gemacht
IMG_0882
Sieht gut aus. Hätte Interesse:-)

Siehe hier

https://gist.github.com/TheSpirit/7a00b169203d51ec1f4472cebaf62012

@entoryFB

This comment has been minimized.

Copy link

@entoryFB entoryFB commented Oct 22, 2020

hab auch mal ne variante gemacht
IMG_0882
Sieht gut aus. Hätte Interesse:-)

Siehe hier

https://gist.github.com/TheSpirit/7a00b169203d51ec1f4472cebaf62012

Danke

@ramenam88

This comment has been minimized.

Copy link

@ramenam88 ramenam88 commented Oct 22, 2020

@ramenam88 Dann ist es ausreichend die Zeile landLabel.textColor = Color.gray() zu ändern. Wenn du „gray()“ löscht, sollten dir in Scriptable alle möglichen Farbwerte angezeigt werden.

@kevinkub danke für deine Hilfe. Leider meinte ich nicht das Bundesland, in meinem Fall Baden-Württemberg, sondern den Landkreis, bei mir Bodenseekreis. Bodenseekreis bleibt bisher immer schwarz. :(

@jo1601

This comment has been minimized.

Copy link

@jo1601 jo1601 commented Oct 23, 2020

Gibt es eine Möglichkeit wie das ganze auch für Österreich funktionieren könnte? Hat da vlt jemand eine idee? :)

@Baumchen

This comment has been minimized.

Copy link

@Baumchen Baumchen commented Oct 23, 2020

@jo1601 @mgfall @KWeb2k16

Ich hab hier https://gist.github.com/Baumchen/b8b9aaf5ba0aebef173a4f956a3b4290 mal eine Variante für Österreich 🇦🇹 gemacht. Allerdings ist das ein erster Ansatz, könnt ja mal schauen, ob die Werte passen und das ganze für euch funktioniert.

@RosoV89

This comment has been minimized.

Copy link

@RosoV89 RosoV89 commented Oct 23, 2020

Hey, da habt ihr euch echt ne tolle Idee einfallen lassen. Ich nutze das Widget sehr gerne.

Ich habe den Link zur RKI website hinterlegt, sodass durch tippen aufs Widget die Seite direkt aufgerufen wird.

Allerdings wünsche ich mir ein Widget mit noch mehr Infos:

Oben links: Inzidenz Landkreis
Oben rechts: Inzidenz Bundesland (oder Deutschland)
Unten links: Neue Fälle Landkreis
Unten rechts: neue Fälle Bundesland oder besser Deutschland.

Kann man so viele Infos da reinpacken?
Würde das jemand basteln für mich? ich kenne mich damit null aus 🙈

Liebe Grüße

@thor1986

This comment has been minimized.

Copy link

@thor1986 thor1986 commented Oct 23, 2020

Würde mich dem anschließen 👍

@gunti-2020

This comment has been minimized.

Copy link

@gunti-2020 gunti-2020 commented Oct 23, 2020

kann mich dem auch nur anschließen 👍
Als i Tüpfelchen noch, die Tendenzen zu den einzelnen Werten

liebe Grüße und Danke für Euere tolle Arbeit

@joogy21

This comment has been minimized.

Copy link

@joogy21 joogy21 commented Oct 23, 2020

Ich kann mich dem auch nur anschließen.
Wäre echt klasse 👍

@karlu92

This comment has been minimized.

Copy link

@karlu92 karlu92 commented Oct 23, 2020

Habt ihr eine Idee wie man in die deutschlandweiten Zahlen ein Tausender Trennzeichen hinbekommt? Also statt +11242 ein +11.242 ?

@wilmaaivlis

This comment has been minimized.

Copy link

@wilmaaivlis wilmaaivlis commented Oct 23, 2020

Ich sage auch mal "Danke"
Mir geht es genau so wie RosoV89 ;),

LG

@Saudumm

This comment has been minimized.

Copy link

@Saudumm Saudumm commented Oct 23, 2020

Habt ihr eine Idee wie man in die deutschlandweiten Zahlen ein Tausender Trennzeichen hinbekommt? Also statt +11242 ein +11.242 ?

Füge hinter der Variable der Zahlen noch .toLocaleString() an.

@RosoV89

This comment has been minimized.

Copy link

@RosoV89 RosoV89 commented Oct 23, 2020

Ich hoffe jemand kann und mag uns da helfen 😅

@rphl

This comment has been minimized.

Copy link

@rphl rphl commented Oct 23, 2020

@RosoV89 Alle Infos, bis auf "Neue Fälle Landkreis" habe ich im meinen Fork drin. Ab einen gewissen grad sind es zu viele Informationen auf zu Wenig fläche. Das mit dem 1000 Punkt ist auch drin. Gerne testen :-)

IMG_5399

@karlu92

This comment has been minimized.

Copy link

@karlu92 karlu92 commented Oct 23, 2020

Hier die Version von @TheSpirit mit tausender Trennzeichen und Orange beim Inzidenzwert von über 25:
https://gist.github.com/karlu92/fadd6d8ed5daeee880334070c8713935

744FBAC7-02C7-4706-A278-9341B3EE077B

@RosoV89

This comment has been minimized.

Copy link

@RosoV89 RosoV89 commented Oct 23, 2020

Top danke euch. Auch an Rphl für die andere Fork. Gefällt mir.

Jetzt müssen wir nur noch hoffen, dass wir das Skript bald nicht mehr benötigen ^^

@RosoV89

This comment has been minimized.

Copy link

@RosoV89 RosoV89 commented Oct 23, 2020

Hier die Version von @TheSpirit mit tausender Trennzeichen und Orange beim Inzidenzwert von über 25:
https://gist.github.com/karlu92/fadd6d8ed5daeee880334070c8713935

744FBAC7-02C7-4706-A278-9341B3EE077B

Hi, 1.000er Trennung funzt, aber die farbliche Unterscheidung leider nicht. Wir haben in Worms 29,9 und steht immer noch auf Grün. finde ich persönlich irritierend

@karlu92

This comment has been minimized.

Copy link

@karlu92 karlu92 commented Oct 23, 2020

Hier die Version von @TheSpirit mit tausender Trennzeichen und Orange beim Inzidenzwert von über 25:
https://gist.github.com/karlu92/fadd6d8ed5daeee880334070c8713935
744FBAC7-02C7-4706-A278-9341B3EE077B

Hi, 1.000er Trennung funzt, aber die farbliche Unterscheidung leider nicht. Wir haben in Worms 29,9 und steht immer noch auf Grün. finde ich persönlich irritierend

Ich habe es geupdated, ich hatte es nur beim Bundesland eingestellt. Nun auch bei der Stadt.

@RosoV89

This comment has been minimized.

Copy link

@RosoV89 RosoV89 commented Oct 23, 2020

Spitze, danke :)

@fearen86

This comment has been minimized.

Copy link

@fearen86 fearen86 commented Oct 23, 2020

Mein Widget wird leider nur so angezeigt. Habe schon alles was sonst hier erwähnt wurde versucht. Steht auf runscript, Koordinaten manuell eingegeben und das richtige ausgewählt....
5592A660-31B9-47C1-994A-8616F56EF930

@FabsexXx

This comment has been minimized.

Copy link

@FabsexXx FabsexXx commented Oct 23, 2020

In den Widget-Einstellungen können jetzt GEO-Koordinaten hinterlegt werden, damit keine Standortdaten übertragen werden. Wenn man sich außerhalb Deutschlands bewegt wird eine entsprechende Meldung angezeigt.

Hi Kevin,

ich bin neu und weiß leider nicht wie ich fix Stadt und Bundesland einstellen kann?! Danke

@martinharder

This comment has been minimized.

Copy link

@martinharder martinharder commented Oct 23, 2020

In den Widget-Einstellungen können jetzt GEO-Koordinaten hinterlegt werden, damit keine Standortdaten übertragen werden. Wenn man sich außerhalb Deutschlands bewegt wird eine entsprechende Meldung angezeigt.

Hi Kevin,

ich bin neu und weiß leider nicht wie ich fix Stadt und Bundesland einstellen kann?! Danke

Wenn du das Widget anlegst, schreib ganz unten unter Parameter: 52.52,13.41 (die Koordinaten findest du in Apple- oder Google-Maps).

@flipkill1985

This comment has been minimized.

Copy link

@flipkill1985 flipkill1985 commented Oct 23, 2020

Hallo,
Wie kann ich das Widget einfach immer mit schwarzem Hintergrund bearbeiten egal ob dark Mode an oder aus ist?
Danke Grus Jan

@vesan66

This comment has been minimized.

Copy link

@vesan66 vesan66 commented Oct 23, 2020

Hallo, ich bin mir nicht ganz sicher, ob der 7-Tage-Inzidenz-Wert-Deutschland ein Average ist.
const averageIncidence = incidencePerState.reduce((a, b) => a + b) / incidencePerState.length
23.10.2020 -> Widget 53.3
23.10.2020 -> RKI 60.3 -> Quelle (RKI PDF: https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Situationsberichte/Okt_2020/2020-10-23-de.pdf?__blob=publicationFile )
Grüße,
Dirk.

@RosoV89

This comment has been minimized.

Copy link

@RosoV89 RosoV89 commented Oct 23, 2020

Achtung: bevor ihr jetzt versucht, einen Fehler zu finden, wartet besser mal das Wochenende ab. Es soll heute beim RKI eine technische Störung gegeben haben, die die Übertragung der Ergebnisse zeitweise Gestört hat. Ggf. Hat dies auch Auswirkungen auf die Daten, die das Widget bekommt und sie sind deshalb falsch.

@AleksCee

This comment has been minimized.

Copy link

@AleksCee AleksCee commented Oct 23, 2020

@kevinkub Wo wird denn der Wert gecached? Der API-Call wird doch bei jedem Widget Aufruf getriggert, die Cache-Abfragen hast du doch nur bei der Anzeige, oder habe ich was übersehen?

Ah schon gefunden - das refreshAfterDate handelt dann das Widget selber... ok... vergiss die Frage. ;)
Liebe Grüße, Alex

@rphl

This comment has been minimized.

Copy link

@rphl rphl commented Oct 23, 2020

@vesan66 Die Api gibt die gleichen 7-Tage Werte je Bundesland zurück, wie deine Quellurl. Es sieht so aus, dass der Gesamt 7-Tage-Inzidenz Wert bei deiner URL falsch ist.

API Request: 23.10

Schleswig-Holstein 25.6
Hamburg 52.8
Niedersachsen 37.2
Bremen 74.6
Nordrhein-Westfalen 74.5
Hessen 80.5
Rheinland-Pfalz 50.5
Baden-Württemberg 61.3
Bayern 66.7
Saarland 69.5
Berlin 105.8
Brandenburg 26.8
Mecklenburg-Vorpommern 19.8
Sachsen 52.7
Sachsen-Anhalt 23.0
Thüringen 31.1

Ergibt somit 53.26372685571306 als korrekten Durchschnitt. Von wo die 60,3 kommen weiss nur das RKI 😄
Oder übersehe ich da etwas?

@vesan66

This comment has been minimized.

Copy link

@vesan66 vesan66 commented Oct 23, 2020

Hallo,
die Frage ist nicht ob der Durchschnitt richtig berechnet wird, sondern ob die Berechnung des Deltas als 7-Tages-Inzidenz für Deutschland überhaupt dem Rechenweg des RKI entspricht.
7-Tages-Inzidenz besagt doch: Neuinfektionen in 7 Tagen pro 100tsd Einwohner.
Grüße,
Dirk

@vesan66

This comment has been minimized.

Copy link

@vesan66 vesan66 commented Oct 23, 2020

Dies könnte man z.B. so berechnen. (Dabei kann man sich natürlich die / 100.000 und * 100.000 auch sparen.)
Bildschirmfoto 2020-10-24 um 00 02 17

Grüße,
Dirk.

@kevinkub

This comment has been minimized.

Copy link
Owner Author

@kevinkub kevinkub commented Oct 23, 2020

Dies könnte man z.B. so berechnen. (Dabei kann man sich natürlich die / 100.000 und * 100.000 auch sparen.)
Bildschirmfoto 2020-10-24 um 00 02 17

Grüße,
Dirk.

Hallo Dirk,

Danke für die investierte Mühe. Das werde ich zeitnah einbauen 👍🏻.

@vesan66

This comment has been minimized.

Copy link

@vesan66 vesan66 commented Oct 23, 2020

Gerne.
Quick and dirty:

  1. Die Outfields erweitern um: outFields=cases7_bl_per_100k,LAN_ew_EWZ
  2. Die nicht hübsche Berechnung. In diesem Fall hier wäre ich mir nicht mals sicher, ob die Sortierung immer garantiert ist. Aber bei einem Test ergab sich bisher das richtige Ergebnis:
let data = await new Request(apiUrlStates).loadJSON()
      const incidencePerState = data.features.map((f) => f.attributes.cases7_bl_per_100k);
      const residentsPerState = data.features.map((f) => f.attributes.LAN_ew_EWZ);
      var absolutIncidences = [];
      for (var i = 0; i < incidencePerState.length; i++) {
        absolutIncidences.push(incidencePerState[i] / 100000 * residentsPerState[i]);
      }
      const absolutIncidencesSum = absolutIncidences.reduce((a, b) => a + b);
      const residentsPerStateSum = residentsPerState.reduce((a, b) => a + b);
      const sevenDayIncidence = absolutIncidencesSum / residentsPerStateSum * 100000
      return { incidence: sevenDayIncidence.toFixed(1), areaName: "Deutschland", shouldCache: false };

Wie gesagt: Das geht sicher auch schöner, aber ich habe nicht so viel Erfahrung mit JS.
Grüße,
Dirk.

@Janni172

This comment has been minimized.

Copy link

@Janni172 Janni172 commented Oct 24, 2020

Hallo zusammen!
Wie kann ich das Skript so abändern dass mir Siri den aktuellen Wert vorliest wenn ich es per Siri Sprachbefehl öffne.
VG

@marcelrebmann

This comment has been minimized.

Copy link

@marcelrebmann marcelrebmann commented Oct 24, 2020

Dies könnte man z.B. so berechnen. (Dabei kann man sich natürlich die / 100.000 und * 100.000 auch sparen.)
Bildschirmfoto 2020-10-24 um 00 02 17

Grüße,
Dirk.

Vielen Dank auch von mir für's Teilen! Ich hab das eingebaut und es scheint zu funktionieren! 👍

057311C3-77FD-48CC-A0E7-56BDB586B4C2

@Robibobi1992

This comment has been minimized.

Copy link

@Robibobi1992 Robibobi1992 commented Oct 24, 2020

Gibt es die Möglichkeit diese Scripte auch auf einer Website darzustellen?

@AleksCee

This comment has been minimized.

Copy link

@AleksCee AleksCee commented Oct 24, 2020

@Robibobi1992

Hier quick&dirty - schön machen (also HTML/Styles) kannst Du ja sicher selber. Steuerbar über Bundesland ID und die Orte-Filterliste.
Der Ort-Filter wird nur genutzt wenn useFilter auf true steht, sonst werden alle Städte des konfigurierten Bundeslandes angezeigt.
Das ganze hat kein Fehlerhandling - ist nur ein Beispiel für Dich um es von Scriptabel auf "HTML" umzustellen.
Auf aktuellen Browsern, wegen der Content Security Policy nicht lokal ausführbar über file:// URL sondern nur wenn von einem Server ausgeliefert. Inline-Scripts sind da verboten, zumindest bei meiner aktuellen FireFox-Version. Sollte aber schnell gehen und in einem File sein für eine mini Demo.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Demo</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <style>
            .grün {
                color: green;
            }
            .gelb {
                color: orange;
            }
            .rot{
                color: darkred;
            }
        </style>
    </head>
    <body>
        <div id="output"></div>
        <script>
            async function getData(){
                // Filter auf Orte aus dem Bundsland die man sehen will.
                const filterLK = ['hannover', 'wolfenbüttel', 'nienburg', 'göttingen'];
                const useFilter = true;
                // Bundesland was man sehen will.
                const region = 3; // Niedersachsen siehe Spalte Bundesland ID unter: https://npgeo-corona-npgeo-de.hub.arcgis.com/datasets/917fc37a709542548cc3be077a786c17_0/data?geometry=-19.006%2C46.211%2C41.024%2C55.839&orderBy=BL&where=BL%20%3D%20%27Niedersachsen%27
                const colors = {35: 'grün', 50: 'gelb', 51: 'rot'};
                const outputDiv = document.getElementById('output');

                const result = {}
                const fetchResult = await fetch('https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=BL_ID%20%3D%20%27'+region+'%27&outFields=GEN,BL,county,cases7_per_100k,last_update,cases7_bl_per_100k&returnGeometry=false&returnDistinctValues=true&outSR=&f=json');
                const apiResult = await fetchResult.json()
                result.lastupdate = apiResult.features.length >0 ? apiResult.features[0].attributes.last_update : 'n/a'
                result.bundesland = apiResult.features.length >0 ? apiResult.features[0].attributes.BL : 'n/a'
                result.overall = apiResult.features.length >0 ? apiResult.features[0].attributes['cases7_bl_per_100k'].toFixed(2).replace('.',',') + ' Fälle' : 'n/a'
                result.landkreise = apiResult.features.map(landkreis => {
                return {
                    lk: landkreis.attributes.GEN,
                    text: landkreis.attributes.GEN + ': ' + landkreis.attributes['cases7_per_100k'].toFixed(2).replace('.',',') + ' Fälle',
                    color: colors[Object.keys(colors).reduce((s,c) => {return landkreis.attributes['cases7_per_100k'] < s ? s : c}, 0)]
                }
                })

                output = 'Corona-Ampel (7 Tage Inzidenz) für ' + result.bundesland + ' vom ' + result.lastupdate + '.<br/>\n'

                output += 'Gesamt: ' + result.overall + '.<br/>\n'

                result.landkreise.filter(lk => {
                    return (useFilter && filterLK.filter(flk => lk.lk.toLowerCase().includes(flk.toLowerCase())).length !== 0) || !useFilter
                }).sort((a,b) => a.lk.localeCompare(b.lk)).forEach(lk => output += '<span class='+ lk.color +'>' + lk.text + ', Ampel: ' + lk.color + '.</span><br/>\n')

                outputDiv.innerHTML = output
        }
        getData();
        </script>
    </body>
    
</html>

Sieht dann so aus wenn auf Niedersachsen und die Orte wie oben beschrieben gefiltert wird:
grafik

@Robibobi1992

This comment has been minimized.

Copy link

@Robibobi1992 Robibobi1992 commented Oct 24, 2020

Super vielen Dank!

@capsload2

This comment has been minimized.

Copy link

@capsload2 capsload2 commented Oct 24, 2020

Hallo Leute,

ich weiß nicht, wie ich jemanden Privat kontaktieren kann - deshalb frage ich hier :/

Wäre es möglich, den "Score" aus dieser URL abzufangen und anzuzeigen als Widget?

https://pr0gramm.com/api/profile/info?name=5z

Wobei "5z" vom User einzugeben wäre (das ist der Username, soll also flexibel sein)

Als Bildchen: https://vignette.wikia.nocookie.net/pr0gramm/images/f/fc/Pr0gramm_Logo.svg.png/revision/latest/scale-to-width-down/230?cb=20150527200407
Als Text neben dem "Score" Ergebnis: "Punkte:"

Danke :3

@js94x

This comment has been minimized.

Copy link

@js94x js94x commented Oct 24, 2020

Hallo zusammen,

Mich würde interessieren wie eine Beispiel URL mit eingesetzten Koordinaten aussieht? Ich würde das gerne mit Curl machen, bekomme es aber nicht hin die „geometry=„ Daten richtig zu interpretieren und dann einzusetzen.

Gruß

Ralf

Mit curl läuft es bei mir so:

lat="50.081"
lon="8.855"

curl "https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,cases7_per_100k&geometry=${lon}%2C${lat}&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnGeometry=false&outSR=4326&f=json"

Du kannst die Ausgabe dann an das Kommandozeilentool jq übergeben um einen bestimmten Wert auszulesen:
jq .features[0].attributes.GEN
jq .features[0].attributes.cases7_per_100k

@AleksCee

This comment has been minimized.

Copy link

@AleksCee AleksCee commented Oct 24, 2020

@js94x - auf der Seite API-Explorer kannst Du dir alles was Du brauchst zusammensuchen und dann wird dir die URL angezeigt die genau die Abfrage macht, die Du haben willst.

Gruß, Alex

@Keyes

This comment has been minimized.

Copy link