Wie Mittelwert von verschiedenen Geräten berechnen

Begonnen von teufelchen, 10 Mai 2021, 13:56:50

Vorheriges Thema - Nächstes Thema

teufelchen

Hallo,

da ich keine eigene Wetterstation betreibe lese ich verschiedene Wetterstationen bei mir im Umkreis aus.

Momentan errechne ich mir den Mittelwert über einen Dummy.
Ich addiere für jedes Gerät das gewünschte Reading und teile dann durch die Anzahl der Stationen.
Der Mittelwert ist dann meistens brauchbar.

Falsch wird der Wert, wenn wegen einer Störung eine Station kein aktuelles Reading hat oder ganz ausfällt.

Was ich suche, aber noch nicht gefunden habe, ist eine Funktion die "einfach" den Mittelwert über identische Readings verschiedener Geräte berechnet und evtl. sogar noch den höchsten und niedrigsten Wert als Ausreißer nicht berücksichtigt.

Gibt es so etwas in FHEM?


Raspberry Pi 3
CUL433: V 1.26.05 a-culfw Build: 311 (2018-12-09_19-12-53) CUL433 (F-Band: 433MHz)
freq:433.920MHz bWidth:325KHz rAmpl:42dB sens:4dB
Debmatic mit RPI-RF-MOD

Christoph Morrison

Zitat von: teufelchen am 10 Mai 2021, 13:56:50
Gibt es so etwas in FHEM?

Ich habe hier die gleiche Situation wie du und mache das mit DOIF und dem Medianwert: https://forum.fhem.de/index.php/topic,95759.100.html

TomLee

Zitatda ich keine eigene Wetterstation betreibe lese ich verschiedene Wetterstationen bei mir im Umkreis aus.

Ich kann einen Beitrag von letzter/vorletzter Woche (ich schau mal ob ich den wieder finde) auch falsch verstanden haben, aber wenn man ein     
netatmo-Device so:
defmod Wetterstationen netatmo PUBLIC xx.xxxx,x.xxxx 0.08
mit PUBLIC definiert (so mit 0.08 steht auch ein Bsp. in der cref, kA. was dieser Parameter bewirkt), dann hab ich es so verstanden das die Werte der Readings der Mittelwert der ausgelesenen Stationen sein sollen.

Nach dem ersten Blick in die cref, wie man das ganze noch weiter beinflussen kann hab nichts weiter dazu gefunden habe und mich nicht weiter mit beschäftigt.

Ich verstehe es bisher so, das bei mir gerade 90 Stationen ausgelesen werden, diese(r) Wert(e) wird/werden in den Iternals ausgegeben daher hier ein jsonlist2:
{
  "Arg":"Wetterstationen",
  "Results": [
  {
    "Name":"Wetterstationen",
    "PossibleSets":"",
    "PossibleAttrs":"alias comment:textField-long eventMap:textField-long group room suppressReading userattr userReadings:textField-long verbose:0,1,2,3,4,5  IODev disable:0,1 interval videoquality:poor,low,medium,high ignored_device_ids setpoint_duration webhookURL webhookPoll:0,1 addresslimit webhookURL webhookPoll:0,1 graphReadings:0,1 locale:en-US,en-GB,de-DE,es-ES,fr-FR,it-IT,nl-NL,ru-RU,ja-JP,zh-CN,zh-TW setpoint_duration event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading ASC:0,1,2 alexaName alexaProactiveEvents:1,0 alexaRoom cmdIcon devStateIcon:textField-long devStateStyle fhem_widget_channels fhem_widget_command fhem_widget_command_2 fhem_widget_command_3 genericDeviceType:security,ignore,switch,outlet,light,blind,thermometer,thermostat,contact,garage,window,lock,scene homebridgeMapping:textField-long icon siriName sortby webCmd webCmdLabel:textField-long widgetOverride",
    "Internals": {
      "DEF": "PUBLIC xx.xxxx,x.xxxx 0.08",
      "FUUID": "60926bd4-f33f-78f5-afa1-43612ce610413a7a",
      "IODev": "na_netatmo",
      "LAST_POLL": "2021-05-10 14:46:27",
      "Lat": "xx.xxxx",
      "Lon": "x.xxxx",
      "NAME": "Wetterstationen",
      "NOTIFYDEV": "global",
      "NR": "394",
      "NTFY_ORDER": "50-Wetterstationen",
      "Rad": "0.08",
      "STATE": "???",
      "SUBTYPE": "PUBLIC",
      "TYPE": "netatmo",
      "altitude": "97.34",
      "location": "xx.xxxx,x.xxxx",
      "model": "WEATHERMAP",
      "openRequests": "0",
      "stations_indoor": "90",
      "stations_outdoor": "90",
      "stations_rain": "46",
      "stations_wind": "24",
      "status": "ok"
    },
    "Readings": {
      "IODev": { "Value":"na_netatmo", "Time":"2021-05-08 20:45:16" },
      "active": { "Value":"ok", "Time":"2021-05-10 14:51:36" },
      "gust": { "Value":"9.3", "Time":"2021-05-10 14:46:27" },
      "gust_angle": { "Value":"19", "Time":"2021-05-10 14:46:27" },
      "gust_max": { "Value":"21", "Time":"2021-05-10 14:46:27" },
      "gust_min": { "Value":"4", "Time":"2021-05-10 14:46:27" },
      "humidity": { "Value":"60.53", "Time":"2021-05-10 14:45:49" },
      "humidity_max": { "Value":"66", "Time":"2021-05-10 14:45:49" },
      "humidity_min": { "Value":"53", "Time":"2021-05-10 14:45:49" },
      "pressure": { "Value":"1011.09", "Time":"2021-05-10 14:46:17" },
      "pressure_max": { "Value":"1016.1", "Time":"2021-05-10 14:46:17" },
      "pressure_min": { "Value":"1006.4", "Time":"2021-05-10 14:46:17" },
      "rain": { "Value":"0.00", "Time":"2021-05-10 14:46:22" },
      "rain_day": { "Value":"0.00", "Time":"2021-05-10 14:46:22" },
      "rain_day_max": { "Value":"0.101", "Time":"2021-05-10 14:46:22" },
      "rain_day_min": { "Value":"0", "Time":"2021-05-10 14:46:22" },
      "rain_hour": { "Value":"0.00", "Time":"2021-05-10 14:46:22" },
      "rain_hour_max": { "Value":"0.101", "Time":"2021-05-10 14:46:22" },
      "rain_hour_min": { "Value":"0", "Time":"2021-05-10 14:46:22" },
      "rain_max": { "Value":"0", "Time":"2021-05-10 14:46:22" },
      "rain_min": { "Value":"0", "Time":"2021-05-10 14:46:22" },
      "temperature": { "Value":"19.45", "Time":"2021-05-10 14:45:49" },
      "temperature_max": { "Value":"20.8", "Time":"2021-05-10 14:45:49" },
      "temperature_min": { "Value":"18.4", "Time":"2021-05-10 14:45:49" },
      "wind": { "Value":"3.7", "Time":"2021-05-10 14:46:27" },
      "wind_angle": { "Value":"42", "Time":"2021-05-10 14:46:27" },
      "wind_max": { "Value":"14", "Time":"2021-05-10 14:46:27" },
      "wind_min": { "Value":"1", "Time":"2021-05-10 14:46:27" }
    },
    "Attributes": {
      "IODev": "na_netatmo",
      "devStateIcon": ".*:no-icon",
      "room": "netatmo",
      "verbose": "2"
    }
  }  ],
  "totalResultsReturned":1
}


Wie gesagt, kann mich auch täuschen, den Beitrag falsch verstanden haben und auf dem Holzweg sein.

Gruß

Thomas

Shadow3561

Moin,

evtl. kannst du das VALVES-Modul benutzen.

https://wiki.fhem.de/wiki/VALVES

musst mal schauen ob es mit den Readings anpassen klappt.

Mit freundlichen Grüßen

Gisbert

#4
Hallo teufelchen,

ich hab was ähnliches in einer sub gemacht, um den höchsten Wert aus verschiedenen Devices zu ermitteln, aber nur unter der Voraussetzung, dass die Readings aktuell sind. Für Mittelwerte muss man das umbauen, sollte aber machbar sein.

sub:
sub max_rain() {
    my $maxrain=0;
    my $maxdev="";
    foreach my $device (qw(
Buienradar
VisualCrossingLeverkusen
netatmo_D70_ee_50_00_ea_7e
netatmo_D70_ee_50_16_12_08
netatmo_D70_ee_50_20_80_d8
netatmo_D70_ee_50_00_7b_52
netatmo_D70_ee_50_2c_ff_5c
netatmo_D70_ee_50_15_e4_02
netatmo_D70_ee_50_5e_e4_36
netatmo_D70_ee_50_1b_28_a6 )) {
        my $rain = ReadingsNum($device, "rain", 0);
        my $active = ReadingsVal($device, "active", 0);
        my $age = ReadingsAge($device, "rain", 0);
        if($active eq "ok" and $age <= 900 and $rain >= $maxrain) {
        $maxrain=$rain;
            $maxdev=$device;
            }
        }
    return $maxrain;
}


Die sub wird wie folgt in einem Userreadings aufgerufen:
attr DEVICE userReadings maxrain {round(max_rain(),1)}

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

teufelchen

Zitat von: Christoph Morrison am 10 Mai 2021, 14:15:01
Ich habe hier die gleiche Situation wie du und mache das mit DOIF und dem Medianwert: https://forum.fhem.de/index.php/topic,95759.100.html

Danke für den Hinweis. Ich wäre nicht auf die Idee gekommen, dass DoIf so etwas kann.

Ich schaffe es mir über die Geräte den Median und auch die Anzahl der Messwerte anzeigen zu lassen:

defmod di_median DOIF ##
attr di_median state [#median:"^Wetter_Wunderground_":"Temperature"]

defmod di_Anzahl DOIF ##
attr di_Anzahl state [# "^Wetter_Wunderground_":"Temperature"]


Kann dies auch in einem DoIf zusammengefasst werden?
Wenn ich ein anders Attribut statt state verwende bekomme ich eine Fehlermeldung.
defmod di_median DOIF ##
attr di_median TempMedian:[#median:"^Wetter_Wunderground_":"Temperature"]

Raspberry Pi 3
CUL433: V 1.26.05 a-culfw Build: 311 (2018-12-09_19-12-53) CUL433 (F-Band: 433MHz)
freq:433.920MHz bWidth:325KHz rAmpl:42dB sens:4dB
Debmatic mit RPI-RF-MOD

Damian

Zitat von: teufelchen am 11 Mai 2021, 15:39:58
Danke für den Hinweis. Ich wäre nicht auf die Idee gekommen, dass DoIf so etwas kann.

Ich schaffe es mir über die Geräte den Median und auch die Anzahl der Messwerte anzeigen zu lassen:

defmod di_median DOIF ##
attr di_median state [#median:"^Wetter_Wunderground_":"Temperature"]

defmod di_Anzahl DOIF ##
attr di_Anzahl state [# "^Wetter_Wunderground_":"Temperature"]


Kann dies auch in einem DoIf zusammengefasst werden?
Wenn ich ein anders Attribut statt state verwende bekomme ich eine Fehlermeldung.
defmod di_median DOIF ##
attr di_median TempMedian:[#median:"^Wetter_Wunderground_":"Temperature"]


Du kannst DOIF_Readings oder event_Readings mit Events im DOIF zu diesem Zweck nutzen.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

teufelchen

Zitat von: Damian am 11 Mai 2021, 15:54:44
Du kannst DOIF_Readings oder event_Readings mit Events im DOIF zu diesem Zweck nutzen.

Danke das war was ich gesucht habe.
Raspberry Pi 3
CUL433: V 1.26.05 a-culfw Build: 311 (2018-12-09_19-12-53) CUL433 (F-Band: 433MHz)
freq:433.920MHz bWidth:325KHz rAmpl:42dB sens:4dB
Debmatic mit RPI-RF-MOD