Wind Toggle richtig setzten (Mittelwert)

Hallo alle

Ich lade die Windgeschwindigkeit von meiner eigenen PWS via Wunderground einmal pro Minute herunter. Leider konnte ich es nicht so machen, dass ich die Daten direkt von meiner Wetterstation einlese…

Ich habe daneben eine Variable „WindToggle“ erstellt. Diese soll als Windwächter dienen. Wenn nun die Windgeschwindigkeit über 16km/h liegt, dann müsste das WindToggle auf „true“ geschaltet werden. Soweit so gut. Mit einem Ereignis habe ich das hinbekommen. Allerdings kommt es in der Praxis oft vor, dass die Grenzgeschwindikeit nur einmal für eine Minute erreicht wird. Das Resultat ist, dass die Markisen dann sofort einfahren.

Ich möchte eigentlich lieber, dass der WindToggle erst dann aktiviert wird, wenn über 3-5 Minuten der Grenzwert konstant überschritten wird. Wie kann ich das PHP-technisch lösen?

Wenn du die Variable loggst, dann kannst du via AC_GetAggregatedValues die Durchschnittswerte der letzten x Minuten abfragen. Darüber kannst dann ja nochmal den Durchschnittswert berechnen (aufsummieren und durch x teilen). Wenn dieser dann über 16 liegt, dann führst du deine gewünschte Aktion durch.

Solltest du die Variable nicht loggen und das auch nicht vorhaben, dann müsstest du dir die letzten Werte in Hilfsvariablen merken, kannst aber vom Prinzip her das Problem genauso lösen.

Hi,

hier ein Beispiel:

§status ist deine WindToggle Variable.
Wird die WindToggle auf true gesetzt, wird dieses Script Gestartet (Ereigniss Erstellen!) und es läuft ein Timer (hier z.b 30 sek)
Sind die 30 sek Fertig, wird nochmal geprüft ob status auf true.
Wenn false, nichts machen.
Wenn true, irgendwas schalten.

<?
 
$status = GetValue(12345); WindToggle Variable
$time   = 30; //Sekunden
 
If ($_IPS['SENDER'] == "Variable")  
{
 
   If ($status == true)
   {
    IPS_SetScriptTimer($_IPS['SELF'],$time);
   }
   else
   {
   //mach nix
   }
}
 
else
{
echo "Dieses Sript kann nur entweder durch eine Variable oder ein Timerevent gestartet werden";
}
 
If ($_IPS['SENDER'] == "TimerEvent") // Wenn das Script durch den Timer gestartet wird
{
    If ($status == true)
    {
 
    //was soll gemacht werden? 
 
    IPS_SetScriptTimer($_IPS['SELF'],$time);
    }
    else
    {
    IPS_SetScriptTimer($_IPS['SELF'],0); // Timer ausschalten
    }
}
else
{
}
 
 
?>

Gruß

Hallo sewo

Ich habe das so auf meine Bedürfnisse angepasst. Stimmt das in etwa?
WindToggle$ = Temporärer Schalter, der bei WS>26 angeht
WindToggle=Definiver Schalter, der erst angeht, wenn 3 Minuten lang die WS>26 war. Diesen Parameter möchte ich dann verwenden, um den Schaltbefehl zu erstellen.

<?
 
$status = GetValue(50744); //WindToggle$
$time   = 60*3; //Sekunden
 
If ($_IPS['SENDER'] == "Variable")  
{
 
   If ($status == true)
   {
    IPS_SetScriptTimer($_IPS['SELF'],$time);
   }
   else
   {
   //mach nix
   }
}
 
else
{
echo "Dieses Sript kann nur entweder durch eine Variable oder ein Timerevent gestartet werden";
}
 
If ($_IPS['SENDER'] == "TimerEvent") // Wenn das Script durch den Timer gestartet wird
{
    If ($status == true)
    {
 
    SetValue($_IPS[22620], $_IPS['VALUE']); //was soll gemacht werden? //WindToggle
 
    IPS_SetScriptTimer($_IPS['SELF'],$time);
    }
    else
    {
    IPS_SetScriptTimer($_IPS['SELF'],0); // Timer ausschalten
    }
}
else
{
}
 
 
?>

Hallo DrNiels
Ich werde mir das Thema aggregated values noch genauer ansehen (müssen). Danke für die Inspiration

Mittelwert berechnen (Windspeed)
Mittelwert berechnen (Windspeed)

Gruß
Julian

Dr. Niels: Ich habe mich da versucht einzulesen, aber irgendwie reicht mein Niveau noch nicht. Ich wollte mal trivial die Tagesdurchschnitttemperatur berechnen:

Variable 35540 = Download Temperatur Wunderground (float), archiviert
Variable 55227 = geplante Variable für den Tagesdurchschnitt (float)

$werte = AC_GetAggregatedValues(35540, 55227, 1 /* Täglich */, strtotime("today 00:00"), time(), 0); //55554 ist die ID der Variable, 12345 vom Archiv
foreach($werte as $wert) {
echo date("d.m.Y H:i:s", $wert['TimeStamp']) . " -> " . $wert['Avg'] . PHP_EOL;
}

Da komme ich aber nicht mehr weiter…

Ich habe mir für eine ähnliche Fragestellung mal eine kleine Funktion geschrieben. Sie müsste auch bei dir passen:


function getAvg(int $id, int $Endzeit, int $minutes): float
{

    $werte = AC_GetAggregatedValues(IPS_GetInstanceIDByName('Archive Handler', 0), $id, 6, $Endzeit - (60 * $minutes), $Endzeit, 0);
    $sum   = 0;
    foreach ($werte as $wert) {
        $sum += $wert['Avg'];
    }
    return $sum / count($werte);
}

Die könntest du aufrufen mit


$durchschnitt = getAvg(47111, time(), 5);

für einen Durchschnitt der letzten 5 Minuten.

Gruß

Burkhard

Deine Funktion sieht soweit richtig aus. Die sollte die Durchschnittstemperatur des aktuellen Tages seit 00:00 Uhr ausgeben. Klappt das nicht? Oder wolltest du etwas anderes erreichen?