Windrichtung richtig mitteln (und visualisieren)?

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • soko
    Extension Master
    • 07.09.2015
    • 124

    #1

    Windrichtung richtig mitteln (und visualisieren)?

    Hallo Leute,

    Ich hab mir für Modbus einen Windrichtungs (-und -speed) Sensor zugelegt.

    Vom Windrichtungssensor hole ich mir alle 5 Sekunden die Richtung. Diese wird als Integer von 0-359 geliefert (0=Norden, 180=Süden, ...).
    Jetzt hab ich - um auch die Historie der Richtung zu sehen - einfach die Statistik aktiviert und lass mir das Mittel über 10 Minuten aufzeichnen.

    Bin aber jetzt auf 2 Probleme draufgekommen.

    1. Problem: Falsche Mittelung
    Wenn sich der Wind um Norden herumdreht wird falsch gemittelt!
    Einfaches Beispiel: Arithmetisches Mittel von 2 Messwerten:
    Messwert 1: 355°
    Messwert 2: 5°
    Mittelwert: 180° => SÜDEN
    Richtig: 0° => NORDEN

    Das Problem tritt natülich jedesmal auf sobald ein Messwert näher zu Norden als zu Süden ist!
    Hat Loxone hier was passendes?
    Wenn nicht - wovon ich ausgehe - wie kann ich das selbst richtig mitteln mit den Loxone-Bausteinen?
    Hab hier schon länger überlegt aber komme zu keinem grünen Zweig


    2. Problem: Graphische Anzeige
    Diese Windrichtung in Grad wird mir wie Temperatur in einem Graphen angezeigt. Was natürlich blöd aussieht wenn der Wind wieder ca. aus Norden kommt. Denn dann kann ich manchmal einen Wert von 2° haben und dann wieder 357°.
    Beide Werte sind graphisch weit voneinander weg, aber in im richtigen Leben nah beinander.
    Hat Loxone hier irgendwas um sowas graphisch im historischen Verlauf schön & nett darzustellen?
    Meine Hoffnung ist hier aber sehr gering

    Danke
    Soko
  • romildo
    Lebende Foren Legende
    • 25.08.2015
    • 5177

    #2
    Wenn Du den Wetterservice von Loxone abonierst, wird die Windrichtung auch angezeigt.

    Wenn Du das nicht möchtest, könntest Du einen Statusbaustein dafür verwenden.
    LG Romildo

    Kommentar

    • BSiege
      LoxBus Spammer
      • 04.10.2015
      • 251

      #3
      Die Formel dazu: https://en.wikipedia.org/wiki/Yamartino_method .
      Habe eine Arduino implementation mit dieser Library geschafft: https://github.com/SAIC-ATS/Algorithms
      Das sollte in PicoC auch möglich sein. Weitere Alternativen: Das Ganze durch eine gute Wettersoftware erledigen lassen, z.B. http://www.weewx.com/ die locker auf einen Loxberry passt. Oder Meteohub. Die liefern die Daten dann auch als Text...

      Kommentar

      • soko
        Extension Master
        • 07.09.2015
        • 124

        #4
        Perfekt Jungs,

        Ich hab mal den Statusbaustein bemüht und auf 16 Kreissegmente eingeschränkt. Somit bekommt meine History-Aufzeichnung nur mehr 0 22,5 45 ... grad zu Gesicht.
        Ist zwar besser aber löst das Problem noch nicht ganz: Wenn der Wind zwischen 337,5° und 0° herumspringt ist das Mittel trotzdem falsch.

        BSiege : Sowas hab ich gesucht, perfekt! Muss mich damit aber mal beschäftigen wenn ich mehr Zeit hab. Zuerst mit der Formel und dann mit dem umsetzen in PicoC

        Kommentar

        • Jan W.
          Lox Guru
          • 30.08.2015
          • 1546

          #5
          Die Formel von Yamartino ist gar nicht so kompliziert, wie sie auf den 1. Blick aussieht, wenn nur die Richtung benötigt wird: lediglich der SIN und COS der Werte muss berechnet und die Durchschnitte gebildet werden. Aus diesen beiden Durchschnitten berechnet atan2 die Windrichtung. Pico C kann zwar kein atan2, aber die Funktion lässt sich leicht mit atan anhand der Bedingungen für x und y herleiten: https://de.wikipedia.org/wiki/Arctan2 (Abschnitt Formel). Ich hatte mal ein Pico C Skript geschrieben, um eine gleitende durchschnittliche maximale Windgeschwindigkeit zu berechnen, weil mir der Baustein von Loxone zu träge war.

          Vielleicht kannst Du das Skript als "Grundlage" nehmen, siehe https://www.loxforum.com/forum/germa...eigen#post1087. Die Formel von Yamartino lässt sich CPU-schonend implementieren, indem die Werte für sin und cos in einem Array zwischengespeichert werden und der jeweils älteste Wert von der laufenden Summe abgezogen und der Neue addiert wird.

          Ich habe gerade mal die Formel mit Excel nachgebaut, siehe Anhang.

          Gruß Jan
          Angehängte Dateien
          Zuletzt geändert von Jan W.; 13.10.2017, 12:54.
          Miniserver v14.5.12.7, 2x Ext., 2x Relay Ext., 2x Dimmer Ext., DMX Ext., 1-Wire Ext., Gira KNX Tastsensor 3 Komfort, Gira KNX Präsenzmelder, Fenster- und Türkontakte, Loxone Regen- und Windsensor, Gira Dual Q Rauchmelder vernetzt, 1x Relais-Modul
          Loxberry: SmartMeter, MS Backup, CamConnect, Weather4Lox
          Lüftung: Helios KWL EC 370W ET mit Modbus TCP - via Pico-C
          Heizung: Stiebel Eltron WPF 5 cool (Sole-Wasser WP) mit ISG, FB-Heizung mit 18 Kreisen, Erdsonde - via modbus/TCP
          Node-RED: IKEA Tradfri

          Kommentar

          • soko
            Extension Master
            • 07.09.2015
            • 124

            #6
            Servus Jan,

            Ja hab ich schon gesehn. Was Yamartino da macht ist eigentlich recht simpel UND CLEVER:
            Den Durchschnitt von X/cos und Y/sin berechnen und dann wieder mittels atan2 den Zeiger/Grad der Resultierenden der beiden Durchschnittswerte rechnen.
            Danke, ich seh mir auf alle Fälle dein Script mal an!

            thx
            Soko

            PS: Bleibt also nur mehr Problem2 meines Eröffnungsposts übrig. Aber da hab ich wenig Hoffnung das irgendwie schön historisch darstellen zu können

            Kommentar

            • soko
              Extension Master
              • 07.09.2015
              • 124

              #7
              Also bin ich schon ganz "DEPPAT" oder einfach nur blind:
              Wo find ich den das Log-Fenster im Loxone-Config wo bei PicoC-Programmen das printf() hingeht????

              Kommentar

              • Christian Fenzl
                Lebende Foren Legende
                • 31.08.2015
                • 11250

                #8
                Schon gestern (bevor Yamarto gefallen ist) hab ich mit Winkelfunktionen herumprobiert - das ist echt sehr spannend!

                Ich werfe mal ein paar Formeln ins Feld. Was noch fehlt ist ein Status-Baustein, der entsprechend cos und sin jeweils größer oder kleiner 0 bei beim ARCTAN-Ergebnis eine Konstante addiert (damit es ein echter ATAN2 wird).

                Die Winkelfunktionen von Loxone (und auch Excel) sind im Bogenmaß - das ist sehr verwirrend, wenn man sonst die ganze Zeit mit Grad arbeitet.
                Angehängte Dateien
                Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                Kommentar


                • soko
                  soko kommentierte
                  Kommentar bearbeiten
                  Ja, ich bin auch grad dabei was in PicoC zu schreiben. Leider kann ich dein Loxone-File nicht öffnen. Hab Config v7
                  Magst ev. einen screenshot posten...

                • Christian Fenzl
                  Christian Fenzl kommentierte
                  Kommentar bearbeiten
                  Das ist V7. Bin nicht mehr am Rechner...
              • Christian Fenzl
                Lebende Foren Legende
                • 31.08.2015
                • 11250

                #9
                Das ist jetzt mit Statusbaustein.
                Man müsste dann nur noch nach SIN und COS einen gleitenden Mittelwert einfügen, dann kommt schon mal in etwa die durchschnittliche Windgeschwindigkeit heraus.
                Das ist aber noch nicht Yamarto, das ist noch etwas komplexer.


                Angehängte Dateien
                Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                Kommentar

                • Christian Fenzl
                  Lebende Foren Legende
                  • 31.08.2015
                  • 11250

                  #10
                  Hier noch die V3 gleich mit dem gleitenden Mittelwert.

                  Ich hab dabei erst bemerkt, dass nicht der Wind-Mittelwert (wie in Jan W. Excel und meinem Programm) die Yamartino-Methode ist.

                  Die Yamartino-Methode ist eigentlich die Berechnung der Standardabweichung der einlaufenden Windrichtungen. Die habe ich in der Datei nun auch noch dazu genommen, ist aber eigentlich für den Heimgebrauch nicht sehr aussagekräftig (man würde damit erkennen, wenn sich der Wind stark dreht).
                  Angehängte Dateien
                  Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                  Kommentar

                  • soko
                    Extension Master
                    • 07.09.2015
                    • 124

                    #11
                    OK Leute,
                    Ich hab meine simple Version fertig und sie funktioniert soweit OK.
                    Falls jemand einen Fehler/Unschönheit entdeckt bitte melden

                    Code:
                    // An Input0 (AI) muss die aktuelle Windrichtung von 0-359 (Genauigkeit wird nur als integer genommen) Grad anliegen
                    // Raus kommt (AQ) die gemittelte Windrichtung ebenfalls von 0-359.999999 Grad.
                    // Disable/enable debug mode (writes log messages)
                    #define DEBUG_MODE 0
                    // 10 minutes
                    #define AVG_PERIOD 600
                    //  5 seconds
                    #define POLL_INTERVAL 5
                    #define PI 3.14159265359
                    
                    //VARIABLES
                    int maxValuesCount;
                    int valuesCount;
                    int value;
                    int valuesSum;
                    float sinSum;
                    float cosSum;
                    float sinAvg;
                    float cosAvg;
                    float valueAvg;
                    float wda; // Wind-Direction-Average von 0 bis 359
                    
                    //PROGRAMM
                    maxValuesCount = AVG_PERIOD / POLL_INTERVAL;
                    valuesCount = 0;
                    valuesSum = 0;
                    sinSum = 0;
                    cosSum = 0;
                    
                    if (DEBUG_MODE) printf("Wind-Direction-Average (WDA) started with Period=%d[s] and PollInterval=%d[s]", AVG_PERIOD, POLL_INTERVAL);
                    
                    // Damit beim Start auch was da steht Input => Output kopieren
                    setoutput(0,getinput(0));
                    
                    while (TRUE)
                    {
                        // Aktuelle Windrichtung ganzzahlig lesen
                        value = (int)getinput(0);
                        valuesSum += value;
                        sinSum += sin(((float)value) * PI / 180);
                        cosSum += cos(((float)value) * PI / 180);
                        valuesCount ++;
                    
                        if (DEBUG_MODE) printf("WDA: value=%d valuesSum=%d sinSum=%f cosSum=%f valuesCount=%d", value, valuesSum, sinSum, cosSum, valuesCount);
                    
                        if (valuesCount >= maxValuesCount) {
                    
                            valueAvg = (float)valuesSum / (float)valuesCount;
                            sinAvg = sinSum / (float)valuesCount;
                            cosAvg = cosSum / (float)valuesCount;
                    
                            // Jetzt den atan2 "händsich" bestimmen
                    
                            // Wenn ich keinen X-Anteil habe, dann liefert der atan ERROR!
                            // Es kann aber nur 90 oder -90 dann sein!
                            if (cosAvg == 0.0) {
                                if (sinAvg >= 0.0) {
                                    wda = PI / 2;
                                } else {
                                    wda = - PI / 2;
                                }
                            } else {
                                // atan(y/x) funktioniert!            
                                wda = atan(sinAvg/cosAvg);
                    
                                if (sinAvg < 0.0 && cosAvg < 0.0) {
                                    // Quadrant 3
                                    wda -= PI;
                                } else if (sinAvg >= 0.0 && cosAvg < 0.0) {
                                    // Quadrant 2
                                    wda += PI;
                                }
                            }
                    
                            // Keine negativen Werte
                            if (wda < 0.0)
                                wda += 2 * PI;
                    
                            // In Grad zurückrechnen
                            wda = wda * 180 / PI;
                            if (DEBUG_MODE) printf("WDA: valueAvg=%f wda=%f (sinAvg=%f cosAvg=%f)", valueAvg, wda, sinAvg, cosAvg);
                            setoutput(0,wda);
                    
                            // Letzten Wert gleich als 1. für die neue Reihe nehmen
                            valuesSum = value;
                            sinSum = sin(value * PI / 180);
                            cosSum = cos(value * PI / 180);
                            valuesCount = 1;
                            if (DEBUG_MODE) printf("WDA: value=%d valuesSum=%d sinSum=%f cosSum=%f valuesCount=%d", value, valuesSum, sinSum, cosSum, valuesCount);
                        }
                    
                        sleeps(POLL_INTERVAL);
                    }

                    Kommentar

                    • Pierre
                      Smart Home'r
                      • 14.11.2018
                      • 72

                      #12
                      Zitat von soko
                      OK Leute,
                      Ich hab meine simple Version fertig und sie funktioniert soweit OK.
                      Falls jemand einen Fehler/Unschönheit entdeckt bitte melden
                      Bei mir funktioniert es leider nicht, bekomme am AQ die gleichen Werte wie beim AI.
                      AI bekommt die Daten via Loxberry Weather4Loxone die ich via Http abrufe.
                      Somit kommt z. B. die Windrichtung 237 rein und wieder raus.

                      Hab es jetzt mit einem Status-Baustein einfacher und simpler gestaltet.
                      Da wir uns für Rollos und gegen Raffstores entschieden haben langt dies mir auch vollkommend.

                      Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Wetterstatus.jpg
Ansichten: 1804
Größe: 171,3 KB
ID: 292012
                      Falls ich mal zu viel Zeit haben sollte werde ich es auch noch auf NNO usw. erweitern.

                      Kommentar

                      • LoxMunich
                        Extension Master
                        • 29.12.2016
                        • 177

                        #13
                        Hallo,

                        ich habe bei mir leider das Problem, dass die Mittelwertberechnung einen seltsamen Wert ausgibt, obwohl ich meine, alles korrekt aus obigem Beispiel übernommen zu haben. Sieht jemand den Fehler und kann mir weiter helfen?

                        Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Mittelwetberechnung.png
Ansichten: 1076
Größe: 53,2 KB
ID: 364366

                        Kommentar

                        Lädt...