-
-
Notifications
You must be signed in to change notification settings - Fork 219
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature Request: Vorschläge Code Anpassungen app::setup & app::loop #483
Comments
Die Sonnenberechnung reicht wirklich nur einmal um Mitternacht und nachdem der ESP gebootet hat. Sooo viele Sonnen haben wir ja nicht 😅 |
vielen Dank für die konstruktiven Vorschläge, sind sehr sinnvoll. |
@lumapu vielen Dank für die guten Worte. Wenn schon am scheduling gearbeitet wird und Vorschläge willkommen sind, so würde ich die ganze Scheduler Klasse entfernen und durch die Ticker Klasse ersetzen. Nutzt den ESP Timer, ist viel flexibler (beliebige Zeiten) und kann wieder entfernt werden.
|
Ich habe jetzt absichtlich nicht die Ticker Funktion von ESP genommen, da ich gerne noch andere Plattformen (RP2040, proMini 328p) unterstützen möchte. |
@lumapu 👍👍👍 super Update, insbesondere der neue Scheduler!!! (verstehe auch, warum die Ticker Funktion nicht passt 😒; vielleicht wird's irgendwann ja noch etwas, auch RP2040 und proMini 328p haben Hardware Timer) Allerdings ist auch die Änderung "system clock was too fast" so nicht korrekt. Noch ein paar Anmerkungen zum Scheduler:
Vorschlag für die Scheduler loop:
und ein Vorschlag für die NTP Abfrage:
Übrigens: bisher wurde |
@lumapu die Reaktionszeiten sind manchmal etwas träge. Wird deutlich besser, wenn in |
refactored NTP generate bin.gz only for ESP8285 fix calcSunrise calculation
@lumapu 👍 vielen Dank für die Umsetzung. Nur die Anpassung in Und dann hat sich leider bei |
bei bei ist es glaube ich ein Verständnisproblem. Der Trigger wurde bei mir je nach ESP (ich habe 3stk. am laufen) nur ab und zu am nächsten Tag aufgeführt. Manchmal hat er wohl schon um 23:59:59 getriggert wodurch die gleichen Ergebnisse rauskommen und nie wieder getriggert wird. Daher die |
Das wird ja in der Zeile davor gemacht.
verkürzen zu
Das Triggerproblem ist merkwürdig. Selbst das NTP Update sollte das nicht beeinflussen, Nur so, wie jetzt getriggert wird, sind es 1000 Sekunden VOR Mitternacht! Sollen es (warum auch immer) 1000 Sekunden NACH Mitternacht sein, muss 1000 abgezogen werden: |
Sorry, hab' noch zwei Punkte:
In
|
refactored web and webApi -> now RestApi.h fix calcSunrise fixed calcSunrise trigger calculation display zero values on /live added changes from #483
vielen Dank für deine Beiträge, ich habe hoffentlich alles integriert und umgesetzt. Ich freue mich immer wieder hier über gute Verbesserungen zu lesen, weiter so :-) |
👍👍👍 WOW! Klasse Idee und Umsetzung Interface Class und RestApi! Macht es auch einfacher, den Code zu lesen. Nur bei
Zwei Anmerkungen (dann ist auch gut 😄): In der |
Ich habe die Scheduler Klasse per einzeln simuliert und gemerkt, wenn ich die |
Ok, ich bin da Theoretiker: |
👏Kommunikation mit einzelnen Invertern an- und abschalten |
noch etwas: |
Vorschlag zu
Zusammen mit dem |
@beegee3 danke für deine Ideen👍, ich habe es mit |
👌 Ein letzter Hinweis: in |
bitte nicht aufhören, finde die Verbesserungen Klasse! |
@lumapu Danke sehr. Manchmal finde ich meine eigenen Kommentare sehr pedantisch. Denke dann aber, vielleicht kann doch das eine oder andere dazu beitragen, AHOY noch besser zu machen. Der größte Dank gebührt aber dir für deine Arbeit!!! |
Nun ja, ich habe das Gefühl das durch Deine Vorschläge und Anpassungen das Ganze stabiler wird. Es gab Tage da bootete mir der ESP mehrmals täglich. Seit dem läuft er stabiler, keine Selbstständigen Reboots mehr, allerdings sind es selten mehr als 2 Tage bevor wieder ein neuer Update rein kommt 😅 |
OK, Danke. Das hier diskutierte ist aber entweder umgesetzt, oder mittlerweile obsolet. Daher schließe ich das hier ab und wünsche vorsorglich schon mal allen, die hier mitgemacht haben, frohe Weihnachten und einen guten Rutsch 🎅 🎄 🎁 |
hier ein paar Hinweise und Vorschläge basierend auf dev03, Version 0.5.47:
WIFI_TRY_CONNECT_TIME (in
config.h
definiert) wird nur inmain.cpp
fürmyApp.setup(...)
benutzt,aber in
app::setup(uint32_t timeout)
gar nicht verwendet, kann also entfernt werden.Der ahoyTimer wird in
ahoywifi.app
nicht benutzt, d.h.#include "../utils/ahoyTimer.h"
kann dort entfernt werden.In
app::setup
wirdaddListener(...)
fürntpUpdateTick
erstellt. Das sollte nur für#if !defined(AP_ONLY)
sein.In
app:loop
wird jede Sekunde geprüft, ob die Sonnenaufgang bzw. -untergang Zeiten neu berechnet werden müssen.Auch das sollte nur für
#if !defined(AP_ONLY)
gemacht werden, aber viel wichtiger:der
if(...)
Ausdruck wird 86400-mal am Tag berechnet, obwohl die Zeiten nur 1-mal aktualisiert werden.Und in dem Ausdruck sind zwei Divisionen, was den Prozessor unnötig auslastet (weil es ja jede Sekunde passiert).
Ohne sonst viel anzupassen, sollte die Aktualisierung der Sonnenzeiten besser in einer eigenen Funktion isoliert werden,
die z.B. mit
addListener(EVERY_HR, ...)
inapp::setup
eingestellt wird und so nur stündlich aufgerufen wird.Das ist dann zwar immer noch 24-mal pro Tag und die Aktualisierung findet irgendwann zwischen Mitternacht und ein Uhr morgens statt, aber das sollte akzeptabel sein.
Der erste Aufruf nach einem Reboot könnte z.B. in der Funktion
uptimeTick
if (mUpdateNtp) {...}
nachmWifi.getNtpTime()
passieren (sonst wartet man ja eine Stunde).Die oben genannten zwei Divisionen kann man auch vermeiden, indem nicht
mLatestSunTimestamp
berechnet wird, sondern dienächste Mitternacht Zeit in UTC konvertiert:
mNextSunTimestamp = ((mUtcTimestamp + mCalculatedTimezoneOffset) / 86400 + 1) * 86400 - mCalculatedTimezoneOffset;
Die
if(...)
Abfrage wäre dann:if (mUtcTimestamp > mNextSunTimestamp && mConfig->sun.lat && mConfig->sun.lon) { // update on reboot or midnight ... }
Daraus folgen dann weitere Anpassungen:
in
app::resetSystem
:mNextSunTimestamp = 946684800; // midnight 1/1/2000
in
app.h
:...
inline uint32_t getLatestSunTimestamp(void) { return mNextSunTimestamp; }
...
uint32_t mNextSunTimestamp;
wenn man die
inline
Funktion z.B. ingetNextSunTimestamp
umbenennen will, dann auch inwebApi.cpp
!In der
Scheduler loop
wird davon ausgegangen, dass von einem zum nächsten Aufruf weniger als 2 Sekunden vergehen.Das muss aber nicht sein, z.B. wenn der NTP Server nicht antwortet. Ist nicht dramatisch, aber es können sich Verschiebungen anhäufen.
Ausgehend davon, dass es keine einzelnen Verschiebungen von 1 Minute oder mehr gibt, genügt es, die Sekunden aus der Differenz von millis() und mPrevMillis zu berechnen. Im Detail ist es dann wegen des millis() overflow alle ~50 Tage aber doch schwieriger,
hier mein Vorschlag (bei Vermeidung dynamischer Variablen und Integerdivison):
The text was updated successfully, but these errors were encountered: