Skip to content

Token Management, Database, ... #578

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

Merged
merged 25 commits into from
Aug 11, 2019
Merged

Token Management, Database, ... #578

merged 25 commits into from
Aug 11, 2019

Conversation

Paulchen-Panther
Copy link
Member

@Paulchen-Panther Paulchen-Panther commented Jul 12, 2019

This draft PR contains 3 parts. 2 parts.

  • The first part:

    • The Doxygen documentation generator has been removed from the local build and is now running free on CodeDocs.xyz
    • The network related configurations have been extended (token management, local and remote access, whitelisted IPs).
    • New (network related) settings are now stored in a database. The remaining settings will continue to be read/saved from/into the configuration file. This will change, however. Further details in the second part.
  • The second part:

    • As already announced in the first part, the complete config file was removed and replaced by the database.
    • Starting and stopping hyperion will now be handled internally by an instance manager. It has the ability to manage and start multiple instances. This allows multiple LED devices to be configured and controlled on one surface. It is therefore no longer necessary by hand.
  • The last part:
    - Comming soon postponed

I hope there are again many volunteer testers (and feedbacks) so this PR will be my last (before the first official release). And last but not least a special thanks to @brindosch.

Let there be light!

demo_token

instance_demo

Copy link
Contributor

@wolph wolph left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great :)

@janpfischer
Copy link
Contributor

janpfischer commented Jul 13, 2019

I build up upon your PR. I started Hyperion with a new config.
I can't access webui. I got the error
image

Also on console:

QSqlDatabasePrivate::database: requested database does not belong to the calling thread.
QSqlQuery::prepare: database not open
[hyperiond DB] <ERROR> Failed recordExists(): 'WHERE user=?' in table: 'auth' Error: Driver not loaded Driver not loaded
QSqlDatabasePrivate::database: requested database does not belong to the calling thread.
QSqlQuery::prepare: database not open
[hyperiond DB] <ERROR> Failed recordExists(): 'WHERE user=?' in table: 'auth' Error: Driver not loaded Driver not loaded
QSqlDatabasePrivate::database: requested database does not belong to the calling thread.
QSqlQuery::prepare: database not open
[hyperiond DB] <ERROR> Failed recordExists(): 'WHERE user=?' in table: 'auth' Error: Driver not loaded Driver not loaded

Testing on macOS.

I think the initial db is missing in your PR. Right?
Also occours if "apiAuth" is set to false.

@Paulchen-Panther
Copy link
Member Author

Paulchen-Panther commented Jul 13, 2019

@b1rdhous3 Thanks for testing on MacOS.
I made some modifications. Can you please test again?

@janpfischer
Copy link
Contributor

janpfischer commented Jul 13, 2019

@Paulchen-Panther I still got the same error when I initially open the webui. I have to press F5 to proceed. After that all is working.

Also I noticed that a change of the activation/deactivation of auth is only set if I restart Hyperion. Example: If I enable auth I can still access with my nodejs api to Hyperion. If I now restart Hyperion the access is denied. Also vice versa.

I noticed something other: (if I refresh the page all tokens are gone. Only visible if you generate a new one)
2019-07-13 14 33 45

@Paulchen-Panther
Copy link
Member Author

Paulchen-Panther commented Jul 13, 2019

@b1rdhous3
Bitte tue mir einen Gefallen und höre auf mir irgenwelche Fehler auf zu zählen, ohne dabei ein wenig ins detail zu gehen. Welcher Brwoser? Welches OS? Was erscheint im Log?
Ich kann leider nicht hellsehen.
DANKE

edit: schaue doch einfach mal in deinem home directory nach ob es im directory .hyperion ein ordner mit dem namen db gibt

@janpfischer
Copy link
Contributor

janpfischer commented Jul 13, 2019

Ich denke ich habe dir nicht völlig detaillos Informationen gegeben, aber gut:

  1. Fehler: Wie beschrieben kann ich erst auf die webUI zugreifen wenn ich einmal den Browser aktualisiere. Beim initialen Aufruf erscheint weiterhin die Fehlermeldung die du oben im Screenshot siehst. Weiterhin erscheint im Log folgendes:
[hyperiond DAEMON] <ERROR> The v4l2 grabber can not be instantiated, because it has been left out from the build
QSqlDatabasePrivate::database: requested database does not belong to the calling thread.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'hyperion', old connection removed.
QSqlQuery::prepare: database not open
[hyperiond DB] <ERROR> Failed recordExists(): 'WHERE user=?' in table: 'auth' Error:  
QSqlDatabasePrivate::database: requested database does not belong to the calling thread.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'hyperion', old connection removed.
QSqlQuery::prepare: database not open
[hyperiond DB] <ERROR> Failed to get record: 'WHERE type=? AND hyperion_inst=?' in table: 'settings' Error:  
QSqlDatabasePrivate::database: requested database does not belong to the calling thread.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'hyperion', old connection removed.
QSqlQuery::prepare: database not open
[hyperiond DB] <ERROR> Failed recordExists(): 'WHERE user=?' in table: 'auth' Error: 

Dies scheint allerdings nur beim ersten Aufruf so zu sein. Danach ist mir das beim Navigieren in der Software nicht aufgefallen.

  1. Fehler: Wenn ich die api authentication an- bzw. ausschalte muss Hyperion erst neugestartet werden, damit externe Programme (wie meine nodejs api) nicht mehr zugreifen (weil ich kein api key mitgebe) bzw zugreifen können. Eine Log Ausgabe erscheint hier nicht. Es scheint als sei die Information dass der auth Schalter umgestellt wurde intern nicht überall angekommen. Ich meine dabei den normalen Schalter: API Authentication

  2. Fehler: Wie im GIF gut zu sehen sind die API keys nur sichtbar wenn gerade ein neuer Key hinzugefügt wurde. Wird die Seite initial aufgerufen oder aktualisiert erscheint nichts. Eine Log Ausgabe erfolgt nicht. Weder bei Hyperion noch in der Browser Console.

Meine Browser: Safari und Chrome. OS weiterhin macOS (sowohl als Client, als auch als Server)

Edit: im .hyperion Verzeichnis hab ich nachgeschaut. Hier gibt es ein db Verzeichnis und eine Datenbank. Die hab ich mir auch angeschaut. Neue Einträge (wie meine tokens) werden erfolgreich geschrieben.

@brindosch
Copy link
Contributor

Yeah cool :)
Die Dokumentation findest du hier: https://docs.hyperion-project.org/en/developer/json-rpc/authorization
Sofern @Paulchen-Panther das so rüber kopiert hat :)
Ändern kann man es natürlich wie es einem gefällt. Vielleicht hab ich da auch was übersehen bezüglich Sicherheit...

@Paulchen-Panther
Copy link
Member Author

@b1rdhous3
I'm sorry that I spoke to you like this.
The token list will now be displayed correctly and the settings in the WebUI will be applied immediately. If you find any time I would be glad about a feedback. thanks man

@@ -50,6 +50,7 @@ $(document).ready( function() {
$(window.hyperion).one("cmd-config-getschema", function(event) {
window.serverSchema = event.response.info;
requestServerConfig();
requestTokenInfo();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Funktioniert das wirklich? Ich konnte bei mir noch nie 2 requests gleichzeitig abschicken, der zweite wurde immer von Hyperion gefressen. Hab da nie eine Antwort drauf gefunden.

Copy link
Member Author

@Paulchen-Panther Paulchen-Panther Jul 14, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Scheint zu funktionieren. Könnte natürlich auch an der (Browser) Websocket Implementierung liegen.

@janpfischer
Copy link
Contributor

@Paulchen-Panther alles gut!
Ich habe nun wieder getestet. Die Tokens werden nun direkt in der WebUI angezeigt. Auch das löschen und neu hinzufügen von Tokens funktioniert nun ohne Probleme. Danke!

Der andere Fehler beim initialen Laden der WebUi ist leider geblieben. Dieser tritt nur auf, wenn die WebUi das erste mal nach dem Start von hyperiond aufgerufen wird. Danach ist der weg. Die Fehlermeldung bleibt die gleiche wie ein paar Kommentare weiter oben.

Ich hab vom Netzverkehr mal zwei Gifs gemacht. Das erste Gif zeigt den Netzverkehr beim initialen Aufruf nach dem Start von hyperiond. Das zweite Gif den Netzverkehr bei der normalen Benutzung der Webui.
Ich tippe darauf, dass der Fehler mit der Datenbank (welchen man im Log sieht) dafür sorgt, dass die Logininformationen noch nicht verfügbar sind und somit nicht validiert werden können. Nach dem Fehler wird denke ich eine neue (funktionierende) Verbindung zu der DB aufgebaut.
Ich hoffe hier sind ein paar hilfreiche Informationen bei.

2019-07-14 11 50 42

2019-07-14 11 46 48

@@ -28,6 +28,7 @@ $(document).ready( function() {
// Token handling
function buildTokenList()
{
console.log(tokenList)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please delete this line?
Thank you!

Copy link
Member Author

@Paulchen-Panther Paulchen-Panther Jul 14, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. no Problem
edit: thanks for reporting. i forgot this totaly

@brindosch
Copy link
Contributor

It's an interesting error, especially as Hyperion should throw a runtime error when the database can't be opened
https://github.com/Paulchen-Panther/hyperion.ng/blob/api_auth/libsrc/db/DBManager.cpp#L37
I think i've never seen such an error. Also the double connection note is strange. Are there mutliple inits of the database?

Super strange

@Paulchen-Panther
Copy link
Member Author

Paulchen-Panther commented Jul 14, 2019

Second part is online

@b1rdhous3 Nochmals vielen dank für so viel Feedback. Was wäre Hyperion ohne deine Hilfe. 😄
Du könntest noch mal testen. Sind garantiert ein paar Fehler dazu gekommen! 😬
edit: könntest du mir noch deine qt version verraten?

@brindosch Unter MacOS scheint die Datenbank von QT etwas empfindlicher zu sein. Auf meinem Linux Testsystem macht die Datenbank keine zicken. Kann natürlich auch an der QT version liegen. Mal schauen wie sich das gestaltet. 😉

@janpfischer
Copy link
Contributor

@Paulchen-Panther vielen Dank! Aber ich denke der noch größere Dank gebührt dir ;)
Keine Sorge, ich mache mich auf die Suche. Habe gerade kompiliert, werde aber erst morgen richtig schauen können.
Die qt Version kann ich dir allerdings schon verraten:
qt: stable 5.12.3

Copy link
Contributor

@janpfischer janpfischer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Edit: messed up, sorry

// also used for watchdog
function requestAuthorization()
{
sendToHyperion("authorize","login",'"username": "Hyperion", "password": "hyperion"');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like like to start a discussion on this:

I think it is not good practice to give the webui a fixed password which is visible and transmitted in clear text. With this you can fake the webui. I would suggest something like this:

  1. On default after install you can login to webui without an account
  2. If you like you can activate logging in with an password on webui frontend by providing an own password which is transmitted and stored in db.
  3. After this you have to login if you startup the webui and the stored pw is used to authenticate through the api. Maybe we can use a cookie for this with a session id which acts as a token
  4. We should implement a SMALL binary on server side to either activate, deactivate or change pw. This is useful if you forgot your password. Or if it is possible to set it on webui after initial install someone could "steal" your webui by setting a password you don't know. We should use an extra binary to separate this from running Hyperiond service.

I would be more than happy to assist with this as I think this would be a very good feature. Especially for security.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Edge note: The password and username thing isn't fully implemented. Currently it's useless, as you can't change it anyway :)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I noticed that the username / password for the webui is initially set in the db which is delivered with compiling so to say.
So you just can check if the combination is right but you can't create a new user or change on at the moment with hyperion?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, no logic, no API, no UI :)
I never finished it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, i see. So we would have to do some work there before ;)

@janpfischer
Copy link
Contributor

@Paulchen-Panther ich habe gerade auf macOS und auf Ubuntu 19.04 versucht deine Neuerungen auszuprobieren. Leider kann ich auf beiden Maschinen Hyperion nicht mehr starten.

Sowohl auf macOS als auch auf Ubuntu erhalte ich folgende Meldung:

./hyperiond --debug
[hyperiond DAEMON] <DEBUG> <PythonInit.cpp:20:PythonInit()> Initializing Python interpreter
[hyperiond SettingsManager] <DEBUG> <SettingsManager.cpp:101:SettingsManager()> Settings database initialized
[hyperiond EFFECTFILES] <INFO> 36 effects loaded from directory :/effects/
[hyperiond EFFECTFILES] <INFO> 19 effect schemas loaded from directory :/effects/schema/
[hyperiond EFFECTFILES] <INFO> 0 effects loaded from directory /Users/jpfischer/.hyperion/custom-effects
[hyperiond SettingsManager] <DEBUG> <SettingsManager.cpp:101:SettingsManager()> Settings database initialized
[hyperiond BLACKBORDER] <DEBUG> <BlackBorderProcessor.cpp:65:handleSettingsUpdate()> Set mode to: default
[hyperiond ComponentRegister] <DEBUG> <ComponentRegister.cpp:67:componentStateChanged()> Blackborder detector: enabled
QSqlDatabasePrivate::database: requested database does not belong to the calling thread.
QSqlDatabasePrivate::removeDatabase: connection 'hyperion' is still in use, all queries will cease to work.
[1]    66913 segmentation fault  ./hyperiond --debug

Auf macOS hab ich qt mal auf 5.13 aktualisiert. Auf ubuntu nutze ich 5.12.2
Ich habe vorher beide .hyperion Verzeichnisse gelöscht, sodass auch eine neue Datenbank angelegt wurde.

Ich weiß nicht was ich dir sonst noch für Infos geben kann. Wenn du noch was brauchst sag gern bescheid.

Copy link

@RickDB RickDB left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great improvement all around 👍

@Paulchen-Panther
Copy link
Member Author

Paulchen-Panther commented Jul 15, 2019

@b1rdhous3
Echt klasse das du uns hier so unterstützt. Deine Vorschläge bezüglich dem Login Verfahren klingen echt gut.
Zu deinem Feedback. Gerade habe ich ein neues (2019-04-08) Raspbian Stretch auf einen RPi3 gezogen, kompiliert und ausgeführt. Das log befindet sich hier. Kurz gesagt, das funktioniert.

edit: Hab gerade gesehen, du benutzt Ubuntu 19 . Das basiert ja uahc auf Debian Buster. Ich teste das gleich mal.

edit2: Kannst ja mal schauen ob eines der unten aufgelisteten Pakete bei dir fehlt:

libqt5sql5
libqt5sql5-sqlite
libmysqlclient-dev
libsqlite3-0

@Paulchen-Panther
Copy link
Member Author

Hab es ohne einen Timer gelöst. Kodi benutzt auch keinen. Die Zusammenfassung der Nachrichten wird ausgegeben sobald eine neue rein kommt die nicht gleich ist wie die vorherigen. Damit der counter nicht endlos läuft, habe ich so wie im syslog eine obergrenze von 200 angegeben. Ist zwar "lachs" aber ist erst mal ein Anfang, ohne alles neu zu schreiben. 😁

@brindosch
Copy link
Contributor

Stimme dir zu. Sehr gut.
Ich kümmere mich gerade um die hyperion-remote wegen den instanzen. Bin gerade unschlüssig, ob man die instanzen in der api auch "by name" und nicht nur über den index nutzen können sollte. Eine Integer in der hyperion-remote als Nutzereingabe ist irgendwie mist. Kann man über die serverinfo rausquetschen, kein Problem

Aber so allgemein per Name unterstützen? Ursprünglich hab ich nicht darüber nachgedacht, ob ein Nutzer mit dem in Kontakt kommt oder nicht. Ich mein einem Entwickler ist das egal, der hat eh die serverinfo um das schick darzustellen.

@Paulchen-Panther
Copy link
Member Author

Bin gerade unschlüssig, ob man die instanzen in der api auch "by name" und nicht nur über den index nutzen können sollte

Ein Name ist auf jeden Fall benutzerfreundlicher. Kannst ja erst mal nur in der hyperion-remote den namen gegen checken. Dafür musst du nicht alles umkrempeln in der API.
Wie du schon sagtest. Ein Entwickler kann ja seinen Benutzern ein schickes interface basteln.

@janpfischer
Copy link
Contributor

Bin gerade unschlüssig, ob man die instanzen in der api auch "by name" und nicht nur über den index nutzen können sollte

Ein Name ist auf jeden Fall benutzerfreundlicher. Kannst ja erst mal nur in der hyperion-remote den namen gegen checken. Dafür musst du nicht alles umkrempeln in der API.
Wie du schon sagtest. Ein Entwickler kann ja seinen Benutzern ein schickes interface basteln.

@brindosch bitte bedenke, dass bei den Namen auch Leerzeichen und Umlaute erlaubt sind. :)

@Paulchen-Panther
Copy link
Member Author

@b1rdhous3 Hast du mal testen können ob bei dir der WebUI log Stream funktioniert?

@janpfischer
Copy link
Contributor

janpfischer commented Aug 13, 2019

@b1rdhous3 Hast du mal testen können ob bei dir der WebUI log Stream funktioniert?

Ich kompiliere gerade den aktuellen Master und schaue mal, aber ja, in den Versionen sonst ging das eigentlich. Hatte aber immer auf Debug stehen.

edit: jap, geht.

@Paulchen-Panther Paulchen-Panther deleted the api_auth branch August 13, 2019 18:53
@brindosch
Copy link
Contributor

brindosch commented Aug 13, 2019

Leerzeichen sind kein Problem (Effektnamen zb). Umlaute haben noch nie funktioniert.
Das ging damals bei den Effekten nicht und mit den Instanznamen geht es auch nicht.

Hab den Fehler schon gefunden. In der webui beim senden zerlegt utf8() die Umlaute. Ich nehms gleich mit auf

Oh ich wollte noch was anmerken. In den <i class="fa fa-cog">TEXT</i> tags keinen Text reinschreiben, die icons sind eine font und überschreiben entsprechend die allgemeine font.

@Paulchen-Panther
Copy link
Member Author

Oh ich wollte noch was anmerken. In den <i class="fa fa-cog">TEXT</i> tags keinen Text reinschreiben, die icons sind eine font und überschreiben entsprechend die allgemeine font.

Alles klar. Ich probiere mir das zu merken! 👍

@brindosch
Copy link
Contributor

#596
Mit Umlauts Test :)
umlauts

@Paulchen-Panther
Copy link
Member Author

Die Funktionalität stelle ich bei dir nicht in frage. Wäre es evtl. noch möglich einen Hinweis in der hyperion-remote zu bringen, wenn der Benutzer mal wieder zu däm.... war seinen Instanznamen ein zugeben? Bis jetzt, geht bei Fehleingabe des namens der Befehl unwissend an die Instanz 0.

@brindosch
Copy link
Contributor

Berechtigt, hab auch drüber nachgedacht. Ich füge es hinzu :)

@brindosch
Copy link
Contributor

@Paulchen-Panther
Ich wollte dich gerade zu POEditor hinzufügen, da sagt der mir doch glatt, du bist schon registriert :)
Wurde das Projekt 2x als open source angenommen? Cool :)

@Paulchen-Panther
Copy link
Member Author

Hyperion.ng ist doch schon in poeditor drin. Warum dann noch mal webUI?

@brindosch
Copy link
Contributor

Du missverstehst die Situation, ich hab nicht gesehen, dass du ein eigenes Projekt geöffnet hast :)

@Paulchen-Panther
Copy link
Member Author

OK. Hast du schon gesehen das 2 neue sprachen hinzugefügt wurden sind?

@brindosch
Copy link
Contributor

Ja, immer schön antreiben :)

@brindosch
Copy link
Contributor

brindosch commented Aug 18, 2019

Oh ich wollte noch was allgemeines fragen. Machen wir noch etwas "cleanup"?

  1. Ich halte den "index" in der ledsConfig für praktisch überflüssig. Wenn niemand darlegen kann, was man so spannendes damit machen kann würde ich den raushauen.

  2. Der clone parameter der ledsConfig, genau das selbe. Der clone ist nur UI Kosmetik, den man jetzt durch das webui direkt-editieren einem kaum schmackhaft machen kann

Mein Hauptproblem damit ist, brauch "keiner" aber läuft in jedem Hyperion::update() mit.
Edit 2: Bis man einem Nutzer erklärt hat, wie das funktioniert, hätte man auch einfach so machen können

Edit: Weitere Optimierungen:
Verkürzung

{
  "hscan": {
    "max": 0.2,
    "min": 0
  },
  "vscan": {
    "max": 0.2,
    "min": 0
  }
}

@Paulchen-Panther
Copy link
Member Author

Paulchen-Panther commented Aug 20, 2019

  1. Ich halte den "index" in der ledsConfig für praktisch überflüssig. Wenn niemand darlegen kann, was man so spannendes damit machen kann würde ich den raushauen.

Ich dachte der ist dafür da individuell (color managment) leds zu konfigurieren.

2. Der clone parameter der ledsConfig, genau das selbe. Der clone ist nur UI Kosmetik, den man jetzt durch das webui direkt-editieren einem kaum schmackhaft machen kann

Der kann von mir aus raus.

Edit: Weitere Optimierungen:
Verkürzung

Spielt das so sehr eine Rolle, jetzt wo wir auf DB setzen?

@brindosch
Copy link
Contributor

Ich dachte der ist dafür da individuell (color managment) leds zu konfigurieren.

Ich meine ja, aber letztlich hat man den vector index.
Der Index bringt ein paar ungebetene Gäste mit.
UI Entwickler müssen die led visualization nach dem index sortieren.
Die led preview muss ebenfalls den index respektieren.
Der Nutzer muss den index verstehen. Man könnte auch einfach die Reihenfolge der Einträge ändern, anstatt am Index rumzupfuschen. Nachher hast du noch einen doppelten Index und der mist fängt an zu dampfen.

Gegenwertig wird der index meine ich nicht beachtet von unserer UI.

Spielt das so sehr eine Rolle, jetzt wo wir auf DB setzen?

Grundsätzlich nicht nein. Man wäre vielleicht schneller im layout editieren, wenn man es von Hand macht :)
Man könnte noch Datenmengen anführen. Das gilt theoretisch auch für image/led streams, dass man die etwas komprimiert und damit die Zeiten vielleicht etwas verbessern kann.

@janpfischer
Copy link
Contributor

JSON Objekte sind AFAIK nicht sort save. Aber die eigentliche Sortierung passiert über h und v scan, richtig? Dann sollte das ja ausreichend sein.

@brindosch
Copy link
Contributor

brindosch commented Aug 21, 2019

Die leds sind in einem array und damit sorted. Das macht den index ja so witzig. Man kann nicht über hscan und vscan gehen.
Hier der Auszug

	[
		{
			"hscan": {
				"maximum": 0.125,
				"minimum": 0
			},
			"index": 0,
			"vscan": {
				"maximum": 0.08,
				"minimum": 0
			}
		},
		{
			"hscan": {
				"maximum": 0.25,
				"minimum": 0.125
			},
			"index": 1,
			"vscan": {
				"maximum": 0.08,
				"minimum": 0
			}
		}
    ]

@janpfischer
Copy link
Contributor

Stimmt, da hast du recht. Dann sehe ich den Sinn von dem Index auch nicht so :)

@brindosch
Copy link
Contributor

Hab den index und clone entfernt. Läuft noch alles :)

Also der clone ist wie gesagt nur dafür da die die LEDs zu kopieren, ständig. Ich weiß echt nicht was man damit machen soll.

Der Index war tatsächlich nur für das neu sortieren der LEDs zuständig.

Mal schauen was ich noch kaputt optimieren kann 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants