Aquarium mit RGBW2

  • Moin,

    vor ca. 2 Jahren habe ich mir eine LED Beleuchtung für unser Aquarium gekauft. Dazu gehören eine LED Leiste, die mit 6 Lichtelementen bestückt ist, eine LED-Leiste einfarbig, ein Controller und natrlich ein Trafo.

    In den Lichtelementen sind WW, rot und blau verbaut. Die 2 Leiste ist ausschliesslich mit warmweissen LEDs ausgestattet.

    Damit kommt ich auf 4 Kanäle, die angesteuert werden können. Der mitgelieferte Contoller kann maximal 5 Kanäle und wir per USB mit Programmen versorgt, die dann statisch ablaufen.

    20200601_114220.jpg

    Die Uhrzeit lässt sich ebenfalls auch nur per USB aktualisieren. Das führt dazu, dass gerade im Winter in den Abendstunden das Aquarium hier das ganze Haus ausleuchtet. Bedeutet also entweder damit leben oder regelmässig die Programme umstellen.

    Ziel war es also die Aquarium-Beleuchtung smart zu machen und dynamisch an Sonnenauf- und Untergang anzupassen.

    Da kommt dann mein erster RGBW2-Shelly ins Spiel.

    Der war schnell angeschlossen und nach etwas Frust mit der Shelly-App dann auch eingebunden. Noch fix die Konfiguration auf 4*White eingebunden, Firmwareupdate und MQTT-Server hinterlegen.

    Die Umsetzung in Node-Red dokumentiere ich im Detail mal hier in der nächsten Nachricht.

    In Node-Red habe ich dann die Steuerung realisieren.Mit Hilfe mehrerer zusätzlicher Nodes habe ich dann eine Steuerung zusammengebaut, die zu bestimmten dynamischen Tageszeit (Sonnenaufgang, Sonnenuntergang, Sonnenmattig, etc.) mehrere Dimmer ansteuert, die kontinuierlich die Dimmwerte mit 1er Schrittweite ändern. Hier wäre es definitiv einfacher direkt dem Shelly die Dimmgeschwindigkeit mitzugeben. Da habe ich aber in der MQTT-API nichts gefunden.

    2020-06-08 21_19_26-Node-RED _ 10.1.1.20.png

    Da ich für andere Automatismen die aktuellen Wetterdaten des DWD abfrage, habe ich diese noch erweitert um de aktuelle effektive Wollkenabdeckung. Mit der Info generiere ich einen Faktor.

    2020-06-08 21_25_50-Node-RED _ 10.1.1.20.png

    Zu guter letzt übergebe ich den Dimmwert mal den Faktor zyklisch an den MQTT-Server. Damit lässt sich der Tagesblauf im Aquarium auf jeden Fall schon ganz gut darstellen und die aktuellen Lichtverhältnisse aussen werden ebenfalls berücksichtigt.

    Das ganze ist aber eher noch eine schnelle frickelige Lösung.

    In Zukunft möchte ich eher dazu über gehen ein eher mathematisches Modell zu nutzen, um den Tagesverlauf abzubilden.

    Des Weiteren fehlt noch eine externe Steuerung, um das Licht zum Aquarium reinigen voll hoch zu dimmen.

    Inventar: Node-Red (Master, Docker-basiert) mit RFXCom Transceiver u.a. für Somfy

    Raspberry-Matic Zentrale mit ca. 65 Aktoren/Sensoren/Schalter

    Mosqitto MQTT-Broker (Docker-basiert) für u.a. 3*Shelly 2.5, 1*Shelly RGBW2, 4*Shelly 1, 2*Shellybutton 1, 3*Shelly HT, 2* Shelly Door Window 2, 5*Shelly Vintage, Octoprint

    InfluxDB und Grafana (beides Docker-basiert)

  • Zum Einsatz kommt:

    Node-Red v1.0.6 im Docker-Container

    Mosquitto 1.6.8 im Docker-Container

    Shelly RGBW2 v1.7.0

    Diese Node-Pakete kommen zum Einsatz:
    node-red-contrib-dwd-local-weather

    node-red-contrib-sun-position

    node-red-contrib-time-based-dimmer

    node-red-node-rbe

    (Die Versionsnummer spare ich mir hier - die sind mitunter recht schnellebig)

    Abholen des aktuellen Wetters und speichern in einer globalen Variable:

    pasted-from-clipboard.png

    Code
    [{"id":"2cad06a0.9fcb72","type":"dwdweather","z":"ac0d7349.2dcc6","name":"DWD Wetter","mosmixStation":"10416","lookAheadHours":"0","additionalFields":"RR1c,PPPP,FX1,Neff","repeat":"600","x":530,"y":420,"wires":[["73f0b156.014d08","6720a5f6.d56f3c","c111752b.87c5f"]]},{"id":"c111752b.87c5f","type":"change","z":"ac0d7349.2dcc6","name":"","rules":[{"t":"set","p":"weather.Neff","pt":"global","to":"payload.Neff","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":750,"y":480,"wires":[[]]}]

    Durchlaufen des Tageszyklus inkl. Dimmer und Reset.

    pasted-from-clipboard.png

    Die Dimmer können parametrisiert werden. Man gibt Min- und Max-Wert vor, die Schrittweite und die Dauer pro Schritt. In dem Screenshot habe ich einen Wertebreich von 0 bis 40 bei Schrittweite 1 in einem Intervall von 45000ms hinterlegt. Damit benötigt der Dimmen 30 Minuten, um auf seinen Max- oder ggf. Min-Wert zu kommen.Da ich die Dimmer zurücksetzen muss injiziere ich kurz nach Mitternacht den Intialwert. Damit der Dimmer dann den Wert nicht wieder hinten ausspuckt werden in einem Zeitraum nach Mitternacht die Werte nicht übertragen. Die Dimmwerte landen dann in Variablen innerhalb der aktuellen Umgebung.

    pasted-from-clipboard.png

    Leider kein Quellcode wegen 10.000-Zeichen-Beschränkung :(

    Berechnung des Hellgkeits-Faktors in Abhängigkeit zur Wolkendichte:

    Eigentlich recht einfach. Der aktuelle Wert wird injiziert und anhand des Wertebreichs wird dann der entsrpechende Faktor ausgewählt und in eine Variable geschrieben.

    pasted-from-clipboard.png

    Code
    [{"id":"e8b54f15.6f6bc8","type":"inject","z":"70077ab4.b01d34","name":"","topic":"","payload":"weather.Neff","payloadType":"global","repeat":"600","crontab":"","once":true,"onceDelay":"40","x":2580,"y":140,"wires":[["af529d49.c5398"]]},{"id":"af529d49.c5398","type":"switch","z":"70077ab4.b01d34","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"},{"t":"btwn","v":"0.01","vt":"num","v2":"20","v2t":"num"},{"t":"btwn","v":"20.01","vt":"num","v2":"40","v2t":"num"},{"t":"btwn","v":"40.01","vt":"num","v2":"60","v2t":"num"},{"t":"btwn","v":"60.01","vt":"num","v2":"80","v2t":"num"},{"t":"btwn","v":"80.01","vt":"num","v2":"90","v2t":"num"},{"t":"gt","v":"90","vt":"str"}],"checkall":"true","repair":false,"outputs":7,"x":2750,"y":140,"wires":[["5ff43dc3.6e0024"],["99715d79.f2c44"],["d760f047.11321"],["36ee8d06.ad0702"],["3c96f527.e66212"],["8befc720.ad1a78"],["db41b4ac.70ae78"]],"outputLabels":["=0","<20","<40","<60","<80","<90",">90"]},{"id":"5ff43dc3.6e0024","type":"change","z":"70077ab4.b01d34","name":"1","rules":[{"t":"set","p":"EG_AQ.Faktor","pt":"flow","to":"1","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":2950,"y":40,"wires":[[]]},{"id":"99715d79.f2c44","type":"change","z":"70077ab4.b01d34","name":"0.9","rules":[{"t":"set","p":"EG_AQ.Faktor","pt":"flow","to":"0.9","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":2950,"y":80,"wires":[[]]},{"id":"d760f047.11321","type":"change","z":"70077ab4.b01d34","name":"0.8","rules":[{"t":"set","p":"EG_AQ.Faktor","pt":"flow","to":"0.8","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":2950,"y":120,"wires":[[]]},{"id":"36ee8d06.ad0702","type":"change","z":"70077ab4.b01d34","name":"0.7","rules":[{"t":"set","p":"EG_AQ.Faktor","pt":"flow","to":"0.7","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":2950,"y":160,"wires":[[]]},{"id":"3c96f527.e66212","type":"change","z":"70077ab4.b01d34","name":"0.6","rules":[{"t":"set","p":"EG_AQ.Faktor","pt":"flow","to":"0.6","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":2950,"y":200,"wires":[[]]},{"id":"db41b4ac.70ae78","type":"change","z":"70077ab4.b01d34","name":"0.2","rules":[{"t":"set","p":"EG_AQ.Faktor","pt":"flow","to":"0.2","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":2950,"y":280,"wires":[[]]},{"id":"8befc720.ad1a78","type":"change","z":"70077ab4.b01d34","name":"0.4","rules":[{"t":"set","p":"EG_AQ.Faktor","pt":"flow","to":"0.4","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":2950,"y":240,"wires":[[]]}]

    Übergabe des berechneten Wertes an den MQTT-Server und damit an den Shelly:

    pasted-from-clipboard.png

    Von links nach rechts:

    - zyklische Injizierung des aktuellen Dimmwertes pro Kanal

    - kleines JavaScript, dass den Wert mit der Variable des Helligkeitsfaktors multipliziert

    - rbe transportiert nur weiter, wenn sich der Wert geändert hat - spart Ressourcen

    - der Switch unt die Rules bauen das MQTT-Nachrichtenobjekt zusammen. Damit unterscheide ich payload.turn on oder off

    - und dann die Übergabe an den MQTT-Server

    Leider kein Quellcode wegen 10.000-Zeichen-Beschränkung :(

    Und wozu das ganze: Weil ich's kann ;)

    Inventar: Node-Red (Master, Docker-basiert) mit RFXCom Transceiver u.a. für Somfy

    Raspberry-Matic Zentrale mit ca. 65 Aktoren/Sensoren/Schalter

    Mosqitto MQTT-Broker (Docker-basiert) für u.a. 3*Shelly 2.5, 1*Shelly RGBW2, 4*Shelly 1, 2*Shellybutton 1, 3*Shelly HT, 2* Shelly Door Window 2, 5*Shelly Vintage, Octoprint

    InfluxDB und Grafana (beides Docker-basiert)

    Einmal editiert, zuletzt von DirkHBo (8. Juni 2020 um 22:14)

  • Hello. I like the solution, but I don't have that knowledge and I don't know how to implement what you created. Is it possible to send a file that I can upload to Shelly RGBW? Will you send it to me, please? Thank you