From f09544bbee0606a52482400d4e182b8ebf427ea1 Mon Sep 17 00:00:00 2001 From: Thomas Renger Date: Wed, 28 Aug 2024 11:24:18 +0200 Subject: [PATCH] First moon bot --- .gitignore | 2 + bot/Dockerfile | 1 + bot/moon.php | 269 +++++++++++++++++++++++++++++++++++++++++++++++ bot/testbot.py | 26 +++++ bot/testmoon.py | 44 ++++++++ bot/testmoon2.py | 99 +++++++++++++++++ 6 files changed, 441 insertions(+) create mode 100644 bot/Dockerfile create mode 100644 bot/moon.php create mode 100644 bot/testbot.py create mode 100644 bot/testmoon.py create mode 100644 bot/testmoon2.py diff --git a/.gitignore b/.gitignore index 3f35a11..53a2c0a 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ /vendors/* .DS_Store +__pycache__ +*.secret diff --git a/bot/Dockerfile b/bot/Dockerfile new file mode 100644 index 0000000..6efd40d --- /dev/null +++ b/bot/Dockerfile @@ -0,0 +1 @@ +# pip3 install Mastodon.py \ No newline at end of file diff --git a/bot/moon.php b/bot/moon.php new file mode 100644 index 0000000..823d920 --- /dev/null +++ b/bot/moon.php @@ -0,0 +1,269 @@ += 99 ){ //--Vollmond + $phase_text = 'Vollmond'; + if($mondphase>=99){ + $pic = rescale([99,100],[172,177]);} // ([Mondphasen von,bis],[Bildnummern von,bis]) + else{ + $pic = rescale([0,1],[178,182]);} + $pic_n = floor($pic($mondphase)); + if($pic_n<10){ + $pic_n = "00".$pic_n;} + elseif($pic_n<100){ + $pic_n = "0".$pic_n;} + else{$pic_n = $pic_n;} + $path = ''; + setvalue(32646 /*[Wetterdaten\Astronomische Daten\Mondansicht]*/, $path); + } + elseif ($mondphase > 1 && $mondphase < 49){ //--abnehmender Mond + $phase_text = 'abnehmender Mond'; + $pic = rescale([2,48],[183,352]); + $pic_n = floor($pic($mondphase)); + if($pic_n<10){ + $pic_n = "00".$pic_n;} + elseif($pic_n<100){ + $pic_n = "0".$pic_n;} + else{$pic_n = $pic_n;} + $path = ''; + setvalue(32646 /*[Wetterdaten\Astronomische Daten\Mondansicht]*/, $path); + } + elseif ($mondphase >= 49 && $mondphase <= 51){ //--Neumond + $phase_text = 'Neumond'; + $pic = rescale([49,51],[353,362]); + $pic_n = floor($pic($mondphase)); + if($pic_n<10){ + $pic_n = "00".$pic_n;} + elseif($pic_n<100){ + $pic_n = "0".$pic_n;} + else{$pic_n = $pic_n;} + $path = ''; + setvalue(32646 /*[Wetterdaten\Astronomische Daten\Mondansicht]*/, $path); + } + else{ //--zunehmender Mond + $phase_text = 'zunehmender Mond'; + $pic = rescale([52,98],[008,171]); + $pic_n = floor($pic($mondphase)); + if($pic_n<10){ + $pic_n = "00".$pic_n;} + elseif($pic_n<100){ + $pic_n = "0".$pic_n;} + else{$pic_n = $pic_n;} + $path = ''; + setvalue(32646 /*[Wetterdaten\Astronomische Daten\Mondansicht]*/, $path); + } + +//------------------------------------------------------------------------------ + +// ============================================================ +// +// Phasen: phase = 0 für Neumond +// phase = 0.25 für erstes Viertel +// phase = 0.5 für Vollmond +// phase = 0.75 für letztes Viertel +// Für Werte anders als 0, 0.25, 0.5 oder 0.75 ist nachstehendes Script ungültig. +// Angabe des Zeitpunktes als Fließkomma-Jahreszahl +// Bsp.: 1.8.2006 = ca. 2006.581 +// +// Ergebnis: $JDE +// ============================================================ + +// aktuelles Datum in Jahre umrechnen +$year = ((((((date("s") / 60)+ date("i")) / 60)+date("G")) / 24) + date("z") - 1) / (365 + (date("L"))) + date("Y"); +//print_r(date("z")); +$rads = 3.14159265359/180; + +$table = ""; +$name = ""; + +for ($phase = 0; $phase < 1; $phase += 0.25){ + // Anzahl der Mondphasen seit 2000 + $k = floor(($year-2000)*12.36853087)+$phase; + // Mittlerer JDE Wert des Ereignisses + $JDE = 2451550.09766+29.530588861*$k; + // Relevante Winkelwerte in [Radiant] + $M = (2.5534+29.10535670*$k)*$rads; + $Ms = (201.5643+385.81693528*$k)*$rads; + $F = (160.7108+390.67050284*$k)*$rads; + + if ($phase == 0){ + // Korrekturterme JDE für Neumond + $JDE += -0.40720*Sin($Ms); + $JDE += 0.17241*Sin($M); + $JDE += 0.01608*Sin(2*$Ms); + $JDE += 0.01039*Sin(2*$F); + $JDE += 0.00739*Sin($Ms-$M); + $JDE += -0.00514*Sin($Ms+$M); + $JDE += 0.00208*Sin(2*$M); + $JDE += -0.00111*Sin($Ms-2*$F); + } + elseif ($phase == 0.5) { + // Korrekturterme JDE für Vollmond + $JDE += -0.40614*Sin($Ms); + $JDE += 0.17302*Sin($M); + $JDE += 0.01614*Sin(2*$Ms); + $JDE += 0.01043*Sin(2*$F); + $JDE += 0.00734*Sin($Ms-$M); + $JDE += -0.00515*Sin($Ms+$M); + $JDE += 0.00209*Sin(2*$M); + $JDE += -0.00111*Sin($Ms-2*$F); + } + + if ($phase == 0.25 || $phase == 0.75){ + // Korrekturterme für JDE für das 1. bzw. letzte Viertel + $JDE += -0.62801*Sin($Ms); + $JDE += 0.17172*Sin($M); + $JDE += -0.01183*Sin($Ms+$M); + $JDE += 0.00862*Sin(2*$Ms); + $JDE += 0.00804*Sin(2*$F); + $JDE += 0.00454*Sin($Ms-$M); + $JDE += 0.00204*Sin(2*$M); + $JDE += -0.00180*Sin($Ms-2*$F); + + // Weiterer Korrekturterm für Viertelphasen + if ($phase == 0.25){ + $JDE += 0.00306; + } else { + $JDE += -0.00306; + } + } + + // Konvertierung von Julianischem Datum auf Gregorianisches Datum + $z = floor($JDE + 0.5); + $f = ($JDE + 0.5) - floor($JDE + 0.5); + if ($z < 2299161){ + $a = $z; + } + else { + $g = floor(($z - 1867216.25) / 36524.25); + $a = $z + 1 + $g - floor($g / 4); + } + $b = $a + 1524; + $c = floor(($b - 122.1) / 365.25); + $d = floor(365.25 * $c); + $e = floor(($b - $d) / 30.6001); + + $tag_temp = $b - $d - floor(30.6001 * $e) + $f; //Tag incl. Tagesbruchteilen + $stunde_temp = ($tag_temp - floor($tag_temp)) * 24; + $minute_temp = ($stunde_temp - floor($stunde_temp)) * 60; + + $stunde = floor($stunde_temp); + $minute = floor($minute_temp); + $sekunde = round(($minute_temp - floor($minute_temp)) * 60); + + $tag = floor($tag_temp); + + if ($e < 14) { + $monat = $e -1; + } + else { + $monat = $e - 13; + } + if ($monat > 2) { + $jahr = $c - 4716; + } + else { + $jahr = $c - 4715; + } + + $sommerzeit = date("I"); + if($sommerzeit == 0){ + $datum = mktime($stunde,$minute,$sekunde+3600,$monat,$tag,$jahr); + } + else{ + $datum = mktime($stunde,$minute,$sekunde+7200,$monat,$tag,$jahr); + } + + switch ($phase){ + case 0: + $ausgabe = 'Neumond'; + break; + case 0.25: + $ausgabe = 'erstes Viertel'; + break; + case 0.5: + $ausgabe = 'Vollmond'; + break; + case 0.75: + $ausgabe = 'letztes Viertel'; + break; + } + + $date = date("D",($datum)); + if($date == "Mon"){ + $wt = "Mo";} + elseif ($date == "Tue"){ + $wt = "Di";} + elseif ($date == "Wed"){ + $wt = "Mi";} + elseif ($date == "Thu"){ + $wt = "Do";} + elseif ($date == "Fri"){ + $wt = "Fr";} + elseif ($date == "Sat"){ + $wt = "Sa";} + elseif ($date == "Sun"){ + $wt = "So";} + + $table .= ($wt.", ".date("d.m.Y H:i",($datum)).";"); + $name .= ($ausgabe.";"); + } + + +setvalue(18785 /*[Wetterdaten\Astronomische Daten\Mondphase]*/,$phase_text." - ".$mondphase."%"); +$var = explode(";",$table); +$var_name = explode(";",$name); +IPS_SetName(11478 /*[Wetterdaten\Astronomische Daten\Neumond]*/, $var_name[0]); +IPS_SetName(52027 /*[Wetterdaten\Astronomische Daten\erstes Viertel]*/, $var_name[1]); +IPS_SetName(53514 /*[Wetterdaten\Astronomische Daten\Vollmond]*/, $var_name[2]); +IPS_SetName(41504 /*[Wetterdaten\Astronomische Daten\letztes Viertel]*/, $var_name[3]); +setvalue(11478 /*[Wetterdaten\Astronomische Daten\Neumond]*/, $var[0]); +setvalue(52027 /*[Wetterdaten\Astronomische Daten\erstes Viertel]*/, $var[1]); +setvalue(53514 /*[Wetterdaten\Astronomische Daten\Vollmond]*/, $var[2]); +setvalue(41504 /*[Wetterdaten\Astronomische Daten\letztes Viertel]*/, $var[3]); + + +//------------------------------------------------------------------------------ +// Berechnung der Mondauf/untergangs Zeiten + +$month = date("m"); +$day = date("d"); +$year = date("Y"); + +include "55184.ips.php"; // Aufruf Moon Rise/Set Script + +$data = (Moon::calculateMoonTimes($month, $day, $year, (getvalue(29795 /*[Scripte\Sonnenauf/untergang\Breitengrad (x1000000)]*/)/1000000), (getvalue(31634 /*[Scripte\Sonnenauf/untergang\Längengrad (x1000000)]*/)/1000000))); + +$rise = $data->{'moonrise'}; //Aufgang +$set = $data->{'moonset'}; //Untergang + +setvalue(55563 /*[Wetterdaten\Astronomische Daten\Mondaufgang]*/,date("H:i",$rise)); +setvalue(31319 /*[Wetterdaten\Astronomische Daten\Monduntergang]*/,date("H:i",$set)); + + +?> \ No newline at end of file diff --git a/bot/testbot.py b/bot/testbot.py new file mode 100644 index 0000000..d01063a --- /dev/null +++ b/bot/testbot.py @@ -0,0 +1,26 @@ +import datetime +import testmoon2 +from mastodon import Mastodon + +# Set up Mastodon +mastodon = Mastodon( + access_token = 'testtoken.secret', + # api_base_url = 'https://fnordon.de/' + api_base_url = 'https://mastodon.wazongtest.de/' +) + + +now = datetime.datetime.now() +moon_text="Aktuelle Mondphase:\n" +moon_text+=testmoon2.moon_phase_as_text(now) +moon_text+="\n" +moon_text+=testmoon2.till_next_full_as_text(now) +print(moon_text) + +mastodon.status_post(moon_text) + +me = mastodon.me() + +print(me['id']) + +print(mastodon.account_statuses(me['id'])[0]) \ No newline at end of file diff --git a/bot/testmoon.py b/bot/testmoon.py new file mode 100644 index 0000000..63cd1bf --- /dev/null +++ b/bot/testmoon.py @@ -0,0 +1,44 @@ +from astral.moon import phase +from mastodon import Mastodon +import datetime + +# Set up Mastodon +mastodon = Mastodon( + access_token = 'testtoken.secret', + # api_base_url = 'https://fnordon.de/' + api_base_url = 'https://mastodon.wazongtest.de/' +) + +now = datetime.datetime.now() +moon_today = phase(now) + +until_full = 14.00 - moon_today +print("until_full", end=": ") +print(until_full) +if (until_full<0): + until_full+=29.53 + print("corrected", end=": ") + print(until_full) + +moon_yesterday = phase(now - datetime.timedelta(days=1)) +moon_tomorrow = phase(now + datetime.timedelta(days=1)) + +next_full = now + datetime.timedelta(days=(until_full*1.055)) + +moon_text = "Next full moon " + format(next_full.isoformat()) + +# mastodon.status_post(moon_text) + +print("Heute", end=": ") +print(now) +print("Mext full", end=": ") +print(next_full) + +print("Mond gestern", end=": ") +print(moon_yesterday) +print("Mond heute", end=": ") +print(moon_today) +print("bis Vollmond", end=": ") +print(until_full) +print("Mond morgen", end=": ") +print(moon_tomorrow) \ No newline at end of file diff --git a/bot/testmoon2.py b/bot/testmoon2.py new file mode 100644 index 0000000..2c71229 --- /dev/null +++ b/bot/testmoon2.py @@ -0,0 +1,99 @@ +import datetime +import math + +def next_full_moon(start): + + # y2k = datetime.datetime(2000, 1, 1) + y2k = datetime.datetime(1999, 12, 22, 18, 31, 18) + since2000 = (start - y2k) / datetime.timedelta(days=365.25) + + rads = 3.14159265359/180 + phase=0.5 # 0.5 equals full moon + # Anzahl der Mondphasen seit 2000 + k = math.floor((since2000)*12.36853087)+phase + + # Mittlerer JDE Wert des Ereignisses + JDE = 2451550.09766+29.530588861*k + # Relevante Winkelwerte in [Radiant] + M = (2.5534+29.10535670*k)*rads + Ms = (201.5643+385.81693528*k)*rads + F = (160.7108+390.67050284*k)*rads + + # Korrekturterme JDE fuer Vollmond + JDE += -0.40614*math.sin(Ms) + JDE += 0.17302*math.sin(M) + JDE += 0.01614*math.sin(2*Ms) + JDE += 0.01043*math.sin(2*F) + JDE += 0.00734*math.sin(Ms-M) + JDE += -0.00515*math.sin(Ms+M) + JDE += 0.00209*math.sin(2*M) + JDE += -0.00111*math.sin(Ms-2*F) + + # Konvertierung von Julianischem Datum auf Gregorianisches Datum + + z = math.floor(JDE + 0.5) + f = (JDE + 0.5) - math.floor(JDE + 0.5) + if (z < 2299161): + a = z + else: + g = math.floor((z - 1867216.25) / 36524.25) + a = z + 1 + g - math.floor(g / 4) + b = a + 1524 + c = math.floor((b - 122.1) / 365.25) + d = math.floor(365.25 * c) + e = math.floor((b - d) / 30.6001) + + tag_temp = b - d - math.floor(30.6001 * e) + f # //Tag incl. Tagesbruchteilen + stunde_temp = (tag_temp - math.floor(tag_temp)) * 24 + minute_temp = (stunde_temp - math.floor(stunde_temp)) * 60 + + stunde = math.floor(stunde_temp) + minute = math.floor(minute_temp) + sekunde = round((minute_temp - math.floor(minute_temp)) * 60) + + tag = math.floor(tag_temp) + + if (e < 14): + monat = e -1 + else: + monat = e - 13 + + if (monat > 2): + jahr = c - 4716 + else: + jahr = c - 4715 + + return datetime.datetime(jahr, monat, tag, stunde, minute, sekunde) + + +def moon_phase_as_text(mday): + nmoon = next_full_moon(mday) + till_next_full=nmoon-mday + if (till_next_full < datetime.timedelta(days=1)): + return("🌕 Vollmond") + if (till_next_full < datetime.timedelta(days=6)): + return("🌔 Zunehmender Dreiviertelmond") + if (till_next_full < datetime.timedelta(days=10)): + return("🌓 Zunehmender Halbmond") + if (till_next_full < datetime.timedelta(days=14)): + return("🌒 Zunehmender Sichelond") + if (till_next_full < datetime.timedelta(days=16)): + return("🌑 Neumond") + if (till_next_full < datetime.timedelta(days=20)): + return("🌘 Abnehmender Sichelmond") + if (till_next_full < datetime.timedelta(days=24)): + return("🌗 Abnehmender Halbmond") + if (till_next_full < datetime.timedelta(days=28)): + return("🌖 Abnehmender Dreiviertelmond") + return("🌕 Vollmond") + +def strfdelta(tdelta, fmt): + d = {"days": tdelta.days} + d["hours"], rem = divmod(tdelta.seconds, 3600) + d["minutes"], d["seconds"] = divmod(rem, 60) + return fmt.format(**d) + +def till_next_full_as_text(mday): + nmoon = next_full_moon(mday) + till_next_full=nmoon-mday + return(strfdelta(till_next_full, "{days} Tage {hours} Stunden bis Vollmond")) \ No newline at end of file