[Project] NeopixelBusFX - WS2812 Effekt-Plugin für ESPEasy

Begonnen von djcysmic, 05 Juli 2017, 21:19:46

Vorheriges Thema - Nächstes Thema

djcysmic

Einen wunderschönen guten Abend,

da ich auf der Suche nach einer einfachen Implementierung von WS2812-Stripes in die Hausautomatisierung - ursprünglich für eine Treppenstufenbeleuchtung - nichts brauchbares gefunden habe, habe ich angefangen, ein eigenes Plugin für ESPEasy zu schreiben. Diese Effekte sind komplett ohne Delays programmiert und mittels Parameter sehr flexibel gestaltet. Das Plugin basiert auf der NeopixelBus-Library von Makuna und erlaubt eine prozessorschonende Ansteuerung der LEDs mittels ESP8266:


https://github.com/Makuna/NeoPixelBus


Zusätzlich wird die FastLED-Library für einige Berechnungen in dem Fire-Effekt benötigt:

https://github.com/FastLED/FastLED

Update 02.12.2018: Die entsprechenden Funktionen sind jetzt im NeopixelBusFX-Plugin implementiert. FastLED wird nicht mehr benötigt.


Diese Libraries müssen nur in den /lib-Ordner von ESPEasy geclont werden

Das Plugin kommt in den /src-Ordner:


https://github.com/djcysmic/NeopixelBusFX


Eine Beschreibung dazu findet ihr im Github bzw. im Plugin-Header.
Vielleicht gibt es ja den ein oder anderen Interessenten, der mir bei der Weiterentwicklung des Plugins helfen möchte bzw. Tipps geben kann (es enthält sicherlich noch einige Fehler).
Möglicherweise kann die Ansteuerung für das Plugin auch irgendwann mit ins ESPEasy-Modul mit aufgenommen werden (ähnlich dem Lights-Plugin).

Falls ihr Verbesserungsvorschläge habt, die ich einarbeiten soll, seht es mir bitte nach, wenn es nicht umgehend geschieht, da ich das Plugin ausschließlich in meiner Freizeit entwickle und meine Kinder einen Großteil davon in Anspruch nehmen.

Ansonsten wünsche euch erstmal viel Spaß beim Ausprobieren und wünsche euch noch einen schönen Abend.

Viele Grüße
Nico

Update 16.07.2017 im Github
Plugin für eine bessere Implementierung in das ESPEasy-Modul erweitert.

dev0

Zitat von: djcysmic am 05 Juli 2017, 21:19:46
Möglicherweise kann die Ansteuerung für das Plugin auch irgendwann mit ins ESPEasy-Modul mit aufgenommen werden (ähnlich dem Lights-Plugin).
Ich nehme das Plugin gerne mit ins ESPEasy Modul auf. Mir fehlte beim letzten Blick auf Deine Befehlsliste noch die Idee, wie der benötigte Eintrag für die Syntaxhilfe/Syntaxprüfung aussehen könnte. (Fast) alle anderen Plugins nutzen eine eindeutige Syntax in dem sie unterschiedliche Befehle einsetzen, Dein Plugin nutzt nur einen Befehl mit vielen Optionen. Im ESPEasy Modul Quelltext findest Du diese Strings im hash %ESPEasy_setCmdsUsage zZ. ab Zeile 114.

gloob

Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

djcysmic

Die Aufteilung der Befehlsfolge schien mir so am sinnvollsten:

Pluginbefehl - Modus/Effekt - Parameter

NeopixelFX <off|on|dim|line|one|all|rgb|fade|colorfade|rainbow|kitt|comet|theatre|scan|dualscan|twinkle|twinklefade|sparkle|fire|stop> <parameter>

Das Problem dabei ist, dass nicht jeder Modus/Effekt die gleichen Parameter benötigt, d.h. die Syntaxüberprüfung ist abhängig vom jeweiligen Effekt.

Ich könnte sicherlich größtenteils auf den Plugin-Befehl verzichten, würde dann allerdings das Problem meiner Meinung nach nur verlagern, da die Parameter-Vielfalt für die Effekte gleich bleibt. Außerdem bestünde die Gefahr, dass es zu Überschneidungen mit Befehlen anderer Plugins kommt.

Ist es denn möglich, für jeden Modus/Effekt eine eigene Syntaxprüfung zu schreiben?
Beim Lights-Plugin ist es doch auch nochmal unterteilt (ct,pct,rgb etc.).

Ich weiß, dass es viel Aufwand für ein Plugin ist, allerdings habe ich spontan keine Idee, wie ich das sinnvoll vereinfachen könnte ohne Einschneidungen bei der Flexibilität der Effekte vorzunehmen.

Ich könnte dir auch anbieten, die Syntaxüberprüfungen/-hilfen für die einzelnen Effekte für das ESPEasy-Modul zu schreiben, wenn dir das weiterhilft...

dev0

Zitat
NeopixelFX <off|on|dim|line|one|all|rgb|fade|colorfade|rainbow|kitt|comet|theatre|scan|dualscan|twinkle|twinklefade|sparkle|fire|stop> <parameter>
Ich werde es am Wochenende dann so oder ähnlich ins svn einchecken... Noch habe ich auch keine bessere Idee.

djcysmic

#5
Erstmal vielen Dank für das schnelle Einchecken.

Ich habe mir mal ein paar Gedanken gemacht, wie man das Plugin mit all den Effekten besser ins Modul implementieren kann und habe mal meinen Vorschlag dazu unten angehängt (inklusive Syntaxprüfung).
Es funktioniert ähnlich wie das Lights-Plugin:

Das Attribut
mapNeoPixelFXCmds = neopixelfx
schaltet die ganzen Neopixel-Effekte im Menü frei.

Die Präfixe nfx_ und nfxparam_ sorgen für eine saubere Abgrenzung zu anderen Plugins.

Da ich Probleme damit hatte, mehrere Parameter in einem Set-Befehl unterzubringen, habe ich das Plugin um die Möglichkeit erweitert, einzelne Parameter per Befehl zu setzen (die sind allerdings nach einem Reboot des ESP erstmal wieder zurückgesetzt).

Reading-Rückmeldungen gibt es jetzt auch per JSON und die HTML-Hilfe habe ich um eine Plugin-Beschreibung erweitert.

Viel Spaß beim Ausprobieren. Würde mich freuen, wenn du das so oder in ähnlicher Form in dein Modul mit aufnehmen könntest  ;)

Edit: 34_ESPEasy.pm gegen 34_ESPEasy.patch getauscht

Papaloewe

Hallo Nico,

vielen Dank für dein neues ESPEasy-Plugin.
Leider bekomme ich es einfach nicht kompiliert.

Arduino: 1.8.2 (Linux), Board: "WeMos D1 R2 & mini, 80 MHz, 921600, 4M (3M SPIFFS)"

In file included from /home/tom/Arduino/ESPEasy/_P124_NeoPixelBusFX.ino:80:0:
/home/tom/Arduino/libraries/FastLED/FastLED.h:17:21: note: #pragma message: FastLED version 3.001.005
#    pragma message "FastLED version 3.001.005"
                     ^
In file included from /home/tom/Arduino/libraries/FastLED/FastLED.h:65:0,
                 from /home/tom/Arduino/ESPEasy/_P124_NeoPixelBusFX.ino:80:
/home/tom/Arduino/libraries/FastLED/fastspi.h:110:23: note: #pragma message: No hardware SPI pins defined.  All SPI access will default to bitbanged output
#      pragma message "No hardware SPI pins defined.  All SPI access will default to bitbanged output"
                       ^
/home/tom/Arduino/ESPEasy/_P124_NeoPixelBusFX.ino: In function 'boolean Plugin_124(byte, EventStruct*, String&)':
_P124_NeoPixelBusFX:190: error: 'addFormNumericBox' was not declared in this scope
    addFormNumericBox(string, F("Led Count"), F("plugin_124_leds"), Settings.TaskDevicePluginConfig[event->TaskIndex][0],1 ,999);
                                                                                                                               ^
_P124_NeoPixelBusFX:199: error: 'getFormItemInt' was not declared in this scope
    Settings.TaskDevicePluginConfig[event->TaskIndex][0] = getFormItemInt(F("plugin_124_leds"));
                                                                                              ^
_P124_NeoPixelBusFX:565: error: 'PLUGIN_FIFTY_PER_SECOND' was not declared in this scope
   case PLUGIN_FIFTY_PER_SECOND:
        ^
exit status 1
'addFormNumericBox' was not declared in this scope

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.


Woran könnte es liegen?

Danke & Gruß
Thomas

dev0

Zitat von: djcysmic am 16 Juli 2017, 00:13:47
Würde mich freuen, wenn du das so oder in ähnlicher Form in dein Modul mit aufnehmen könntest
Bitte als Patch/diff hier anhängen, dann schaue ich mir das an.
Bitte die angehängte .pm löschen, damit keine Versionen weiter in Umlauf kommen, die ich nicht von der offiziellen Verison unterscheiden kann und ggf. Support-Chaos entsteht....

djcysmic

Zitat von: dev0 am 16 Juli 2017, 13:36:42
Bitte als Patch/diff hier anhängen, dann schaue ich mir das an.
Bitte die angehängte .pm löschen, damit keine Versionen weiter in Umlauf kommen, die ich nicht von der offiziellen Verison unterscheiden kann und ggf. Support-Chaos entsteht....

Erledigt - ich hoffe, es passt so.

Zitat von: Papaloewe am 16 Juli 2017, 13:14:03
Woran könnte es liegen?

Hallo Thomas,

der erste Teil der Fehlermeldung von der FASTLED-Library ist unproblematisch.

Das Problem, welches wir lösen, müssen steckt hier:

/home/tom/Arduino/ESPEasy/_P124_NeoPixelBusFX.ino: In function 'boolean Plugin_124(byte, EventStruct*, String&)':
_P124_NeoPixelBusFX:190: error: 'addFormNumericBox' was not declared in this scope
    addFormNumericBox(string, F("Led Count"), F("plugin_124_leds"), Settings.TaskDevicePluginConfig[event->TaskIndex][0],1 ,999);
                                                                                                                               ^
_P124_NeoPixelBusFX:199: error: 'getFormItemInt' was not declared in this scope
    Settings.TaskDevicePluginConfig[event->TaskIndex][0] = getFormItemInt(F("plugin_124_leds"));
                                                                                              ^
_P124_NeoPixelBusFX:565: error: 'PLUGIN_FIFTY_PER_SECOND' was not declared in this scope
   case PLUGIN_FIFTY_PER_SECOND:
        ^
exit status 1
'addFormNumericBox' was not declared in this scope


Welche ESPEasy-Version verwendest du und womit kompilierst du? Ich habe sowohl mit Arduino 1.8.3 für Linux als auch mit dem Atom-Editor keine Probleme in dieser Richtung.

Viele Grüße
Nico

Papaloewe

Meine Arduino Version ist zur Zeit:
Arduino: 1.8.2 (Linux), Board: "WeMos D1 R2 & mini, 80 MHz, 921600, 4M (3M SPIFFS)"

Und ich benutze noch die letzte Version ESPEasy-Version:
R148 02-12-2016

ComputerZOO


djcysmic


Papaloewe

Klappt doch nocht nicht ganz.  :-\
Diese Arduino-IDE macht mich noch wahnsinnig!

Arduino: 1.8.2 (Linux), Board: "WeMos D1 R2 & mini, 80 MHz, 921600, 4M (3M SPIFFS)"

/home/tom/Arduino/ESPMega/ESPEasy/_P036_FrameOLED.ino:22:20: fatal error: images.h: No such file or directory
#include "images.h"
                    ^
compilation terminated.
exit status 1
Fehler beim Kompilieren für das Board WeMos D1 R2 & mini.

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

djcysmic

Alles halb so wild. Kopier mal bitte alles aus dem /lib-Ordner von ESPEasy in dein Arduino /libraries-Ordner

Papaloewe