Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Scriptable.app widget displaying the exact time of today's sunrise and sunset. Which comes in handy in the wintertime …
// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: orange; icon-glyph: sun;
///////////////////////////////////////////////////////////////////////
// dawn2dusk.js
// Origin:
// https://gist.github.com/HendrikRunte/4b5d03cb26e31508bc96553ad3c10f47
// Take it and have fun.
// Hendrik Runte, Nov 12, 2020, 17:33.
///////////////////////////////////////////////////////////////////////
// Extending the JavaScritp Date object.
// Usage:
// const sunriseDateObject = new Date().sunrise(lat, long);
// const sunsetDateObject = new Date().sunrise(lat, long);
// All the other methods just help.
Date.prototype.sunrise = function (latitude, longitude, zenith) {
return this.setSun(latitude, longitude, true, zenith);
};
Date.prototype.sunset = function (latitude, longitude, zenith) {
return this.setSun(latitude, longitude, false, zenith);
};
Date.prototype.setSun = function (latitude, longitude, isSunrise, zenith) {
zenith = zenith || 90.8333;
const DEGREES_PER_HOUR = 360 / 24;
const hoursFromMeridian = longitude / DEGREES_PER_HOUR;
const dayOfYear = this.getDayOfYear();
const approxTimeOfEventInDays = isSunrise
? dayOfYear + (6 - hoursFromMeridian) / 24
: dayOfYear + (18 - hoursFromMeridian) / 24;
const sunMeanAnomaly = 0.9856 * approxTimeOfEventInDays - 3.289;
const sunTrueLongitude = Math.mod(
sunMeanAnomaly +
1.916 * Math.sinDeg(sunMeanAnomaly) +
0.02 * Math.sinDeg(2 * sunMeanAnomaly) +
282.634,
360
);
const ascension = 0.91764 * Math.tanDeg(sunTrueLongitude);
let rightAscension = (360 / (2 * Math.PI)) * Math.atan(ascension);
rightAscension = Math.mod((360 / (2 * Math.PI)) * Math.atan(ascension), 360);
const lQuadrant = Math.floor(sunTrueLongitude / 90) * 90;
const raQuadrant = Math.floor(rightAscension / 90) * 90;
rightAscension = rightAscension + (lQuadrant - raQuadrant);
rightAscension /= DEGREES_PER_HOUR;
const sinDec = 0.39782 * Math.sinDeg(sunTrueLongitude);
const cosDec = Math.cosDeg(Math.asinDeg(sinDec));
const cosLocalHourAngle =
(Math.cosDeg(zenith) - sinDec * Math.sinDeg(latitude)) /
(cosDec * Math.cosDeg(latitude));
const localHourAngle = Math.acosDeg(cosLocalHourAngle);
const localHour = isSunrise
? (360 - localHourAngle) / DEGREES_PER_HOUR
: localHourAngle / DEGREES_PER_HOUR;
const localMeanTime =
localHour + rightAscension - 0.06571 * approxTimeOfEventInDays - 6.622;
let time = localMeanTime - longitude / DEGREES_PER_HOUR;
time = Math.mod(time, 24);
const midnight = new Date(0);
midnight.setUTCFullYear(this.getUTCFullYear());
midnight.setUTCMonth(this.getUTCMonth());
midnight.setUTCDate(this.getUTCDate());
const milli = midnight.getTime() + time * 60 * 60 * 1000;
return new Date(milli);
};
// Utility functions
Date.prototype.getDayOfYear = function () {
return Math.ceil((this - new Date(this.getFullYear(), 0, 1)) / 86400000);
};
Math.degToRad = function (num) {
return (num * Math.PI) / 180;
};
Math.radToDeg = function (radians) {
return (radians * 180.0) / Math.PI;
};
Math.sinDeg = function (deg) {
return Math.sin((deg * 2.0 * Math.PI) / 360.0);
};
Math.acosDeg = function (x) {
return (Math.acos(x) * 360.0) / (2 * Math.PI);
};
Math.asinDeg = function (x) {
return (Math.asin(x) * 360.0) / (2 * Math.PI);
};
Math.tanDeg = function (deg) {
return Math.tan((deg * 2.0 * Math.PI) / 360.0);
};
Math.cosDeg = function (deg) {
return Math.cos((deg * 2.0 * Math.PI) / 360.0);
};
Math.mod = function (a, b) {
let result = a % b;
if (result < 0) {
result += b;
}
return result;
};
///////////////////////////////////////////////////////////////////////
// Here comes the actual Scriptable widget stuff.
///////////////////////////////////////////////////////////////////////
function getMoonphase(dateObj) {
// Bluntly copied from https://gist.github.com/endel/dfe6bb2fbe679781948c
let c = 0;
let e = 0;
let jd = 0;
let b = 0;
let year = dateObj.getFullYear();
let month = dateObj.getMonth() + 1;
let day = dateObj.getDate();
if (month < 3) {
year--;
month += 12;
}
++month;
c = 365.25 * year;
e = 30.6 * month;
jd = c + e + day - 694039.09; // jd is total days elapsed
jd /= 29.5305882; // divide by the moon cycle
b = parseInt(jd); // int(jd) -> b, take integer part of jd
jd -= b; // subtract integer part to leave fractional part of original jd
b = Math.round(jd * 8); // scale fraction from 0-8 and round
if (b >= 8) {
b = 0; // 0 and 8 are the same so turn 8 into 0
}
return b;
}
// Helps adding icons from SF Symbols.
function addSymbol({
symbolName = 'applelogo',
stack,
color = Color.white(),
size = 20,
}) {
const icon = stack.addImage(SFSymbol.named(symbolName).image);
icon.tintColor = color;
icon.imageSize = new Size(size, size);
}
function getSunriseAndSunset(date, location) {
return {
location: location,
todaysSunrise: date.sunrise(location.latitude, location.longitude),
todaysSunset: date.sunset(location.latitude, location.longitude),
};
}
function displayLoadingIndicator() {
const listWidget = new ListWidget();
const gradient = new LinearGradient();
gradient.locations = [0, 1];
gradient.colors = [new Color('#000618'), new Color('#121A34')];
listWidget.backgroundGradient = gradient;
const iconStack = listWidget.addStack();
addSymbol({
symbolName: 'text.bubble',
stack: iconStack,
color: Color.white(),
size: 32,
});
listWidget.addSpacer(10);
const header = listWidget.addText('Das Widget');
header.font = Font.regularRoundedSystemFont(FONTSETTINGS.medium);
header.textColor = Color.white();
listWidget.addSpacer(2);
const footer = listWidget.addText('wird geladen …');
footer.font = Font.regularRoundedSystemFont(FONTSETTINGS.medium);
footer.textColor = Color.white();
return listWidget;
}
async function displaySunriseAndSunset(
{ location, todaysSunrise, todaysSunset },
locality = null
) {
const listWidget = new ListWidget();
let todaysDate = new Date(NOW);
let headerText = 'Sonnenlauf, heute';
let headerColor = Color.white();
const gradient = new LinearGradient();
const gradientByTime =
NOW >= todaysSunrise.getTime() - 900000 &&
NOW < todaysSunset.getTime() + 900000
? { gradientStart: '#093199', gradientStop: '#4C95FE' } // day
: { gradientStart: '#000618', gradientStop: '#121A34' }; // night
gradient.locations = [0, 1];
gradient.colors = [
new Color(gradientByTime.gradientStart),
new Color(gradientByTime.gradientStop),
];
listWidget.backgroundGradient = gradient;
// Is it before midnight but later than today's sunset
// we'll look at tomorrow:
if (
NOW <= todaysDate.setHours(23, 59, 59, 999) &&
NOW > todaysSunset.getTime()
) {
todaysDate = new Date(new Date().setDate(todaysDate.getDate() + 1)); // tomorrow
headerText = 'Sonnenlauf, morgen';
todaysSunrise = todaysDate.sunrise(location.latitude, location.longitude);
todaysSunset = todaysDate.sunset(location.latitude, location.longitude);
headerColor = Color.white();
}
const header = listWidget.addText(headerText.toUpperCase());
header.font = Font.regularRoundedSystemFont(FONTSETTINGS.small);
header.textColor = headerColor;
listWidget.addSpacer(12);
// Sunrise
const sunriseStack = listWidget.addStack();
const sunriseStackColor =
todaysSunrise.getTime() < NOW ? new Color('#ffffff99') : Color.white();
addSymbol({
symbolName: 'sunrise.fill',
stack: sunriseStack,
color: sunriseStackColor,
size: 26,
});
sunriseStack.addSpacer();
const sunriseLabel = sunriseStack.addText(
` ${todaysSunrise
.getHours()
.toString()
.replace(/^0(?:0:0?)?/, '')}:${('0' + todaysSunrise.getMinutes()).slice(
-2
)}`
);
sunriseLabel.font = Font.mediumRoundedSystemFont(FONTSETTINGS.big);
sunriseLabel.textColor = sunriseStackColor;
// Sunset
const sunsetStack = listWidget.addStack();
const sunsetStackColor =
todaysSunset.getTime() < NOW ? new Color('#ffffff99') : Color.white();
addSymbol({
symbolName: 'sunset.fill',
stack: sunsetStack,
color: sunsetStackColor,
size: 26,
});
sunsetStack.addSpacer();
const sunsetLabel = sunsetStack.addText(
` ${todaysSunset
.getHours()
.toString()
.replace(/^0(?:0:0?)?/, '')}:${('0' + todaysSunset.getMinutes()).slice(
-2
)}`
);
sunsetLabel.font = Font.mediumRoundedSystemFont(FONTSETTINGS.big);
sunsetLabel.textColor = sunsetStackColor;
listWidget.addSpacer(12);
// Footer:
const footerStack = listWidget.addStack();
addSymbol({
symbolName: locality ? 'location.fill' : 'arrowtriangle.right.circle',
stack: footerStack,
color: Color.white(),
size: 12,
});
const footerLabel = locality
? footerStack.addText(` ${locality.toUpperCase()}`)
: footerStack.addText(
` ${todaysDate.toLocaleDateString(undefined, {
weekday: 'short',
})}., ${todaysDate.toLocaleDateString(undefined, {
year: 'numeric',
month: 'numeric',
day: 'numeric',
})}`
);
footerStack.addSpacer();
footerStack.addText(MOONICONS[getMoonphase(new Date())]);
footerLabel.font = Font.regularRoundedSystemFont(FONTSETTINGS.small);
footerLabel.textColor = Color.white();
// render
return listWidget;
}
// Locate yourself or use params.
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;
}
}
async function getLocality(geolocation) {
let locality = null;
try {
// Location.reverseGeocode returns an array with object properties.
// Uses Apple CLLocation.
const address = await Location.reverseGeocode(
geolocation.latitude,
geolocation.longitude
);
// The order is relevant for processing the
// address properties.
const cascade = [
'ocean',
'inlandWater',
'administrativeArea',
'subAdministrativeArea',
'locality',
'subLocality',
];
if (address.length) {
cascade.forEach((prop) => {
locality = address[0][prop] ? address[0][prop] : locality;
});
}
return locality;
} catch (e) {
return null;
}
}
///////////////////////////////////////////////////////////////////////
let widget = {};
const FONTSETTINGS = {
big: 30,
medium: 16,
small: 9,
};
const NOW = +new Date();
const MOONICONS = ['🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘'];
const location = await getLocation();
const locality = await getLocality(location);
if (location) {
const sunriseAndSunset = getSunriseAndSunset(new Date(NOW), location);
widget = await displaySunriseAndSunset(sunriseAndSunset, locality);
} else {
console.error(location);
console.error(locality);
widget = await displayLoadingIndicator();
}
if (!config.runsInWidget) {
await widget.presentSmall();
}
Script.setWidget(widget);
Script.complete();
@kater100

This comment has been minimized.

Copy link

@kater100 kater100 commented Oct 23, 2020

image

Die letzten beiden Ziffern sind abgeschnitten

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Oct 23, 2020

Das ist schade, ich kann es leider nicht reproduzieren. Du kannst checken, ob Du in Zeile 160 ein Leerzeichen mehr eingefügt hast, in dem Fall würde es so aussehen.

@wodkasreineseele

This comment has been minimized.

Copy link

@wodkasreineseele wodkasreineseele commented Oct 24, 2020

Super Widget. Eine Frage habe ich: Kann man vielleicht eine Stunde nach Sonnenuntergang dann die Daten vom nächsten Tag anzeigen?

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Oct 24, 2020

Super Widget. Eine Frage habe ich: Kann man vielleicht eine Stunde nach Sonnenuntergang dann die Daten vom nächsten Tag anzeigen?

Danke! Ja, ich könnte mir gut vorstellen, dass man in dem Fall »morgen« drüber schreibt, und die Zeiten vom nächsten Tag anzeigt.

@cdf1982

This comment has been minimized.

Copy link

@cdf1982 cdf1982 commented Oct 25, 2020

Thank you so much for this! I can see myself finally stop using a very-very hacky Shortcut I built a while ago to get data from suncalc.org. A question: SunCalc provides also Sunrise and Dusk times, roughly 30 minutes after Dawn and Sunset respectively.
I'd have no idea on how to implement those calculations, but I actually find those informations more useful because they tend to better reflect the actual daylight available.
If you know how and it can be useful for you too, it would be amazing if the script could calculate those too. Thanks again for this script!

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Oct 25, 2020

Thank you so much for this! I can see myself finally stop using a very-very hacky Shortcut I built a while ago to get data from suncalc.org. A question: SunCalc provides also the Sunrise and Dusk time, roughly 30 minutes after Dawn and Sunset. I'd have no idea on how to implement it, but if you know how and it's useful for you too, it would be amazing. Thanks again for this script!

Glad to see you like it! At the time of this writing my algorithm provides only sunrise and sunset times, I'm afraid.

@cdf1982

This comment has been minimized.

Copy link

@cdf1982 cdf1982 commented Oct 25, 2020

Glad to see you like it! At the time of this writing my algorithm provides only sunrise and sunset times, I'm afraid.

I imagined this was the case. Thanks again for the amazing script!

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Oct 28, 2020

Made some smaller adjustments style-wise. Hope you like it.

@wodkasreineseele

This comment has been minimized.

Copy link

@wodkasreineseele wodkasreineseele commented Oct 28, 2020

Ja, sieht gut aus. Ist es möglich, dass anstatt der Koordinaten dort der Name der Stadt steht? Ich habe es bei den COVID Widgets so gesehen.

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Oct 28, 2020

Ja, sieht gut aus. Ist es möglich, dass anstatt der Koordinaten dort der Name der Stadt steht? Ich habe es bei den COVID Widgets so gesehen.

Danke. Wenn ich das richtig sehe, nimmt das Inzidenz-Widget von @kevinkub https://gist.github.com/kevinkub/46caebfebc7e26be63403a7f0587f664 den Ortsnamen aus den Daten, die das Widget aus den Daten des RKI erhält. Theoretisch könnte man natürlich auch diesen Dienst zusätzlich einbauen nur für die Ermittlung des Ortsnamen nehmen, aber das wäre vielleicht etwas unelegant. Was es braucht, wäre ein Dienst, der die Geo-Koordinaten in einen Ortsnamen übersetzt. Es sieht so aus, als könnte Scriptable eine Apple-API ansprechen, aber das müsste ich erst mal testen :)

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Oct 28, 2020

Ja, sieht gut aus. Ist es möglich, dass anstatt der Koordinaten dort der Name der Stadt steht? Ich habe es bei den COVID Widgets so gesehen.

Kurz: Ja, geht. Ich bin ein bisschen erstaunt, dass es einfach ging. Jedenfalls für Hamburg. Probier's aus!

IMG_A320E26D9D12-1

@wodkasreineseele

This comment has been minimized.

Copy link

@wodkasreineseele wodkasreineseele commented Oct 29, 2020

Funktioniert bei mir auch perfekt! Vielen Dank!

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Oct 29, 2020

Super Widget. Eine Frage habe ich: Kann man vielleicht eine Stunde nach Sonnenuntergang dann die Daten vom nächsten Tag anzeigen?

Hey @wodkasreineseele, jetzt werden Sonnenauf- und -untergang des Folgetages angezeigt, wenn die Sonne mal unten ist. Test doch einmal, ob es bei Dir auch funktioniert.

IMG_43BF16EF6BCD-1

@wodkasreineseele

This comment has been minimized.

Copy link

@wodkasreineseele wodkasreineseele commented Oct 29, 2020

Jawohl, perfekt!!! Vielen lieben Dank!

799BA6B5-8B20-4DC8-BD57-99B8DFF669BA

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Oct 30, 2020

Der Hintergrundverlauf passt sich nun den Zeiten an.

IMG_AF358DB83436-1

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Oct 30, 2020

Jawohl, perfekt!!! Vielen lieben Dank!

799BA6B5-8B20-4DC8-BD57-99B8DFF669BA

Tja, in Bochum ist der Tag echt länger …

@wodkasreineseele

This comment has been minimized.

Copy link

@wodkasreineseele wodkasreineseele commented Oct 30, 2020

Sieht gut aus der Farbverlauf, Top.
Ich hätte noch die Idee, ob man anzeigen kann ob Vollmond oder Neumond ist?

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Oct 30, 2020

Sieht gut aus der Farbverlauf, Top.
Ich hätte noch die Idee, ob man anzeigen kann ob Vollmond oder Neumond ist?

Ja, geht auch. :)

IMG_CE9D23A15D9B-1

@Augustus88

This comment has been minimized.

Copy link

@Augustus88 Augustus88 commented Oct 31, 2020

Wow, Sehr stylish - sieht wirklich gut aus! Tolle Arbeit, die du da geleistet hast!

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Oct 31, 2020

Wow, Sehr stylish - sieht wirklich gut aus! Tolle Arbeit, die du da geleistet hast!

Freut mich, wenn's gefällt!

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 1, 2020

Update: Der Hintergrund wechselte erst nach Stunden zu spät, da war wohl eine 0 zu viel. Bitte die letzte Version verwenden.

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 2, 2020

Update: Ab Mitternacht wurde nicht auf »heute« gewechselt.

@frollein-ike

This comment has been minimized.

Copy link

@frollein-ike frollein-ike commented Nov 5, 2020

Ich bekomme leider beim Ausführen des Skripts eine Fehlermeldung:
2020-11-05 19:45:24: Error on line 250:61: TypeError: null is not an object (evaluating 'address[0].locality.toUpperCase')
Kann mir da jemand weiterhelfen? (Bin absoluter Noob, allerdings lief eine ältere Version des Skripts vor circa einer Woche ohne Probleme).
Danke!

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 5, 2020

Ich bekomme leider beim Ausführen des Skripts eine Fehlermeldung:
2020-11-05 19:45:24: Error on line 250:61: TypeError: null is not an object (evaluating 'address[0].locality.toUpperCase')
Kann mir da jemand weiterhelfen? (Bin absoluter Noob, allerdings lief eine ältere Version des Skripts vor circa einer Woche ohne Probleme).
Danke!

Hi @frollein-ike, ich habe da so einen Verdacht, aber zunächst ein paar Fragen: Gestattest Du Deinem iPhone, Deine Position zu ermitteln? Gestattest Du der App Scritptable, Deine Position zu ermitteln? –– Bis bald, Hendrik.

@frollein-ike

This comment has been minimized.

Copy link

@frollein-ike frollein-ike commented Nov 5, 2020

Gestattest Du Deinem iPhone, Deine Position zu ermitteln? Gestattest Du der App Scritptable, Deine Position zu ermitteln?

DC8F876A-F4A2-42CC-9D80-122AB2EF05AD
Danke schnelle Antwort!
Ja, eigentlich schon. Wie gesagt, das Skript hat ja auch in der alten Version bei mir funktioniert. 😕

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 5, 2020

Gestattest Du Deinem iPhone, Deine Position zu ermitteln? Gestattest Du der App Scritptable, Deine Position zu ermitteln?

DC8F876A-F4A2-42CC-9D80-122AB2EF05AD
Danke schnelle Antwort!
Ja, eigentlich schon. Wie gesagt, das Skript hat ja auch in der alten Version bei mir funktioniert. 😕

Alles klar, danke für den Screenshot. Dann habe ich gleich vielleicht eine Zwischenlösung für Dich.

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 5, 2020

Update: Eventuell wird nun eine fehlende Verortung besser aufgefangen. @frollein-ike: Für Dich habe ich noch etwas eingebaut, mit dem Du mir helfen könntest, wenn Du Lust hast:

Aktualisiere das Script mit dem neuen Code von heute (5.11.20). Öffne die Quelltext-Ansicht des Widgets in Scriptable und tippe auf den Play-Button rechts unten. Nun wird das Widget (oder die Fehlermeldung) angezeigt. Schließe diese Ansicht links oben mit »Close«. Nun steht rechts unten neben dem Play-Button eine eingerahmte »1«. Tipp darauf und Du bekommst eine Log-Ausgabe. Kannst Du das herauskopieren und mir per E-Mail schicken? (Wenn Du es hier veröffentlichst, steht möglicherweise Deine Privat-Adresse drin). Schreibe an hendrik.runte+scriptable@gmail.com. Danke!

IMG_A605615BDDFB-1

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 6, 2020

Update: Die Ortsbestimmung ist nun robuster und sollte nicht mehr in einem Fehler enden, wenn der Ort nicht namentlich bestimmt werden kann.

IMG_7041CF28FB8D-1

@frollein-ike

This comment has been minimized.

Copy link

@frollein-ike frollein-ike commented Nov 6, 2020

Update: Die Ortsbestimmung ist nun robuster und sollte nicht mehr in einem Fehler enden, wenn der Ort nicht namentlich bestimmt werden kann.

Hallo Hendrik, bei mir funktioniert auf jeden Fall jetzt alles ganz wunderbar. Ich danke dir für die Arbeit, die du da reingesteckt hast! 😃

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 6, 2020

Update: Die Ortsbestimmung ist nun robuster und sollte nicht mehr in einem Fehler enden, wenn der Ort nicht namentlich bestimmt werden kann.

Hallo Hendrik, bei mir funktioniert auf jeden Fall jetzt alles ganz wunderbar. Ich danke dir für die Arbeit, die du da reingesteckt hast! 😃

Yipiieh :)

@zeron23

This comment has been minimized.

Copy link

@zeron23 zeron23 commented Nov 8, 2020

Mehrmals am Tag bekomme ich diese Fehlermeldung im Widget angezeigt:
Error on line 148:50: TypeError: null is not an object (evaluating 'location.latitude')
8E3721E3-C26C-4F27-93ED-67C0742BF428

@wodkasreineseele

This comment has been minimized.

Copy link

@wodkasreineseele wodkasreineseele commented Nov 8, 2020

Ich bekomme auch manchmal die gleiche Meldung.

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 8, 2020

Ja, die bekomme ich auch, wenn ich das Widget längere Zeit nicht aufgerufen hatte, allerdings nur für einen Augenblick, dann erscheint der gewohnte Anblick.

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 8, 2020

Ich forsche.

@zeron23

This comment has been minimized.

Copy link

@zeron23 zeron23 commented Nov 9, 2020

Ich forsche.

Benutze das Widget in einem Stapel und habe das mehrmals täglich wenn ich innerhalb des Stapels zu dem Widget schalte. Nachdem ich das Script in der Scriptable-App ausführe, wird es normal angezeigt.
Weil aber mehrmals am Tag eine Fehlermeldung auf meinem Homescreen auftaucht, ist das doch ganz schön unbefriedigend. Sind doch Widgets dazu da, gleich Informationen zu erhalten ohne erstmal eine App öffnen zu müssen.
Ich hoffe dafür wird eine Lösung gefunden, ist nämlich ein schönes Widget, was ich gerne dauerhaft benutzen würde 🙂👍🏻

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 9, 2020

Ich musste die Geolokalisierung zur Ermittlung der Adresse leider rausnehmen, denn manchmal funktioniert diese Methode nicht richtig. Was aber für das Widget keinen entscheidenden Nachteil bedeutet, denn die Geopositionierung (vulgo GPS) funktioniert tadellos. Update!

IMG_2D732736EFAF-1

@zeron23

This comment has been minimized.

Copy link

@zeron23 zeron23 commented Nov 10, 2020

Jetzt gibts mehrmals täglich diesen Fehler:

B8998DE1-502B-4BCB-9894-2A1B6D465A63

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 10, 2020

Jetzt gibts mehrmals täglich diesen Fehler:

B8998DE1-502B-4BCB-9894-2A1B6D465A63

Ja, vielen Dank. Das beobachte ich ähnlich. Allerdings ist bei mir die Fehlermeldung nach einem Augenblick verschwunden und das Widget funktioniert dann normal. Ich vermute, dass Scriptable irgendwann den Location-Service stoppt. Aber mal sehen, ich teste gerade eine andere Version.

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 10, 2020

Jetzt wird ein solcher Fehler, wenn er auftritt, mit einer Hinweismeldung abgefangen. Kurz danach lädt das Widget dann normal.

@zeron23

This comment has been minimized.

Copy link

@zeron23 zeron23 commented Nov 11, 2020

Okay 👍🏻 Danke für die Mühe. Sieht jetzt besser aus als eine Fehlermeldung mit rotem Text.

Wenn es an der Ortung liegt weswegen die Fehler auftreten, wäre es eine Option dass man den Ort selbst als Parameter in den Widget-Einstellungen eingibt und das Widget auf diesen Ort zurückgreift sobald die Ortung fehlschlägt?

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 11, 2020

Okay 👍🏻 Danke für die Mühe. Sieht jetzt besser aus als eine Fehlermeldung mit rotem Text.

Wenn es an der Ortung liegt weswegen die Fehler auftreten, wäre es eine Option dass man den Ort selbst als Parameter in den Widget-Einstellungen eingibt und das Widget auf diesen Ort zurückgreift sobald die Ortung fehlschlägt?

Das sollte bereits funktionieren. Gib die Koordinaten mit Dezimalpunkt, getrennt durch Komma an.

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 11, 2020

Update: Die Ladeanzeige ist nun ein wenig schicker.

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 12, 2020

Update: Die Ortsbestimmung ist nun wieder eingebaut (aber technisch etwas anders). Feedback Welcome!

@wodkasreineseele

This comment has been minimized.

Copy link

@wodkasreineseele wodkasreineseele commented Nov 12, 2020

Ich habe es aktualisiert und werde es beobachten.
03F502BB-640E-4FE3-A1F9-F0D993883FD5

@frollein-ike

This comment has been minimized.

Copy link

@frollein-ike frollein-ike commented Nov 13, 2020

Bei mir funktioniert es in der neuen Version prima. 😃👍🏼

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 13, 2020

Bei mir funktioniert es in der neuen Version prima. 😃👍🏼

Danke, @frollein-ike, schön zu hören! Grüße in den Südwesten!

@wodkasreineseele

This comment has been minimized.

Copy link

@wodkasreineseele wodkasreineseele commented Nov 18, 2020

Läuft weiterhin alles stabil.

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Nov 18, 2020

Läuft weiterhin alles stabil.

Danke für die Rückmeldung!

@monza258

This comment has been minimized.

Copy link

@monza258 monza258 commented Jan 18, 2021

Hi, ist es möglich eine Benachrichtigung einzubauen? Ich möchte gerne das bei Sonnenuntergang eine Pushcut gesendet wird. So könnte ich Automationen erstellen.

If sunset then

const req2 = new Request('https://api.pushcut.io/-XXXXXXX/notifications/sunset')
   req2.method = 'POST'
    req2.headers = {
  'Content-Type': 'application/json'
}
req2.body = JSON.stringify({
  title: 'Sunset',
  text: 'Sunset',
  input: 'TEXT'
})
 
    await req2.loadJSON()
	}

Kann mir jemand sagen was ich wo einfügen müsste?

@HendrikRunte

This comment has been minimized.

Copy link
Owner Author

@HendrikRunte HendrikRunte commented Jan 18, 2021

Hi, ist es möglich eine Benachrichtigung einzubauen? Ich möchte gerne das bei Sonnenuntergang eine Pushcut gesendet wird. So könnte ich Automationen erstellen.

If sunset then

const req2 = new Request('https://api.pushcut.io/-XXXXXXX/notifications/sunset')
   req2.method = 'POST'
    req2.headers = {
  'Content-Type': 'application/json'
}
req2.body = JSON.stringify({
  title: 'Sunset',
  text: 'Sunset',
  input: 'TEXT'
})
 
    await req2.loadJSON()
	}

Kann mir jemand sagen was ich wo einfügen müsste?

Hi, das Widget hat derzeit kein Event wie »onSunset()«. Soweit ich weiß, wird es auch kein zuverlässiges EventHandling geben, wenn das Widget nicht gerade erst angezeigt wurde, da kein Hintergrundprozess läuft.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment