Wetterstation mit openHAB 2, Tinkerforge und ESP32

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
KlausGünther
Beiträge: 143
Registriert: 16. Jul 2018 08:57
Wohnort: Werl
Kontaktdaten:

Wetterstation mit openHAB 2, Tinkerforge und ESP32

Beitrag von KlausGünther »

Wetterstation mit OPENHAB2, Raspberry Pi3b+ und Tinkerforge

Wetter hat mich schon immer interessiert und daher lag es nahe, das ganze auch in unser Smart Home einzubinden.

Neben der normalen Installation von Openhab2 auf einem Raspberry Pi 3b+ bestand der Gedanke darin, eine
Wetterstation im Garten zu betrieben, die möglichst vergleichbare Werte (z.B. zu "richtigen" Stationen) liefert
und am besten Energieautark läuft.

Letzten Endes habe ich mich für Komponenten von Tinkerforge entschieden und da ich damit keinerlei Erfahrung habe,
möchte ich erst mal klein Anfangen.

Als Basis dient der Master Brick:
https://www.tinkerforge.com/de/doc/Hard ... ster-brick
der über die WiFi 2.0 Erweiterung mit dem Raspeberry spricht:
https://www.tinkerforge.com/de/doc/Hard ... nsion.html
Damit die ersten Daten ins System kommen sind am Master Brick folgende Bricklets für Luftdruck und Luftfeuchte angeschlossen:
https://www.tinkerforge.com/de/doc/Hard ... 2-bricklet
https://www.tinkerforge.com/de/doc/Hard ... ty_V2.html
Beide Bricklets können auch jeweils die Temperatur messen, somit könnte man das Theoretisch sogar doppelt machen.

Auf der Website vom DWD gibt's es eine Anleitung bzw. Beschreibung wie eine "offizielle" Wetterstation aussehen muss,
wieder Standort ist usw. Schnell war klar, der Garten ist zu klein, ich habe kein ISDN und auch keine Lust eine 230V Spannungsversorgung
zu verlegen. Ich habe daher "nur" eine kleine Box gebaut, die einer Wetterstation sagen wir mal ähnlich sieht. Grundmaße sind ca. 200x200
und steht auf einem Rohr im Blumebeet. ca. 1,8m über Grund.

Betrieben wir das ganze mit mitlerweile 5 Stück Solarzellen, 3 Stück Li-Ion Akkus und einem Laderegler der gleichzeitig
mit dem Solarstrom die Akkus laden kann und auch die Tinkerforge Bausteine betreibt. Oder halt den Akku leersaugt wenn
keine Sonne da ist.
https://www.waveshare.com/solar-power-manager.htm
Angefangen habe ich mit 3 Zellen (6V, 150mA, gibts in jedem gut sortiertem Elektronik Shop) und einer 18500 Li-Ion Zelle.
Leider war dann morgens um 5 der Strom "leer", somit habe ich einfach mal Leistung bzw. Kapazität nachgeworfen und bin
mal gespannt, wie lange das ganze jetzt läuft, spätestens im Winter könnte es spannend werden.
Im Moment hat die Station eine Akkukapazität von 9.000mA (Bei 3,7V) und 5 Stück Solarzellen á 6V mit je 150mA.

Die TF Bausteine brauchen insgesamt 160mA bei 5V, die Solarzellen liefern max. 4,5W und über das Datenblatt des Ladereglers sind
die Verluste bzw. Effizienzen angegeben, z.B. 78% beim Solaren laden. Vielleicht sollte man erwähnen das man auch noch über
eine USB Buchse zusätzlich Strom einspeisen kann wenn notwendig ? Theoretisch komme ich dann bei einem Ausnutzungsgrad von 60%
der Solarzellen darauf aus, dass es im Winter zur Wintersonnenwende halbwegs passen müsste (Rein=Raus), somit sollte erst mal ausreichend Puffer im Energiespeicher sein. Was die Praxis daraus macht, Stichwort Kälte, Wetter usw. wird sich zeigen.

Somit lasse ich mit in der Sitemap Werte für Luftdruck, Luftfeuchtigkeit und Temperatur direkt anzeigen. Werte für gefühlte Temperatur
und Taupunkt errechne ich über eine Rule. Vielleicht noch spannend, ich nutze das Tinkerforge Binding von "Theo" aus diesem
Thread:
https://github.com/theoweiss/openhab-ti ... /README.md
Die Konfiguration der TF-Bricklets habe ich einfach mit der PaperUI durchgeführt. Kurz und Schmerzlos.



Regel gefühlte Temperatur:

Code: Alles auswählen

rule "Gefühlte Temperatur berechnen"

when
	Item Temperature changed
then 
	if (Temperature.state > 15)
    {
    var tempCurrent = (Temperature.state as Number).floatValue
    var temphumidity = (Luftfeuchte.state as Number).floatValue
    var hitzeindex = -8.784695 + 1.61139411*tempCurrent + 2.338549*temphumidity - 0.14611605*tempCurrent*temphumidity - 0.012308094*(tempCurrent*tempCurrent) - 0.016424828*(temphumidity*temphumidity) + 0.002211732 *(tempCurrent*tempCurrent)*temphumidity + 0.00072546*tempCurrent*(temphumidity*temphumidity) - 0.000003582*(tempCurrent*tempCurrent)*(temphumidity*temphumidity)
    TempFeel.postUpdate(hitzeindex as Number)
    }
    
    else
    {
    var speedCurrent = Math.pow((((Wind_Speed_Mps.state as Number).floatValue) * 3.6), 0.16)  //bei m/s aus 1.0 3.6 machen oder 1.0 bei km/h
    var tempCurrent = (Temperatur.state as Number).floatValue
    var tempfeel = (13.12 + 0.6215 * tempCurrent - 11.37 * speedCurrent + 0.3965 * tempCurrent * speedCurrent ).floatValue
    TempFeel.postUpdate(tempfeel as Number)
   }
end 

Berechnung Taupunkt (Auch hier noch mal der Hinweis, der Urheber dieser Formel steht oben im LINK!)

Code: Alles auswählen

//------------------------------------------------------------------------------------------------------------------------
//
//	Lambda: getDewPoint
//
// Berechnung des Taupunktes für eine gegebene Temperatur und Luftfeuchtigkeit
// 
// Beschreibung:
// Die Luft ist ein Gemisch verschiedener Gase. Eines dieser Gase ist der Wasserdampf. Die Menge an 
// Wasserdampf, die in der Luft enthalten sein kann, ist allerdings begrenzt. Je wärmer die Luft ist, 
// desto mehr Wasserdampf kann in ihr enthalten sein.
// 
// Die relative Luftfeuchtigkeit gibt an, wie viel Prozent des maximalen Wasserdampfgehaltes die Luft 
// im Augenblick enthält. Da der maximale Wasserdampfgehalt mit steigender Temperatur ansteigt, 
// fällt die relative Luftfeuchtigkeit mit steigender Temperatur (und umgekehrt).
// 
// Die Taupunkttemperatur ist definiert als die Temperatur, bei der der aktuelle Wasserdampfgehalt in 
// der Luft der maximale (100% relative Luftfeuchtigkeit) ist. Die Taupunkttemperatur ist damit eine von 
// der aktuellen Temperatur unabhängige Größe. Eine Möglichkeit die Taupunkttemperatur zu messen 
// ist das Abkühlen von Metall bis sich die Oberfläche mit Wasserdampf beschlägt. Dann ist die 
// Temperatur des Metalls die Taupunkttemperatur.
// 
// Es gibt keine exakte Formel zur Umrechnung der Taupunkttemperatur in die relative Luftfeuchtigkeit. 
// Zur Erstellung des Taupunktrechners habe ich eine einfache Näherungsformel benutzt. Eine exakte 
// Umrechnung ist nur mit experimentell ermittelten Tabellen möglich.
// 
// Aus Temperatur und relativer Luftfeuchte bzw. Temperatur und Taupunkt lässt sich auch der 
// absolute Feuchtegehalt der Luft in Gramm Wasserdampf pro Kubikmeter ausrechnen.
// 
// Formeln:
// Die Grundlage der Berechnungen ist die Näherungsformel für den Sättigungsdampfdruck ( Gleichung 1 ), 
// die sogenannte Magnusformel. Die relative Luftfeuchtigkeit ist definiert als das Verhältnis vom 
// augenblicklichen Dampfdruck zum Sättigungsdampfdruck (umgeformte Gleichung 2). Bei der 
// Taupunkttemperatur ist definitionsgemäß der Sättigungsdampfdruck gleich dem aktuellen Dampfdruck. 
// Aus diesen beiden Definitionen folgt unmittelbar Gleichung 3, die Formel zur Berechnung der 
// relativen Luftfeuchtigkeit aus der Taupunkttemperatur. Die 4. Gleichung beschreibt umgekehrt die 
// Berechnung der Taupunkttemperatur aus der relativen Luftfeuchtigkeit und der aktuellen Temperatur. 
// Diese 4. Gleichung ist im Grunde nichts anderes als die nach T aufgelöste 1. Gleichung , wobei für 
// den Sättigungsdampfdruck der aktuelle Dampfdruck (und nicht der aktuelle Sättigungsdampfdruck) 
// eingesetzt wird, so dass die Taupunkttemperatur und nicht die normale Temperatur als Ergebnis 
// herauskommt. Aus der allgemeinen Gasgleichung ergibt sich die 5. Gleichung .
// 
// Bezeichnungen:
// r = relative Luftfeuchte
// T = Temperatur in °C
// TK = Temperatur in Kelvin (TK = T + 273.15)
// TD = Taupunkttemperatur in °C
// DD = Dampfdruck in hPa
// SDD = Sättigungsdampfdruck in hPa
// 
// Parameter:
// a = 7.5, b = 237.3 für T >= 0
// a = 7.6, b = 240.7 für T < 0 über Wasser (Taupunkt)
// a = 9.5, b = 265.5 für T < 0 über Eis (Frostpunkt)
// 
// R* = 8314.3 J/(kmol*K) (universelle Gaskonstante)
// mw = 18.016 kg/kmol (Molekulargewicht des Wasserdampfes)
// AF = absolute Feuchte in g Wasserdampf pro m3 Luft
// 
// Formeln:
// SDD(T) = 6.1078 * 10^((a*T)/(b+T))
// DD(r,T) = r/100 * SDD(T)
// r(T,TD) = 100 * SDD(TD) / SDD(T)
// TD(r,T) = b*v/(a-v) mit v(r,T) = log10(DD(r,T)/6.1078)
// AF(r,TK) = 10^5 * mw/R* * DD(r,T)/TK; AF(TD,TK) = 10^5 * mw/R* * SDD(TD)/TK
// 
// Quelle: http://www.wetterochs.de/wetter/feuchte.html
// 
// Danke an Stefan Ochs von www.wetterochs.de
//
//------------------------------------------------------------------------------------------------------------------------
val org.eclipse.xtext.xbase.lib.Functions$Function2<Double, Double, Double> getDewPoint = [
	
	Double Temperature, 
	Double Humidity 
	
	|

	var Double a
	var Double b
	var Double SDD
	var Double DD
	var Double v
	var Double t = Temperature
	var Double h = Humidity
	
	if (t >= 0.0){ // T >= 0 °C
		a = 7.5
		b = 237.3
	} else { // T < 0 °C über Wasser
		a = 7.6
		b = 240.7
	}
	SDD=(6.1078 * Math::pow(10.0, ((a*t)/(b+t))))
	DD = (h/100.0*SDD)
	v = Math::log10((DD/6.107))
	return ((b*v)/(a-v))

]


rule "Taupunkt draußen"
when

	Item Temperature received update

then

	if (Temperature.state != NULL) && (Luftfeuchte.state != NULL))
	{

		var t = (Temperature.state as QuantityType<Number>).doubleValue
		var h = (Luftfeuchte.state as QuantityType<Number>).doubleValue
		
		Taupunkt_Outside.postUpdate(getDewPoint.apply(t, h))
	
				
	}

end

Basis für die Regel des Taupunktes:
https://knx-user-forum.de/forum/support ... ich-lüften

Wetterstation im Garten
Bild

Tinkerforge zusammengebaut und erster Funktionstest
Bild

Sensoren und Laderegler nehmen das erste mal Platz im Holzkasten
Bild
Zuletzt geändert von KlausGünther am 2. Mär 2020 20:14, insgesamt 1-mal geändert.

Benutzeravatar
sihui
Beiträge: 1827
Registriert: 11. Apr 2018 19:03
Answers: 21

Re: Wetterstation mit OPENHAB2 und Tinkerforge

Beitrag von sihui »

KlausGünther hat geschrieben: 8. Aug 2019 19:17 Wetterstation mit OPENHAB2, Raspberry Pi3b+ und Tinkerforge
Danke, klasse gemacht!
Ich überlege seit längerem wie ich ein Anemometer selbst bauen kann, einige Teile dafür habe ich schon eingekauft, leider fehlt wie immer die Zeit.
openHAB3 mit Zwave, Alexa, ESPEasy, MQTT, Logitech Harmony, Philips HUE und ZigBee Hardware auf Proxmox VE.

KlausGünther
Beiträge: 143
Registriert: 16. Jul 2018 08:57
Wohnort: Werl
Kontaktdaten:

Re: Wetterstation mit OPENHAB2 und Tinkerforge

Beitrag von KlausGünther »

sihui hat geschrieben: 9. Aug 2019 07:05 Anemometer selbst bauen kann
Was wäre mit der Outdoor Weather Station von TF ?

Benutzeravatar
sihui
Beiträge: 1827
Registriert: 11. Apr 2018 19:03
Answers: 21

Re: Wetterstation mit OPENHAB2 und Tinkerforge

Beitrag von sihui »

KlausGünther hat geschrieben: 9. Aug 2019 07:49 Was wäre mit der Outdoor Weather Station von TF ?
Nö. kaufen kann ja jeder, der Reiz liegt im Selberbasteln :lol: Ein Anfang ist ja schon (seit längerem) gemacht:
anemometer.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB3 mit Zwave, Alexa, ESPEasy, MQTT, Logitech Harmony, Philips HUE und ZigBee Hardware auf Proxmox VE.

KlausGünther
Beiträge: 143
Registriert: 16. Jul 2018 08:57
Wohnort: Werl
Kontaktdaten:

Re: Wetterstation mit OPENHAB2 und Tinkerforge

Beitrag von KlausGünther »

Kleines Update:

Die "versprochenen" 150mA aus den Zellen sind doch etwas sehr geschönt und werden nicht mal bei wolkenlosem Himmel
und direkter Einstrahlung erreicht (ja ich hab die Folie ab gemacht).
Ich habe also ein paar Zellen "nachgeworfen" und ebenfalls die Akkuleistung auf 9Ah erhöht, stellt mich aber immer noch
nicht zufrieden --> fällt tlw. aus.

Daher hat das Ding jetzt ein Kabel :?

Zweiter Punkt, die Nachbarn. Wie im Thread:
viewtopic.php?f=13&t=2352&p=10583#p10583
ja mal angefraht, die möchten gerne sehen was gerade so passiert und da alles nicht
wirklich funktioniert hat (Vermutlich sitzt das Problem zwischen Tastatur und Stuhl)
bin ich zum Plan B über gegangen und schiebe die Daten jetzt per sendHttpGetRequest
nach Thinkspeak. Nicht wirklich sexy, nicht wirklich schick, aber zumindest können
die Leutchen jetzt ein bisschen gucken.
Sollte noch jemand dazu eine Idee haben, ich probier das gerne aus. (Dann vorher bitte
per PN mal anfragen was an "Technik" zur verfügung steht.

KlausGünther
Beiträge: 143
Registriert: 16. Jul 2018 08:57
Wohnort: Werl
Kontaktdaten:

Re: Wetterstation mit OPENHAB2 und Tinkerforge

Beitrag von KlausGünther »

Nächstes Update:

Das mit Thinkspeak war eine nette Sache, aber noch nicht wirklich "sexy", ausserdem hatte ich Urlaub.

Windy.com bietet wohl seit einiger Zeit auch eine Schnittstelle für PWS - PrivateWeatherStations an.
Link zur Seite von Windy, wie richtet man das ein:
https://community.windy.com/topic/8168/ ... ZojuBQpxbI

Funktioniert soweit auch ganz gut und war auch für jemand er nicht beruflich programmiert, mit Tante Google relativ
einfach zusammengesucht.

Code: Alles auswählen

sendHttpGetRequest(WINDY_URL + "&temp=" + ((TEMPERATUR.state as Number).floatValue) + "&rh=" + ((LUFTFEUCHTIGKEIT.state as Number).floatValue) + "&dewpoint=" + ((TAUPUNKT.state as Number).floatValue) )
Und jetzt schickt OH alle 5min die Daten an Windy.com und man hat dort direkt für sich den Vergleich, welches Vorhersagemodell am besten ist.
Jetzt kämpfe ich nur noch damit, wie man aus bar, wieder mbar macht (Habe auf OH2.5M3 umgestellt)....Und das ganze in PaperUI.

KlausGünther
Beiträge: 143
Registriert: 16. Jul 2018 08:57
Wohnort: Werl
Kontaktdaten:

Re: Wetterstation mit openHAB 2, Tinkerforge und ESP32

Beitrag von KlausGünther »

Es gibt das nächste Update dank tatkräftiger Hilfe hier im Forum.
Das ganze wurde um ein nodeMCU ESP32 mit einem AS3935 Blitzsensor erweitert.

Der Sensor registriert Blitze (angeblich) bis zu einer Entfernung von 40km. Und schickt das ganze in mehreren Stufen über
den IIC Bus an das ESP32. Mit übertragen wird dann auch ob es Störungen oder Rauschen gibt. Ich sehe das ganze als Spaß
an und nicht unbedingt als exakte Wissenschaft, wenn das plus Minus ungefähr rauskommt, ist es eine nette Spielerei,
man könnte es Hobby nennen. Zurück zum Thema.
MQTT muss natürlich laufen.....
Also, vom Sensor gibts Diverse Ausführungen, ich habe einen an dem ein Stecker ist (DFRobot) und somit schon mal Lötarbeiten
weitestgehend entfallen. Für denjenigen der es nachbauen möchte: Das Interrupt Kabel kommt in meinem Beispiel an GPIO4, die Clock Leitung
vom IIC an GPIO22 und die Datenleitung des IIC an GPIO 21. Spannungsversorgung (3,3V) und GND brauche ich bestimmt nicht weiter zu erklären.

Dann kopiert man noch den Code auf den ESP und schon läuft es. Zumindest beim letzten Gewitter hier am Samstag hat das Gerät "nach Gefühl"
ganz gut angezeigt. Wobei man sagen muss, alles was tolle elektrische Felder macht (SmartPhone, Induktionsherde usw.) lösen das Ding auch aus
wenn zu nah dran...

Hier der Code, zusammenkopiert von mehreren Website und dan entsprechend angepasst:
(Das ist übrigens mein erstes ESP Projekt, ich vermute das mit dem Code geht noch wesentlich eleganter, kleiner und schöner.

Code: Alles auswählen

#include <Wire.h>
#include <SparkFun_AS3935.h>
#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "WLANSSID";
const char* password =  "PASSWORT";
const char* mqttServer = "IP-ADRESSE";
const int mqttPort = 1883;
const char* mqttUser = "BENUTZERNAME"; 
const char* mqttPassword = "PASSWORT";

#define AS3935_ADDR 0x03 
#define INDOOR 0x12 
#define OUTDOOR 0xE
WiFiClient espClient;
PubSubClient client(espClient);
SparkFun_AS3935 lightning(AS3935_ADDR);

// Interrupt pin for lightning detection 
const int lightningInt = 4; 
#define LIGHTNING_INT 0x08
#define DISTURBER_INT 0x04
#define NOISE_INT 0x01

int noiseFloor = 2;

// This variable holds the number representing the lightning or non-lightning
// event issued by the lightning detector. 
int intVal = 0;



void WiFiEvent(WiFiEvent_t event) {
    Serial.printf("[WiFi-event] event: %d\n", event);
    switch(event) {
    case SYSTEM_EVENT_STA_GOT_IP:
         break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
        WiFi.begin(ssid, password);
        break;
    }
    if (event > 7 ) {
      WiFi.begin(ssid, password);
    }
}

void setup()
{

  pinMode(lightningInt, INPUT); 

  Serial.begin(115200); 
  delay(10);
  WiFi.onEvent(WiFiEvent);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
 }
   client.setServer(mqttServer, mqttPort);
 
  
  while (!client.connected()) {
      if (client.connect("ESP32Client", mqttUser, mqttPassword )) {

      client.publish("esp321/AS3935_Status", "MQTT verbunden");
      client.publish("esp321/Noise", "-");
      client.publish("esp321/Detection", "-");
      client.publish("esp321/Entfernung","0");
      client.publish("esp321/Disturber", "-"); 
      delay(5000);
    } else {

    }
  }


  Wire.begin(); // Begin Wire before lightning sensor. 

  if( !lightning.begin() ) { // Initialize the sensor. 
     client.publish("esp321/AS3935_Status", "Blitzsensor nicht gestartet");
    while(1); 
  }
  else
     client.publish("esp321/AS3935_Status", "Blitzsensor bereit");
  //lightning.setIndoorOutdoor(OUTDOOR); 
}

void loop()
{
  if(digitalRead(lightningInt) == HIGH){

    intVal = lightning.readInterruptReg();
    if(intVal == NOISE_INT){
      client.publish("esp321/Noise", "Rauschen");
      delay(5000);
      client.publish("esp321/Noise", "-");
    }
    else if(intVal == DISTURBER_INT){
      client.publish("esp321/Disturber", "Störung empfangen");
      delay(5000);
      client.publish("esp321/Disturber", "-");
      
    }
    else if(intVal == LIGHTNING_INT){
      client.publish("esp321/Detection", "Blitz erkannt");
      byte distance = lightning.distanceToStorm(); 
      char s [20];
      sprintf (s, "%d", lightning.distanceToStorm());
      client.publish("esp321/Entfernung", (const char*) s);
      delay(5000);
      client.publish("esp321/Entfernung","0"); 
      client.publish("esp321/Detection", "-");
    }
  }
  delay(100);
}

Antworten