Schaltdauer einer Bool-Variable auswerten

Hallo zusammen,

ich stehe vor der Herausforderung für mein Bewässerungsprojekt den Regensensor (Regen: ja/nein ohne Menge) auszuwerten und benötige hierzu eure Hilfe.

Ich möchte gern die Dauer der Regensensorvariable (True bei Regen) nach 24h wissen und diese Zeitdaten in Sekunden in eine Integervariable ausgeben.

Somit kann ich auswerten, ob der Eventtimer für die Bewässerung am Abend aktiv bleiben soll.

Ich würde mich freuen wenn mir hierbei jemand helfen könnte.

Vielen Dank.

Felix

Die Regenvar startet bei „true“ ein Script welches time(); und dessen Differenz bei false in eine Integervar schreibt und in einer zweiten Integervar die Summe der jeweiligen Scriptaufrufe, nach 24h kannst Du diese abrufen und wieder zurücksetzen.

Hall REDBANDITO,

script stamm nicht von mir, funktioniert aber zuverlässig, ich werte damit ähnliche vorgänge aus:


function getLoggedValueDuration ($variableID, $tsStart, $tsEnd, $value)
{
    $duration = 0;

    $archiveHandlerID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}');
    $archiveHandlerID = $archiveHandlerID[0];

    $data = AC_GetLoggedValues($archiveHandlerID, $variableID, time(), time(), 1);
    $openTs = count($data) > 0 ? $data[0]['TimeStamp'] : false;

    $data = AC_GetLoggedValues($archiveHandlerID, $variableID, $tsStart, $tsEnd, 100000);
    $isOpen = ($openTs !== false && count($data) > 0) ? ($openTs == $data[0]['TimeStamp']) : false;

    if (count($data) == 100000)
    {
        return false;
    }

    if (count($data) > 0)
    {
        if ($data[count($data) - 1]['TimeStamp'] < $tsStart)
        {
            $delta = $tsStart - $data[count($data) - 1]['TimeStamp'];
            $data[count($data) - 1]['TimeStamp'] = $tsStart;
            $data[count($data) - 1]['Duration'] = max(0, $data[count($data) - 1]['Duration'] - $delta);
        }

        if ($data[0]['TimeStamp'] + $data[0]['Duration'] > $tsEnd || $isOpen)
        {
            $data[0]['Duration'] = $tsEnd - $data[0]['TimeStamp'];
        }

        for ($i = 0, $j = count($data); $i < $j; $i++)
        {
            if ($data[$i]['Value'] == $value)
            {
                $duration += $data[$i]['Duration'];
            }
        }
    }

    return $duration;
}
?>


Anwendungsbeispiel zeitdauer für boolsche variable mit wert = true:


$dauer = getLoggedValueDuration($m,$tsStart,$tsEnd,true);

Beste Grüße
hoep

1 „Gefällt mir“

Hallo
Ich wollte mir das Skript zur Nutze machen da ich genau vor der Aufgabe stehe

An welcher Stelle muss ich es einsetzten bzw an welchen Positionen muss ich noch mein Variabelen ID‘s einsetzen ?
Danke

Das ist eine Funktion und der übergibst du als ersten Parameter deine VariablenID beim Aufruf:

$ergebnis = getLoggedValueDuration ($variableID, ...

Aber das grenzt schon an Leichenflederei nach 9 Jahren :wink: .

Du könntest auch einfach das Modul Betriebsstundenzähler aus dem Store nehmen.

Zumindest kann man mir nicht vorwerfen ich hätte die Suche nicht benutzt;-) wenn ich was so altes finde …
Das Betriebsstunden Modul gibt leider nur ganze Stunden Werte aus, ich brauche aber für meine geplanten Folgefunktionen Minuten genau die Zeit
Ginge das einfacher?

Das konnte ich nicht glauben und habe mal kurz installiert, deine Aussage ist nur fast richtig. Die Anzeige aufgrund des Profils ist zwar Stunden, aber der Wert ist schon deutlich mehr aufgelöst :wink:

Aber du kannst doch die Funktion von oben nutzen

getLoggedValueDuration ($variableID, $tsStart, $tsEnd, $value)

die notwendigen Parameter sind och selbsterklärend oder was geht bei dir nicht?