Ankündigung

Einklappen
Keine Ankündigung bisher.

Kurvenberechnung

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

  • noescape
    antwortet
    Wie gesagt, großartig PHP muss man dafür nicht können, einfach Vorhandenes kopieren und anpassen. Kannst ja mal versuchen, einen weiteren Zwischenpunkt zu definieren. In Edomi kann man ja sehr einfach einen Schreibtischtest durchführen.

    Edit: Sehe grad, dass ich in einer Zeile gar nicht gerundet hatte.

    Code:
                 } elseif ($E[1]['value']<=$E[40]['value'] && $E[1]['value']>$E[30]['value']) {                
                     logic_setOutput($id,1,(($E[41]['value']-$E[31]['value'])/($E[40]['value']-$E[30]['value']))*($E[1]['value']-$E[30]['value'])+$E[31]['value']);
    muss ersetzt werden durch

    Code:
      
                 } elseif ($E[1]['value']<=$E[40]['value'] && $E[1]['value']>$E[30]['value']) {                
                     logic_setOutput($id,1,[B]round([/B](($E[41]['value']-$E[31]['value'])/($E[40]['value']-$E[30]['value']))*($E[1]['value']-$E[30]['value'])+$E[31]['value'])[B],0)[/B];
    Zuletzt geändert von noescape; 17.04.2019, 17:32.

    Einen Kommentar schreiben:


  • LeFreak
    antwortet
    Tausend Dank!!!!!! Wird getestet! Wenn ich irgendwann mal wieder Zeit habe, werde ich mich auf jeden Fall mal mit PHP befassen.

    Einen Kommentar schreiben:


  • noescape
    antwortet
    Zitat von LeFreak Beitrag anzeigen
    Könnte mir evtl. jemand einen Denkanstoß geben was den LBS angeht? ich hatte wie gesagt bisher mit PHP und LBS selbst schreiben quasi noch gar nichts am Hut....


    Mal so ganz profan heruntergeschrieben. Ohne Prüfung der Eingabewerte und sonstigen Schnickschnack.
    Sobald ein Wert an E1 ankommt, triggert der Baustein. Ist E1<E10 wird der Wert aus E11 ausgegeben, ist E1>E40 wird der Wert aus E41 ausgegeben, also alles außerhalb der Definitionsmenge wird abgefangen. Werte dazwischen werden als gerundetes arithmetisches Mittel zurückgegeben.

    Selbst ohne PHP sollte man die Logik dahinter im Script erkennen können. Einzig die Berechnung ist vielleicht nicht so einfach zu lesen, da ich aus Faulheitsgründen die Formel durch Ausklammern vereinfacht habe:
    y=m*x+n (mit n=y1-m*x1)
    y=m*x+y1-m*x1
    y=m*(x-x1)+y1 (mit m=(y2-y1)/(x2-x1))
    y=(y2-y1)/(x2-x1)*(x-x1)+y1 entspricht der Formel im Script

    Dabei sind P1(x1/y1) und P2(x2/y2) jeweils die Intervallgrenzen unten und oben, sowie P(x/y) der gesuchte Punkt bei bekanntem x (Sonnenhöhe).

    Wenn du nun jahreszeitenabhängig die intervalle anders setzen willst, kannst du ja die Eingänge über andere KOs/Logikausgänge befüllen.


    Code:
    ###[DEF]###
    [name        =Interpolation Lamellenwinkel        ]
    [titel        =Lamellenwinkel berechnen            ]
    
    [e#1 TRIGGER=Sonnenhoehe_aktuell                 ]
    [e#10         =Intervallgrenze_1         #init=5            ]
    [e#11         =Lamellenwinkel_1         #init=10        ]
    [e#20         =Intervallgrenze_2         #init=24            ]
    [e#21         =Lamellenwinkel_2         #init=50        ]
    [e#30         =Intervallgrenze_3         #init=45            ]
    [e#31         =Lamellenwinkel_3         #init=30        ]
    [e#40         =Intervallgrenze_4         #init=65            ]
    [e#41         =Lamellenwinkel_4         #init=10        ]
    
    [a#1        =Lamellenwinkel                        ]
    ###[/DEF]###
    
    
    ###[HELP]###
    Dieser Baustein interpoliert auf linearen Teilstrecken den einzustellenden Lamellenwinkel.
    Eingänge EX0 definieren die Referenzhöhen und Eingänge EX1 die zugehörigen Winkel.
    
    Ausgang A1 gibt den interpolierten Lamellenwinkel als Ganzzahl gerundet zurück.
    ###[/HELP]###
    
    
    ###[LBS]###
    <?
    function LB_LBSID($id) {
        if ($E=logic_getInputs($id)) {
            if ($E[1]['refresh']==1) {
                if ($E[1]['value']<=$E[10]['value']) {
                    logic_setOutput($id,1,$E[11]['value']);
                } elseif ($E[1]['value']<=$E[20]['value'] && $E[1]['value']>$E[10]['value']) {
                    logic_setOutput($id,1,round((($E[21]['value']-$E[11]['value'])/($E[20]['value']-$E[10]['value']))*($E[1]['value']-$E[10]['value'])+$E[11]['value']),0);
                } elseif ($E[1]['value']<=$E[30]['value'] && $E[1]['value']>$E[20]['value']) {
                    logic_setOutput($id,1,round((($E[31]['value']-$E[21]['value'])/($E[30]['value']-$E[20]['value']))*($E[1]['value']-$E[20]['value'])+$E[21]['value']),0);
                } elseif ($E[1]['value']<=$E[40]['value'] && $E[1]['value']>$E[30]['value']) {
                    logic_setOutput($id,1,(($E[41]['value']-$E[31]['value'])/($E[40]['value']-$E[30]['value']))*($E[1]['value']-$E[30]['value'])+$E[31]['value']);
                } elseif ($E[1]['value']>$E[40]['value']) {
                    logic_setOutput($id,1,$E[41]['value']);
                }
            }
        }
    }
    ?>
    ###[/LBS]###
    
    
    ###[EXEC]###
    <?
    
    ?>
    ###[/EXEC]###
    Zuletzt geändert von noescape; 17.04.2019, 13:33.

    Einen Kommentar schreiben:


  • MrIcemanLE
    antwortet
    Mathematisch solltest du mit der Geradengleichung anfangen und diese dann in PHP umsetzen:

    2019-04-17 14_25_07-Gerade durch zwei Punkte finden.png

    PHP-Code:
    function getZwischenwert($elevation1,$winkel1,$elevation2,$winkel2,$aktuelleElev){
        return (
    $winkel2-$winkel1)/($elevation2-$elevation1)*$aktuelleElev+($elevation2*$winkel1-$elevation1*$winkel2)/($elevation2-$elevation1);

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    Ich vermute von einem Denkanstoß wirst du kein PHP lernen. Daher wäre ein Einstieg in PHP vermutlich der beste Weg. Oder einfach das verwenden, was in Post #6 gepostet wurde, denn das ist ja bereits ein kompletter LBS.

    Einen Kommentar schreiben:


  • LeFreak
    antwortet
    Könnte mir evtl. jemand einen Denkanstoß geben was den LBS angeht? ich hatte wie gesagt bisher mit PHP und LBS selbst schreiben quasi noch gar nichts am Hut....

    Einen Kommentar schreiben:


  • LeFreak
    antwortet
    Also quasi die "Zwischenbereiche" zwischen zwei Angaben/Punkten sollen schon linear sein.
    Beispiel aus meinem hs:

    Rollo.png

    Einen Kommentar schreiben:


  • noescape
    antwortet
    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.

    Einen Kommentar schreiben:


  • DolcheVita
    antwortet
    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"...)

    Einen Kommentar schreiben:


  • LeFreak
    antwortet
    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

    Einen Kommentar schreiben:


  • noescape
    antwortet
    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

    Einen Kommentar schreiben:


  • Peterich
    antwortet
    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

    Einen Kommentar schreiben:


  • DolcheVita
    antwortet
    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 ...

    Einen Kommentar schreiben:


  • jonofe
    antwortet
    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

    Einen Kommentar schreiben:


  • DolcheVita
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X