Um das Feature „rund“ zu machen, müssen wir das auf jeden Fall auch direkt ins Webinterface integrieren. Weil auf der einen Seite arbeiten wir daran, dass wir die Compiler-Direktiven reduzieren - da ist es ungut, wenn wir wieder neue schaffen, die später (absehbar!) dann migriert werden müssen.
Aber für einen POC ist das erstmal ok für mich.
Die Power und Rfid Änderungen gehören nicht zum Cloud System. Sind auch getrennte Commits.
Beim Abschalten des POWER Features kamen Compilerfehler.
Genau so bei der Nutzung von I2C für den RfidReader , bei dem Fix habe ich gleich die RST_PIN Direktive mit der RFID_RST zusammen geführt.
Wegen Default: Ist ja mein Fork daher sind es auch meine Einstellungen die halt standardmässig an sind. Der Server ist öffentlich, jeder kann wenn er mag sich registrieren und seine Karten und Medien administrieren.
Natürlich kann man auch selber ein Server hochziehen und diesen hinterlegen.
Ja das habe ich mir auch schonmal gedacht warum wir das alles über Direktiven lösen und nicht über Settings. So kann aber mehr RAM und Flashgröße eingespart werden daher hat beides Vorteile.
Naja letztlich hat es sich so entwickelt, da es auf Entwicklerseite natürlich auch am einfachsten ist. Auf der Userseite sieht’s aber halt so aus, dass Mancheiner doch überfordert ist. Aus dem Grund ist das Ziel, dass man irgendwann mal einen uniformen Build hat und man die Konfiguration über das Webinterface macht. Dann muss nicht jeder VSC + Platformio installieren.
Aber ist noch ein langer Weg…
Ich kann das gerne anpassen.
Ich hab gerade den entsprechenden Thread gefunden…
@QDaniel Erst mal schön, dass du nach längerer Zeit wieder dabei bist! Das Thema scheint viele zu interessieren.
Kannst du hier ganz kurz beschreiben was deine Cloud genau macht? Denn nicht jeder kennt die Funktionalität, ich habe zum Beispiel noch nie eine Cloud für ESPuino verwendet. Download von Audiodateien auf SD, Streaming, Benutzerrollen, Musik teilen? Ist dein Konzept kompatibel mit einem Standard z.B. DLNA? Dein Server basiert auf C#, wo kann man sowas privat kostenfrei aufsetzen/hostem?
ah okay danke für die Infos.
D.h. du würdest nur die Änderungen vom Commit QUino Cloud-Manager · QDaniel/ESPuino@8c86929 · GitHub würden zu deinem PR gehören, richtig?
Ich finde es schwer hier zu entscheiden ob zur Laufzeit oder nicht, ich würde den Server aber auf jeden Fall zur Laufzeit änderbar machen.
(inkl. einem Test zur Laufzeot ob der Server erreichbar ist)
Ob das Feature drin ist oder nicht kann imho per #define erledigt werden, das es schon ein sehr aufwendiges komplexes Feature ist.
Die Frage des Hosting stellt sich mir auch, reicht da ein Rasperry Pi im lokalen NW für?
Die Cloud an sich, ist nicht viel und genau genommen vom Code her nicht aufwendig.
Ablauf
Ich sende bei unbekannten Tags eine Anfrage an: {SERVER_URL}/api/rfid/info/{TAG_ID}
Bekomme dann eine spezielle M3U zurück:
#{EINDEUTIGER_STRING_FUER_CHANGE_ERKENNUNG}
#INCOMPLETE
Vollständige URL zum Media File
Vollständige URL zum Media File
...
Diese Datei speichere ich auf der SD und lade sie in die Play-Queue.
Im Hintergrund gehe ich diese Datei durch schaue nach ob die zweite Zeile ‚#INCOMPLETE‘ lautet.
Wenn Ja dann werden die Files herunter geladen und nummeriert auf der SD gespeichert TAGID/XXX.mp3
Die gecachte M3U wird mit dem lokalen Path aktualisiert.
Wenn am Ende keine URLs mehr in der M§U sind, wird die zweite Zeile auf ‚#COMPLETED‘ geändert.
Beim zweiten auflegen wir dann die gecachte M3U in die Play-Queue gelegt.
Und dann mit übergabe des eindeutigen Strings, wieder am Server angefragt.
Server
Der Server ist in .NET Core geschrieben, lässt sich auf jedem Linux oder Windows starten.
Man könnte dann auch ein Docker-Image bereitstellen.
Nach dem ersten Start und anlegen der DB, werden im Ordner AppData das erstellte AdminPasswort als Datei abgelegt.
Somit gibt es keine Standard-Passwörter oder so.
Ich werde dann nochmal ein eigenen Thread dafür machen.
Infos
Wenn ich Web-Streams setzen möchte, wird die zweite Zeile direkt mit ‚#COMPLETED‘ vom Server geschickt. So versucht der ESP nicht die Web-Streams runterzuladen.
Admin-Karten werden mit #CMD:{BEFEHLSCODE} versendet.
Server Installation in Kurz
.NET SDK 9 installieren:
Code herunterladen:
git clone https://github.com/QDaniel/QUinoCloud.git
Starten (am besten in einem extra screen):
dotnet run
Hab den Ablauf nun etwas modifiziert .
Damit ist es nun möglich das System ohne Serverseitige Unterstützung zu nutzen.
Die Taginfos können dann auch einfach statische Files sein die jeder Web-Server mit ETag-Header ausliefern kann.
Werde das noch testen und dann hochladen.
Zur Vorgehensweise habe ich, ohne mir den Code angeschaut zu haben, verschiedene Fragen.
a) D.h. für’s Erste, so dass die Musik (oder was auch immer) sofort losläuft, streamst du das vom Server und parallel dazu lädst du es runter. Korrekt? Hast den Durchsatz mal gemessen und geht das parallel auch ruckelfrei?
b) D.h. wenn es, durch welches Event auch immer, zu einer Unterbrechung des Runterladens kommt, dann beginnt die Übertragung ganz von vorne. Korrekt?
Nummeriert heißt: Sie kriegen einen Präfix (001_name.mp3) oder heißen die Dateien dann z.B. 001.mp3?
Den definierst du dann in der Cloud? Also was genau passiert da alles?
Das musst du nochmal genauer erklären.
Die M3U die heruntergeladen wird für Tag 0123456789 sieht auf dem Server z.B. wie folgt aus :
#INCOMPLETE
http://quino.0011.de/dl/media/7ca82f0b-4da0-413a-a827-684764e78e43/c2uccwlpcgooyvnyux7bsnyxx7koyzlp.flac
Gespeichert wird diese dann auf der SD unter:
/CloudCache/0123456789.m3u
#"etag123456789Abc"
#INCOMPLETE
http://quino.0011.de/dl/media/7ca82f0b-4da0-413a-a827-684764e78e43/c2uccwlpcgooyvnyux7bsnyxx7koyzlp.flac
Dann wird die URL heruntergeladen und auf SD gespeichert unter:
/0123456789/001.flac
Danach wird die Datei auf der SD-Karte geändert zu:
#"etag123456789Abc"
#COMPLETED
/0123456789/001.flac
Jedes mal wenn die Karte aufgelegt wird, wird einfach nur die M3U geladen und geschaut ob noch INCOMPLETE drin steht.
Und damit ein evtl. abgebrochener Download neugestartet.
Zusätzlich wird versucht vom Server die Info-Datei nochmal zu holen, dabei wird der ETag (Der Cache-Identifier vom Web-Server, welchen ich als erste Zeile speichere) mitgeschickt und abgeglichen. Dadurch erkennt der ESP dann Änderungen vom Server.
Da beim Streamen nur soviel Daten geladen werden wie verarbeitet werden können, ist beim Streamen die Datenrate langsamer als möglich daher ist es dann auch möglich nebenbei andere Daten herunter zu laden.
Das WLAN vom ESP32 schafft knapp ca. 5Mbit das speichern auf die SD ist nur langsam (ca. 2Mbit) daher kann Stream und SD gut gleichzeitig funktionieren.
Bei Web-Streams wird die Server-Datei gleich mit COMPLETED gesendet z.B. 0987654321.
#COMPLETED
https://streamtdy.ir-media-tec.com/live/mp3-128/web/play.mp3
Dadurch weiß das System das nichts runterladen werden muss. Die M3U wird dann ganz normal in die Play-Liste geladen.
Danke für die Ausführungen .
Ich weiß noch nicht, ob ich die Namensstruktur gut finde, weil mich das auch so ein bisschen an die Tonuino-Limitierungen erinnert. Aber vielleicht ist das auch völlig ok wenn man sagt, dass man die tatsächliche Verwaltung woanders macht und sich gar nicht mehr so sehr darum kümmert, was auf der SD drauf ist bzw. wie das dort heißt. Definitiv wird damit der Prozess schwerer, wenn man sagt, dass man über das Webinterface spontan mal was abspielen will, weil dann sind halt nur Nummern da.
Sollten vielleicht diejenigen, die das Feature nutzen werden/wollen, mal beurteilen. Ein entsprechender Feature-Request wird garantiert früher oder später kommen, dass man gerne eine andere Benamung hätte .
@tueddy Hast du da ne Meinung zu?
Über den Audio Player haben wir ja schon nen AudioTagReader.
Evtl. Können wir einfach ein Media Browser Implementieren der die Titel und Album Infos aus den Files ausliest und diese anzeigen.
Den Scan kann man ja evtl. Nur Manuell im Webinterface anstoßen um dann die. Verwaltung einfacher zu haben.
Aber ich kann auch implementieren das ein bestimmter Kommentar vor der Url Zeile den Dateinamen anpasst.
Ja genau deshalb bin ich da ein wenig raus, ich werde wohl keine Verwendung dafür haben
Gut finde ich den Ansatz es über eine erweiterte M3U-Playlist zu lösen!
Über den Audio Player haben wir ja schon nen AudioTagReader.
Jein: Ich hatte mal geschaut ob man die Metadaten wie Album/Titel usw. über die Weboberfläche (Kontextmenu auf Datei → Info) anzeigt. Mit der Audiobibliothek klappt es aber nur wenn der Song auch abgespielt wird. Evt. geht es aber evt. auch mit arduino-audio-tools & diesem Beispiel. Diese Bibliothek ist bereits eingebunden.
Unabhängig davon würde ich zunächst den POWER-Bugfix übernehmen, direkt per Cherry-Pick oder @QDaniel willst Du einen getrennten PR erstellen?
Kannst du gerne Cherry picken.
Was haltet ihr davon das immer der Filename zum speichern angegeben werden muss und wenn nicht wird das als Stream interpretiert?
Mit Ordner angabe, dann kann es auch mehrere Tage mit den selben Files geben. Evtl. mit Angabe der Dateigröße die ich dann abgleiche
Mir geht es mit der Verwendung auch so, aber ich meinte jetzt rein aus Nutzersicht. Brauchen hin oder her
Also meine Art mit meinen Audiofiles umzugehen ist ziemlich oldschool. D.h. ich mache mir selten die Arbeit, dass ich id3-Tags setze, sondern es ist alles in Ordnern organisiert. Würde ich das Feature hier vor diesem Hintergrund bauen, dann würde ich die Filenamen entsprechend übernehmen wollen - weil sie mir halt wichtig sind. Aber ich will mich jetzt nicht als Gatekeeper hinstellen und sagen, dass wir das so machen müssen. Wenn euch das anders taugt, dann macht’s anders. Ich glaube nur, dass wenn man die Dateinamen mitüberträgt, dass man dann mind. mal keinen Nachteil hat.
Das ist sicherlich auch ne Möglichkeit, dass man die Größen abgleicht, so dass man sich bei Verbindungsabbruch die Mehrfachübertragung von Files spart, die man eigentlich schon übertragen hat. Muss man nur schauen, wie man sowas in ein m3u kriegt, dass wir es auch lesen können. Im einfachsten Fall macht man unter incomplete nochmal sowas wie #SIZE und listet, komplementär zu den Zeilen der tatsächlichen Files irgendwie so als Array die Größen auf. Irgendwie so, hab’s jetzt nicht tief durchdacht.
Dem schließe ich mich ausdrücklich an .
Das incomplete wäre dann nicht mehr Nötig.
#DL-FILE:/path/zur/;datei.mp3;9674323
Ich schau dann nur noch gibt es URLs wo dieser Kommentar davor steht. Und die werden entsprechend geladen.
Ich lade sowieso die Dateien immer erst in eine tmp Datei und benenne diese dann nach erfolgreicher Übertragung erst um. Fehlerhafte Files werden dann immer wieder geladen.
Hab das nun entsprechend geändert.
Das einzige was noch offen ist sind die verschiedenen Play-Modes z.b: für Audiobook etc. das wird zurzeit noch nicht behandelt.
Schön zu sehen das es hier etwas Neues gibt. Meine eigene hacky Cloud Implementierung basiert noch auf dem Stand von vor ca. 1 Jahr. Da war Streamen und parallel Downloaden performancetechnisch keine Option (Bei mir wurden die Dateien während des Streams auf die SD Karte gespeichert.
Schön zu hören das Download+Stream seit dem audio lib Performance Patch wohl kein Problem mehr ist.
Hast du mal Streamen+Downloaden via HTTPS probiert?
Anstelle Custom M3U Tags zu verwenden würde ich vorschlagen, die benötigten Informationen in M3U Attribute zu packen, das lässt sich dann leichter erweitern und man kann es mit Standard M3U Parser Bibliotheken lesen/schreiben.
Sieht bei mir z. B. so aus:
#EXTM3U version="1" mtime="1711699846286" tag-id="1e889eda-4b39-43b5-b120-4f8d7062d177" play-mode="3" dir="audiobooks/Die drei Fragezeichen Kids/013 Im Reich der Rätsel"
#PLAYLIST:Im Reich der Rätsel
#EXTINF:500 mtime="1711694974307" size="110743867" filename="Die drei Fragezeichen Kids - 013 Im Reich der Rätsel.mp3",Die drei Fragezeichen Kids - 013 Im Reich der Rätsel
https://example.com/espuino/items/014835a7-597f-4855-8ee7-9a8e9d4e5442/file/73990385/download
Hallo QDaniel,
ich gebe eigentlich immer einen ganzen Ordner für eine Spielkarte an. So hoffe ich, dass das ganze Übersichtlich bleibt.
Das einzige was mich natürlich nervt, ist die Übertragung zum Espuino. Durch FTP klappt das schon recht einfach aber man muss natürlich trotzdem recht viel prüfen usw.
Cool wäre es für mich, wenn ich alles auf meinem kleinen Heimserver verwalten könnte und der Espuino automatisch einen abgleich machen würde. Z.B. fehlt eine Datei oder wurde diese verschoben usw.
Wäre das mit deinem Stand rel. einfach möglich?
Meine Dateien sind aktuell nur durch Interpret und Liedernamen benannt. Für die richtige Reihenfolge, setze ich noch die Zahl davor;)
Das würde ich gerne so weiterführen…
Grüße
Felix
Mit der neusten Version ja.
Du benötigst nur eine Karte die deine gesamte Bibliothek enthält.
Aber Das System löscht oder benennt nichts um. Es lädt es einfach nochmal runter wenn die Größe nicht passt.