Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS 19000142 - Moving Colors

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    LBS 19000142 - Moving Colors

    Hallo miteinander,

    es gibt einen weiteren neuen LBS im Download-Bereich:

    19000142 - Moving Colors - Aktuelle Version: 1.4 (2017-05-30)

    Hier zunächst der Text aus der Bausteinbeschreibung:

    Code:
    Dieser Baustein erzeugt einen Moving-Colors-Effekt welcher bei dimmbaren Leuchten verwendet werden kann. Um den
    Effekt der sich bewegenden Farben mit einem RGB-Strip zu erreichen, werden also drei dieser Bausteine benoetigt.
    
    Der grundsaetzliche Ablauf ist dabei wie folgt:
    Basierend auf dem Startwert E3 bzw. dem Wert vom letzten Durchlauf des LBS wird unter Verwendung der Schrittweite E6
    der naechste Dimmwert berechnet. Erreicht der Dimmwert den maximalen Wert E5, wird die Richtung der Dimmung umgekehrt
    und der Dimmwert bei jedem weiteren Duchlauf des LBS solange vermindert, bis der minimale Wert E4 erreicht ist. Nun
    wird die Richtung erneut gewechselt und der Ablauf beginnt von vorn.
    
    Zusaetzlich werden die tatsaechlichen Umkehrpunkte der Dimmung in den durch E4 und E5 vorgegebenen Grenzen zufaellig
    ermittelt. Damit wird erreicht, dass sich die Dimmung mit jedem vollen Durchlauf "anders" verhaelt, was insbesondere
    bei der Kombination mehrerer dieser LBS zur Dimmung von RGB-Leuchten oder RGB-LED-Strips zu staendig anderen
    Farbvarianten fuehrt. Wird der Eingang E7 auf 0 gesetzt, wird die zufaellige Ermittlung der Umkehrpunkte deaktiviert
    und die Dimmung kehrt die Richtung immer an den mit E4 und E5 vorgegebenen Min- und Max-Werten um.
    
    Ein Durchlauf des LBS ermittelt genau einen Dimm-Schritt. Somit muss der LBS von aussen in geeigneten Abstaenden
    getriggert werden, um den tatsaechlichen Effekt der sich bewegenden Farben zu erreichen. Hierfuer bietet sich der
    Baustein 16000111 (Oszillator) an. Der an E1 uebermittelte Wert spielt keine Rolle, der Baustein startet, sobald E1
    beschrieben wird. Wird also der Oszillator verwendet, so muessen fuer ein Intervall von 2s dessen beide Eingaenge E2
    und E3 auf jeweils 2000 gesetzt werden.
    
    Die Kombination des Trigger-Intervalls des Bausteines sowie der Schrittweite (E6) der Dimmung bestimmen massgeblich,
    wie sanft der Effekt ablaeuft. Dabei ist zu beachten, dass jeder Duchlauf des LBS i.d.R. die entsprechenden Befehle
    auf dem Bus erzeugt, was bei vielen LBS und kurzer Triggerzeit entsprechend Bus-Last erzeugen kann. Es sollte
    ausreichend sein, wenn der Baustein alle zwei bis drei Sekunden getriggert und die Schrittweite auf einen Wert von
    eins bis drei konfiguriert wird.
    
    
    E1:     Trigger des Bausteines.
    E2:     Debug-Modus: Mehr Output in den Logs aktivieren (1) oder deaktivieren (0)
    E3:     Startwert des Farbeffektes. Muss groesser als E5 und kleiner als E5 sein. Wertebereich: 0-255
    E4:     Unterer Grenzwert des Lichteffektes. Es wird nicht auf Werte kleiner diesem Eingang gedimmt.
    Muss kleiner als E5 sein. Wertebereich: 0-255
    E5:     Oberer Grenzwert des Lichteffektes. Es wird nicht auf Werte groesser diesem Eingang gedimmt.
    Muss groesser als E4 sein. Wertebereich: 0-255
    E6:     Gibt an, um welchen Wert der aktuelle Dimmwert bei einem Durchlauf des Bausteines veraendert
    werden soll. Wertebereich: 1-10
    E7:     Sollen die Grenzwerte zwischen den gegebenen Min- und Max-Werten zufaellig gewaehlt werden,
    ist dieser Input auf 1 (Default) zu setzen. Wird hier 0 gesetzt, bewegt sich der Dimmbereich immer bis
    zum Min- bzw. Max-Wert.
    
    A1:     Aktueller Dimmwert
    
    Changelog:
    1.4 (2017-05-30)
    - Debug-Output korrigiert.
    
    1.3 (2016-12-30)
    - Dateiname der Logs korrigiert: MovingColors_LBS190000142_<id>
    - Improved internal parameter validation
    - Fixed initialization of internal variables
    
    1.2 (2016-07-13)
    Noch einige weitere Erläuterungen:

    1. Triggern des Bausteines:
    Der Baustein wird durch beschreiben von E1 getriggert. Dabei ist es unerheblich, ob der Eingang mit 0 oder 1 beschrieben wird. Aus diesem Grund ist die Verwendung eines Oszillators die perfekte Methode, den Baustein zu starten.

    2. Start-, Min- und Maxwert:
    Der Startwert der Dimmung wird mit E3 vorgegeben. Jeder weitere Durchlauf des Bausteines baut jedoch auf dem im vorherigen Lauf errechneten Dimmwert auf, so dass eine sich mit jedem weiteren Durchlauf kontinuierlich ändernde Dimmung ergibt. Mit den Eingängen E4 und E5 wird der Bereich vorgegeben, in dem sich die Dimmung bewegen soll. Kommt der Dimmwert am entsprechenden Max- bzw. Min-Wert an, wird die Richtung der Dimmung geändert.

    3. Zufällige Grenzwerte:
    Per Default ist der Eingang E7 auf 1 gesetzt. Das bedeutet, dass die Grenzwerte der Richtungsumkehr zufällig gewählt werden. Bei erreichen eines Grenzwertes wird immer der jeweils gegenüberliegende Grenzwert neu als Zufallswert ermittelt. Der Baustein läuft also beim ersten Durchlauf bis zum Max-Wert von E5. Bei erreichen dieses Wertes wird für den Min-Wert ein zufälliger Wert aus dem Bereich Min-Wert bis Max-Wert ermittelt und die Dimm-Richtung umgekehrt. Erreicht der Baustein den errechneten Min-Wert wird aus dem Bereich des aktuellen Min-Wertes bis zum Max-Wert eine zufälliger neuer Max-Wert ermittelt und die Dimm-Richtung erneut gewechselt. Somit ergeben sich bei jedem Durchlauf andere Grenzwerte und die Dimmkurve ist bei jedem Durchlauf anders.

    Wird dieses Zufallsverhalten nicht gewünscht, so kann E7 auf 0 gesetzt werden. Damit pendelt die Dimmung immer zwischen den Min-/Max-Werten von E4/E5.

    4. Schrittweite:
    Der mit E6 vorgegebene Wert gibt an, um welchen Betrag der aktuelle Dimm-Wert je nach Dimm-Richtung erhöht oder vermindert werden soll. Bei kleinen Werten ist die Veränderung der Dimmung fast nicht wahrnehmbar, bei grösseren Werten erscheint sie mitunter ruckartig. Das ist aber auch von der verwendeten Leuchte resp. deren Trägheit beim Ändern der Dimmung abhängig und muss wie alle anderen Werte auch an die örtlichen Gegebenheiten angepasst werden.

    5. RGB-Dimmung:
    Soll der Effekt bei einer RGB-Dimmung zum Einsatz kommen, so werden drei Bausteine und ein Oszillator benötigt. Der Ausgang des Oszillator wird mit jedem Eingang E1 verbunden. Je nachdem wie schnell die Dimmung verlaufen soll, muss E2 und E3 des Oszillators noch mit einem entsprechenden Wert in ms belegt werden. 2000ms haben sich hier für einen sehr langsamen Effekt bewährt. Die Ausgänge des Moving-Color-LBS werden jeweils mit den R-, G- und B-Wert-GAs verbunden, um den errechneten Dimm-Wert zu setzen.

    Damit der Effekt im ersten Durchlauf nicht zunächst weiss durchlaufen wird, sollten die Eingänge E3 mit unterschiedlichen Startwerten belegt werden.

    6. Timing und Buslast:
    Für eine langsame und sanfte Dimmung sollte die Schrittweite nicht zu gross und das Trigger-Intervall nicht zu klein gewählt werden. Es ist zu beachten, dass jeder Durchlauf des Bausteines die entsprechenden Dimm-Befehle auf den Bus sendet, was je nach Anzahl der verwendeten Bausteine und dem verwendeten Intervall eine nicht unerhebliche Buslast erzeugen kann!

    7. Disclaimer:
    Der Baustein wurde mit bestem Wissen und Gewissen erstellt und wird so wie er ist zur Verfügung gestellt. Ich übernehme keinerlei Verantwortung, wenn der Bus durch den Baustein überlastet wird, daraufhin das Smarthome nicht mehr das macht was es machen sollte und dadurch der WAF so steil wie die Eiger-Nordwand fällt! Jegliches Feedback zum Baustein ist jedoch sehr gern gesehen und wird nach Möglichkeit in aktualisierten Versionen des Bausteines einfliessen.

    Viel Spass mit dem Baustein! Ich freue mich über jegliches Feedback und Verbesserungsvorschläge aller Art.
    Zuletzt geändert von starwarsfan; 30.05.2017, 21:33. Grund: Updated with v1.4
    Kind regards,
    Yves

    #2
    Coole Idee! Echte Partylöwen erkennt man eben nicht an der Eisskulptur oder am Tanzstil...

    im ernst: für mich noch erheblich zu früh im Edomi-Projekt, aber das könnte ich mir später gut vorstellen. Danke! Für Idee und Umsetzung!

    Kommentar


      #3
      Schöner Baustein Yves,
      läuft bei mir momentan für die Ansteuerung der Küchensockel-Beleuchtung.

      Die Fehlerbehandlung in den Zeilen 198-205 ist meiner Meinung nach noch leicht fehlerhaft.
      Entsprechend der Debug-Ausgabe sollte es heißen

      PHP-Code:
      if ($startValue $minValue) {
      LB_LBSID_debug(false"Modifying too low start value ${startValue} to $minValue.");
      $E[3]['value'] = $minValue;
      }
      if (
      $startValue $maxValue) {
      LB_LBSID_debug(false"Modifying too high start value ${startValue} to $maxValue.");
      $E[3]['value'] = $maxValue;

      Kommentar


        #4
        Hi

        Zitat von phili Beitrag anzeigen
        Schöner Baustein Yves,
        läuft bei mir momentan für die Ansteuerung der Küchensockel-Beleuchtung.
        Feinfein, freut mich zu hören.


        Zitat von phili Beitrag anzeigen
        Die Fehlerbehandlung in den Zeilen 198-205 ist meiner Meinung nach noch leicht fehlerhaft.
        Entsprechend der Debug-Ausgabe sollte es heißen

        PHP-Code:
        if ($startValue $minValue) {
        LB_LBSID_debug(false"Modifying too low start value ${startValue} to $minValue.");
        $E[3]['value'] = $minValue;
        }
        if (
        $startValue $maxValue) {
        LB_LBSID_debug(false"Modifying too high start value ${startValue} to $maxValue.");
        $E[3]['value'] = $maxValue;

        Hoppla, Du hast Recht. Wird korrigiert, danke für den Hinweis.
        Kind regards,
        Yves

        Kommentar


          #5
          Hallo Yves,
          kannst Du Dir vorstellen, den Baustein um einen "default"-Farbwert zu ergänzen?

          Folgender Hintergrund:
          Ich nutze den Baustein wie gesagt für meine Sockelbeleuchtung. Nun möchte meine Frau die Sockelleistenbeleuchtung in einige Lichtszenen integrieren und dabei dann eine definierte Farbe vorgeben (natürlich auch tageszeiten- und außentemperaturabhängig - aber das soll nicht Dein Problem sein.)

          Jetzt wäre es prima, wenn ich dem Baustein über einen zusätzlichen Eingang mitteilen kann, dass der default-Farbwert verwendet werden soll. Außerdem wäre es toll, wenn man zusätzlich noch die Anzahl der "Triggerungen" angeben könnte, nach denen der default-wert erreicht ist. Dann hat man nicht einen so harten Übergang.

          Also ich bräuchte drei weitere Eingänge: "default-Wert" und "default-aktiv" und "Triggerungen bis default".

          Wenn "default-aktiv" auf low zurückgeht, dann sollte der Baustein vom default-Wert aus wieder loslaufen.

          Liebe Grüße
          Phili


          Kommentar


            #6
            Hi Philipp

            Zitat von phili Beitrag anzeigen
            kannst Du Dir vorstellen, den Baustein um einen "default"-Farbwert zu ergänzen?
            Unmögliches wird sofort erledigt, Wunder dauern etwas länger...


            Zitat von phili Beitrag anzeigen
            Ich nutze den Baustein wie gesagt für meine Sockelbeleuchtung. Nun möchte meine Frau die Sockelleistenbeleuchtung in einige Lichtszenen integrieren und dabei dann eine definierte Farbe vorgeben (natürlich auch tageszeiten- und außentemperaturabhängig - aber das soll nicht Dein Problem sein.)
            Mit Default meinst Du also einen definierten Startwert, welcher für den Anfang des Farbverlaufes verwendet wird, korrekt? Ja, das sollte sich machen lassen.


            Zitat von phili Beitrag anzeigen
            Jetzt wäre es prima, wenn ich dem Baustein über einen zusätzlichen Eingang mitteilen kann, dass der default-Farbwert verwendet werden soll.
            Was heisst nun "zusätzlich"? Der Eingang für den Default-Wert ist der zusätzliche Eingang oder nicht? Ich könnte es mir so vorstellen, als dass der Farbverlauf bei Wert dieses zusätzlichen Einganges beginnt, wenn er nicht leer ist und im Bereich der Min-Max-Angaben liegt. Ist der Eingang leer, wird so begonnen, wie jetzt.


            Zitat von phili Beitrag anzeigen
            Außerdem wäre es toll, wenn man zusätzlich noch die Anzahl der "Triggerungen" angeben könnte, nach denen der default-wert erreicht ist. Dann hat man nicht einen so harten Übergang.
            Ich kann Dir nicht folgen. Was soll das sein? Es gibt einen Startwert (bzw. soll einen Startwert geben), bei dem der Farbverlauf beginnt. Was willst Du nun mit diesem zusätzlichen Eingang erreichen?

            Kind regards,
            Yves

            Kommentar


              #7
              Hallo Yves,

              Zitat von starwarsfan Beitrag anzeigen
              Unmögliches wird sofort erledigt, Wunder dauern etwas länger...
              Das ist auf jeden Fall schon mal einmal eine vernünftige Arbeitsgrundlage !

              Zitat von starwarsfan Beitrag anzeigen
              Mit Default meinst Du also einen definierten Startwert, welcher für den Anfang des Farbverlaufes verwendet wird, korrekt? Ja, das sollte sich machen lassen.
              Der Startwert ist mir eigentlich egal (ist bei meiner Küchenbeleuchtung in allen 4 Bausteinen (RGBW) Null), weil der ja eh sofort verlassen wird. Ich meinte einen zusätzlichen Festwert, den der Baustein anspringt, wenn der "Moving Color"-Effekt gerade nicht gewünscht ist. Z.B. 70. Solange der default-Wert aktiv ist, bleibt der Ausgang auf 70.

              Zitat von starwarsfan Beitrag anzeigen
              Was heisst nun "zusätzlich"? Der Eingang für den Default-Wert ist der zusätzliche Eingang oder nicht? Ich könnte es mir so vorstellen, als dass der Farbverlauf bei Wert dieses zusätzlichen Einganges beginnt, wenn er nicht leer ist und im Bereich der Min-Max-Angaben liegt. Ist der Eingang leer, wird so begonnen, wie jetzt.
              Dann würdest Du die Option "default-aktiv" dadurch realisieren, dass der "deflault-Wert" gesetzt ist oder nicht. Für mich auch OK, auch wenn ich es praktischer finde, hierfür einen separaten Eingang zu haben. Dann kann ich mir den "default-Wert" irgendwoher holen (evtl. auch von der Außenhelligkeit) und schalte über ein zusätzliches Bit "default-aktiv" ein oder aus.

              Zitat von starwarsfan Beitrag anzeigen
              Ich kann Dir nicht folgen. Was soll das sein? Es gibt einen Startwert (bzw. soll einen Startwert geben), bei dem der Farbverlauf beginnt. Was willst Du nun mit diesem zusätzlichen Eingang erreichen?
              Wenn der "default-Wert" aktiv geschaltet wird, dann könnte der Baustein, diesen Wert sofort am Ausgang bereitstellen. Das gibt aber einen harten Übergang. z.B. von einem schicken hellblau direkt auf rot (ich setzte voraus, das ich mehrere Deiner Bausteine verwende).
              Ich würde es aber begüßen, wenn der Baustein hier einen weichen Übergang erlaubt. Also den Wert nicht direkt anspringt sondern z.B. erst nach 4 Triggerschritten erreicht. Für einen Kanal hieße das z.B. nicht direkt von 170 auf 10 zu wechseln sondern den Übergang aufzusplitten in : 170 nach 130 nach 90 nach 50 nach 10.

              Wenn "default-aktiv" dann auf Null gesetzt wird, dann geht es von dem gerade aktiven "default-Wert" mit dem "moving color"-Effekt weiter in Richtung auf den min/max bzw. Zufallswert.

              Hier ein Vorschlag für die Baustein I/O:

              20170619_edomi_MovingColors_Vorschlag.jpg

              Kommentar


                #8
                Hallo Yves,
                ich habe die Variante mit den default-Werten jetzt einmal implementiert. Keine Ahnung ob Du Interesse daran hast, den zusätzlichen Code in den Baustein einzupflegen. Wenn E9 leer ist und/oder E9=0 verhält sich der Baustein wie gehabt. Ansonsten habe ich die Beschreibung entsprechend angepasst:

                PHP-Code:
                ###[DEF]###
                [name            =Moving Colors v1.6 (optionales UPDATE)                   ]

                [e#1 TRIGGER    =Trigger                            ]
                [e#2 OPTION        =Debug Output         #init=0        ]
                [e#3            =Startwert            #init=0        ]
                [e#4            =Min                  #init=0        ]
                [e#5            =Max                  #init=255        ]
                [e#6            =Stepping             #init=2        ]
                [e#7            =Zufallsgrenzen       #init=1        ]
                [e#8 OPTION        =default-Wert                        ]
                [e#9 OPTION        =default-aktiv            #init=0        ]
                [e#10            =Schritte bis default    #init=3        ]

                [a#1        =nächster Dimm-Wert              ]

                [v#1        = ] current lower boundary
                [v#2        = ] current upper boundary
                [v#3        = ] current value
                [v#4        = ] current direction
                [v#5        = ] remaining steps to default
                ###[/DEF]###


                ###[HELP]###
                Dieser Baustein erzeugt einen Moving-Colors-Effekt welcher bei dimmbaren Leuchten verwendet werden kann. Um den
                Effekt der sich bewegenden Farben mit einem RGB-Strip zu erreichen, werden also drei dieser Bausteine benötigt.

                Der grundsätzliche Ablauf ist dabei wie folgt:
                Basierend auf dem Startwert E3 bzw. dem Wert vom letzten Durchlauf des LBS wird unter Verwendung der Schrittweite E6
                der nächste Dimmwert berechnet. Erreicht der Dimmwert den maximalen Wert E5, wird die Richtung der Dimmung umgekehrt
                und der Dimmwert bei jedem weiteren Duchlauf des LBS solange vermindert, bis der minimale Wert E4 erreicht ist. Nun
                wird die Richtung erneut gewechselt und der Ablauf beginnt von vorn.

                Zusätzlich werden die tatsächlichen Umkehrpunkte der Dimmung in den durch E4 und E5 vorgegebenen Grenzen zufällig
                ermittelt. Damit wird erreicht, dass sich die Dimmung mit jedem vollen Durchlauf "anders" verhält, was insbesondere
                bei der Kombination mehrerer dieser LBS zur Dimmung von RGB-Leuchten oder RGB-LED-Strips zu ständig anderen
                Farbvarianten führt. Wird der Eingang E7 auf 0 gesetzt, wird die zufällige Ermittlung der Umkehrpunkte deaktiviert
                und die Dimmung kehrt die Richtung immer an den mit E4 und E5 vorgegebenen Min- und Max-Werten um.

                Ein Durchlauf des LBS ermittelt genau einen Dimm-Schritt. Somit muss der LBS von aussen in geeigneten Abständen
                getriggert werden, um den tatsächlichen Effekt der sich bewegenden Farben zu erreichen. Hierfür bietet sich der
                Baustein 16000111 (Oszillator) an. Der an E1 übermittelte Wert spielt keine Rolle, der Baustein startet, sobald E1
                beschrieben wird. Wird also der Oszillator verwendet, so müssen für ein Intervall von 2s dessen beide Eingänge E2
                und E3 auf jeweils 2000 gesetzt werden.

                Die Kombination des Trigger-Intervalls des Bausteines sowie der Schrittweite (E6) der Dimmung bestimmen massgeblich,
                wie sanft der Effekt abläuft. Dabei ist zu beachten, dass jeder Duchlauf des LBS i.d.R. die entsprechenden Befehle
                auf dem Bus erzeugt, was bei vielen LBS und kurzer Triggerzeit entsprechend Bus-Last erzeugen kann. Es sollte
                ausreichend sein, wenn der Baustein alle zwei bis drei Sekunden getriggert und die Schrittweite auf einen Wert von
                eins bis drei konfiguriert wird.

                <u><b>default-Wert:</b></u>
                Mit Hilfe der Eing&auml;nge E8 bis E10 wird eine default-Wert-Steuerung erreicht. Der gew&uuml;nschte Festwert (default-Wert)
                wird &uuml;ber E8 vorgegeben. Ist E9 &ne;0 und wird &uuml;ber E8 ein Zahlwert vorgegeben, so werden die Dimmwerte an A1 nicht
                mehr kontinuierlich ver&auml;ndert. Stattdessen wird der default-Wert an den Ausgang gelegt. Wird E9 auf 0 zur&uuml;ckgesetzt,
                wird die Dimmertberechnung ausgegend von dem default-Wert erneut gestartet.
                F&uuml;r einen sanften &Uuml;bergang beim Anfahren des default-Wertes wird &uuml;ber E10 vorgegeben, wie viele Trigger-Impulse erforderlich sind,
                bis der default-Wert erreicht ist. Der Abstand zwischen dem aktuellen Wert und dem default-Wert wird dazu in E10 gleich gro&szlig;e Abst&auml;nde
                unterteilt.


                E1:     Trigger des Bausteines.
                E2:     Debug-Modus: Mehr Output in den Logs aktivieren (1) oder deaktivieren (0)
                E3:     Startwert des Farbeffektes. Muss gr&ouml;sser als E5 und kleiner als E5 sein. Wertebereich: 0-255
                E4:     Unterer Grenzwert des Lichteffektes. Es wird nicht auf Werte kleiner diesem Eingang gedimmt. Muss kleiner als E5 sein. Wertebereich: 0-255
                E5:     Oberer Grenzwert des Lichteffektes. Es wird nicht auf Werte gr&ouml;sser diesem Eingang gedimmt. Muss gr&ouml;sser als E4 sein. Wertebereich: 0-255
                E6:     Gibt an, um welchen Wert der aktuelle Dimmwert bei einem Durchlauf des Bausteines ver&auml;ndert werden soll. Wertebereich: 1-10
                E7:     Sollen die Grenzwerte zwischen den gegebenen Min- und Max-Werten zuf&auml;llig gew&auml;hlt werden, ist dieser Input auf 1 (Default) zu setzen. Wird hier 0 gesetzt, bewegt sich der Dimmbereich immer bis zum Min- bzw. Max-Wert.
                E8:     default-Wert:  der aktuelle default-Wert
                E9:     default-aktiv: default-Wert woll ausgegeben werden
                E10:    Schritte bis default: Schritte bis der Default-Wert erreicht ist


                A1:     Aktueller Dimmwert

                <br>
                <b>Changelog:</b>
                1.6 (2017-06-21)
                - Erg&auml;nzung um default-Steuerung

                1.5 (2017-06-12)
                - Validierung der Eingangswerte korrigiert (thx @phili)

                1.4 (2017-05-30)
                - Debug-Output korrigiert.

                1.3 (2016-12-30)
                - Dateiname der Logs korrigiert: MovingColors_LBS190000142_&lt;id&gt;
                - Improved internal parameter validation
                - Fixed initialization of internal variables

                1.2 (2016-07-13)
                ###[/HELP]###

                ###[LBS]###
                <?php
                $LB_LBSID_doDebug 
                false;
                $LB_LBSID_id 0;
                function 
                LB_LBSID($id)
                {
                    if (
                $E getLogicEingangDataAll($id))

                        
                // updating the defaultValue resets the remaining steps counter (in memory). This allows for smooth fades when changing default values while default mode is active. 
                        
                if ($E[8]['refresh'])
                            
                setLogicElementVar($id5$E[10]['value']);

                        if (
                $E[1]['refresh'] == 1) {
                            
                // LBS was triggered, go ahead and compute all the stuff

                            
                global $LB_LBSID_id;
                            
                $LB_LBSID_id $id;
                            global 
                $LB_LBSID_doDebug;
                            if (
                $E[2]['value'] == 1) {
                                
                // Debug output activated
                                
                $LB_LBSID_doDebug true;
                            } else {
                                
                $LB_LBSID_doDebug false;
                            }

                            
                // Check if input is usable
                            
                $E LB_LBSID_validateInput($E);

                            
                // Get configured values
                            
                $minValue $E[4]['value'] + 0;
                            
                $maxValue $E[5]['value'] + 0;
                            
                $stepping $E[6]['value'] + 0;
                            
                $useRandom $E[7]['value'];
                            
                $defaultValue $E[8]['value'];
                            
                $defaultActive $E[9]['value'] + 0;
                            
                $steps_to_default $E[10]['value'];


                            
                // Grab current dimm value, either default or the one from last run
                            
                $currentValue $E[3]['value'];
                            if (
                getLogicElementVar($id3) != '') {
                                
                $currentValue getLogicElementVar($id3) + 0;
                            }

                            
                //default control is active
                            
                if ($defaultActive){

                                
                // fetch remaining steps from memory
                                
                $remainingSteps getLogicElementVar($id,5);

                                
                // remainingSteps had not been initialized? Go for it!
                                
                if (!is_numeric($remainingSteps))
                                    
                $remainingSteps $steps_to_default;

                                
                // are there more steps to compute on our way to output the default value?
                                
                if ($remainingSteps){
                                    
                $currentValue = (int) ($currentValue + ($defaultValue $currentValue) / $remainingSteps);
                                    
                $remainingSteps --;
                                    
                setLogicElementVar($id5$remainingSteps);
                                    
                setLogicElementVar($id3$currentValue);
                                    
                LB_LBSID_debug(true"defaultActive: true, currentValue: ".$currentValue.", remainigSteps: ".$remainingSteps.", defaultValue: ".$defaultValue);
                                }

                                    
                setLogicLinkAusgang($id1$currentValue); 

                            }
                                  else{
                                          
                // when not in default mode reset remaining steps variable
                                             
                setLogicElementVar($id5$steps_to_default);

                                  
                // Get dimm direction
                                  
                $countUp true;
                                  if (!
                getLogicElementVar($id4))
                                      
                $countUp false;

                                  
                // Get current upper and lower dimm boundary
                                  
                $lowerBoundary $minValue;
                                  if (
                getLogicElementVar($id1) != '')
                                      
                $lowerBoundary getLogicElementVar($id1) + 0;

                                  
                $upperBoundary $maxValue;
                                  if (
                getLogicElementVar($id2) != '')
                                      
                $upperBoundary getLogicElementVar($id2) + 0;

                                  
                LB_LBSID_debug(true"minValue:$minValue maxValue:$maxValue countUp:$countUp lowerBoundary:$lowerBoundary currentValue:$currentValue upperBoundary:$upperBoundary");

                                  
                // Now go ahead and calculate next dimm value
                                  
                if ($countUp && $currentValue $upperBoundary) {
                                      
                // Increase dimm value
                                      
                $currentValue $currentValue $stepping;
                                  } elseif (
                $countUp && $currentValue >= $upperBoundary) {
                                      
                // Reached upper boundary, so decrease dimm value, change dimm direction
                                      // and determine random based next lower boundary
                                      
                $currentValue $currentValue $stepping;
                                      
                $countUp false;

                                      
                // If random based boundary was deactivated, skip computation of next value
                                      
                if ($useRandom)
                                          
                $lowerBoundary rand($minValue$upperBoundary);
                                  } elseif (!
                $countUp && $currentValue $lowerBoundary) {
                                      
                // Decrease dimm value
                                      
                $currentValue $currentValue $stepping;
                                  } elseif (!
                $countUp && $currentValue <= $lowerBoundary) {
                                      
                // Reached lower boundary, so increase dimm value, change dimm direction
                                      // and determine random based next upper boundary
                                      
                $currentValue $currentValue $stepping;
                                      
                $countUp true;

                                      
                // If random based boundary was deactivated, skip computation of next value
                                      
                if ($useRandom)
                                          
                $upperBoundary rand($lowerBoundary$maxValue);
                                  }

                                  
                // Set output and store current values for next run of lbs
                                  
                setLogicLinkAusgang($id1$currentValue);
                                  
                setLogicElementVar($id1$lowerBoundary);
                                  
                setLogicElementVar($id2$upperBoundary);
                                  
                setLogicElementVar($id3$currentValue);
                                  
                setLogicElementVar($id4$countUp);
                            }
                    }

                }

                /**
                 * Validate given values for plausibility and reset them to defaults if neccessary.
                 *
                 * @param $E - The array with all the input values
                 * @return mixed - The array with all possibly fixed input values
                 */
                function LB_LBSID_validateInput($E)
                {
                    
                $startValue $E[3]['value'];
                    
                $minValue   $E[4]['value'];
                    
                $maxValue   $E[5]['value'];
                    
                $stepping   $E[6]['value'];

                    
                $defaultValue        $E[8]['value'];
                    
                $defaultActive        $E[9]['value'];
                    
                $steps_to_default    $E[10]['value'];


                    if (
                $minValue || $minValue 255) {
                        
                LB_LBSID_debug(false"Modifying wrong min value ${minValue} to 0.");
                        
                $minValue 0;
                        
                $E[4]['value'] = $minValue;
                    }
                    if (
                $maxValue || $maxValue 255) {
                        
                LB_LBSID_debug(false"Modifying wrong max value ${maxValue} to 255.");
                        
                $maxValue 255;
                        
                $E[5]['value'] = $maxValue;
                    }
                    if (
                $maxValue $minValue) {
                        
                LB_LBSID_debug(false"Switching min (${minValue}) and max (${maxValue}) value. Min must be lower than max!");
                        
                $tmpValue $maxValue;
                        
                $maxValue $minValue;
                        
                $minValue $tmpValue;
                        
                $E[4]['value'] = $minValue;
                        
                $E[5]['value'] = $maxValue;
                    }
                    if (
                $startValue $minValue) {
                        
                LB_LBSID_debug(false"Modifying too low start value ${startValue} to ${minValue}.");
                        
                $E[3]['value'] = $minValue;
                    }
                    if (
                $startValue $maxValue) {
                        
                LB_LBSID_debug(false"Modifying too high start value ${startValue} to ${maxValue}.");
                        
                $E[3]['value'] = $maxValue;
                    }
                    if (
                $stepping || $stepping 10) {
                        
                LB_LBSID_debug(false"Modifying wrong stepping value ${stepping} to 2.");
                        
                $E[6]['value'] = 2;
                    }

                    if (!
                is_numeric($defaultValue) && $defaultActive) {
                        
                LB_LBSID_debug(false"Disabling "default value mode". No default value given.");
                        
                $E[9]['value'] = 0;
                    }

                    if (
                $steps_to_default || $steps_to_default 10) {
                        
                LB_LBSID_debug(false"Modifying wrong "steps to default value${stepping} to 3.");
                        
                $E[10]['value'] = 3;
                    }

                    return 
                $E;
                }

                /**
                 * If E2 was set to 1, debug mode is activated. If so, write debug output into log file LBSLBSID_${id}.
                 *
                 * @param $isOk - If true, mark message as error
                 * @param $message - Message to write into the log
                 */
                function LB_LBSID_debug($isOk$message)
                {
                    global 
                $LB_LBSID_doDebug;
                    if (
                $LB_LBSID_doDebug || !$isOk) {
                        
                $logPrefix "INFO: ";
                        if (!
                $isOk) {
                            
                $logPrefix "ERROR:";
                        }
                        global 
                $LB_LBSID_id;
                        
                writeToCustomLog("MovingColors_LBSLBSID_${LB_LBSID_id}"$logPrefix$message);
                    }
                }

                ?>
                ###[/LBS]###


                ###[EXEC]###
                <?

                ?>
                ###[/EXEC]###

                Kommentar


                  #9
                  Hi

                  Zitat von phili Beitrag anzeigen
                  Hallo Yves,
                  ich habe die Variante mit den default-Werten jetzt einmal implementiert. Keine Ahnung ob Du Interesse daran hast, den zusätzlichen Code in den Baustein einzupflegen.
                  Cool! Na sicher habe ich Interesse daran, das einzubauen. Von daher schonmal vielen Dank für die Erweiterung. Schau ich mir auf jeden Fall an, bin nur gerade mit Terrasse und Garten ziemlich ausgelastet...
                  Kind regards,
                  Yves

                  Kommentar


                    #10
                    Hi

                    Ich brauche jetzt mal ein bisschen Hilfe bei dem Zusammenbau für einen schönen Farbverlauf. Wie verknüpfe ich die vier Moving Color LBS damit ich einen Verlauf der Farben bekomme?
                    ---
                    Martin

                    Kommentar


                      #11
                      Hallo Martin,

                      da gibt's nicht viel zu beachten. Ich kann grad keinen Screenshot meiner Logik machen aber aus dem Kopf heraus sieht das so aus:
                      • Für jeden Farbkanal einen LBS
                      • Je LBS unterschiedliche Startwerte an E3 vorgeben
                      • Alle anderen Werte nach Möglichkeit identisch
                      • Alle LBS gemeinsam bspw. via Sys-KO periodisch triggern
                      Screenshot mach' ich heute Abend (wenn ich's nicht vergesse...).
                      Kind regards,
                      Yves

                      Kommentar


                        #12
                        Da fällt mir grad ein bzw. auf, Du hast da ja noch eine Erweiterung des Bausteines vorgeschlagen. Sorry, das ist leider etwas untergegangen. Werde ich aber noch nachholen!
                        Kind regards,
                        Yves

                        Kommentar


                          #13
                          Hallo Yves

                          Nach 2 Jahren (seit Neubau) habe ich es heute endlich doch noch geschafft, die bis jetzt vorbereitete, aber noch leere Wohnzimmer-"Voute" mit Leben, sprich Licht zu füllen. Habe mir testweise mal die ersten 5m RGBW in die Voute gelegt (die restlichen 3 Seiten folgen, sobald ich das Material habe).

                          Angesteuert wird es von einem (ebenfalls neu gekauften Testgerät) Lunatone 4ch Dimmer, der dann meine bisherigen EldoLED Lin720 ersetzen soll, weil diese einfach grauenhaft für einen Schaltschrank sind.

                          Jetzt habe ich natürlich sofort via Edomi die Steuerung dieses LED-Stripes umgesetzt, was recht gut klappt. Klar, das Realtime-Verhalten fehlt halt schon etwas, aber gaert hat da ja für die Zukunft glaub etwas in seinem Zauberschrank.

                          Nachdem ich mich etwas totgespielt habe mit meinem Farbrad und RGB-Regler, musste ich natürlich deinen Moving Colors LBS installieren.
                          Und es hat eigentlich sofort funktioniert. Mit den Standardwerten (2000ms, Stepping 2) dauerts bei mir zwar ewig, bis er einen Durchgang abgeschlossen hat, aber das werde ich jetzt natürlich noch bisschen ausprobieren und optimieren.

                          Da mein RGBW-Stripe mit 26W/m sehr hell ist und bei Total 17m Länge viel Strom vom Dimmer zieht, werde ich ihn vermutlich im DALI Gateway (Siemens) bei der maximalen Helligkeit auf die Hälfte reduzieren (soll ja nur Effektlicht und kein Sonnenersatz sein). Der Gateway würde somit nicht bis 255 raufgehen, sondern schon bei ca. 127 fertig sein.

                          Ich denke, dein Baustein würde damit nicht korrekt funktionieren und von 127 bis 255 hochdimmen, während der Gateway diese Werte gar nicht zulässt und einfach clipped.
                          Denke nicht, dass Siemens die Werte von 0-255 auf den neuen Range von 0-127 umrechnet.

                          Also erstmal herzlichen Dank für den kleinen, aber feinen LBS. Wie schon von anderer Seite erwähnt, gäbe es sicher noch Potenzial für ein paar tolle Zusatzfunktionen.

                          Gruss, Hansjörg

                          EDIT: Oh, ich Blödmann habe ganz übersehen, dass man im LBS ja einen Max-Wert angeben kann. Wenn ich hier den gleichen Max. Wert wie im DALI GW setze, ist mein vermutetes Problem bereits gelöst.
                          Zuletzt geändert von rdeckard; 25.09.2017, 23:49.

                          Kommentar


                            #14
                            Hallo starwarsfan

                            ich habe den LBS im Einsatz, aber es schaut aus, als reagiert der Eingang Zufallsgrenzen nicht.
                            Obwohl dieser 0 ist, fährt der LBS nicht den vollen Bereich an, wie in E4/E5 definiert.

                            Hast du eine Idee was ich falsch mache?

                            vg André
                            mc.png
                            ...and I thought my jokes were bad!

                            Kommentar


                              #15
                              Hi

                              Gute Frage. Dass sieht soweit ok aus, da muss ich in den Code schauen. Bin aber noch zwei Wochen in den Ferien, bitte ggf. nochmal daran erinnern...
                              Kind regards,
                              Yves

                              Kommentar

                              Lädt...
                              X