[Projekt] ESP8266 Windmesser zur Markisensteuerung

Begonnen von sbiermann, 02 Mai 2017, 16:24:54

Vorheriges Thema - Nächstes Thema

sbiermann

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 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:

Viele Grüße
Stefan

Alex85

Danke, dass du dieses Projekt geteilt hast. Made my day!

Gruß,
Alex

Manfi

#2
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
Hardware: Raspberry Pi2, SignalDuino 433, Sonoff/Tasmota, NodeMCU/ESPEasy, FS10

heikoh81

#3
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

sbiermann

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.


vencam

#5
@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 )) {

wuschel

#6
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


sbiermann

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.

wuschel

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


sbiermann

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.

wuschel

#10
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

sbiermann

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.

wuschel

#12
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

sbiermann

Installiert ist die PubSub Client von Nick O'Leary https://pubsubclient.knolleary.net/ in der Version 2.7.0.

wuschel

Mit dieser Lib hat es geklappt, danke läuft sauber!