Hallo
Ich beschäftige mich derzeit mit ner Wetterstation und da kommt natürlich das Thema Windrichtung und Häufigkeit zum Zug....
Da ich noch neu bin im fhem mal die Frage ob es mittels sag möglich ist ein netzdiagramm zu erstellen, das mir die Häufigkeit und Richtungen des Windes wiedergibt?
Danke
Hallo Michl1003,
meinst Du etwa so etwas:
http://de.wikipedia.org/wiki/Windrose_(Meteorologie)#mediaviewer/File:Wind_rose_plot.jpg (http://de.wikipedia.org/wiki/Windrose_(Meteorologie)#mediaviewer/File:Wind_rose_plot.jpg)
Ich bin hier gerade am basteln. Die Daten für den Plot lasse ich per SQL-Statements (benutze DbLog) aus meinen Logdaten generieren. Daraus erzeuge ich ich dann mittels gnuplot den entsprechenden Chart. Das ganze soll - wenn es fertig ist - dann per Cron-Job regelmäßig erzeugt werden.
Wenn ich eine vorzeigbare Methode habe, kann ich das hier gerne mal vorstellen.
Viele Grüße
Christoph
Wow genau sowas hab ich mir vorgestellt, wenn man das dann auch irgendwie ins fhem bekommt... Halt mic da bitte am laufenden, wäre supercool von dir danke!
Lg Michl
Ps meine Fähigkeiten im programmieren sind sehr begrenzt aber voll. Kann ich dir wo helfen?!?
hallo
ich bin jetzt einen Schritt weiter... ich habe mir einen windrichtungsanzeiger mittels AS5040 (magnetic hall sensor) gebastelt.. funktioniert super... soweit...
jetzt muss ich das teil nur mehr einbinden...
hier mal der arduino code (habs mit MYSENSORS gebastelt).
#include <SPI.h>
#include <MySensor.h>
const int ledPin = 13; //LED connected to digital pin 13
const int clockPin = 5; //output to clock
const int CSnPin = 4; //output to chip select
const int inputPin = 6; //read AS5040
int inputstream = 0; //one bit read from pin
long packeddata = 0; //two bytes concatenated from inputstream
long angle = 0; //holds processed angle value
long anglemask = 65472; //0x1111111111000000: mask to obtain first 10 digits with position info
long statusmask = 63; //0x000000000111111; mask to obtain last 6 digits containing status info
long statusbits; //holds status/error information
int DECn; //bit holding decreasing magnet field error data
int INCn; //bit holding increasing magnet field error data
int OCF; //bit holding startup-valid bit
int COF; //bit holding cordic DSP processing error data
int LIN; //bit holding magnet field displacement error data
int debug = 0; //SET THIS TO 0 TO DISABLE PRINTING OF ERROR CODES
int shortdelay = 1000; // this is the microseconds of delay in the data clock
int longdelay =1000; // this is the milliseconds between readings
#define CHILD_ID_DIR 0
//#define INTERRUPT inputPin
MySensor gw;
MyMessage msgDIR(CHILD_ID_DIR, V_DIRECTION);
void setup()
{
gw.begin(NULL, AUTO, true, AUTO);
Serial.begin(250000);
pinMode(ledPin, OUTPUT); // visual signal of I/O to chip
pinMode(clockPin, OUTPUT); // SCK
pinMode(CSnPin, OUTPUT); // CSn -- has to toggle high and low to signal chip to start data transfer
pinMode(inputPin, INPUT); // SDA
// Send the Sketch Version Information to the Gateway
gw.sendSketchInfo("Winddirection", "1.0");
// Register all sensors to gw (they will be created as child devices)
gw.present(CHILD_ID_DIR, S_WIND);
}
void loop()
{
// CSn needs to cycle from high to low to initiate transfer. Then clock cycles. As it goes high
// again, data will appear on sda
digitalWrite(CSnPin, HIGH); // CSn high
digitalWrite(clockPin, HIGH); // CLK high
delay(longdelay);// time between readings
digitalWrite(ledPin, HIGH); // signal start of transfer with LED
digitalWrite(CSnPin, LOW); // CSn low: start of transfer
delayMicroseconds(shortdelay); // delay for chip initialization
digitalWrite(clockPin, LOW); // CLK goes low: start clocking
delayMicroseconds(shortdelay); // hold low
for (int x=0; x <16; x++) // clock signal, 16 transitions, output to clock pin
{
digitalWrite(clockPin, HIGH); //clock goes high
delayMicroseconds(shortdelay); //
inputstream =digitalRead(inputPin); // read one bit of data from pin
//Serial.print(inputstream, DEC);
packeddata = ((packeddata << 1) + inputstream);// left-shift summing variable, add pin value
digitalWrite(clockPin, LOW);
delayMicroseconds(shortdelay); // end of one clock cycle
}
// end of entire clock cycle
//Serial.println(" ");
digitalWrite(ledPin, LOW); // signal end of transmission
// lots of diagnostics for verifying bitwise operations
//Serial.print("packed:");
//Serial.println(packeddata,DEC);
//Serial.print("pack bin: ");
//Serial.println(packeddata,BIN);
angle = packeddata & anglemask; // mask rightmost 6 digits of packeddata to zero, into angle.
//Serial.print("mask: ");
//Serial.println(anglemask, BIN);
//Serial.print("bin angle:");
//Serial.println(angle, BIN);
//Serial.print("angle: ");
//Serial.println(angle, DEC);
angle = (angle >> 6); // shift 16-digit angle right 6 digits to form 10-digit value
//Serial.print("angleshft:");
//Serial.println(angle, BIN);
//Serial.print("angledec: ");
//Serial.println(angle, DEC);
angle = angle * 0.3515; // angle * (360/1024) == actual degrees
Serial.print("angle: "); // and, finally, print it.
Serial.println(angle, DEC);
//Serial.println("--------------------");
//Serial.print("raw: "); // this was the prefix for the bit-by-bit diag output inside the loop.
if (debug)
{
statusbits = packeddata & statusmask;
DECn = statusbits & 2; // goes high if magnet moved away from IC
INCn = statusbits & 4; // goes high if magnet moved towards IC
LIN = statusbits & 8; // goes high for linearity alarm
COF = statusbits & 16; // goes high for cordic overflow: data invalid
OCF = statusbits & 32; // this is 1 when the chip startup is finished.
if (DECn && INCn) { Serial.println("magnet moved out of range"); }
else
{
if (DECn) { Serial.println("magnet moved away from chip"); }
if (INCn) { Serial.println("magnet moved towards chip"); }
}
if (LIN) { Serial.println("linearity alarm: magnet misaligned? Data questionable."); }
if (COF) { Serial.println("cordic overflow: magnet misaligned? Data invalid."); }
}
float V_DIRECTION = angle;
gw.send(msgDIR.set(V_DIRECTION, DEC));
packeddata = 0; // reset both variables to zero so they don't just accumulate
angle = 0;
gw.process();
//gw.sleep(INTERRUPT,CHANGE);
gw.sleep(longdelay);
}
und hier mein FHEM-Code.
define MYSENSOR_111 MYSENSORS_DEVICE 111
attr MYSENSOR_111 IODev SerialGate
attr MYSENSOR_111 alias Windrichtung
attr MYSENSOR_111 group Sensoren
attr MYSENSOR_111 mapReading_direction 0 direction
attr MYSENSOR_111 mapReading_gust 0 gust
attr MYSENSOR_111 mapReading_wind 0 wind
attr MYSENSOR_111 mode repeater
attr MYSENSOR_111 room 03_Umwelt
attr MYSENSOR_111 stateFormat {sprintf("%.0f",ReadingsVal("MYSENSOR_111","direction",0))."°"}
der nächste schritt ist nun ein wind-speed sensor.. auch mit dem AS5040... mal schaun...
schau dir mal die logProxy beispiele im wiki an. im polar mode müsste auch so etwas möglich sein.
gruss
andre