Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
const apiUrl = "https://pass.telekom.de/api/service/generic/v1/status"
let widget = await createWidget()
widget.backgroundColor = new Color("#777777")
if (!config.runsInWidget) {
await widget.presentSmall()
}
Script.setWidget(widget)
Script.complete()
async function createWidget(items) {
let fm = FileManager.local()
let dir = fm.documentsDirectory()
let path = fm.joinPath(dir, "scriptable-telekom.json")
const list = new ListWidget()
list.addSpacer(16)
try {
let r = new Request(apiUrl)
// API only answers for mobile Safari
r.headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1"
}
let data, fresh = 0
try {
// Fetch data from pass.telekom.de
data = await r.loadJSON()
// Write JSON to iCloud file
fm.writeString(path, JSON.stringify(data, null, 2))
fresh = 1
} catch (err) {
// Read data from iCloud file
data = JSON.parse(fm.readString(path), null)
if (!data || !data.usedPercentage) {
const errorList = new ListWidget()
errorList.addText("Please disable WiFi for initial execution.")
return errorList
}
}
const line1 = list.addText("Telekom")
line1.font = Font.mediumSystemFont(12)
const line2 = list.addText(data.usedPercentage + "%")
line2.font = Font.boldSystemFont(36)
line2.textColor = Color.green()
if (data.usedPercentage >= 75) {
line2.textColor = Color.orange()
} else if (data.usedPercentage >= 90) {
line2.textColor = Color.red()
}
const line3 = list.addText(data.usedVolumeStr + " / " + data.initialVolumeStr)
line3.font = Font.mediumSystemFont(12)
list.addSpacer(16)
let line4, line5
if (data.remainingTimeStr) {
line4 = list.addText("Remaining time:")
line4.font = Font.mediumSystemFont(12)
line5 = list.addText(data.remainingTimeStr)
line5.font = Font.mediumSystemFont(12)
}
// Gray out if local data instead of Telekom API data:
if (fresh == 0) {
line1.textColor = Color.darkGray()
line2.textColor = Color.darkGray()
line3.textColor = Color.darkGray()
if (data.remainingTimeStr) {
line4.textColor = Color.darkGray()
line5.textColor = Color.darkGray()
}
}
} catch(err) {
list.addText("Error fetching JSON from https://pass.telekom.de/api/service/generic/v1/status")
}
// Add time of last widget refresh:
list.addSpacer(4)
const now = new Date();
const timeLabel = list.addDate(now)
timeLabel.font = Font.mediumSystemFont(10)
timeLabel.centerAlignText()
timeLabel.applyTimeStyle()
timeLabel.textColor = Color.darkGray()
return list
}
@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 21, 2020

Telekom Widget für Scriptable + iOS 14

Das Widget holt die Verbrauchsdaten von pass.telekom.de und zeigt sie an. Sollte das iPhone in einem WLAN und die API der Telekom nicht erreichbar sein, greift es auf ein lokales Backup des JSONs zurück und zeigt die älteren Daten ausgegraut an.

Widget_colors

Installation

  • Scriptable installieren
  • telekom.js-Script von oben in Scriptable als Telekom abspeichern
  • vor dem allerersten Aufruf WLAN deaktivieren, um pass.telekom.de aufrufen zu können
  • Script Telekom ausführen
  • WLAN ggfs. wieder aktivieren

Widget

  • Widget zum Home Screen hinzufügen durch langes Drücken auf eine leere Stelle im Home Screen, dann das "+" oben
  • Widget konfigurieren ("Script: Telekom" und "When Interacting: Run Script" auswählen)
  • Warten (das Refresh-Intervall für Widgets wird von iOS begrenzt auf einem Wert zwischen 10 und 15 Minuten)

IMG_0256

Thanks

A big Thank you to @simonbs for making great apps like Scriptable, DataJar or Jayson.

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 21, 2020

Beim ersten Start sollte man nicht im WLAN sein, fällt mir gerade auf.

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 21, 2020

Die Schriftgrößen scheinen nur auf dem iPhone Xr gut zu passen.

@ThorstenKoebe

This comment has been minimized.

Copy link

@ThorstenKoebe ThorstenKoebe commented Oct 21, 2020

@Sillium

Wenn Du Zeile 13 in
let fm = FileManager.local()
änderst, sollte es nach meinem Test auch ohne icloud funktionieren

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 21, 2020

@Sillium

Wenn Du Zeile 13 in
let fm = FileManager.local()
änderst, sollte es nach meinem Test auch ohne icloud funktionieren

Sehr cool, danke.

@NiklasJordan

This comment has been minimized.

Copy link

@NiklasJordan NiklasJordan commented Oct 21, 2020

Funktioniert das auch mit Congstar (Tochter von Telekom)?

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 21, 2020

Funktioniert das auch mit Congstar (Tochter von Telekom)?

Wenn Du vom iPhone aus https://pass.telekom.de/api/service/generic/v1/status aufrufen kannst und ein JSON-File mit Inhalt zurückkommt, ja.

@NiklasJordan

This comment has been minimized.

Copy link

@NiklasJordan NiklasJordan commented Oct 21, 2020

Funktioniert das auch mit Congstar (Tochter von Telekom)?

Wenn Du vom iPhone aus https://pass.telekom.de/api/service/generic/v1/status aufrufen kannst und ein JSON-File mit Inhalt zurückkommt, ja.

Scheint auch mit Congstar zu funktionieren! Danke dir!

@Token2K

This comment has been minimized.

Copy link

@Token2K Token2K commented Oct 21, 2020

Ich habe den 5G Prepaid Jahrestarif, und hier kommt beim Gültigkeitsdatum ein Fetching Error.

{"nextUpdate":10800,"subscriptions":["tns","xtraSpeed","xtraRLH"],"title":"","hasOffers":true,"passName":"MagentaMobil Prepaid 5G - Jahrestarif","passStage":1,"validityPeriod":4,"initialVolume":2147483648,"initialVolumeStr":"2 GB","usedVolume":42598400,"usedPercentage":2,"usedVolumeStr":"40,62 MB","usedAt":1603270533000,"remainingSeconds":2454697,"passType":103}

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 21, 2020

Ich habe den 5G Prepaid Jahrestarif, und hier kommt beim Gültigkeitsdatum ein Fetching Error.

{"nextUpdate":10800,"subscriptions":["tns","xtraSpeed","xtraRLH"],"title":"","hasOffers":true,"passName":"MagentaMobil Prepaid 5G - Jahrestarif","passStage":1,"validityPeriod":4,"initialVolume":2147483648,"initialVolumeStr":"2 GB","usedVolume":42598400,"usedPercentage":2,"usedVolumeStr":"40,62 MB","usedAt":1603270533000,"remainingSeconds":2454697,"passType":103}

Code oben ist angepasst, kannst Du nochmal probieren, indem Du den Code neu als das Script in Scriptable abspeicherst.

@Alextubi

This comment has been minimized.

Copy link

@Alextubi Alextubi commented Oct 21, 2020

Entschuldigt bitte, aber ich bin zu dumm bei Punkt: Widget hinzufügen! Es wird mir wunderbar angezeigt, ich kann aber dann nur oben auf „Close“ drücken.... Was muss ich machen? Danke für die Hilfe und das tolle Script!!

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 21, 2020

Entschuldigt bitte, aber ich bin zu dumm bei Punkt: Widget hinzufügen! Es wird mir wunderbar angezeigt, ich kann aber dann nur oben auf „Close“ drücken.... Was muss ich machen? Danke für die Hilfe und das tolle Script!!

Was Du in Scriptable siehst, ist nicht das Widget, sondern eine Vorschau. Du musst es zum Home Screen hinzufügen durch langes Drücken auf eine leere Stelle im Home Screen. Dann oben das "+" drücken, dann Scriptable auswählen. Ab da solle es so aussehen wie in den 4 Screenshots oben.

@Alextubi

This comment has been minimized.

Copy link

@Alextubi Alextubi commented Oct 21, 2020

Vielen Dank!! Und sorry... 🙈

@Token2K

This comment has been minimized.

Copy link

@Token2K Token2K commented Oct 21, 2020

@Sillium:
Hmm, jetzt ist die Gültigkeit ausgeblendet, ohne Fehlermeldung.
Kannst du nicht die „remainingSeconds“ verarbeiten?
(Sind in diesen Fall ja 28.4days ... 18.11.2020)

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 21, 2020

@Sillium:
Hmm, jetzt ist die Gültigkeit ausgeblendet, ohne Fehlermeldung.
Kannst du nicht die „remainingSeconds“ verarbeiten?
(Sind in diesen Fall ja 28.4days ... 18.11.2020)

Klar ginge das, aber für Support und Weiterentwicklung habe ich nicht immer Zeit.

@gregor-hh

This comment has been minimized.

Copy link

@gregor-hh gregor-hh commented Oct 21, 2020

Hi, erstmal vielen Dank für den tollen Code👍

Bei mir (Telekom Prepaid M) wird leider auch keine verbleibende Zeit angezeigt.

Navigiere ich direkt auf pass.telekom.de steht da:
Gültig bis: 29. Oktober 2020

Würde mich über ein Update freuen,

Besten Dank

@Token2K

This comment has been minimized.

Copy link

@Token2K Token2K commented Oct 21, 2020

@Sillium:
Dein Projekt - Dein Invest an Zeit ... das ist doch klar!
Ich wollte ja nur auf den Bug hinweisen!
Da @gregor-hh das identische Problem hat, gehe ich von unterschiedlichen Abfragen zwischen
Postpaid- und Prepaid-Tarifen aus.
Beim Prepaid wird lt. Json mit „remainingSeconds“ gearbeitet - wie das beim Postpaid ausschaut,
kann ich mangels Vertrag nicht nachvollziehen.

Also wenn du dafür mal eine Lösung hast, wäre das super ... zumal es momentan auch keine App im Store gibt,
welche mit dem neuen Format der Telekom-Abfragen zurecht kommen.

Auch von mir natürlich ein grosses Danke für den Code!

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 21, 2020

Alles gut, wenn ich dafür mal Zeit habe, baue ich es ein.

@Token2K

This comment has been minimized.

Copy link

@Token2K Token2K commented Oct 21, 2020

Supi ... Merci!

@ghost

This comment has been minimized.

Copy link

@ghost ghost commented Oct 21, 2020

Moin @Sillium ... Ich hab überhaupt keinen Plan von der Materie, aber frage dennoch mal in die Runde.

Bei einem anderen Script das ich habe, wird die Farbe entsprechend des Modus - Hell / Dunkel - eingestellt.

Hierfür sind wohl diese CodeZeilen (siehe Bild) erforderlich - oder so ähnlich.

8352497A-D2A1-45F9-BCD6-0A2F52CBEDBE

Beim Wechsle zwischen hell und dunkel sieht’s echt bescheiden aus. (Siehe Bild)

EA13BFD2-3506-44DC-936D-08E3E274568C

Kann man das vllt noch einarbeiten? Ich bekomm‘ das selber nicht hin. 🙈

Grüße

@JanuschM-CGN

This comment has been minimized.

Copy link

@JanuschM-CGN JanuschM-CGN commented Oct 21, 2020

Weißer und Dunkelgrauer Hintergrund (wie meisten Widgets) - automatisch mit iOS System (Tag/Nacht) wechselnd - wäre spitze - Danke für die Arbeit

@NoTrace-Kai

This comment has been minimized.

Copy link

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

Dem schließe ich mich gerne an.
Vielen Dank für den Code hier ;)

@Token2K

This comment has been minimized.

Copy link

@Token2K Token2K commented Oct 21, 2020

@ALL:
für den Dark-Mode habe ich einfach Zeile 4 auskommentiert!
Orig:
widget.backgroundColor = new Color("#777777")
New:
// widget.backgroundColor = new Color("#777777")

@NoTrace-Kai

This comment has been minimized.

Copy link

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

Super. Danke.

@LupusArgentum

This comment has been minimized.

Copy link

@LupusArgentum LupusArgentum commented Oct 22, 2020

@Sillium:
Hmm, jetzt ist die Gültigkeit ausgeblendet, ohne Fehlermeldung.
Kannst du nicht die „remainingSeconds“ verarbeiten?
(Sind in diesen Fall ja 28.4days ... 18.11.2020)

Hier die Lösung:

else if (data.remainingSeconds) {
	  let days = Math.floor(data.remainingSeconds / 86400)
	  let hours = Math.floor((data.remainingSeconds % 86400) / 3600)
          line4 = list.addText("Remaining time:")
          line4.font = Font.mediumSystemFont(12)
	  line5 = list.addText(days + "d " + hours + "h")
          line5.font = Font.mediumSystemFont(12)
}

Klappt wunderbar bei mir. Gerne Feedback dalassen

@revunix

This comment has been minimized.

Copy link

@revunix revunix commented Oct 22, 2020

Cooles Script, kannst du das ggf. noch für andere Anbieter umschreiben?! Vodafone zb.

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 22, 2020

Cooles Script, kannst du das ggf. noch für andere Anbieter umschreiben?! Vodafone zb.

https://github.com/ThisIsBenny/iOS-Widgets

@matthiasertl

This comment has been minimized.

Copy link

@matthiasertl matthiasertl commented Oct 22, 2020

wow ! toll ! Vielen Dank für die haufen Arbeit !!
Wie kann ich es schaffen noch einen %-Balken einzufügen ?

@revunix

This comment has been minimized.

Copy link

@revunix revunix commented Oct 22, 2020

Cooles Script, kannst du das ggf. noch für andere Anbieter umschreiben?! Vodafone zb.

https://github.com/ThisIsBenny/iOS-Widgets

Klasse, danke für den Link!

@p3l4h0

This comment has been minimized.

Copy link

@p3l4h0 p3l4h0 commented Oct 22, 2020

@Silium die Farben hätte ich eher an den prozentualen verbrauch angepasst. Also wie viele Tage hat der Monat noch ->9 Tage
Er hatte 31 Tage macht also pro tag ca 3,2%.
Ich bin jetzt bei Tag 22 also darf ich im grünen Bereich maximal 70,96% verbraucht haben.
In dem Fall <=70,96-3,2/2 =96,36% -> GRÜN
<=70,96-3,2/2 =72,56% -> Gelb
">"72,56% -> ROT

@smar77

This comment has been minimized.

Copy link

@smar77 smar77 commented Oct 22, 2020

gibt es auch was ähnliches für/von O2 (1&1)?

@Token2K

This comment has been minimized.

Copy link

@Token2K Token2K commented Oct 22, 2020

@Lupus...:

... das passt super!
... Restlaufzeit stimmt mit der App oder pass. überein!

Merci!

@Lupus

This comment has been minimized.

Copy link

@Lupus Lupus commented Oct 22, 2020

@Token2K, you probably tagged me by mistake? :)

@Token2K

This comment has been minimized.

Copy link

@Token2K Token2K commented Oct 22, 2020

@Lupus:
... sorry, i mean @LupusArgentum !!!

@Abstauber3000

This comment has been minimized.

Copy link

@Abstauber3000 Abstauber3000 commented Oct 22, 2020

Suche wie @smar77 ein Widget für O2/1&1

@ThorstenKoebe

This comment has been minimized.

Copy link

@ThorstenKoebe ThorstenKoebe commented Oct 23, 2020

@Sillium
Wenn Du nach Zeile 17 noch
list.url = "https://pass.telekom.de"
einfügst, wird beim klick auf das Widget die Telekom-Seite aufgerufen

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 23, 2020

@Sillium
Wenn Du nach Zeile 17 noch
list.url = "https://pass.telekom.de"
einfügst, wird beim klick auf das Widget die Telekom-Seite aufgerufen

👏

@Token2K

This comment has been minimized.

Copy link

@Token2K Token2K commented Oct 23, 2020

@LupusArgentum:
... bei mir erscheint „Remaining time:“ aber nicht im Widget ... die Werte hingegen schon.
also „line4“(zeile 63/64) wird nicht „geprinted“.

@LupusArgentum

This comment has been minimized.

Copy link

@LupusArgentum LupusArgentum commented Oct 23, 2020

@LupusArgentum:
... bei mir erscheint „Remaining time:“ aber nicht im Widget ... die Werte hingegen schon.
also „line4“(zeile 63/64) wird nicht „geprinted“.

Korrekt, ist aber ein easy fix. Einfach copy paste. Habe meinen Code nochmal angepasst, kleinere Modifikationen kannst du aber auch selbst zu deinem Belieben vornehmen.

@Token2K

This comment has been minimized.

Copy link

@Token2K Token2K commented Oct 23, 2020

@LupusArgentum:
... jetzt passt alles super!
... Danke!

@gregor-hh

This comment has been minimized.

Copy link

@gregor-hh gregor-hh commented Oct 23, 2020

Alles Top jetzt mit den ganzen Ergänzungen ;-)

Hab jetzt noch Telekom die Farbe magenta gegönnt.

A6FDA8F4-DF92-4C21-9B51-50E0BFFFE8B6

Bekommt es jemand hin statt dem Text n kleines Telekomlogo als PNG einzufügen?

Dann wäre es Perfekt ;-)

@smar77

This comment has been minimized.

Copy link

@smar77 smar77 commented Oct 23, 2020

als Hintergrund Bild mit dem Logo an der richtigen Stelle, wäre wohl eine einfache Lösung

@misterjay1990

This comment has been minimized.

Copy link

@misterjay1990 misterjay1990 commented Oct 23, 2020

Danke für das Widget
Bin es vom original Telekom alt Widget gewohnt das die verbleibenden GB angezeigt werden. Hab somit beim Widget ein wenig Text ergänzt 😅
DA373E82-3F4C-4764-AF96-F4EC49D6A75E

@LupusArgentum

This comment has been minimized.

Copy link

@LupusArgentum LupusArgentum commented Oct 23, 2020

So schaut's bei mir aus:
img
Vielen Dank für den tollen Input vom Ersteller und den Leuten hier in den Kommentaren!

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 23, 2020

👏

@cwallwey

This comment has been minimized.

Copy link

@cwallwey cwallwey commented Oct 24, 2020

@Sillium Erstmal vielen Dank für dieses coole Widget. Ich hab mal eine Frage dazu: wie bist Du an die URL für die Telekom API gekommen? Und gibt's dazu auch eine Doku?

@danny1605

This comment has been minimized.

Copy link

@danny1605 danny1605 commented Oct 25, 2020

Hallo, ist es auch schon möglich von Mobilcom Debitel die Daten auszulesen ? Lg

@entoryFB

This comment has been minimized.

Copy link

@entoryFB entoryFB commented Oct 25, 2020

Hallo
weiß jemand, ob man das auch mit Telekom über Norma connect realisieren kann
Besten Dank im Voraus

@sand55kan

This comment has been minimized.

Copy link

@sand55kan sand55kan commented Oct 25, 2020

Hallo,
auf dem iPad funktioniert das Script gut. Aber auf meinem iPhone wird immer nur das Standardwidget auf dem Homescreen angezeigt. Was mache ich falsch?

@HelmutTo

This comment has been minimized.

Copy link

@HelmutTo HelmutTo commented Oct 26, 2020

Hallo, wie kann man dauerhaft das Datenvolumen anzeigen im Widget? Im Augenblick wird nur Scriptable als Widget angezeigt und ich kann es ausführen lassen und das Datenvolumen wird mir angezeigt. Danach klicke ich links oben auf Close und ich sehr wieder das Scriptable-Widget mit dem Dreieck....

@xILuigi

This comment has been minimized.

Copy link

@xILuigi xILuigi commented Oct 26, 2020

Kann jemand bitte ein Video machen wie es geht? Und geht es auch für congstar?

@drno007

This comment has been minimized.

Copy link

@drno007 drno007 commented Oct 27, 2020

Sorry, habe nicht so die Erfahrung... ginge das auch für Vodafone bei 1&1 ?

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Oct 27, 2020

Sorry, habe nicht so die Erfahrung... ginge das auch für Vodafone bei 1&1 ?

https://gist.github.com/Sillium/f904fb89444bc8dde12cfc07b8fa8728#gistcomment-3499710

@JoeGit42

This comment has been minimized.

Copy link

@JoeGit42 JoeGit42 commented Oct 30, 2020

Funktioniert auch mit einem Vertrag bei HIGH Mobile. :-)
Hat man per scriptable eigentlich Zugriff auf den aktuellen mobilen Datenverbrauch.
Dann könnte man quasi hochrechnen, wie viel Daten verbraucht wurden, wenn man nicht im Mobilfunknetz ist.
Ich sitze im HomeOffice und bewege mich kaum noch aus meiner WLAN-Zelle heraus. ;-)
=> Ich gebe zu, dass in diesem Fall dann auch keine mobilen Daten verbraucht werden.

@JoeGit42

This comment has been minimized.

Copy link

@JoeGit42 JoeGit42 commented Oct 30, 2020

@Silium die Farben hätte ich eher an den prozentualen verbrauch angepasst. Also wie viele Tage hat der Monat noch ->9 Tage
Er hatte 31 Tage macht also pro tag ca 3,2%.
Ich bin jetzt bei Tag 22 also darf ich im grünen Bereich maximal 70,96% verbraucht haben.
In dem Fall <=70,96-3,2/2 =96,36% -> GRÜN
<=70,96-3,2/2 =72,56% -> Gelb
">"72,56% -> ROT

Ich habe einen ganz ähnlichen Wunsch, und das mal für mich angepasst.
Orange wird es wenn nicht mehr viel Luft ist zum "erlaubten Verbrauch".
Der erlaubte Verbrauch wären zur Monatsmitte z.B. 50%.
Rot wird es, wenn man bereits ein gutes Stück mehr verbraucht hat als erlaubt.
Zusätzlich gibt es noch feste Grenzen. Rot wird’s immer ab 90%. Und grün bleibt es immer bis zu einem kleinen Schwellwert.

    // change color of the remaining volume according to usage
    const line2 = list.addText(100 - data.usedPercentage + "%")
    line2.font = Font.boldSystemFont(36)
    // rough calculate remainig percentage of this month 
    // adjust colors according to what's needed within rest of the month
    let availableMonthPercentage = (data.remainingSeconds / (31*86400)) * 100
    let bufferPercentage = 5
    line2.textColor = Color.green()
    if (data.usedPercentage >= ((100 - availableMonthPercentage) - bufferPercentage) && data.usedPercentage >= bufferPercentage) {
      line2.textColor = Color.orange()
    } else if (data.usedPercentage >= ((100 - availableMonthPercentage) + bufferPercentage) || data.usedPercentage >= 90) {
      line2.textColor = Color.red()
    }
@JoeGit42

This comment has been minimized.

Copy link

@JoeGit42 JoeGit42 commented Oct 30, 2020

Danke für das Widget
Bin es vom original Telekom alt Widget gewohnt das die verbleibenden GB angezeigt werden. Hab somit beim Widget ein wenig Text ergänzt 😅

Ich sehe auch lieber den noch verbleibenden Verbrauch und habe das für mich so angepasst:

    let availableVolume = (data.initialVolume - data.usedVolume)/(1024*1024*1024)      
    // const line3 = list.addText(data.usedVolumeStr)
    const line3 = list.addText(availableVolume.toFixed(2) + " GB")

Auf eine schöne Darstellung kleinerer Datenvolumen habe ich verzichtet. Anzeige immer in GB.

@Augustus88

This comment has been minimized.

Copy link

@Augustus88 Augustus88 commented Oct 31, 2020

@Silium die Farben hätte ich eher an den prozentualen verbrauch angepasst. Also wie viele Tage hat der Monat noch ->9 Tage
Er hatte 31 Tage macht also pro tag ca 3,2%.
Ich bin jetzt bei Tag 22 also darf ich im grünen Bereich maximal 70,96% verbraucht haben.
In dem Fall <=70,96-3,2/2 =96,36% -> GRÜN
<=70,96-3,2/2 =72,56% -> Gelb
">"72,56% -> ROT

Ich habe einen ganz ähnlichen Wunsch, und das mal für mich angepasst.
Orange wird es wenn nicht mehr viel Luft ist zum "erlaubten Verbrauch".
Der erlaubte Verbrauch wären zur Monatsmitte z.B. 50%.
Rot wird es, wenn man bereits ein gutes Stück mehr verbraucht hat als erlaubt.
Zusätzlich gibt es noch feste Grenzen. Rot wird’s immer ab 90%. Und grün bleibt es immer bis zu einem kleinen Schwellwert.

    // change color of the remaining volume according to usage
    const line2 = list.addText(100 - data.usedPercentage + "%")
    line2.font = Font.boldSystemFont(36)
    // rough calculate remainig percentage of this month 
    // adjust colors according to what's needed within rest of the month
    let availableMonthPercentage = (data.remainingSeconds / (31*86400)) * 100
    let bufferPercentage = 5
    line2.textColor = Color.green()
    if (data.usedPercentage >= ((100 - availableMonthPercentage) - bufferPercentage) && data.usedPercentage >= bufferPercentage) {
      line2.textColor = Color.orange()
    } else if (data.usedPercentage >= ((100 - availableMonthPercentage) + bufferPercentage) || data.usedPercentage >= 90) {
      line2.textColor = Color.red()
    }

Ja, farbliche Orientierung nach dem prozentualen Verbrauch finde ich auch deutlich besser. Habe diese Passage jetzt in den Fork von LupusArgentum eingebaut (und die entsprechende Passage dort gelöscht). Allerdings werden mir jetzt immer noch die verbleibende Tage rot angezeigt...

Kann mir jemand weiterhelfen?

@JoeGit42

This comment has been minimized.

Copy link

@JoeGit42 JoeGit42 commented Oct 31, 2020

Ja, farbliche Orientierung nach dem prozentualen Verbrauch finde ich auch deutlich besser. Habe diese Passage jetzt in den Fork von LupusArgentum eingebaut (und die entsprechende Passage dort gelöscht). Allerdings werden mir jetzt immer noch die verbleibende Tage rot angezeigt...

Kann mir jemand weiterhelfen?
Din dem Fork von LupusArgentum musst du die folgende Zeile löschen:
line5.textColor = (days < 3 ? Color.red() : Color.green())
Das ist dazu gedacht, um den Nutzer daran zu erinnern ein neues Datenvolumen zu buchen. Brauche ich auch nicht.

@Augustus88

This comment has been minimized.

Copy link

@Augustus88 Augustus88 commented Oct 31, 2020

Ja, farbliche Orientierung nach dem prozentualen Verbrauch finde ich auch deutlich besser. Habe diese Passage jetzt in den Fork von LupusArgentum eingebaut (und die entsprechende Passage dort gelöscht). Allerdings werden mir jetzt immer noch die verbleibende Tage rot angezeigt...

Kann mir jemand weiterhelfen?
Din dem Fork von LupusArgentum musst du die folgende Zeile löschen:
line5.textColor = (days < 3 ? Color.red() : Color.green())
Das ist dazu gedacht, um den Nutzer daran zu erinnern ein neues Datenvolumen zu buchen. Brauche ich auch nicht.

Jo klappt, sehr nett von dir!
Werde morgen mal ein bisschen mit Mobile Daten surfen und dann schauen ob die Zahl in % rot angezeigt wird, da ich dann ja quasi über dem prozentualen Tagesbedarf liegen werde. Sollte durch den Austausch der entsprechenden Zeilen ja geklappt haben…
Melde mich dann mal … ;)

@domeightyfour

This comment has been minimized.

Copy link

@domeightyfour domeightyfour commented Nov 1, 2020

Hi, super nice und klappt super.
Kann man das Widget auch für die Seite von 1&1 anpassen?
https://www.1und1.de/mobile-center-no-umts
Hab das leider nicht hinbekommen...
Merci

@dennerforen

This comment has been minimized.

Copy link

@dennerforen dennerforen commented Nov 2, 2020

.Geht das auch als o2kunde?

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 2, 2020

So schauts bei mir aus. 🤘🏻

F8E1E3CB-C566-44C8-9470-02848E2ABC35

@JoeGit42

This comment has been minimized.

Copy link

@JoeGit42 JoeGit42 commented Nov 2, 2020

Auch sehr schick. Welches Zeichen hast du vor dem Text „Datenvolumen“ genutzt?

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 2, 2020

Auch sehr schick. Welches Zeichen hast du vor dem Text „Datenvolumen“ genutzt?

antenna.radiowaves.left.and.right

@Suplanus

This comment has been minimized.

Copy link

@Suplanus Suplanus commented Nov 3, 2020

Wollte mal ein Dankeschön hier lassen 💖
Bei meinem Glück ist gerade pass.telekom.de kaputt (HTTPS ging nicht).

@HelmutTo

This comment has been minimized.

Copy link

@HelmutTo HelmutTo commented Nov 3, 2020

@olikdesign: Kannst Du mir das script zur Verfügung stellen? Es wird doch dauerhaft als Widget angezeigt oder?

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 3, 2020

@olikdesign: Kannst Du mir das script zur Verfügung stellen? Es wird doch dauerhaft als Widget angezeigt oder?

Wo kann ich das senden?

@Augustus88

This comment has been minimized.

Copy link

@Augustus88 Augustus88 commented Nov 3, 2020

Auch sehr schick. Welches Zeichen hast du vor dem Text „Datenvolumen“ genutzt?

antenna.radiowaves.left.and.right

An welcher exakten Stelle im Script muss ich das eingeben, um die „Antenne“ angezeigt zu bekommen?
Und wie bekomme ich die Sau-coolen Magenta-Hintergrund hin?

Danke im Voraus!

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 3, 2020

Auch sehr schick. Welches Zeichen hast du vor dem Text „Datenvolumen“ genutzt?

antenna.radiowaves.left.and.right

An welcher exakten Stelle im Script muss ich das eingeben, um die „Antenne“ angezeigt zu bekommen?
Und wie bekomme ich die Sau-coolen Magenta-Hintergrund hin?

Danke im Voraus!

Wenn es vor dem Titel stehen soll, dann davor. :-)

Damit es nebeneinander steht muss erst ein Stack erstellt werden.

@Augustus88

This comment has been minimized.

Copy link

@Augustus88 Augustus88 commented Nov 3, 2020

Sorry für die blöde Rückmeldung, allerdings habe ich vom Programmieren nicht wirklich eine Ahnung und versuche mich da reinzufuchsen. Wenn ich den Text so eingebe, dann steht im Widget auch der Text (und eben nicht das Zeichen)… Muss ich noch irgendwelche Zeichen einfügen?

Und wie stelle ich die Farbe auf pink ein?

Auch sehr schick. Welches Zeichen hast du vor dem Text „Datenvolumen“ genutzt?

antenna.radiowaves.left.and.right

An welcher exakten Stelle im Script muss ich das eingeben, um die „Antenne“ angezeigt zu bekommen?
Und wie bekomme ich die Sau-coolen Magenta-Hintergrund hin?
Danke im Voraus!

Wenn es vor dem Titel stehen soll, dann davor. :-)

Damit es nebeneinander steht muss erst ein Stack erstellt werden.

Sorry für die blöde Rückmeldung, allerdings habe ich vom Programmieren nicht wirklich eine Ahnung und versuche mich da reinzufuchsen. Wenn ich den Text so eingebe, dann steht im Widget auch der Text (und eben nicht das Zeichen)… Muss ich noch irgendwelche Zeichen einfügen?

Und wie stelle ich die Farbe auf pink ein?

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 3, 2020

Sorry für die blöde Rückmeldung, allerdings habe ich vom Programmieren nicht wirklich eine Ahnung und versuche mich da reinzufuchsen. Wenn ich den Text so eingebe, dann steht im Widget auch der Text (und eben nicht das Zeichen)… Muss ich noch irgendwelche Zeichen einfügen?

Und wie stelle ich die Farbe auf pink ein?

Auch sehr schick. Welches Zeichen hast du vor dem Text „Datenvolumen“ genutzt?

antenna.radiowaves.left.and.right

An welcher exakten Stelle im Script muss ich das eingeben, um die „Antenne“ angezeigt zu bekommen?
Und wie bekomme ich die Sau-coolen Magenta-Hintergrund hin?
Danke im Voraus!

Wenn es vor dem Titel stehen soll, dann davor. :-)
Damit es nebeneinander steht muss erst ein Stack erstellt werden.

Sorry für die blöde Rückmeldung, allerdings habe ich vom Programmieren nicht wirklich eine Ahnung und versuche mich da reinzufuchsen. Wenn ich den Text so eingebe, dann steht im Widget auch der Text (und eben nicht das Zeichen)… Muss ich noch irgendwelche Zeichen einfügen?

Und wie stelle ich die Farbe auf pink ein?

Hintergrundfarbe:
widget.backgroundColor = new Color("#E20074")

Titel:

let titleRow = list.addStack()
let titleStack = titleRow.addStack()
    titleStack.layoutHorizontally()
    titleStack.centerAlignContent()
let dataIcon = SFSymbol.named('antenna.radiowaves.left.and.right');
let dataIconElement = titleStack.addImage(dataIcon.image)
    dataIconElement.imageSize = new Size(15, 15)
    dataIconElement.tintColor = Color.white()
titleStack.addSpacer(4)
let titlename = titleStack.addText("Datenvolumen")
    titlename.font = Font.mediumSystemFont(14)
    titlename.textColor = Color.white()
@HelmutTo

This comment has been minimized.

Copy link

@HelmutTo HelmutTo commented Nov 3, 2020

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 4, 2020

@Augustus88

This comment has been minimized.

Copy link

@Augustus88 Augustus88 commented Nov 4, 2020

@olikdesign: WerderBremenTor@web.de
Danke

Ist raus.

Also ich habe mein Script jetzt total zerschossen. Hatte eine Mischung aus dem Original von Silicium und dem Fork von LapusArgentum. Doch leider funktioniert jetzt nichts mehr, da ich deine beiden Passagen nicht vernünftig einbauen konnte :(

Wärst du so freundlich und könntest dein Script auch mir zur Verfügung stellen? Das ist noch einen Tick attraktiver!
berni7758@web.de

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 4, 2020

@Augustus88

Ist raus.

@Augustus88

This comment has been minimized.

Copy link

@Augustus88 Augustus88 commented Nov 4, 2020

@Augustus88

Ist raus.

Besten Dank für die schnelle Lieferung!!! Sieht wirklich sehr schön aus

In solchen Dingen bin ich auf euch Programmierer echt neidisch, weil das schon cool ist, wenn man so etwas „mal eben schnell“ machen kann. Kompliment!

Kurze Rückfrage: Nach welchen Kriterien verändert der Punkt seine Farbe? Und was steht an der der von „API offline“ sofern man wifi an hat? Das Datum der letzten erfolgreichen Aktualisierung?

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 4, 2020

@Augustus88
Ist raus.

Besten Dank für die schnelle Lieferung!!! Sieht wirklich sehr schön aus

In solchen Dingen bin ich auf euch Programmierer echt neidisch, weil das schon cool ist, wenn man so etwas „mal eben schnell“ machen kann. Kompliment!

Kurze Rückfrage: Nach welchen Kriterien verändert der Punkt seine Farbe? Und was steht an der der von „API offline“ sofern man wifi an hat? Das Datum der letzten erfolgreichen Aktualisierung?

Der Punkt ist bis 25% grün und ab 90% rot.

Solange W-Lan oder Internet aus ist, steht API Offline dort. Sobald er aktualisiert und dein Datenvolumen nutzt, wird das letzte Aktualisierungsdatum angezeigt.

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 4, 2020

@HelmutTo

This comment has been minimized.

Copy link

@HelmutTo HelmutTo commented Nov 5, 2020

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 5, 2020

@HelmutTo

keine Ahnung was du machst, aber bei allen anderen klappt es. 😋

@Augustus88

This comment has been minimized.

Copy link

@Augustus88 Augustus88 commented Nov 5, 2020

@olikdesign

Ja, ok. Dann weiß ich Bescheid. Ich versuche mal die Farben an dem prozentualen Tagesverbrauch zu orientieren. Mal sehen ob mir das gelingt …
Ansonsten klappt alles wunderbar. Vielen Dank nochmals!

Einfach mal aus Neugier: Wie lange braucht man um solch ein Script zu erstellen, inkl. etwaiger Fehlerkorrektur? Würde mich einfach mal interessieren.

@chimcen

This comment has been minimized.

Copy link

@chimcen chimcen commented Nov 5, 2020

Funktioniert das auch mit Congstar (Tochter von Telekom)?

Wenn Du vom iPhone aus https://pass.telekom.de/api/service/generic/v1/status aufrufen kannst und ein JSON-File mit Inhalt zurückkommt, ja.

Scheint auch mit Congstar zu funktionieren! Danke dir!

Bei mir wird mit Congstar aber keine Remaing Time angezeigt...
Ich finde in meinen iCloud files auch kein vom Script abgelegtes json file... (andere scripts laufen auch und können files schreiben)

Hier mein json output via pass.telekom:
{"nextUpdate":10800,"subscriptions":["tns","xtraSpeed","xtraRLH"],"title":"Xtra SpeedOn","hasOffers":true,"passName":"Dein Datenvolumen","passStage":1,"validityPeriod":4,"initialVolume":1073741824,"initialVolumeStr":"1 GB","usedVolume":189614080,"usedPercentage":18,"usedVolumeStr":"180,83 MB","usedAt":1604616253000,"remainingSeconds":1812993,"passType":103}

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Nov 6, 2020

Funktioniert das auch mit Congstar (Tochter von Telekom)?

Wenn Du vom iPhone aus https://pass.telekom.de/api/service/generic/v1/status aufrufen kannst und ein JSON-File mit Inhalt zurückkommt, ja.

Scheint auch mit Congstar zu funktionieren! Danke dir!

Bei mir wird mit Congstar aber keine Remaing Time angezeigt...
Ich finde in meinen iCloud files auch kein vom Script abgelegtes json file... (andere scripts laufen auch und können files schreiben)

Hier mein json output via pass.telekom:
{"nextUpdate":10800,"subscriptions":["tns","xtraSpeed","xtraRLH"],"title":"Xtra SpeedOn","hasOffers":true,"passName":"Dein Datenvolumen","passStage":1,"validityPeriod":4,"initialVolume":1073741824,"initialVolumeStr":"1 GB","usedVolume":189614080,"usedPercentage":18,"usedVolumeStr":"180,83 MB","usedAt":1604616253000,"remainingSeconds":1812993,"passType":103}

Seit hier https://gist.github.com/Sillium/f904fb89444bc8dde12cfc07b8fa8728#gistcomment-3498170 wird keine Remaining Time angezeigt, wenn sie im JSON nicht enthalten ist.

Seit hier https://gist.github.com/Sillium/f904fb89444bc8dde12cfc07b8fa8728#gistcomment-3497865 wird nicht mehr im iCloud-Folder abgelegt, sondern lokal. (Steht auch im ersten Kommentar korrigiert.)

@chimcen

This comment has been minimized.

Copy link

@chimcen chimcen commented Nov 6, 2020

Danke für die Info - hab fie lokale Ablage übersehen...

Ist „remainingSeconds“ denn nicht die Remaining Time?

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Nov 6, 2020

Danke für die Info - hab fie lokale Ablage übersehen...

Ist „remainingSeconds“ denn nicht die Remaining Time?

Doch kann man auch nehmen. In Telekom-Laufzeitverträgen kommt es aber auch als Text im JSON mit und das passt für mich. Der Code ist ja absichtlich public hier zum beliebigen Anpassen, also feel free! :)

@Alextubi

This comment has been minimized.

Copy link

@Alextubi Alextubi commented Nov 6, 2020

@HelmutTo

This comment has been minimized.

Copy link

@HelmutTo HelmutTo commented Nov 7, 2020

So, nachdem Scriptable ein neues Update erhalten hat funktioniert das Widget wie erhofft... Dank an Olikdesign für seine Geduld....

@Augustus88

This comment has been minimized.

Copy link

@Augustus88 Augustus88 commented Nov 7, 2020

@Olidesign

Wie bereits erwähnt, ist dein Widget echt klasse!
Kannst du eigentlich auch statt „API offline“ die Zeit der letzten erfolgreichen (!) Aktualisierung einblenden lassen? Ich glaube das ist bei dem Fork von Sillium oder LupusArgentum so. Das wäre die Krönung bei deinem Fork…!

Kurze Rückmeldung wäre schön 👍🏿

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 7, 2020

@Augustus88

This comment has been minimized.

Copy link

@Augustus88 Augustus88 commented Nov 8, 2020

Alles bestens! Sehr nett!!!

@HelmutTo

This comment has been minimized.

Copy link

@HelmutTo HelmutTo commented Nov 9, 2020

Top bisher... kann mir jemand zeigen wie ich anstatt des Prozentwertes die verbleibenden GB dort anzeigen lassen kann? Am besten was ich wo einsetzen (GB) muß und was ich wo entfernen (Prozent) muß im Script.

Ich nutze das Script:
// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: pink; icon-glyph: magic;
// creator: https://github.com/Sillium | functions added https://github.com/LupusArgentum | Color and Layout edit by https://github.com/olikdesign

const apiUrl = "https://pass.telekom.de/api/service/generic/v1/status"

let widget = await createWidget()
widget.backgroundColor = new Color("#E20074")
if (!config.runsInWidget) await widget.presentSmall()
Script.setWidget(widget)
Script.complete()

async function createWidget(items) {
let fm = FileManager.local()
let dir = fm.documentsDirectory()
let jsonLocalPath = fm.joinPath(dir, "scriptable-telekom.json")
let lastFetchDateLocalPath = fm.joinPath(dir, "lastUpdate.txt")

const list = new ListWidget()
list.addSpacer()

try {
let r = new Request(apiUrl)
// API only answers for mobile Safari
r.headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1"
}
let data = false, api_online = false, lastFetchDate = false
try {
// Fetch data from pass.telekom.de
data = await r.loadJSON()
// Write JSON to local file
fm.writeString(jsonLocalPath, JSON.stringify(data, null, 2))
api_online = true
lastFetchDate = new Date()
fm.writeString(lastFetchDateLocalPath, lastFetchDate.toString())
} catch (err) {
console.log(err)
// Read data from local file
if (fm.fileExists(jsonLocalPath) && fm.fileExists(lastFetchDateLocalPath)) {
data = JSON.parse(fm.readString(jsonLocalPath), null)
lastFetchDate = new Date(fm.readString(lastFetchDateLocalPath, null))
} else {
const errorList = new ListWidget()
errorList.addText("Please disable WiFi for initial execution.")
return errorList
}
}

let stack = list.addStack()
let dataIcon = SFSymbol.named('antenna.radiowaves.left.and.right');

let dataIconElement = stack.addImage(dataIcon.image)
dataIconElement.imageSize = new Size(15, 15)
dataIconElement.tintColor = Color.white()
stack.addSpacer(4)
let titlename = stack.addText("Datenvolumen")
titlename.font = Font.mediumSystemFont(14)
titlename.textColor = Color.white()

    const availabledata = 100 - data.usedPercentage;
    const fontName = "Futura-Medium"  
const line2 = list.addText(availabledata + "%")
line2.font = new Font(fontName, 36)
line2.textColor = new Color("#101e43")
if (data.usedPercentage >= 75) {
  line2.textColor = Color.orange()
} else if (data.usedPercentage >= 90) {
  line2.textColor = Color.red()
}

let row = list.addStack()
function addUsedData() {
let stack = row.addStack()
stack.layoutHorizontally()
let line3 = stack.addText(data.usedVolumeStr)
line3.font = Font.boldSystemFont(14)
line3.textColor = Color.white()
stack.addSpacer(10)
const lineSpacer = stack.addText("●")
lineSpacer.font = Font.heavySystemFont(14)
lineSpacer.rightAlignText()
lineSpacer.textColor = Color.green()
if (data.usedPercentage >= 75) {
lineSpacer.textColor = Color.orange()
} else if (data.usedPercentage >= 90) {
lineS.textColor = Color.red()
}
}
addUsedData();
const line4 = list.addText("von " + data.initialVolumeStr + " verbraucht")
line4.font = Font.mediumSystemFont(10)
line4.textColor = Color.white()
list.addSpacer(6)

list.addSpacer()
let line5
    
// alt text on line5 if local data instead of Telekom API data:
if (api_online) {
  let plan = (data.remainingSeconds ? "prepaid" : data.remainingTimeStr ? "postpaid" : "")
  switch (plan) {
    case "prepaid":
      let days = Math.floor(data.remainingSeconds / 86400)
      let hours = Math.floor((data.remainingSeconds % 86400) / 3600)
      line5 = list.addText("noch " + days + " Tage " + hours + " Std.")
      line5.font = Font.mediumSystemFont(10)
      line5.textColor = new Color("#101e43")
      break;
  
    case "postpaid":
      line5 = list.addText("gültig bis:\n" + data.remainingTimeStr)
      line5.font = Font.mediumSystemFont(12)
      break;
  }
  
} else {
    line5 = list.addText("API Offline")
    line5.font = Font.boldSystemFont(12)
    line5.textColor = new Color("#101e43")
}

// Add time (and date) of last data fetch
const df = new DateFormatter()
const wasFetchedToday = (lastFetchDate.getDate() == new Date().getDate())
df.dateFormat = (wasFetchedToday ? "HH:mm" : "dd.MM. HH:mm")

let timeLabel = list.addText("aktualisiert " + df.string(lastFetchDate))
timeLabel.font = Font.mediumSystemFont(9)
timeLabel.textColor = new Color("#101e43", 0.5)
list.addSpacer()

} catch (err) {
console.log(err)
list.addText("Error fetching JSON from https://pass.telekom.de/api/service/generic/v1/status")
}

return list
}

Danke im Voraus

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 9, 2020

@HelmutTo

Berechnet werden kann das ganze mit diesen Variablen:

Verbauchtes Datenvolumen
data.usedVolumeStr

Verfügbares Datenvolumen
data.initialVolumeStr

Rechnerisch muss das ganze also so aufgebaut werden:

data.initialVolumeStr - data.usedVolumeStr = Restliches Datenvolumen.

z.B. dann so:

Das ersetzen:
const availabledata = 100 - data.usedPercentage; const fontName = "Futura-Medium" const line2 = list.addText(availabledata + "%") line2.font = new Font(fontName, 36) line2.textColor = new Color("#101e43") if (data.usedPercentage >= 75) { line2.textColor = Color.orange() } else if (data.usedPercentage >= 90) { line2.textColor = Color.red() }

mit (Code editiert & funktioniert)

function formatBytes(a,b=2){if(0===a)return"0 Bytes";const c=0>b?0:b,d=Math.floor(Math.log(a)/Math.log(1024));return parseFloat((a/Math.pow(1024,d)).toFixed(c))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][d]} const availabledata = data.initialVolume - data.usedVolume; const fontName = "Futura-Medium" const line2 = list.addText(formatBytes(availabledata, 2)) line2.font = new Font(fontName, 26) line2.textColor = new Color("#101e43") if (data.usedPercentage >= 75) { line2.textColor = Color.orange() } else if (data.usedPercentage >= 90) { line2.textColor = Color.red() }

@HelmutTo

This comment has been minimized.

Copy link

@HelmutTo HelmutTo commented Nov 9, 2020

so habe ich es jetzt geändert:

// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: pink; icon-glyph: magic;
// creator: https://github.com/Sillium | functions added https://github.com/LupusArgentum | Color and Layout edit by https://github.com/olikdesign

const apiUrl = "https://pass.telekom.de/api/service/generic/v1/status"

let widget = await createWidget()
widget.backgroundColor = new Color("#E20074")
if (!config.runsInWidget) await widget.presentSmall()
Script.setWidget(widget)
Script.complete()

async function createWidget(items) {
let fm = FileManager.local()
let dir = fm.documentsDirectory()
let jsonLocalPath = fm.joinPath(dir, "scriptable-telekom.json")
let lastFetchDateLocalPath = fm.joinPath(dir, "lastUpdate.txt")

const list = new ListWidget()
list.addSpacer()

try {
let r = new Request(apiUrl)
// API only answers for mobile Safari
r.headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1"
}
let data = false, api_online = false, lastFetchDate = false
try {
// Fetch data from pass.telekom.de
data = await r.loadJSON()
// Write JSON to local file
fm.writeString(jsonLocalPath, JSON.stringify(data, null, 2))
api_online = true
lastFetchDate = new Date()
fm.writeString(lastFetchDateLocalPath, lastFetchDate.toString())
} catch (err) {
console.log(err)
// Read data from local file
if (fm.fileExists(jsonLocalPath) && fm.fileExists(lastFetchDateLocalPath)) {
data = JSON.parse(fm.readString(jsonLocalPath), null)
lastFetchDate = new Date(fm.readString(lastFetchDateLocalPath, null))
} else {
const errorList = new ListWidget()
errorList.addText("Please disable WiFi for initial execution.")
return errorList
}
}

let stack = list.addStack()
let dataIcon = SFSymbol.named('antenna.radiowaves.left.and.right');
let dataIconElement = stack.addImage(dataIcon.image)
dataIconElement.imageSize = new Size(15, 15)
dataIconElement.tintColor = Color.white()
stack.addSpacer(4)
let titlename = stack.addText("Datenvolumen")
titlename.font = Font.mediumSystemFont(14)
titlename.textColor = Color.white()

const availabledata = data.initialVolumeStr - data.usedVolumeStr; const fontName = "Futura-Medium" const line2 = list.addText(availabledata) line2.font = new Font(fontName, 36) line2.textColor = new Color("#101e43") if (data.usedPercentage >= 75) { line2.textColor = Color.orange() } else if (data.usedPercentage >= 90) { line2.textColor = Color.red()
}
let row = list.addStack()
function addUsedData() {
let stack = row.addStack()
stack.layoutHorizontally()
let line3 = stack.addText(data.usedVolumeStr)
line3.font = Font.boldSystemFont(14)
line3.textColor = Color.white()
stack.addSpacer(10)
const lineSpacer = stack.addText("●")
lineSpacer.font = Font.heavySystemFont(14)
lineSpacer.rightAlignText()
lineSpacer.textColor = Color.green()
if (data.usedPercentage >= 75) {
lineSpacer.textColor = Color.orange()
} else if (data.usedPercentage >= 90) {
lineS.textColor = Color.red()
}
}
addUsedData();
const line4 = list.addText("von " + data.initialVolumeStr + " verbraucht")
line4.font = Font.mediumSystemFont(10)
line4.textColor = Color.white()
list.addSpacer(6)

list.addSpacer()
let line5

// alt text on line5 if local data instead of Telekom API data:
if (api_online) {
let plan = (data.remainingSeconds ? "prepaid" : data.remainingTimeStr ? "postpaid" : "")
switch (plan) {
case "prepaid":
let days = Math.floor(data.remainingSeconds / 86400)
let hours = Math.floor((data.remainingSeconds % 86400) / 3600)
line5 = list.addText("noch " + days + " Tage " + hours + " Std.")
line5.font = Font.mediumSystemFont(10)
line5.textColor = new Color("#101e43")
break;

case "postpaid":
  line5 = list.addText("gültig bis:\n" + data.remainingTimeStr)
  line5.font = Font.mediumSystemFont(12)
  break;

}

} else {
line5 = list.addText("API Offline")
line5.font = Font.boldSystemFont(12)
line5.textColor = new Color("#101e43")
}

// Add time (and date) of last data fetch
const df = new DateFormatter()
const wasFetchedToday = (lastFetchDate.getDate() == new Date().getDate())
df.dateFormat = (wasFetchedToday ? "HH:mm" : "dd.MM. HH:mm")

let timeLabel = list.addText("aktualisiert " + df.string(lastFetchDate))
timeLabel.font = Font.mediumSystemFont(9)
timeLabel.textColor = new Color("#101e43", 0.5)
list.addSpacer()
} catch (err) {
console.log(err)
list.addText("Error fetching JSON from https://pass.telekom.de/api/service/generic/v1/status")
}

return list
}

Aber es erscheint folgender Fehler:

2020-11-09 14:08:05: Error on line 121: SyntaxError: Unexpected keyword 'const'. Expected ';' after variable declaration.

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 9, 2020

@HelmutTo

hier ist der funktionierende Code:

function formatBytes(a,b=2){if(0===a)return"0 Bytes";const c=0>b?0:b,d=Math.floor(Math.log(a)/Math.log(1024));return parseFloat((a/Math.pow(1024,d)).toFixed(c))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][d]} const availabledata = data.initialVolume - data.usedVolume; const fontName = "Futura-Medium" const line2 = list.addText(formatBytes(availabledata, 2)) line2.font = new Font(fontName, 26) line2.textColor = new Color("#101e43") if (data.usedPercentage >= 75) { line2.textColor = Color.orange() } else if (data.usedPercentage >= 90) { line2.textColor = Color.red() }

@HelmutTo

This comment has been minimized.

Copy link

@HelmutTo HelmutTo commented Nov 9, 2020

@olikdesign

This comment has been minimized.

Copy link

@olikdesign olikdesign commented Nov 9, 2020

@HelmutTo

Mail ist raus.

@HelmutTo

This comment has been minimized.

Copy link

@HelmutTo HelmutTo commented Nov 9, 2020

Super und Danke - so sollte es sein!

@Goldsucher

This comment has been minimized.

Copy link

@Goldsucher Goldsucher commented Nov 17, 2020

Danke für die Info - hab fie lokale Ablage übersehen...

Ist „remainingSeconds“ denn nicht die Remaining Time?

damit kriegst du die verbleibende Zeit für Congstar:

let line4, line5
if (data.remainingSeconds) {
  line4 = list.addText("verbleibende Zeit:")
  line4.font = Font.mediumSystemFont(12)
  seconds = data.remainingSeconds
  var d = Math.floor(seconds / (3600*24))
  var h = Math.floor(seconds % (3600*24) / 3600)
  //line5 = list.addText(data.remainingTimeStr)
  line5 = list.addText(d + " Tage " + h + " Stunden")
  line5.font = Font.mediumSystemFont(12)
}
@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Nov 19, 2020

Für alle, die es interessiert, habe ich hier ein Update des Widgets gemacht: https://gist.github.com/Sillium/313164aec3d835c076ebfcd330f1be14

Neu:

  • Anzeige kann englisch oder deutsch konfiguriert werden
  • man kann wählen, ob verbrauchte oder verbleibende Daten angezeigt werden
  • es kann konfiguriert werden, wie das Widget aussehen soll
  • die verbleibende Zeit wird aus "remainingSeconds" genommen und nicht aus "remainingTimeStr", das es wohl bei Congstar usw. nicht gibt
@HelmutTo

This comment has been minimized.

Copy link

@HelmutTo HelmutTo commented Nov 20, 2020

Hi,
leider weiss ich nicht wo ich im Script auf deutsch einstellen kann, wo ich im Script das Fraenk Logo integrieren kann...
Kann mir mal jemand farblich die Passagen markieren? - Bitte?

@NoTrace-Kai

This comment has been minimized.

Copy link

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

Das mit dem fraenk Logo würde mich auch reizen ;)

@chimcen

This comment has been minimized.

Copy link

@chimcen chimcen commented Nov 20, 2020

Das passiert alles per Widget-Parameter - Steht auch so dort...

Z.B. Fraenk mit Anzeige der verbrauchten Daten: de;used;fraenk

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Nov 20, 2020

Das mit dem fraenk Logo würde mich auch reizen ;)

Bitte mal dem obigen Link (https://gist.github.com/Sillium/313164aec3d835c076ebfcd330f1be14) folgen und die paar Sätze Anleitung lesen.

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Nov 20, 2020

Hi,
leider weiss ich nicht wo ich im Script auf deutsch einstellen kann, wo ich im Script das Fraenk Logo integrieren kann...
Kann mir mal jemand farblich die Passagen markieren? - Bitte?

Bitte mal dem obigen Link (https://gist.github.com/Sillium/313164aec3d835c076ebfcd330f1be14) folgen und die paar Sätze Anleitung lesen.

@chimcen

This comment has been minimized.

Copy link

@chimcen chimcen commented Nov 20, 2020

Das mit dem fraenk Logo würde mich auch reizen ;)

Bitte mal dem obigen Link (https://gist.github.com/Sillium/313164aec3d835c076ebfcd330f1be14) folgen und die paar Sätze Anleitung lesen.

YMMD

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Nov 20, 2020

Hi,
leider weiss ich nicht wo ich im Script auf deutsch einstellen kann, wo ich im Script das Fraenk Logo integrieren kann...
Kann mir mal jemand farblich die Passagen markieren? - Bitte?

Was vielleicht nicht ganz klar wurde: Ihr müsst das neue Script verwenden.

@Sillium

This comment has been minimized.

Copy link
Owner Author

@Sillium Sillium commented Nov 20, 2020

Das mit dem fraenk Logo würde mich auch reizen ;)

Was vielleicht nicht ganz klar wurde: Ihr müsst das neue Script verwenden.

@chimcen

This comment has been minimized.

Copy link

@chimcen chimcen commented Nov 20, 2020

Wenn man liest war es eigentlich schon klar ;)

@NoTrace-Kai

This comment has been minimized.

Copy link

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

Ups ... jetzt habe ich es auch verstanden und es hat sogar beim ersten Versuch geklappt ;)
Danke für die Hilfe ... und Sorry für die Mühen ;)

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.