Ankündigung

Einklappen
Keine Ankündigung bisher.

Kurvenberechnung

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

    Kurvenberechnung

    Gibt es in Edomi irgendwo einen Baustein ala HS in Sachen Kurvenberechung? Also z.B. bei 10°C = 10% | 20°C = 50% | 30°C = 100% und alles dazwischen wird berechnet?

    #2
    Meinst du eine Berechnung einer quadratischen/linearen mathematischen Funktion aus drei/zwei Punkten?

    m.W. gibt es das nicht als LBS.

    Kommentar


      #3
      Ja, genau das meine ich. ok, schade! Dann muss ich mal schauen wie ich das hin bekomme.

      Kommentar


        #4
        Ein universeller LBS dafür ist ja schnell gemacht...

        Kommentar


          #5
          Ich nix PHP Aber ich sehe schon, ich muss mich da auch mal rein denken...

          Kommentar


            #6
            Ich hab als ich angefangen hab mit edomi mal an sowas gebastelt. Vielleicht reicht dir das schon.
            Ist aber ganz schlecht geschrieben, funktionieren tut es aber.

            Interpoliert aber nur linear.

            PHP-Code:
            ###[DEF]###
            [name  = Multiskalierer ]

            [e#1  = Wert    #init=1  ]
            [e#2  = Primär Skala Anfangswert #init=0  ]
            [e#3  = Primär Skala 2.Wert  #init=10  ]
            [e#4  = Primär Skala 3.Wert  #init=20  ]
            [e#5  = Primär Skala 4.Wert  #init=30  ]
            [e#6  = Primär Skala 5.Wert  #init=40  ]
            [e#7  = Primär Skala 6.Wert  #init=50  ]
            [e#8  = Primär Skala 7.Wert  #init=60   ]
            [e#9  = Primär Skala 8.Wert  #init=70  ]
            [e#10  = Primär Skala 9.Wert  #init=80  ]
            [e#11  = Primär Skala 10.Wert  #init=90  ]
            [e#12  = Primär Skala Endwert  #init=100  ]

            [e#14  = Ziel Skala Anfangswert #init=0  ]
            [e#15  = Ziel Skala 2.Wert  #init=1  ]
            [e#16  = Ziel Skala 3.Wert  #init=2  ]
            [e#17  = Ziel Skala 4.Wert  #init=3  ]
            [e#18  = Ziel Skala 5.Wert  #init=4  ]
            [e#19  = Ziel Skala 6.Wert  #init=5  ]
            [e#20  = Ziel Skala 7.Wert  #init=6  ]
            [e#21  = Ziel Skala 8.Wert  #init=7  ]
            [e#22  = Ziel Skala 9.Wert  #init=8  ]
            [e#23  = Ziel Skala 10.Wert  #init=9  ]
            [e#24  = Ziel Skala Endwert  #init=10 ]

            [a#1  = Wert ]
            [a#2  = Interval ]
            [a#3  = Interval unten]
            [a#4  = Interval oben ]
            [a#5  = Ziel-Interval unten]
            [a#6  = Ziel-Interval oben ]
            [a#7  = Ziel-Wert ]

            ###[/DEF]###


            ###[HELP]###
            Vorlage: Standard-LBS
            ###[/HELP]###


            ###[LBS]###
            <?
            function LB_LBSID($id) {
             if ($E=logic_getInputs($id)) {

              if ($E[1]['refresh']==1 || $E[2]['refresh']==1 || $E[3]['refresh']==1 || $E[4]['refresh']==1 || $E[5]['refresh']==1 ||
                                 $E[6]['refresh']==1 || $E[7]['refresh']==1 || $E[8]['refresh']==1 || $E[9]['refresh']==1 || $E[10]['refresh']==1 ||
                                 $E[11]['refresh']==1 || $E[12]['refresh']==1 || $E[14]['refresh']==1 || $E[15]['refresh']==1 || $E[16]['refresh']==1 ||
                  $E[17]['refresh']==1 || $E[18]['refresh']==1 || $E[19]['refresh']==1 || $E[20]['refresh']==1 || $E[21]['refresh']==1 ||
               $E[22]['refresh']==1 || $E[23]['refresh']==1 || $E[24]['refresh']==1)
              {


               for($i = 2;$i <= 11;$i ++){
                $l=$i+1;
                $m=$i+12;
                $n=$i+13;
                $A=$E[1]['value'];
                if (!is_numeric($A)) {$A=0;}

                    if ($A>=$E[$i]['value'] && $A<$E[$l]['value']) {
                
                  $B=$E[$i]['value'];
                  $C=$E[$l]['value'];
                  $O=$E[$m]['value'];
                  $P=$E[$n]['value'];
                  $Pos=$i-1;
                  }

                 }

                $G=($C-$B);
                $H=$P-$O;
                $L=($A-$B);
                $LA=$L/$G;
                $M=(($LA*$H)+$O);
                $Z=($M);
              

                setLogicLinkAusgang($id,1,($A));
                setLogicLinkAusgang($id,2,($Pos));
                setLogicLinkAusgang($id,3,($B));
                setLogicLinkAusgang($id,4,($C));
                setLogicLinkAusgang($id,5,($O));
                setLogicLinkAusgang($id,6,($P));
                setLogicLinkAusgang($id,7,($Z));
             }

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


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

            Kommentar


              #7
              Zitat von LeFreak Beitrag anzeigen
              Ich nix PHP Aber ich sehe schon, ich muss mich da auch mal rein denken...
              Vielleicht beschreibst du etwas genauer, was du wie gerne umsetzen möchtest. Und auch wenn man kein oder nur rudimentär PHP coden kann, ist es zumeist eh nur ein Zusammensetzen verschiedener Codeschnipsel (so machen es auch viele Programmierer )

              Kommentar


                #8
                So in etwa müsste das gewünschte Programm aussehen... da ich von PHP und den Edomi eigenen Spezifica keien Ahnung habe (arbeite in Phyton und MatLab), müsste das jmd in schönen LBS-Code gießen

                Code:
                ###[DEF]###
                [name  = quadratische Funktion durch drei Punkte (a*x2+b*x+c) ]
                
                [e#1  = x_given    #init=1  ]
                [e#2  = x1 #init=10  ]
                [e#3  = y1 #init=10  ]
                [e#4  = x2  #init=20  ]
                [e#5  = y2 #init=50  ]
                [e#6  = x3  #init=30  ]
                [e#7  = y3  #init=100  ]
                
                
                [a#1  = y_search]
                [a#2  = a ]
                [a#3  = b ]
                [a#3  = c ]
                
                ###[/DEF]###
                
                
                ###[HELP]###
                Vorlage: Standard-LBS
                ###[/HELP]###
                
                
                ###[LBS]###
                <?
                function LB_LBSID($id) {
                 hier müsste ein Trigger rein, (noch) keine Ahnung, wie das in Edomi geht
                    
                     $a = ($E[2]*($E[5]-$E[7])+$E[4]*($E[7]-$E[3])+$E[6]*($E[3]-$E[5]))/(($E[2]-$E[4])*($E[2]-$E[6])*($E[6]-$E[4]))
                     $b = ($E[2]**2*($E[5]-$E[7])+$E[4]**2*($E[7]-$E[3])+$E[6]**2*($E[3]-$E[5]))/(($E[2]-$E[4])*($E[2]-$E[6])*($E[4]-$E[6]))
                     $c = ($E[2]**2*($E[4]*$E[7]-$E[6]*$E[5])+$E[2]*($E[6]**2*$E[5]-$E[4]**2*$E[7])+$E[4]*$E[6]*$E[3]*($E[4]-$E[6]))/(($E[2]-$E[4])*($E[2]-$E[6])*($E[4]-$E[6]))
                    
                     // a = (x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))/((x1-x2)*(x1-x3)*(x3-x2))
                     // b = (x1**2*(y2-y3)+x2**2*(y3-y1)+x3**2*(y1-y2))/((x1-x2)*(x1-x3)*(x2-x3))
                     // c = (x1**2*(x2*y3-x3*y2)+x1*(x3**2*y2-x2**2*y3)+x2*x3*y1*(x2-x3))/((x1-x2)*(x1-x3)*(x2-x3))
                    
                     $y_search=$a*$E[1]**2+$b*$E[1]+$c
                    
                     // y_search=a*y_given**2+b*x_given+c
                    
                     setLogicLinkAusgang($id,1,($y_search));
                     setLogicLinkAusgang($id,2,($a));
                     setLogicLinkAusgang($id,3,($b));
                     setLogicLinkAusgang($id,4,($c));
                    
                }
                ?>
                ###[/LBS]###

                so sieht dann das Ergebnis aus
                Figure_1.png
                Zuletzt geändert von DolcheVita; 11.04.2019, 10:23.
                Viele Grüße, Vitali

                Kommentar


                  #9
                  Zitat von saegefisch Beitrag anzeigen
                  Ein universeller LBS dafür ist ja schnell gemacht...
                  Eine quadratische Funktion aus 3 Punkten zu berechnen ist zwar durchaus machbar, aber vielleicht doch nicht so trivial.
                  Für das o.g. Beispiel wäre es: f(x) = 0,05x² + 2,5x - 20

                  Kommentar


                    #10
                    Zitat von jonofe Beitrag anzeigen

                    Eine quadratische Funktion aus 3 Punkten zu berechnen ist zwar durchaus machbar, aber vielleicht doch nicht so trivial.
                    Für das o.g. Beispiel wäre es: f(x) = 0,05x² + 2,5x - 20
                    stimmt, spuckt der o.g. Code so aus ...
                    Viele Grüße, Vitali

                    Kommentar


                      #11
                      Ich hab das mit dem Formelberechnungsbaustein von Gerd gemacht

                      Formel ist "(($d-$b)/($c-$a))*$x+(($b*$c)-($d*$a))/($c-$a)"
                      in meinem beispiel ist
                      E3 X-Wert A1= Y-Wert
                      E4 X1
                      E5 Y1
                      E6 X2
                      E7 Y2

                      Angelehnt an diesen Baustein
                      http://service.knx-user-forum.de/?comm=download&id=9044

                      Ich Nutz das um zb meine FBH zu steuern

                      Kommentar


                        #12
                        Je nach Konstellation der Punkte kommt aber Murks raus. Ich wüsste auch nicht, warum man die Funktionszuordnung dynamisch errechnen sollte, normalerweise sollte es reichen, diese einmal zu bestimmen und dann im Code zu implementieren. Ohne den Einsatzzweck kann man da nur mutmaßen

                        Kommentar


                          #13
                          Hintergrund ist folgender: Ich habe zu Hause aktuell einen Mischbetrieb von Gira HS / Edomi. Natürlich bin ich seit einiger Zeit dabei meinen HS auf EDOMI zu migrieren. Da ich aber ein quasi vollautomatisiertes Haus habe, ist das extrem aufwendig. Nun möchte ich mich mal nach der Heizung an die Beschattungssteuerung machen.
                          Ich weis das es hierfür einige LBS gibt, aber bei mir ist das alles Baulich etwas speziell, daher möchte ich die Funktionen "händlich" in der Logik zusammensetzen. Aktuell habe ich im HS für die Lamellennachführung nach Sonnenstand eine Kurvenberechnung. Also wenn z.B. Sonnenhöhe 0° dann Lamelle 100%, wenn Sonnenhöhe 90" dann Lamelle 50%. Hier habe ich eine 4 Punkt Kurvenberechnung im Einsatz. Der Punkt ist nun - deswegen speziell- das zum Teil unser Haus von Nebengebäuden teilweise verschattet ist, daher die feine händische Abstimmung. Oder auch das in bestimmten Bereichen die Lamellen von weiteren Abhängigkeiten gesteuert werden. z.B. Wenn jemand zu hause ist, wenn sich jemand im entsprechenden Raum befindet, wenn der Fernseher an ist, wenn das Fenster offen ist, wenn Licht an ist,...u.s.w......Meine aktuelle Kurve ist z.B. in einem bestimmten Bereich nicht Linear. Morgens ist z.B. der Winkel der Lamellen größer als gegen Mittag. Da Sonne frühs nicht so warm und ich habe es beim Frühstücken gerne etwas Heller

                          Kommentar


                            #14
                            LeFreak unabhängig vom Sinn und Zweck.. Suchst Du wirklich nach einer Kurvenberechnung, oder "nur" nach einer (linearen) Interpolation über ein Punktereihe. über diese könnte man quasi beliebige Verläufe generieren und bräuchte nicht zig verschieden Bausteine, weil man mal 2/3/4/5 Punkte für jeweils einen anderen Einsatzzweck hat. (Würde ja auch immer unterschiedliche Ansätze erforndern bzw. sowas wie einen "least square fit"...)
                            Viele Grüße, Vitali

                            Kommentar


                              #15
                              Sehe es genau wie DolcheVita . Bevor du dich da verkünstelst, jeden Zwischenschritt formeltechnisch zu ermitteln, würde ich einfach abschnittsweise linear interpolieren. Das ist sehr simpel in eine Formel und Logik zu bringen und je mehr Zwischenpunkte du definierst, desto feiner steuerst du den Winkel der Behänge.

                              Kommentar

                              Lädt...
                              X