Holas,
meine neue Dachterrasse hat eine schicke Markise bekommen welche ich mit dem HM-LC-BL1-FM von Homematic steuern kann. Da ich das Ganze nun für die Beschattung der Wohung nutzen will, sprich je nach Temperatur und Sonnenschein die Markise ein- bzw. ausfahren möchte, brauche ich einen Mechanismus der die Markise vor Windböen schützt bzw. wenn welche auftreten die Markise automatisch einfährt. Da mir das angebotene Modul des Markisenherstellers zu teuer war, habe ich meine eigenen Windmesser und Anbindung realisiert auf Basis des ESP8266 mit MQTT.
Benutzte Hardware:
- Wemos D1 (kein Mini, weil da 24V DC wegen LED liegt und der D1 einen Powerjack hat für 24V)
- Eltako Windmesser WS von hier: http://amzn.to/2ps1Tte
Der Eltako Windmesser hat 4 Reedkontakte dementsprechend gibt es 4 Signale wenn er einmal vollständig gedreht hat. Mit der Formel v [km/h] = 1.761 / (1 + rps) + 3.013 * rps (rps=rounds per second) die ich in einer der Kundenbewertungen (http://"http://amzn.to/2p1wiuY") gefunden habe, konnte ich den Arduino Code so schreiben das am Ende, meiner Meinung nach, verlässliche Werte raus kommen. Die Windgeschwindigkeit wird anschließend per MQTT gepublished. Damit nicht zu viele Werte gesendet werden wird nur jede Sekunde gesendet wenn der Wind sich um mehr als 1 km/h ändert ansonsten nur alle 10 Sekunden. Sollte meiner Meinung nach vollkommen ausreichend sein.
Der Windmesser ist mit dem D7 und GND Pin des Wemos verbunden. Der D7 ist als INPUT_PULLUP initialisiert. Software technisch ist es so gelöst das jeder Reedkontakt einen Interrupt auslöst, welcher dazu führt das eine Variable hoch zählt. Jede Sekunde wird dann geprüft wie viele Reedkontakte wurden überschritten, daraus ergibt sich die rps für die oben genannte Formel.
In FHEM habe ich ein MQTT Device eingerichtet:
define Windmesser MQTT_DEVICE
attr Windmesser IODev MQTTBroker
attr Windmesser room Wetter
attr Windmesser stateFormat wind km/h
attr Windmesser subscribeReading_wind anemometer/wind
Und ein DOIF um die Markise zu steuern:
define AutoMarkiseSchliessen DOIF ([HM_508FCB:pct] > 0 && ([Windmesser:wind] >= 25)) (set HM_508FCB pct 0)
Den Sourcecode für das Projekt findet ihr auf github: https://github.com/sbiermann/esp8266-anemometer.
Installation:
- git pull https://github.com/sbiermann/esp8266-anemometer
- myconfig_samples.h in myconfig.h ändern
- Werte in der myconfig.h anpassen (MQTT und WLAN Daten)
- Software auf Wemos hoch laden, Windmesser anschließen und testen
Viele Grüße
Stefan
Danke, dass du dieses Projekt geteilt hast. Made my day!
Gruß,
Alex
Hi,
Habe so etwas mit einem La Crosse (Technoline) TX20 Windsensor an einem Sonoff Basic mit Tasmota realisiert. Funktioniert perfekt.
Zusätzlich kann ich damit das Licht meiner Gartenhütte schalten ;D
LG
Manfi
Ich habe den Eltako-Windsensor an einem Raspi am Laufen.
Wemos D1 Mini ist natürlich eine sehr interessante Alternative.
In der Github-Readme steht nichts, wo/wie man die myconfig_samples.h platzieren soll.
Was ist denn die Basis-Software dahinter? Momentan verwende ich tasmota mit dem Wemos D1 Mini.
Software auf Wemos hoch laden, Windmesser anschließen und testen
Wie hast du das gemacht?
Viele Grüße,
Heiko
Eigentlich muss man nur das Git Repo auschecken und dann die myconfig_samples.h in myconfig.h umbenennen und die Werte ändern.
Falls du Basissoftware wie ESPEasy oder Tasmota meinst, nein das habe ich nicht verwendet, ist ein purer Sketch der außer den MQTT und ESP Libs nicht anderes verwendet.
Als MQTT Library habe ich folgende verwendet: https://github.com/knolleary/pubsubclient. Die kann man über die Arduino IDE einfach installieren.
@sbiermann: Ich versuche gerade das Ganze nachzubauen :) ... gefällt mir echt gut!
Die Wifi-Verbindung klappt, jedoch habe ich meinen MQTT Broker mit Benutzernamen und Passwort aufgebaut. Genau das fehlt mir noch in deiner Config, wäre toll wenn du helfen könntest.
Grüße
EDIT:
Hab es schon geschafft! War doch nicht so schwer, wie gedacht! ::)
Einfach in myconfig.h folgende Zeilen hinzufügen:
const char* mqttUser = "YourMqttUser";
const char* mqttPassword = "YourMqttUserPassword";
Im Sketch dann noch folgende Zeile abändern von:
if (client.connect(mqtt_id)) { in if (client.connect(mqtt_id, mqttUser, mqttPassword )) {
Guten Abend sbiermann,
erstmal vielen dank für den Code und das bereitstellen.
Bin über google auf diesen Thread aufmerksam geworden, habe einen wemos d1 mini erfolgreich über die arduino ide gelfasht.
Allerdings bekomme ich im Debug nur merkwürdigen output und in der Heimsteuerung keine Werte.
Evtl eine Idee wo es klemmen könnte?
Ich selbst kann mit der meldung nichts anfangen...
Danke und Gruß
Connecting to *SSID meines WLANS* (drei buchstaben)
.......
WiFi connected
IP address:
192.1**.1**.***
do update
[update] Update failed.
Attempting MQTT connection...connected
ISR not in IRAM!
Abort called
>>>stack>>>
ctx: cont
sp: 3ffffd90 end: 3fffffc0 offset: 01b0
3fffff40: 3ffe865f 3ffee558 3ffee6d8 40203b38
3fffff50: 00000000 00000000 3ffee558 3ffe84dc
3fffff60: 000001ed 3ffee66c 3ffee6d8 401004e6
3fffff70: 000001ed 3ffee66c 3ffee6d8 40201540
3fffff80: 40209350 70b2a8c0 feefeffe feefeffe
3fffff90: feefeffe feefeffe feefeffe 3ffee7f4
3fffffa0: 3fffdad0 00000000 3ffee7c4 40205b28
3fffffb0: feefeffe feefeffe 3ffe8530 40100861
<<<stack<<<
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v8b899c12
~ld
Connecting to *SSID meines WLANS*
.......
WiFi connected
IP address:
192.1**.1**.***
do update
[update] Update failed.
Attempting MQTT connection...connected
ISR not in IRAM!
Abort called
>>>stack>>>
ctx: cont
sp: 3ffffd90 end: 3fffffc0 offset: 01b0
3fffff40: 3ffe865f 3ffee558 3ffee6d8 40203b38
3fffff50: 00000000 00000000 3ffee558 3ffe84dc
3fffff60: 000001ed 3ffee66c 3ffee6d8 401004e6
3fffff70: 000001ed 3ffee66c 3ffee6d8 40201540
3fffff80: 40209350 70b2a8c0 feefeffe feefeffe
3fffff90: feefeffe feefeffe feefeffe 3ffee7f4
3fffffa0: 3fffdad0 00000000 3ffee7c4 40205b28
3fffffb0: feefeffe feefeffe 3ffe8530 40100861
<<<stack<<<
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v8b899c12
~ld
Das ganze ist wohl ein Problem mit der ESP8266 Library ab einer bestimmten Version. Zu mindestens sagt Google dies so.
Probier mal folgendes aus:
Such im Code die Stelle:
void Interrupt()
und füge das ICACHE_RAM_ATTR ein, so das es so aussieht:
void ICACHE_RAM_ATTR interrupt()
Theoretisch sollte dies das Problem lösen.
Bitte gib kurz Rückmeldung ob das Problem gelöst wurde, dann füge ich das in Code auf Github ein.
Guten Morgen und danke für das annehmnen des Problems.
Habe void Interrupt() zu void ICACHE_RAM_ATTR interrupt() geändert ein paar Zeilen weiter unten kommt er dann zum fehler beim kompilieren.
Denke diese Zeile müsste auch angepasst werden oder ?
attachInterrupt(input_pin,Interrupt,RISING);
esp8266-anemometer:100:31: error: 'Interrupt' was not declared in this scope
attachInterrupt(input_pin,Interrupt,RISING);
^
exit status 1
'Interrupt' was not declared in this scope
Kleiner Vertipper anstelle von:
void ICACHE_RAM_ATTR interrupt()
muss es
void ICACHE_RAM_ATTR Interrupt()
heißen.
Sprich aus dem kleine i ein großes I machen.
Angepasst, kompilerit kurzen moment länger um dann wieder abzubrechen.
Habe mal einen Screenshot gemacht, ist denke aussagekräftiger
http://img28115.imagevenue.com/img.php?image=93569_ide_122_490lo.JPG
Ok, ich habe mal den Code ausgecheckt und mit der aktuellen Arduino IDE bauen lassen. Den Fehler konnte ich nachvollziehen und beheben. Ich habe eine korrigierte Version eingecheckt und nach Github gepushed. Die kompiliert korrekt, aber ob sie funktioniert kann ich mangels Hardware nicht ausprobieren.
Danke für deine Mühe, bekomme den Sketch nun gar nicht mehr kompiliert.
Könntest du noch ein paar mehr Angaben zu deiner Umgebung machen, evtl auch deine libs mit hier einfügen oder in das GitHub Projekt?
Als ESP Boards hatte ich 2.5.2 und jetzt 2.5.1 bei beiden motzt er das er das Board nicht kennt -> Fehler beim Kompilieren für das Board Generic ESP8266 Module.
//PS:
Denke es liegt an der PubSubClient.h -> mit der hier genannten im Thrad kommt der Fehler mit dem Board -> Fehler beim Kompilieren für das Board Generic ESP8266 Module.
Nehme ich eine andere aus der GitHub Repo kommt -> 'class PubSubClient' has no member named 'setServer'
Daher auch die Frage nach den benutzten Libs
Installiert ist die PubSub Client von Nick O'Leary https://pubsubclient.knolleary.net/ in der Version 2.7.0.
Mit dieser Lib hat es geklappt, danke läuft sauber!
Hallo zusammen,
erstmal dank an sbiermann für die Veröffentlichung. Bei mir hat alles auf Anhieb funktioniert, sehr gute Beschreibung. Ich nutze einen NodeMCU Amica. Allerdings habe ich ein Problem und versuche es gerade zu lösen. Im Moment liegt der Sensor im Arbeitszimmer, so dass ich die Software noch anpassen kann. Läuft Sensor und NodeMCU länger als 8h (also ohne Wind) kommen keine Windgeschwindigkeiten mehr an (Geschwindkeit 0.00). Ich gehe davon aus, dass der Interrupt nicht mehr ausgelöst wird. Erste Gedanken sind, dass vielleicht bei mir einen externen Pull Up Widerstand benötige. Hat jemand ein vergleichbares Problem?
Viele Grüße
Nee, ich habe nur das Problem das hin und wieder das Netzwerk wegbricht. Aber das haben alle Geräte die da in der Ecke hängen. Ist halt außerhalb des Gebäudes und dazu noch gut isoliert was Strahlung angeht (bedampfte Fenster, verzinktes Blech, usw.).
Ansonsten tut der Sensor aber immer seinen Dienst, meldet alle 10 Sekunden seinen Wert und dieser ändert sich auch regelmäßig.
Da ich im Forum nach meiner Lösung gefragt wurde und diese mit einem Wemos D1 mini realisiert wurde, stelle ich sie hier einfach mal ein:
Hardware:
- Eltako Windsensor (ca 50 Euro): https://www.amazon.de/Eltako-Windsensor-WS/dp/B0018LBFG8
- Wemos D1 mini (ca 2,50 Euro): https://www.ebay.de/itm/162809655148 (das Development Board auswählen, die Antenne benötigt ihr nicht)
Schaltplan:
Den Windsensor zwischen Masse (G) und D4 anschließen. Es gehen auch andere Pins, aber so sieht man am Blinken der LED des ESP8266 gleich, ob die Erfassung funktioniert.
Programmierung (mit ESPhome):
esphome:
name: windsensor
platform: ESP8266
board: d1_mini
wifi:
ssid: "xxxxx"
password: "xxxxx"
# Enable logging
logger:
level: INFO
logs:
mqtt.client: ERROR
ota:
password: "xxxxx"
web_server:
port: 80
mqtt:
broker: 192.168.0.1
username: xxxxx
password: xxxxx
id: mqtt_client
log_topic:
topic: fhem/windsensor
birth_message:
topic: fhem/windsensor
payload: online
will_message:
topic: fhem/windsensor
payload: offline
sensor:
- platform: pulse_counter
name: Windgeschwindigkeit
id: windsensor
pin:
number: D4
mode: INPUT_PULLUP
unit_of_measurement: rps
update_interval: 10s
filters:
- multiply: 0.016666666
- lambda: return (x/4);
Ich lasse mir derzeit nicht die Windgeschwindigkeit sondern die Umdrehungen pro Sekunde - gemittelt über 10 Sekunden (update_interval) - ausgeben.
Die IP des brokers sollte die des FHEM Servers sein.
In FHEM muss dann noch ein MQTT-Server erstellt werden:
defmod myBroker MQTT2_SERVER 1883 global
Sobald der ESP8266 Daten über MQTT sendet, taucht das Device in FHEM auf. Im Reading state steht dann die Umdrehungen pro Sekunde.
Ich hole dieses ältere Ding noch einmal hoch...
Den Windmesser mit einem Wemos D1 Mini und dem verlinktem Eltako Windmesser habe ich gerade frei verdrahtet aufgebaut. Beim Messen ist mir aufgefallen, dass mein Exemplar genau zwei Impulse pro Umdrehung abgibt. Das habe ich auch so in den Defs eingetragen (number_reed = 2).
Wenn ich den Eltako jetzt (aus meiner Sicht) verdammt schnell anschupse, dann kommen im Schnitt 20 - 25 km/h heraus.
Ich frage mich jetzt, ob das so richtig ist...
Wer hat das nachgabaut und kann mich erhellen?
Danke Peter
An der wirklichen Windgeschwindkeit saß ich auch eine Weile dran, habe es dann aber aufgegeben. Denke dafür braucht man ein "Referenzwind", in den man den Windmesser hält und ein paar Windgeschwindigkeiten erfasst. Dann kann man eine Formel dafür entwickeln.
Mir ging es eher darum, ab wann die Markise automatisch rein fahren muss. Und da habe ich einfach geschaut, wann der "Grenzwert" der Markise erreicht ist (egal wie schnell der Wind ist) und habe daraus ein DOIF gemacht.
Zitat von: Topgun am 18 Oktober 2020, 17:21:14
Denke dafür braucht man ein "Referenzwind", in den man den Windmesser hält und ein paar Windgeschwindigkeiten erfasst. Dann kann man eine Formel dafür entwickeln.
Wenn das jemand will, möglicherweise kein Problem... mir ist dabei sofort die Story einfallen von jemandem der vor 20 Jährchen sowas entwickelt hatte...:
"Den Windmesser aus dem Auto halten und ein paaar Geschwindigkeiten probieren"
8) 8) 8)
Achtung geltendes Recht dabei einhalten ! PS: Und heute sieht man die tatsächliche Geschwindigkeit im GPS Empfänger statt dem falschen Tacho...