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?
Ankündigung
Einklappen
Keine Ankündigung bisher.
Kurvenberechnung
Einklappen
X
-
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
-
Zitat von LeFreak Beitrag anzeigenIch nix PHPAber ich sehe schon, ich muss mich da auch mal rein denken...
)
Kommentar
-
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.pngZuletzt geändert von DolcheVita; 11.04.2019, 10:23.Viele Grüße, Vitali
Kommentar
-
Zitat von saegefisch Beitrag anzeigenEin universeller LBS dafür ist ja schnell gemacht...
Für das o.g. Beispiel wäre es: f(x) = 0,05x² + 2,5x - 20
Kommentar
-
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 - 20Viele Grüße, Vitali
Kommentar
-
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
-
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
-
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
-
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
Kommentar