# Moving average
Oblicza bieżącą średnią z przychodzących wartości liczbowych za pomocą wybranego algorytmu (EMA lub CA)
Moving average
V
R
AVG
# Wejścia
| ID | Skrót | Nazwa | Typ | Domyślnie | Opis |
|---|---|---|---|---|---|
value | V | Wartość | NUMBER | 0 | Wartość liczbowa do uwzględnienia w średniej |
reset | R | Reset | BOOLEAN | false | Zbocze narastające resetuje średnią do aktualnej wartości wejściowej |
# Wyjścia
| ID | Skrót | Nazwa | Typ | Domyślnie | Opis |
|---|---|---|---|---|---|
average | AVG | Średnia | NUMBER | 0 | Obliczona średnia krocząca |
# Konfiguracja
| ID | Nazwa | Typ | Domyślnie | Jednostka | Opis |
|---|---|---|---|---|---|
algorithm | Algorytm | ENUM | 0 | Algorytm uśredniania: EMA (wykładnicza średnia krocząca) lub CA (średnia kumulacyjna) Szczegóły: Wartości: EMA, CA | |
alpha | Alfa (współczynnik wygładzania) | NUMBER | 0.2 | Współczynnik wygładzania EMA (0-1). Wyższe wartości nadają większą wagę najnowszym wartościom Szczegóły: Widoczne gdy algorithm = EMA> 0 ≤ 1 |
# Stan
| ID | Nazwa | Typ | Domyślnie | Jednostka | Opis |
|---|---|---|---|---|---|
count | Licznik | NUMBER | 0 | Liczba otrzymanych wartości | |
prev_reset | Poprzedni stan resetu | BOOLEAN | false | Poprzedni stan wejścia reset do detekcji zbocza |
# Kod źródłowy
Pokaż kod Volang
channel = input::channel()
value = input::value()
if (channel == "reset") {
prev_reset = state::get("prev_reset")
if (value and !prev_reset) {
current = input::get("value")
state::set("count", 1)
output::set("average", current)
}
state::set("prev_reset", value)
return
}
if (channel == "value") {
count = state::get("count")
avg = output::get("average")
if (count == 0) {
state::set("count", 1)
output::set("average", value)
return
}
algorithm = config::get("algorithm")
if (algorithm == 0) {
alpha = config::get("alpha")
new_avg = alpha * value + (1 - alpha) * avg
output::set("average", new_avg)
} else {
count = count + 1
state::set("count", count)
new_avg = avg + (value - avg) / count
output::set("average", new_avg)
}
}
