Hallo,
ich versuche gerade mir einen Sinnvollen Anzeigewert für die Windgeschwindigkeit zu berechnen.
Ich betreibe eine SCN-WS3HW.01, das ist im Prinzip ein Windrad mit Dämmerungssensoren und Tempereatursensor.
Eigentlich gedacht zur Fassadenstererung, aber: wenn man da sowieso eine „kleine Wetterstation“ hat würde ich mir gerne die aktuelle Windgeschwindigkeit anzeigen lassen, einfach aus Interesse.
Das Teil sendet den aktuellen Windspeed bei einer Änderung von 10%. Ich würde mir jetzt gerne einen Mittelwert über z.B. 10 Minuten errechnen. Mein bisheriges Script schreibt jeden neuen Wert in eine angelegte IPS-Variable, löscht alte Variablen die älter als die definierte Zeit sind und berechnet danach einen Mittelwert über die verbleibenden Variablen. Das funktioniert, sieht aber irgendwie so aus wie als ob man das noch besser lösen kann, ohne Variablenverbrauch. Mir fällt aber als Hobby Programmierer nichts ein. Gibts einen Weg den ich nicht sehe, oder ist das wirklich nur so zu lösen wie ich es mache ?
anbei mein Script:
<?
$time = time();
$EventIdCyclic = 21744 /*[Scripte\KNX\Wind auf Bus\Täglich alle 5 Minuten]*/;
$VarIdInbetrieb = 28919 /*[KNX\Stör - Statusobjekte\Statussachen / Timestamp\Inbetrieb Wetter\Wert]*/;
$VarIdWindmeter = GetValueFloat(37550 /*[KNX\7 Wetter\Dach\Wind\Wert]*/);
$VarValWindknoten = ($VarIdWindmeter * 900 / 463);
$Inbetrieb = 1;
$Var = 21759 /*[Scripte\KNX\Wind auf Bus\Var]*/;
$Anzahl = 0;
$VarSchnittValue = 0;
$Interval = 300; //Zeit über welche Durchschnitt gebildet wird
$VarId = IPS_CreateVariable(2);
IPS_SetParent ($VarId, $Var);
SetValueFloat ($VarId, $VarValWindknoten);
foreach(IPS_GetChildrenIDs($Var) as $item)
{
$VarInfo = IPS_GetVariable($item);
$Differenz = $time - $VarInfo['VariableUpdated'];
if ($Differenz <= $Interval)
{
$Anzahl++;
$VarSchnittValue = $VarSchnittValue + GetValueFloat($item);
}
else
{
IPS_DeleteVariable ($item);
}
}
if ($VarSchnittValue)
$VarSchnittValue = $VarSchnittValue / $Anzahl;
$VarGetInbetrieb = IPS_GetVariable($VarIdInbetrieb);
$Differenz = $time - $VarGetInbetrieb['VariableUpdated'];
if ($Differenz > 720)
$Inbetrieb = 0;
if($Inbetrieb)
{
SetValueFloat (28889 /*[Scripte\KNX\Wind auf Bus\Wind]*/, $VarValWindknoten);
SetValueFloat (10076 /*[Scripte\KNX\Wind auf Bus\Wind10]*/, $VarSchnittValue);
EIB_Value(20190 /*[KNX\7 Wetter\IPS\Wind knots]*/, $VarSchnittValue);
}
else
{
SetValueFloat (28889 /*[Scripte\KNX\Wind auf Bus\Wind]*/, -1);
SetValueFloat (28889 /*[Scripte\KNX\Wind auf Bus\Wind]*/, -1);
EIB_Value(20190 /*[KNX\7 Wetter\IPS\Wind knots]*/, -1);
}
?>
Gruß Julian