Mittelwertbildung für die Windrichtung

Begonnen von SabineT, 09 August 2017, 19:31:19

Vorheriges Thema - Nächstes Thema

CoolTux

Solche Fehler könnte man vermeiden wenn man die zum auslesen von Readings bestimmten FHEM Funktionen verwendet. Generell empfiehlt es sich nicht unnötig Hash's aus zu lesen oder für Bedingungen zu verwenden. Dafür dann lieber die FHEM Funktionen.
Ein weiterer Grund auf Hash Abfragen zu verzichten ist, das bei der Abfrage von verschachtelten Hash's auch Hash's unnötiger Weise angelegt werden.
if(hash->{READINGS}{$wdr}{VAL})
Sollte aus einem Grund {$wdr} nicht existieren wird es bei der Abfrage von {VAL} angelegt.

Sabine vielleicht schaust Du einmal das Du Deine wirklich gute Sub entsprechend um baust.
ReadingsVal währe hier angebracht. Eventuell kannst Du dann ganz auf den Wert von $hash verzichten. Habe mir aber nicht alles angeschaut. $name sollte dann reichen.



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

pink99panther

#16
@pejonp
nicht Average sondern Direction brauchst du im userreading.

userReadings windDirAverage {myWindDirAverage('WetterstnNdn','Gust','Direction',1200,0.75,1.8); }

Bei mir läuft das mit MQTT fehlerfrei.

EDIT:

der Vollständigkeit halber häng ich noch ein list vom Device an

Internals:
   IODev      MyBroker
   NAME       WetterstnNdn
   NR         127
   STATE      incoming publish received
   TYPE       MQTT_DEVICE
   Helper:
     DBLOG:
       Average:
         logdb:
           TIME       1506319798.01265
           VALUE      0.0
       Battery:
         logdb:
           TIME       1506319802.10818
           VALUE      0
       Direction:
         logdb:
           TIME       1506319797.94068
           VALUE      135.0
       Distance_in_km:
         logdb:
           TIME       1506319801.20898
           VALUE      40
       Gust:
         logdb:
           TIME       1506319798.08269
           VALUE      0.0
       Humidity:
         logdb:
           TIME       1506319796.98924
           VALUE      27
       Rainfall:
         logdb:
           TIME       1506319799.05028
           VALUE      0.0
       Strike_counter:
         logdb:
           TIME       1506319801.0653
           VALUE      1126
       Strikes_past_5_minutes:
         logdb:
           TIME       1506319801.13818
           VALUE      0
       Temperature:
         logdb:
           TIME       1506319796.90516
           VALUE      11.0
       Total:
         logdb:
           TIME       1506319798.97798
           VALUE      770.0
       UV:
         logdb:
           TIME       1506319800.04946
           VALUE      0.0
       transmission-state:
         logdb:
           TIME       1506319802.07354
           VALUE      incoming publish received
       windDirAverage:
         logdb:
           TIME       1506020788.95284
           VALUE      180
   READINGS:
     2017-09-25 08:09:58   Average         0.0
     2017-09-25 08:10:02   Battery         0
     2017-09-25 08:09:57   Direction       135.0
     2017-09-25 08:10:01   Distance_in_km  40
     2017-09-25 08:09:58   Gust            0.0
     2017-09-25 08:09:56   Humidity        27
     2017-09-25 08:09:59   Rainfall        0.0
     2017-09-25 08:10:01   Strike_counter  1126
     2017-09-25 08:10:01   Strikes_past_5_minutes 0
     2017-09-25 08:09:56   Temperature     11.0
     2017-09-25 08:09:58   Total           770.0
     2017-09-25 08:10:00   UV              0.0
     2017-09-25 08:10:02   transmission-state incoming publish received
     2017-09-21 21:06:28   windDirAverage  180
   message_ids:
   sets:
   subscribe:
     /VentusNdn/Ventus/Average
     /VentusNdn/Ventus/Battery
     /VentusNdn/Ventus/Direction
     /VentusNdn/Ventus/Distance
     /VentusNdn/Ventus/Gust
     /VentusNdn/Ventus/Humidity
     /VentusNdn/Ventus/Rainpasthour
     /VentusNdn/Ventus/Strikecounter
     /VentusNdn/Ventus/Strikespast5
     /VentusNdn/Ventus/Temperature
     /VentusNdn/Ventus/Totalrain
     /VentusNdn/Ventus/UV
   subscribeExpr:
     ^\/VentusNdn\/Ventus\/Average$
     ^\/VentusNdn\/Ventus\/Battery$
     ^\/VentusNdn\/Ventus\/Direction$
     ^\/VentusNdn\/Ventus\/Distance$
     ^\/VentusNdn\/Ventus\/Gust$
     ^\/VentusNdn\/Ventus\/Humidity$
     ^\/VentusNdn\/Ventus\/Rainpasthour$
     ^\/VentusNdn\/Ventus\/Strikecounter$
     ^\/VentusNdn\/Ventus\/Strikespast5$
     ^\/VentusNdn\/Ventus\/Temperature$
     ^\/VentusNdn\/Ventus\/Totalrain$
     ^\/VentusNdn\/Ventus\/UV$
   subscribeReadings:
     /VentusNdn/Ventus/Average:
       cmd
       name       Average
     /VentusNdn/Ventus/Battery:
       cmd
       name       Battery
     /VentusNdn/Ventus/Direction:
       cmd
       name       Direction
     /VentusNdn/Ventus/Distance:
       cmd
       name       Distance_in_km
     /VentusNdn/Ventus/Gust:
       cmd
       name       Gust
     /VentusNdn/Ventus/Humidity:
       cmd
       name       Humidity
     /VentusNdn/Ventus/Rainpasthour:
       cmd
       name       Rainfall
     /VentusNdn/Ventus/Strikecounter:
       cmd
       name       Strike_counter
     /VentusNdn/Ventus/Strikespast5:
       cmd
       name       Strikes_past_5_minutes
     /VentusNdn/Ventus/Temperature:
       cmd
       name       Temperature
     /VentusNdn/Ventus/Totalrain:
       cmd
       name       Total
     /VentusNdn/Ventus/UV:
       cmd
       name       UV
Attributes:
   DbLogInclude .*
   IODev      MyBroker
   room       Wetter
   stateFormat transmission-state
   subscribeReading_Average /VentusNdn/Ventus/Average
   subscribeReading_Battery /VentusNdn/Ventus/Battery
   subscribeReading_Direction /VentusNdn/Ventus/Direction
   subscribeReading_Distance_in_km /VentusNdn/Ventus/Distance
   subscribeReading_Gust /VentusNdn/Ventus/Gust
   subscribeReading_Humidity /VentusNdn/Ventus/Humidity
   subscribeReading_Rainfall /VentusNdn/Ventus/Rainpasthour
   subscribeReading_Strike_counter /VentusNdn/Ventus/Strikecounter
   subscribeReading_Strikes_past_5_minutes /VentusNdn/Ventus/Strikespast5
   subscribeReading_Temperature /VentusNdn/Ventus/Temperature
   subscribeReading_Total /VentusNdn/Ventus/Totalrain
   subscribeReading_UV /VentusNdn/Ventus/UV
   userReadings windDirAverage {myWindDirAverage('WetterstnNdn','Gust','Direction',1200,0.75,1.8); }

SabineT

Zitat von: CoolTux am 25 September 2017, 08:01:16
Solche Fehler könnte man vermeiden wenn man die zum auslesen von Readings bestimmten FHEM Funktionen verwendet. Generell empfiehlt es sich nicht unnötig Hash's aus zu lesen oder für Bedingungen zu verwenden. Dafür dann lieber die FHEM Funktionen.
Ein weiterer Grund auf Hash Abfragen zu verzichten ist, das bei der Abfrage von verschachtelten Hash's auch Hash's unnötiger Weise angelegt werden.
if(hash->{READINGS}{$wdr}{VAL})
Sollte aus einem Grund {$wdr} nicht existieren wird es bei der Abfrage von {VAL} angelegt.

Sabine vielleicht schaust Du einmal das Du Deine wirklich gute Sub entsprechend um baust.
ReadingsVal währe hier angebracht. Eventuell kannst Du dann ganz auf den Wert von $hash verzichten. Habe mir aber nicht alles angeschaut. $name sollte dann reichen.

Grüße
Ich hab für meine Sub ja das movingAverage (https://wiki.fhem.de/wiki/Gleitende_Mittelwerte_berechnen_und_loggen) vom Wiki als Basis genommen und nur für die speziellen Anforderungen für die Windrichtung ergänzt.

Ganz ohne $hash wird das aber vermutlich nicht gehen, da ja dort in {"history"} das Array mit den vorhergehenden Werten gespeichert wird. Ich bin jetzt nicht so firm mit dem Development für fhem, aber vielleicht gibt es ja eine bessere Möglichkeit, das Array beim jeweiligen Device zu speichern.

pejonp hat die Sub ja jetzt in 14_SD_WS09.pm integriert, da können dann ohnehin keine falschen Readingsnamen mehr angegeben werden.

lg, Sabine

CoolTux

Für hash->{history} kommst Du in der Tat nicht an $hash vorbei, das stimmt.
Vielleicht ergibt es sich aber das Du Dir

$hash->{READINGS}{$wsr}{VAL},deg2rad($hash->{READINGS}{$wdr}{VAL}),$hash->{READINGS}{$wdr}{TIME}

solche Sachen noch einmal an schaust und auf ReadingsVal um baust.
Ich schaue mir den Wiki Artikel einmal genauer an.



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

SabineT

Zitat von: CoolTux am 25 September 2017, 09:12:13
Für hash->{history} kommst Du in der Tat nicht an $hash vorbei, das stimmt.
Vielleicht ergibt es sich aber das Du Dir

$hash->{READINGS}{$wsr}{VAL},deg2rad($hash->{READINGS}{$wdr}{VAL}),$hash->{READINGS}{$wdr}{TIME}

solche Sachen noch einmal an schaust und auf ReadingsVal um baust.
Ich schaue mir den Wiki Artikel einmal genauer an.



Grüße
Ich hab jetzt
  my $hash = $defs{$name};
  my @new = my ($ws,$wd,$time) = ($hash->{READINGS}{$wsr}{VAL},deg2rad($hash->{READINGS}{$wdr}VAL}),$hash->{READINGS}{$wdr}{TIME});


durch
  my $ws = ReadingsVal($name, $wsr, undef);
  if (!defined $ws) {
    Log 0,"myWindDirAverage: Reading $name->$wsr unknown!";
    return undef;
  }
  my $wd = ReadingsVal($name, $wdr, undef);
  if (!defined $wd) {
    Log 0,"myWindDirAverage: Reading $name->$wdr unknown!";
    return undef;
  }
  my $time = ReadingsTimestamp($name, $wdr, undef);

  my $hash = $defs{$name};

ersetzt (ist im 1. Posting eingepflegt).
Falsche Angaben bei der Definition des userReadings werden damit abgefangen und im FHEM-Log angezeigt (hab ich getestet ;)).

@pejonp im 14_SD_WS09.pm ist diese Änderung nicht notwendig, dort hast du die Readings je fix vorgegeben.

lg

CoolTux

Hallo Sabine,

Ich habe den Wikieintrag entsprechend engepasst. Vielleicht magst ja mal drüber schauen.


Grüße
Leon
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

SabineT

Zitat von: CoolTux am 25 September 2017, 11:56:37
Hallo Sabine,

Ich habe den Wikieintrag entsprechend engepasst. Vielleicht magst ja mal drüber schauen.


Grüße
Leon
Im Prinzip macht meine letzte Änderung eh das gleiche. Ich hab nur zusätzlich noch eine Logausgabe eingebaut, falls nicht vorhandene Readings angegeben werden und beende dann auch gleich die sub mit "return undef".

SabineT

Zitat von: pejonp am 25 September 2017, 00:03:40
Hi SabineT,

habe die Readings 14_SD_WS09.pm angepaßt.

pejonp
Ein paar Sachen sind mir noch aufgefallen:

  • bei dir wird immer der vorhergehende Wert verwendet, und nicht der aktuelle. Grund dafür ist, dass du "my $average = SD_WS09_WindDirAverage($hash);" aufrufst, $hash da aber noch nicht mit den aktuellen Werten befüllt wurde.
    Sieht man, wenn man das Logging entsprechend aufdreht:
2017.09.25 12:18:35 4: SD_WS09_WindDirAverage_01 WH1080 :Speed=1.4 DirR=2.36 Time=2017-09-25 12:18:01

Meine sub im myUtils liefert da:
2017.09.25 12:18:35 3: [WH1080 myWDA1] call: Speed=1.4 Dir=1.57 Time=2017-09-25 12:18:35

In der Praxis wirkt sich das aber nicht sonderlich aus.

  • in "Log3 $hash,4, "[$name myWDA2] ARRAY CREATED";" gehört myWDA2 durch SD_WS09_WindDirAverage_02 ersetzt (ist aber nur eine kosmetische Sache).

Durch deinen Code bin ich übrigens drauf gekommen, dass ich bei mir deg2rad vergessen hatte, ist jetzt im 1. Posting mit berücksichtigt.

lg, Sabine

SabineT

Zitat von: pejonp am 25 September 2017, 00:03:40
Hi SabineT,

habe die Readings 14_SD_WS09.pm angepaßt.

pejonp
Hallo pejonp!

Ich hab jetzt mal die sub SD_WS09_WindDirAverage so umgeschrieben, dass gleich die aktuellen Werte genommen werden. Hab sie hier dran gehängt. Die 1. Zeile wäre der dazugehörige Aufruf.

Beim Plot sieht man, dass die Werte von meiner sub in myUtils (blau) und die aus der SD_WS09 (rot) nachmittags dann praktisch gleich sind (Vormittag ist noch deine Version zu sehen).

lg, Sabine

pejonp

@pink99panther

Der Fehler bei mir war das noch keine Daten geloggt wurden. Als ich diese dann in die DBlog geschrieben habe, hat es auch funktioniert.


Zitat von: SabineT am 25 September 2017, 18:12:59
...
Ich hab jetzt mal die sub SD_WS09_WindDirAverage so umgeschrieben, dass gleich die aktuellen Werte genommen werden. ...

Hallo Sabine,

habe versuchte alle deine Änderungen einzuarbeiten. Vielen Dank für deine Hilfe. Bei der Werteübergabe in die sub hat es bei mir gehakt.
windDirAverage --> windDirectionAverage geändert. So wird er richtiger einsortiert. Neue Datei zum testen hänge ich an.


Was jetzt noch fehlt, wäre das automatische anlegen der Diagramme. gplot siehe Anhang.

in der Datei steht ja:

      $hash->{AutoCreate} =
            { "SD_WS09.*" => { ATTR => "event-min-interval:.*:300 event-on-change-reading:.* windKorrektur:.*:0 " , FILTER => "%NAME",

GPLOT => "wind4windDir4:wind/Dir,",  autocreateThreshold => "2:180"} };

Ich bin jetzt aber noch nicht dahinter gestiegen wie der Aufruf ist. Vielleicht gibt es ja einen Wissenden.

1.Versuch der nicht geht: GPLOT => "WH1080wind4:windSpeed/windGust

Jörg
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

SabineT

Zitat von: pejonp am 25 September 2017, 22:13:58
Hallo Sabine,

habe versuchte alle deine Änderungen einzuarbeiten. Vielen Dank für deine Hilfe. Bei der Werteübergabe in die sub hat es bei mir gehakt.
windDirAverage --> windDirectionAverage geändert. So wird er richtiger einsortiert. Neue Datei zum testen hänge ich an.


Was jetzt noch fehlt, wäre das automatische anlegen der Diagramme. gplot siehe Anhang.

in der Datei steht ja:

      $hash->{AutoCreate} =
            { "SD_WS09.*" => { ATTR => "event-min-interval:.*:300 event-on-change-reading:.* windKorrektur:.*:0 " , FILTER => "%NAME",

GPLOT => "wind4windDir4:wind/Dir,",  autocreateThreshold => "2:180"} };

Ich bin jetzt aber noch nicht dahinter gestiegen wie der Aufruf ist. Vielleicht gibt es ja einen Wissenden.

1.Versuch der nicht geht: GPLOT => "WH1080wind4:windSpeed/windGust

Jörg
Hallo Jörg,

ich hab jetzt dein 14_SD_WS09.pm bei mir installiert (und auch im DBlog das Reading von windDirAverage auf windDirectionAverage geändert).

Zum automatischen Anlegen der Plots kann ich leider nichts sagen, ich hab meine .gplot Dateien selber erstellt (ich verwende auch gnuplot statt SVG...). Ich würde aber Windgeschwindigkeit und Windrichtung in getrennten Diagrammen darstellen, sonst wird das schnell unübersichtlich. Und windDirectionDegree würde ich ganz weg lassen, das streut speziell bei schwachem Wind viel zu stark (sieht man in meinem Beispiel beim 1. Posting).

lg, Sabine

pejonp

Hi Sabine,

habe die 14_SD_WS09.pm angepaßt und auch eingecheckt.

Mach mal bitte ein Update: update all https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt

Jörg
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

SabineT

Hi Jörg!

Update durchgeführt. Die Datei hat sich aber gegenüber der bei mir seit 26.9. laufenden Version nicht mehr geändert, daher sollte alles passen.
Danke, dass du meine Vorschläge übernommen hast.

Liebe Grüße,
Sabine