Skip to content

Instantly share code, notes, and snippets.

@Baumchen

Baumchen/incidence.js

Forked from kevinkub/incidence.js
Last active Nov 25, 2020
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
// Multiple values: Use with `48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA` as widget parameter e.g.
// Current location can be used with: `current,NAME;48.809,11.897,KEH;49.122,12.549,LA` as widget parameter e.g.
const apiUrl = (location) => `https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,last_update,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`
function parseLocation(location) {
const fixedCoordinates = location.split(",")
if (fixedCoordinates[0] === "current") {
return {
current_location: true,
name: fixedCoordinates.length >= 2 ? fixedCoordinates[1] : null,
}
}
return {
latitude: parseFloat(fixedCoordinates[0]),
longitude: parseFloat(fixedCoordinates[1]),
name: fixedCoordinates.length >= 3 ? fixedCoordinates[2] : null,
}
}
async function dataForLocation(location) {
let locationData
if (location.current_location) {
Location.setAccuracyToThreeKilometers()
locationData = await Location.current()
} else {
locationData = location
}
const data = await new Request(apiUrl(locationData)).loadJSON()
if (!data || !data.features || !data.features.length) {
return {
error: "Keine Ergebnisse für den aktuellen Ort gefunden.",
}
}
const attr = data.features[0].attributes
const incidence = attr.cases7_per_100k.toFixed(1)
const cityName = location["name"] ? location["name"] : attr.GEN
const lastUpdate = parseInt(attr.last_update.split(".")[0])
return {
incidence: incidence,
name: cityName,
updateDay: lastUpdate,
}
}
let widget = await createWidget()
if (!config.runsInWidget) {
await widget.presentSmall()
}
Script.setWidget(widget)
Script.complete()
async function createWidget(items) {
let parameters
if (args.widgetParameter) {
parameters = args.widgetParameter
} else {
parameters = "current"
}
const locations = parameters.split(";").map(parseLocation)
const list = new ListWidget()
const header = list.addStack()
header.layoutHorizontally()
header.centerAlignContent()
const headerTitle = header.addText("🦠 Inzidenz".toUpperCase())
headerTitle.font = Font.mediumSystemFont(13)
headerTitle.leftAlignText()
header.addSpacer()
const currentDate = new Date().getDate()
const dateLabel = header.addText(currentDate + ".")
dateLabel.font = Font.mediumSystemFont(10)
dateLabel.rightAlignText()
list.addSpacer()
for (location of locations) {
const data = await dataForLocation(location)
if (data["error"]) {
list.addText(data["error"])
continue
}
const incidence = data["incidence"]
const cityName = data["name"]
const line = list.addStack()
line.layoutHorizontally()
line.centerAlignContent()
line.useDefaultPadding()
const label = line.addText(incidence + "")
label.font = Font.boldSystemFont(24)
label.leftAlignText()
if (incidence >= 50) {
label.textColor = Color.red()
} else if (incidence >= 35) {
label.textColor = Color.orange()
} else {
label.textColor = Color.green()
}
line.addSpacer()
if (currentDate !== data.updateDay) {
const oldData = line.addText("⌛")
oldData.font = Font.systemFont(10)
}
const name = line.addText(cityName)
name.rightAlignText()
if (currentDate !== data.updateDay) {
name.textColor = Color.orange()
}
}
return list
}
@Baumchen

This comment has been minimized.

Copy link
Owner Author

@Baumchen Baumchen commented Oct 20, 2020

Mehrere Locations in einem Widget:

Screenshot 2020-10-20 at 17 31 53

@NoTrace-Kai

This comment has been minimized.

Copy link

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

Hi,
aber wie stelle ich die verschiedenen Orte ein?
Habe es gefunden ;)
// Multiple values: Use with 48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA as parameter e.g.
Danke!

@entoryFB

This comment has been minimized.

Copy link

@entoryFB entoryFB commented Oct 21, 2020

Vielen DANK. Genau das suchte ich. Leider geht es im automatischen TAG/Nacht Modus nicht. Bei Tagmodus ist der Text nicht lesbar, da schwarz. Gibt es hierzu eine Lösung

@Baumchen

This comment has been minimized.

Copy link
Owner Author

@Baumchen Baumchen commented Oct 21, 2020

Vielen DANK. Genau das suchte ich. Leider geht es im automatischen TAG/Nacht Modus nicht. Bei Tagmodus ist der Text nicht lesbar, da schwarz. Gibt es hierzu eine Lösung

Moin moin, ich hab das ganze Dark Mode Zeug einfach mal rausgeschmissen, sieht jetzt passend aus in beiden Fällen bei mir. Evtl. probierst du es mal aus.

@1121PD

This comment has been minimized.

Copy link

@1121PD 1121PD commented Oct 21, 2020

Hi,
aber wie stelle ich die verschiedenen Orte ein?
Habe es gefunden ;)
// Multiple values: Use with 48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA as parameter e.g.
Danke!

Ich habe es noch nicht verstanden, selbst wenn ich das Script einfach nur kopiere wird mir nur mein aktueller Standort angezeigt wenn ich es abrufe??!!

@Baumchen

This comment has been minimized.

Copy link
Owner Author

@Baumchen Baumchen commented Oct 21, 2020

Hi,
aber wie stelle ich die verschiedenen Orte ein?
Habe es gefunden ;)
// Multiple values: Use with 48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA as parameter e.g.
Danke!

Ich habe es noch nicht verstanden, selbst wenn ich das Script einfach nur kopiere wird mir nur mein aktueller Standort angezeigt wenn ich es abrufe??!!

Du kannst in den Widget-Einstellungen (also auf der Rückseite der Widget-Karte) einen Parameter setzen: Da kannst du eben z.B. "48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA" eintragen und hast dann die 3 Standorte drin.

Syntax ist einfach "LATITUDE_1,LONGITUDE_1,NAME_1;LATITUDE_2,LONGITUDE_2,NAME_2;LATITUDE_3,LONGITUDE_3,NAME_3".

@1121PD

This comment has been minimized.

Copy link

@1121PD 1121PD commented Oct 21, 2020

Hi,
aber wie stelle ich die verschiedenen Orte ein?
Habe es gefunden ;)
// Multiple values: Use with 48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA as parameter e.g.
Danke!

Ich habe es noch nicht verstanden, selbst wenn ich das Script einfach nur kopiere wird mir nur mein aktueller Standort angezeigt wenn ich es abrufe??!!

Du kannst in den Widget-Einstellungen (also auf der Rückseite der Widget-Karte) einen Parameter setzen: Da kannst du eben z.B. "48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA" eintragen und hast dann die 3 Standorte drin.

Syntax ist einfach "LATITUDE_1,LONGITUDE_1,NAME_1;LATITUDE_2,LONGITUDE_2,NAME_2;LATITUDE_3,LONGITUDE_3,NAME_3".

Ah jetzt...ich dachte ich muss dein Script oben unter Multiple Values bearbeiten weil da auch die Koordinaten etc. stehen.

Lieben Dank für die schnelle Hilfe 👍🏻🙂

@entoryFB

This comment has been minimized.

Copy link

@entoryFB entoryFB commented Oct 21, 2020

Vielen DANK. Genau das suchte ich. Leider geht es im automatischen TAG/Nacht Modus nicht. Bei Tagmodus ist der Text nicht lesbar, da schwarz. Gibt es hierzu eine Lösung

Moin moin, ich hab das ganze Dark Mode Zeug einfach mal rausgeschmissen, sieht jetzt passend aus in beiden Fällen bei mir. Evtl. probierst du es mal aus.

Perfekt. Vielen DANK

@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?

@Baumchen

This comment has been minimized.

Copy link
Owner Author

@Baumchen Baumchen commented Oct 21, 2020

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

Da würde ich vmtl. eher mal im originalen Gist nachfragen: https://gist.github.com/kevinkub/46caebfebc7e26be63403a7f0587f664 da gibt's etwas mehr Aktivität als hier, das ist ja nur eine Variante.

Scheint aber als gäbe es hier (https://www.data.gv.at/suche/?sort=abc#C) tatsächlich ein paar APIs (zwar nicht die Inzidenz, aber zumindest die Anzahl der neuen Fälle pro Tag: https://www.data.gv.at/katalog/dataset/469acdc1-998f-4d04-b5ca-6a722130e85e).
Da kann man sich vmtl. relativ einfach was draus basteln.

Hier (https://covid19-dashboard.ages.at/data/JsonData.json) kriegt man sogar alle Daten die im Board von Österreich angezeigt werden, aber das sind schon sehr viele Daten, die da geladen werden müssen.

Bzw. hier gibt es sogar nach GKZ die Inzidenz: https://covid19-dashboard.ages.at/data/CovidFaelle_GKZ.csv ..

@MirkoKas

This comment has been minimized.

Copy link

@MirkoKas MirkoKas commented Oct 21, 2020

Die Idee mit mehreren Orten ist super. Kann ich sowohl den aktuellen Ort als auch weitere feste Orte hinterlegen? Ähnlich wie es in der Wetter App von Apple der Fall ist.

Hätte gerne auf Reisen den jeweiligen Wert und zusätzlich immer auch noch den Wert meiner Heimatstadt.

@idominiki

This comment has been minimized.

Copy link

@idominiki idominiki commented Oct 22, 2020

Die Idee mit mehreren Orten ist super. Kann ich sowohl den aktuellen Ort als auch weitere feste Orte hinterlegen? Ähnlich wie es in der Wetter App von Apple der Fall ist.

Hätte gerne auf Reisen den jeweiligen Wert und zusätzlich immer auch noch den Wert meiner Heimatstadt.

Das wäre wirklich cool!

@NoTrace-Kai

This comment has been minimized.

Copy link

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

Hi ...
Ich habe mir so einen "Smart Stapel" gemacht, in dem ich 3 Forks eingebunden haben.
01 - Fork von marcelrebmann
02 - Fork von Baumchen
03 - Fork von malakka
So kann ich zwischen den verschiedenen Ansichten wählen ... so kannst Du auch einfach verschiedene Orte in einen
"Smart Stapel" packen ... zuerst je ein Widget erstellen und dann ineinander packen.
CU

@MirkoKas

This comment has been minimized.

Copy link

@MirkoKas MirkoKas commented Oct 22, 2020

Hi ...
Ich habe mir so einen "Smart Stapel" gemacht, in dem ich 3 Forks eingebunden haben.
01 - Fork von marcelrebmann
02 - Fork von Baumchen
03 - Fork von malakka
So kann ich zwischen den verschiedenen Ansichten wählen ... so kannst Du auch einfach verschiedene Orte in einen
"Smart Stapel" packen ... zuerst je ein Widget erstellen und dann ineinander packen.
CU

Schon klar. Ich habe das Widget auch in einem Smart Stapel, aber die Idee dieses Widgets hier ist es ja gerade mehrere Orte in einem Widget zu sehen. Da wäre es echt toll wenn der aktuelle Ort und feste Orte in einem Widget kombiniert werden könnten.

@Baumchen

This comment has been minimized.

Copy link
Owner Author

@Baumchen Baumchen commented Oct 22, 2020

@MirkoKas, @idominiki, @NoTrace-Kai

Ist geupdated, einfach als Parameter "current" statt der Longitude, Latitude anzugeben. Als Name wir dann der aktuelle Ort verwendet, wenn man "current,HIER" nimmt, wird immer "HIER" als Name angezeigt.

Als Beispiel: current,NAME;48.809,11.897,KEH;49.122,12.549,LA.

@MirkoKas

This comment has been minimized.

Copy link

@MirkoKas MirkoKas commented Oct 22, 2020

@Baumchen Super! Vielen Dank für das Update. Das mit der Location habe ich selbst einfach nicht hinbekommen.
Ich habe mir noch das letzte Refresh Datum mit in das Skript integriert und jetzt ist es für mich perfekt.

Ich nutze das Widget übrigens in der mittleren Größe und dann schaut es bei mir so aus.
DFE38AEA-17E4-4142-8D81-E2F38A2AC0A7

@Baumchen

This comment has been minimized.

Copy link
Owner Author

@Baumchen Baumchen commented Oct 23, 2020

@mgfall

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

Probier mal das hier aus:
https://gist.github.com/Baumchen/b8b9aaf5ba0aebef173a4f956a3b4290

Denke, das sollte soweit auch funktionieren..

@AlScho88

This comment has been minimized.

Copy link

@AlScho88 AlScho88 commented Oct 23, 2020

Wie kann ich denn das Datum einfügen? 😊

@apbonn

This comment has been minimized.

Copy link

@apbonn apbonn commented Oct 23, 2020

Kann ich mir auch den Durchschnitt für ganz Deutschland anzeigen lassen oder alle Neuinfektionen pro Tag?

@MirkoKas

This comment has been minimized.

Copy link

@MirkoKas MirkoKas commented Oct 23, 2020

Wie kann ich denn das Datum einfügen? 😊

Ich pack dir mal meinen Code rein - geht sicherlich besser und ist auch nur im Hinblick auf die mittleren Widgets angepasst:

// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
// Multiple values: Use with 48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA as widget parameter e.g.
// Current location can be used with: current,NAME;48.809,11.897,KEH;49.122,12.549,LA as widget parameter e.g.

const apiUrl = (location) => https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,cases7_per_100k,last_update&geometry=${location.longitude.toFixed(3)}%2C${location.latitude.toFixed(3)}&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnGeometry=false&outSR=4326&f=json

function parseLocation (location) {
const fixedCoordinates = location.split(",")

if (fixedCoordinates[0] === "current") {
return {
current_location: true,
name: fixedCoordinates.length >= 2 ? fixedCoordinates[1] : null,
}
}

return {
latitude: parseFloat(fixedCoordinates[0]),
longitude: parseFloat(fixedCoordinates[1]),
name: fixedCoordinates.length >= 3 ? fixedCoordinates[2] : null,
}
}

async function dataForLocation(location) {
let locationData
if (location.current_location) {
Location.setAccuracyToThreeKilometers()
locationData = await Location.current()
} else {
locationData = location
}

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

if (!data || !data.features || !data.features.length) {
return {
error: "Keine Ergebnisse für den aktuellen Ort gefunden.",
}
}

const attr = data.features[0].attributes
const incidence = attr.cases7_per_100k.toFixed(1)
const lastRefresh = attr.last_update
const cityName = location["name"] ? location["name"] : attr.GEN

return {
incidence: incidence,
name: cityName,
date: lastRefresh
}
}

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

Script.setWidget(widget)
Script.complete()

async function createWidget(items) {
let parameters

if (args.widgetParameter) {
parameters = args.widgetParameter
} else {
parameters = "current"
}

const locations = parameters.split(";").map(parseLocation)

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

list.addSpacer()

for (location of locations) {
const data = await dataForLocation(location)

if (data["error"]) {
list.addText(data["error"])
continue
}

const incidence = data["incidence"]
const cityName = data["name"]
const lastRefresh = data["date"]

const line = list.addStack()
line.layoutHorizontally()
line.centerAlignContent()
line.useDefaultPadding()

const label = line.addText(incidence+"")
label.font = Font.boldSystemFont(24)
label.leftAlignText()

if(incidence >= 50) {
label.textColor = Color.red()
} else if(incidence >= 35) {
label.textColor = Color.orange()
} else {
label.textColor = Color.green()
}

line.addSpacer()

const name = line.addText(cityName)
name.rightAlignText()

line.addSpacer()

const label1 = line.addText(lastRefresh.substr(0,10))
label1.font = Font.mediumSystemFont(6)
}

return list
}

@Baumchen

This comment has been minimized.

Copy link
Owner Author

@Baumchen Baumchen commented Oct 24, 2020

Wie kann ich denn das Datum einfügen? 😊

Jetzt wird rechts oben das aktuelle Datum angezeigt.
Wenn die Daten der API nicht am selben Tag sind, dann wird der Ort in Orange angezeigt und ein kleines Icon davor platziert.
Das sollte ja eigentlich reichen, um zu sehen, ob die Daten aktuell sind.

Normal:
IMG_8980

Veraltete Daten:
IMG_8981

@entoryFB

This comment has been minimized.

Copy link

@entoryFB entoryFB commented Oct 25, 2020

Wie kann ich denn das Datum einfügen? 😊

Jetzt wird rechts oben das aktuelle Datum angezeigt.
Wenn die Daten der API nicht am selben Tag sind, dann wird der Ort in Orange angezeigt und ein kleines Icon davor platziert.
Das sollte ja eigentlich reichen, um zu sehen, ob die Daten aktuell sind.

Normal:
IMG_8980

Veraltete Daten:
IMG_8981

Guten Morgen
Bei mir kommt dann
2020-10-25 08:49:09: Error on line 5: SyntaxError: Unexpected token ':'. Expected ';' after variable declaration.

@Hansiklein

This comment has been minimized.

Copy link

@Hansiklein Hansiklein commented Oct 27, 2020

Wie kann ich denn das Datum einfügen? 😊

Ich pack dir mal meinen Code rein - geht sicherlich besser und ist auch nur im Hinblick auf die mittleren Widgets angepasst:

// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
// Multiple values: Use with 48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA as widget parameter e.g.
// Current location can be used with: current,NAME;48.809,11.897,KEH;49.122,12.549,LA as widget parameter e.g.

const apiUrl = (location) => https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,cases7_per_100k,last_update&geometry=${location.longitude.toFixed(3)}%2C${location.latitude.toFixed(3)}&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnGeometry=false&outSR=4326&f=json

function parseLocation (location) {
const fixedCoordinates = location.split(",")

if (fixedCoordinates[0] === "current") {
return {
current_location: true,
name: fixedCoordinates.length >= 2 ? fixedCoordinates[1] : null,
}
}

return {
latitude: parseFloat(fixedCoordinates[0]),
longitude: parseFloat(fixedCoordinates[1]),
name: fixedCoordinates.length >= 3 ? fixedCoordinates[2] : null,
}
}

async function dataForLocation(location) {
let locationData
if (location.current_location) {
Location.setAccuracyToThreeKilometers()
locationData = await Location.current()
} else {
locationData = location
}

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

if (!data || !data.features || !data.features.length) {
return {
error: "Keine Ergebnisse für den aktuellen Ort gefunden.",
}
}

const attr = data.features[0].attributes
const incidence = attr.cases7_per_100k.toFixed(1)
const lastRefresh = attr.last_update
const cityName = location["name"] ? location["name"] : attr.GEN

return {
incidence: incidence,
name: cityName,
date: lastRefresh
}
}

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

Script.setWidget(widget)
Script.complete()

async function createWidget(items) {
let parameters

if (args.widgetParameter) {
parameters = args.widgetParameter
} else {
parameters = "current"
}

const locations = parameters.split(";").map(parseLocation)

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

list.addSpacer()

for (location of locations) {
const data = await dataForLocation(location)

if (data["error"]) {
list.addText(data["error"])
continue
}

const incidence = data["incidence"]
const cityName = data["name"]
const lastRefresh = data["date"]

const line = list.addStack()
line.layoutHorizontally()
line.centerAlignContent()
line.useDefaultPadding()

const label = line.addText(incidence+"")
label.font = Font.boldSystemFont(24)
label.leftAlignText()

if(incidence >= 50) {
label.textColor = Color.red()
} else if(incidence >= 35) {
label.textColor = Color.orange()
} else {
label.textColor = Color.green()
}

line.addSpacer()

const name = line.addText(cityName)
name.rightAlignText()

line.addSpacer()

const label1 = line.addText(lastRefresh.substr(0,10))
label1.font = Font.mediumSystemFont(6)
}

return list
}

@user: MirkoKas

Hallo, würde gerne dein Widget verwenden. Leider bekomme ich die Fehlermeldung:

Error on line 5: SyntaxError: Unexpected token ':'. Expected ';' after variable declaration.

Weißt Du an was das liegt ?

Servus
Hans

@Baumchen

This comment has been minimized.

Copy link
Owner Author

@Baumchen Baumchen commented Oct 27, 2020

Wie kann ich denn das Datum einfügen? 😊

Ich pack dir mal meinen Code rein - geht sicherlich besser und ist auch nur im Hinblick auf die mittleren Widgets angepasst:
// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
// Multiple values: Use with 48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA as widget parameter e.g.
// Current location can be used with: current,NAME;48.809,11.897,KEH;49.122,12.549,LA as widget parameter e.g.
const apiUrl = (location) => https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,cases7_per_100k,last_update&geometry=${location.longitude.toFixed(3)}%2C${location.latitude.toFixed(3)}&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnGeometry=false&outSR=4326&f=json
function parseLocation (location) {
const fixedCoordinates = location.split(",")
if (fixedCoordinates[0] === "current") {
return {
current_location: true,
name: fixedCoordinates.length >= 2 ? fixedCoordinates[1] : null,
}
}
return {
latitude: parseFloat(fixedCoordinates[0]),
longitude: parseFloat(fixedCoordinates[1]),
name: fixedCoordinates.length >= 3 ? fixedCoordinates[2] : null,
}
}
async function dataForLocation(location) {
let locationData
if (location.current_location) {
Location.setAccuracyToThreeKilometers()
locationData = await Location.current()
} else {
locationData = location
}
const data = await new Request(apiUrl(locationData)).loadJSON()
if (!data || !data.features || !data.features.length) {
return {
error: "Keine Ergebnisse für den aktuellen Ort gefunden.",
}
}
const attr = data.features[0].attributes
const incidence = attr.cases7_per_100k.toFixed(1)
const lastRefresh = attr.last_update
const cityName = location["name"] ? location["name"] : attr.GEN
return {
incidence: incidence,
name: cityName,
date: lastRefresh
}
}
let widget = await createWidget()
if (!config.runsInWidget) {
await widget.presentSmall()
}
Script.setWidget(widget)
Script.complete()
async function createWidget(items) {
let parameters
if (args.widgetParameter) {
parameters = args.widgetParameter
} else {
parameters = "current"
}
const locations = parameters.split(";").map(parseLocation)
const list = new ListWidget()
const header = list.addText("🦠 Inzidenz".toUpperCase())
header.font = Font.mediumSystemFont(13)
list.addSpacer()
for (location of locations) {
const data = await dataForLocation(location)
if (data["error"]) {
list.addText(data["error"])
continue
}
const incidence = data["incidence"]
const cityName = data["name"]
const lastRefresh = data["date"]
const line = list.addStack()
line.layoutHorizontally()
line.centerAlignContent()
line.useDefaultPadding()
const label = line.addText(incidence+"")
label.font = Font.boldSystemFont(24)
label.leftAlignText()
if(incidence >= 50) {
label.textColor = Color.red()
} else if(incidence >= 35) {
label.textColor = Color.orange()
} else {
label.textColor = Color.green()
}
line.addSpacer()
const name = line.addText(cityName)
name.rightAlignText()
line.addSpacer()
const label1 = line.addText(lastRefresh.substr(0,10))
label1.font = Font.mediumSystemFont(6)
}
return list
}

@user: MirkoKas

Hallo, würde gerne dein Widget verwenden. Leider bekomme ich die Fehlermeldung:

Error on line 5: SyntaxError: Unexpected token ':'. Expected ';' after variable declaration.

Weißt Du an was das liegt ?

Servus
Hans

Du musst in Zeile 5 (von dem Skript von MirkoKas die URL in ``` Backticks packen.

Wenn du das hier gepostete Gist verwendest hast du die Anzeige wie im letzten Screenshot (da steht auch das Datum drin, zumindest der Tag eben).

@Hansiklein

This comment has been minimized.

Copy link

@Hansiklein Hansiklein commented Oct 27, 2020

@Baumchen:
Danke Dir das funktioniert jetzt.
Wie kann man bei deinem Widget, mit den 3 Orten, wenn ich die breite Ausführung nutze, den angegeben Tag um Monat und Jahr erweitern ?

@entoryFB

This comment has been minimized.

Copy link

@entoryFB entoryFB commented Oct 27, 2020

Wie kann ich denn das Datum einfügen? 😊

Ich pack dir mal meinen Code rein - geht sicherlich besser und ist auch nur im Hinblick auf die mittleren Widgets angepasst:
// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
// Multiple values: Use with 48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA as widget parameter e.g.
// Current location can be used with: current,NAME;48.809,11.897,KEH;49.122,12.549,LA as widget parameter e.g.
const apiUrl = (location) => https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,cases7_per_100k,last_update&geometry=${location.longitude.toFixed(3)}%2C${location.latitude.toFixed(3)}&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnGeometry=false&outSR=4326&f=json
function parseLocation (location) {
const fixedCoordinates = location.split(",")
if (fixedCoordinates[0] === "current") {
return {
current_location: true,
name: fixedCoordinates.length >= 2 ? fixedCoordinates[1] : null,
}
}
return {
latitude: parseFloat(fixedCoordinates[0]),
longitude: parseFloat(fixedCoordinates[1]),
name: fixedCoordinates.length >= 3 ? fixedCoordinates[2] : null,
}
}
async function dataForLocation(location) {
let locationData
if (location.current_location) {
Location.setAccuracyToThreeKilometers()
locationData = await Location.current()
} else {
locationData = location
}
const data = await new Request(apiUrl(locationData)).loadJSON()
if (!data || !data.features || !data.features.length) {
return {
error: "Keine Ergebnisse für den aktuellen Ort gefunden.",
}
}
const attr = data.features[0].attributes
const incidence = attr.cases7_per_100k.toFixed(1)
const lastRefresh = attr.last_update
const cityName = location["name"] ? location["name"] : attr.GEN
return {
incidence: incidence,
name: cityName,
date: lastRefresh
}
}
let widget = await createWidget()
if (!config.runsInWidget) {
await widget.presentSmall()
}
Script.setWidget(widget)
Script.complete()
async function createWidget(items) {
let parameters
if (args.widgetParameter) {
parameters = args.widgetParameter
} else {
parameters = "current"
}
const locations = parameters.split(";").map(parseLocation)
const list = new ListWidget()
const header = list.addText("🦠 Inzidenz".toUpperCase())
header.font = Font.mediumSystemFont(13)
list.addSpacer()
for (location of locations) {
const data = await dataForLocation(location)
if (data["error"]) {
list.addText(data["error"])
continue
}
const incidence = data["incidence"]
const cityName = data["name"]
const lastRefresh = data["date"]
const line = list.addStack()
line.layoutHorizontally()
line.centerAlignContent()
line.useDefaultPadding()
const label = line.addText(incidence+"")
label.font = Font.boldSystemFont(24)
label.leftAlignText()
if(incidence >= 50) {
label.textColor = Color.red()
} else if(incidence >= 35) {
label.textColor = Color.orange()
} else {
label.textColor = Color.green()
}
line.addSpacer()
const name = line.addText(cityName)
name.rightAlignText()
line.addSpacer()
const label1 = line.addText(lastRefresh.substr(0,10))
label1.font = Font.mediumSystemFont(6)
}
return list
}

@user: MirkoKas
Hallo, würde gerne dein Widget verwenden. Leider bekomme ich die Fehlermeldung:
Error on line 5: SyntaxError: Unexpected token ':'. Expected ';' after variable declaration.
Weißt Du an was das liegt ?
Servus
Hans

Du musst in Zeile 5 (von dem Skript von MirkoKas die URL in ``` Backticks packen.

Wenn du das hier gepostete Gist verwendest hast du die Anzeige wie im letzten Screenshot (da steht auch das Datum drin, zumindest der Tag eben).

Stelle mich irgendwie dumm an. Ich bekomme es nicht zum laufen. Kann man den richtigen Code vielleicht nochmal richtig einstellen.
Danke

@MirkoKas

This comment has been minimized.

Copy link

@MirkoKas MirkoKas commented Oct 27, 2020

// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
// Multiple values: Use with 48.260,11.439,DAH;48.809,11.897,KEH;49.122,12.549,LA as widget parameter e.g.
// Current location can be used with: current,NAME;48.809,11.897,KEH;49.122,12.549,LA as widget parameter e.g.

const apiUrl = (location) => https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,cases7_per_100k,last_update&geometry=${location.longitude.toFixed(3)}%2C${location.latitude.toFixed(3)}&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnGeometry=false&outSR=4326&f=json

function parseLocation (location) {
const fixedCoordinates = location.split(",")

if (fixedCoordinates[0] === "current") {
return {
current_location: true,
name: fixedCoordinates.length >= 2 ? fixedCoordinates[1] : null,
}
}

return {
latitude: parseFloat(fixedCoordinates[0]),
longitude: parseFloat(fixedCoordinates[1]),
name: fixedCoordinates.length >= 3 ? fixedCoordinates[2] : null,
}
}

async function dataForLocation(location) {
let locationData
if (location.current_location) {
Location.setAccuracyToThreeKilometers()
locationData = await Location.current()
} else {
locationData = location
}

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

if (!data || !data.features || !data.features.length) {
return {
error: "Keine Ergebnisse für den aktuellen Ort gefunden.",
}
}

const attr = data.features[0].attributes
const incidence = attr.cases7_per_100k.toFixed(1)
const lastRefresh = attr.last_update
const cityName = location["name"] ? location["name"] : attr.GEN

return {
incidence: incidence,
name: cityName,
date: lastRefresh
}
}

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

Script.setWidget(widget)
Script.complete()

async function createWidget(items) {
let parameters

if (args.widgetParameter) {
parameters = args.widgetParameter
} else {
parameters = "current"
}

const locations = parameters.split(";").map(parseLocation)

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

list.addSpacer()

for (location of locations) {
const data = await dataForLocation(location)

if (data["error"]) {
list.addText(data["error"])
continue
}

const incidence = data["incidence"]
const cityName = data["name"]
const lastRefresh = data["date"]

const line = list.addStack()
line.layoutHorizontally()
line.centerAlignContent()
line.useDefaultPadding()

const label = line.addText(incidence+"")
label.font = Font.boldSystemFont(24)
label.leftAlignText()

if(incidence >= 50) {
label.textColor = Color.red()
} else if(incidence >= 35) {
label.textColor = Color.orange()
} else {
label.textColor = Color.green()
}

line.addSpacer()

const name = line.addText(cityName)
name.rightAlignText()

line.addSpacer()

const label1 = line.addText(lastRefresh.substr(0,10))
label1.font = Font.mediumSystemFont(6)
}

return list
}

@MirkoKas

This comment has been minimized.

Copy link

@MirkoKas MirkoKas commented Oct 27, 2020

Hoffe jetzt passt der Code. Das einfügen am iPhone klappt bei mir nicht so richtig. Einfach alles aus meinem vorherigen Post in ein Script einfügen.

@entoryFB

This comment has been minimized.

Copy link

@entoryFB entoryFB commented Oct 27, 2020

Hoffe jetzt passt der Code. Das einfügen am iPhone klappt bei mir nicht so richtig. Einfach alles aus meinem vorherigen Post in ein Script einfügen.

Danke.

@Pr3mut05

This comment has been minimized.

Copy link

@Pr3mut05 Pr3mut05 commented Oct 29, 2020

Vielen Dank für das tolle Widget
Auf meinem Blog gibt es einen kleinen Beitrag dazu

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.