Weerstation

Last Updated on 19 oktober 2023 by Syds

Met dit project ben ik zo’n jaar zoet geweest, uiteraard met tussenposes, maar een heel leuk traject met een geweldig eindresultaat. De anemometer en windvaan staan fier te draaien op de tuinkas, en er komt plenty sensor data binnen om mijn webpagina met weersinformatie te voeden. Hieronder stap voor stap mijn aanpak. Maar eerst de use cases die ik van te voren bedacht had.

Use cases

  • Temperatuur
  • Luchtvochtigheid
  • Luchtdruk
  • Lichtsterkte
  • Windsnelheid
  • Windrichting
  • Neerslag per 24 uur
  • Neerslag indicatie
  • WiFi verbinding buitensensor
  • Data opgeslagen in Domotica database voor statistieken
  • Optioneel: data aanleveren aan open data portaal
  • Optioneel: display aan de wand

Onderdelen

Onderdeel Aantal Prijs p/s Totaal Te bestellen bij
Waterdichte Plastic Aansluitdoos Transparante Cover 160*160*90 1 9,86 9,86 www.aliexpress.com
PCB 150 * 90 1 1,97 1,97 www.aliexpress.com
Micro USB kabel 25cm 1 1,99 1,99 www.aliexpress.com
Telefoonadapter 1 Uit doos
Wemos D1 Mini 1 1,74 1,74 www.aliexpress.com
DS18B20 Temperatuur Sensor 1 3,54 3,54 www.aliexpress.com
DHT22 Sensor 1 3,02 3,02 www.aliexpress.com
BMP280 luchtdruksensor 1 1,77 1,77 www.aliexpress.com
BH1750 Lux sensor 1 1,70 1,70 www.aliexpress.com
Anemometer  1 13,22 13,22 www.aliexpress.com
Windvaan 1 11,71 11,71 www.aliexpress.com
Neerslagmeter 1 12,66 12,66 www.aliexpress.com
Totaal 70,16

Benodigdheden:

  • soldeerbout + tin
  • schroevendraaier
  • boormachine + boren
  • Siliconenkit of lijm

Reeds up-and-running:

  • Domoticz
  • MQTT
  • MQTT plugin Domoticz
  • Node-red

Daarnaast wat klein materiaal zoals:

  • tie-wraps
  • female headers
  • dupont kabeltjes
  • M2 Boutjes en moertjes
  • M4 Bouten en moertjes
  • CV buis 22mm doorsnee, ongeveer 1 meter
  • 2 dunne metalen strips, ongeveer 12 cm lang
  • Hoekijzer, ongeveer 60mm bij 120mm
  • 2 Telefoonkabel clips
  • 2 dunne schroeven, ongeveer 10mm lang

Behuizing, standaard & voeding

Alle elektronica en sensoren worden ingebouwd in een installatie doos met transparant deksel, afmetingen 160x160x90. 

Indeling:

Noot: Ik had twijfel of 1 Wemos wel voldoende processorkracht had om alle sensordata te verwerken en genoeg voeding kon leveren aan alle sensoren. Daarom in het ontwerp rekening gehouden met 2 Wemos D1 mini’s. De Wemos bleek echter voldoende power te hebben of alles te handelen, dus in mijn project maar 1 Wemos D1 mini toegepast. Daarom tevens de 12v DC adapter en de USB converter vervangen door een standaard Telefoonadapter.

Voor de voeding telefoonadapter toegepast uit de voorraad, deze levert 5v en 2A. 

Calculatie opgenomen vermogen:

Component Amperage
Wemos D1 mini (1) 400mA
Wemos D1 mini (2) 400mA
DB18B20 15mA
DHT22 1,5mA
BMP280 0,027mA (2,7µA)
BH1750 7mA
ADS1115 0,15mA (150µA)
Anenometer
Regenmeter
Windmeter
Windvaan
Totaal 823,67mA

Standaard:

Als standaard heb ik een stuk 22mm CV buis genomen. Deze heb ik met behulp van een buigijzer in een dusdanige hoek gebogen zodat hij precies haaks op het dak van mijn tuinkas staat. In deze CV buis heb ik twee 5mm gaten geboord, en vervolgens deze gaten doorgeboord in het aluminium profiel van de tuiskas. M.b.v. twee M4 bouten van ongeveer 5 cm lengte heb ik vervolgens de CV buis vastgezet op de tuinkas. Tevens heb ik twee 5mm gaten in het aluminium profiel geboord voor de doorvoer van een 220v verlengsnoer en de thermometer in de tuinkas.

Op de achterkant van de installatiedoos heb ik vervolgens twee dunne metalen strips met M2 boutjes en moeren bevestigd, en die metalen strips in het midden vastgezet op de CV buis m.b.v. 2 M4 bouten en moeren. De neerslagmeter heb ik m.b.v. een hoekijzer en wat M2 en M4 bouten en moeren vastgezet op de CV Buis. Tot slot heb ik de draagarm voor de Anemometer en de Windvaan m.b.v. een M2 bout en moer vastgezet op de bovenkant van de CV Buis. Dit paste perfect. Alle draden heb ik m.b.v. tie-wraps vastgezet langs de draagarm en CV Buis en aan de onderkant van de installatiedoos ingebracht.

De DS18B20 die de buitentemperatuur meet heb ik met behulp van twee kabelclips bevestigd aan de onderkant van de installatiedoos. Hiervoor heb ik de spijkertjes vervangen door twee dunne schroeven, en de schroeven in het PVC van de installatiedoos geschroefd. De draad heb ik door een kleine gaatje aan de onderkant ingevoerd in de installatiedoos en het gaatje vervolgens afgedicht met wat siliconenkit.

De BH1750 Lux sensor heb ik aan de bovenkant van de installatiedoos bevestigd. Hiervoor heb ik de plastic dop van de sensor afgehaald. Een kleine sleuf in de bovenkant van de installatie doos gemaakt door een aantal kleine gaatjes achter elkaar te boren. Vervolgens de kabel van de sensor door de gleuf in de installatiedoos gebracht. De onderkant van de plastic dop van de sensor heb ik ingesmeerd met wat siliconenkit en waterdicht vastgelijmd op de bovenkant van de installatiedoos (op de sensor uiteraard 😉

Tot zover al het monteerwerk, nu de configuratie.

Weerstation 1 (Wemos D1 Mini)

Configuratie:

Hardware:

Devices:

Tools, Advanced:

Temperatuur

Voor het meten van de buitentemperatuur gebruik ik een DS18B20 Temperatuur Sensor. Als volgt aan te sluiten op een Wemos D1 mini met ESPEasy:

Pinout:

Wemos DS18B20
1 3,3V Rood (VCC)
2 D4 Geel (Data)
3 G Zwart (Gnd)

Verdere beschrijving van het configureren van ESP kun je vinden op https://ehoco.nl/zelf-ds18b20-thermometer-maken-met-espeasy-voor-domoticz/

Luchtvochtigheid

Voor het meten van de luchtvochtigheid en ter controle van de buitentemperatuur gebruik ik een DHT22 Temperatuur & luchtvochtigheid Sensor Module. Als volgt aan te sluiten op een Wemos D1 mini met ESPEasy:

Pinout:

Wemos DHT22
1 3,3V Rood (VCC)
2 D7 Blauw (Data)
3 G Zwart (Gnd)

Verdere beschrijving van het configureren van ESP kun je vinden op https://eigenbrood.eu/2018/03/22/espeasy-with-dht22-and-domoticz/

Luchtdruk

Voor het meten van de luchtdruk gebruik ik een BMP280 luchtdruksensor. Als volgt aan te sluiten op een Wemos D1 mini met ESPEasy:

Pinout:

Wemos BMP280
1 3,3V VIN (VCC)
2 D1 SCK (SCL) 
3 D2 SDI (SDA)
4 G Gnd

Verdere beschrijving van het configureren van ESP kun je vinden op https://www.letscontrolit.com/wiki/index.php/BMP280

Vanwege een bug in ESPEasy of Domoticz worden de waarden via een rule verstuurd:

On System#Boot do //When the ESP boot,do
timerSet 1,300 //Set Timer1 for the next event in 300 seconds
endon

On Rules#Timer=1 do
Publish domoticz/in {“idx”:88,”nvalue”:0,”svalue”:”[Baro#Temp];[Baro#Pres];0;0″}
timerSet 1,300 //Resets the Timer 1 for another 300 seconds
endon

Vertaling luchtdruk naar beleving

Bron:http://www.techna.nl/Stofeigenschappen/wolken%20en%20het%20weer/barometer/de%20barometer.htm

Lichtsterkte

Voor het meten van de lichtsterkte gebruik ik een BH1750 Lux sensor. Als volgt aan te sluiten op een Wemos D1 mini met ESPEasy:

Pinout:

Wemos BH1750
1 3,3V VCC (Rood)
2 D1 SCL (Bruin)
3 D2 SDA (Wit)
4 G Gnd (Zwart)

Verdere beschrijving van het configureren van ESP kun je vinden op https://www.letscontrolit.com/wiki/index.php/BH1750

Vertaling Lux naar beleving

Situatie lux

zonlicht 100.000

daglicht 15.000

bewolkte dag 1.000

donkere dag 100

volle maan 0,1

Bron: https://lumeco.nl/lux-en-lumen/

Website gebouwd

Als voorbeeld heb ik de frontpage van “Hansbit” op het Domoticz forum gebruikt, zie ook https://www.domoticz.com/forum/viewtopic.php?f=8&t=4698&sid=c8c2e4c7575b2edb9a86672979b78c74

De frontpage is te downloaden van https://www.domoticz.com/forum/download/file.php?id=2055

Op de volgende site wordt prima uitgelegd hoe je de frontpage dient te installeren en kunt customizen: https://contactkring.nl/phpbb/viewtopic.php?t=17

Het eindresultaat ziet er in ieder geval zo uit

Noot: De BMP280 stribbelt nog wat tegen bij het maken van dit plaatje, vandaar de 0 waarden bij Buiten Baro en de voorspelling van Zeer zware storm 😉

En dit is bijbehorende HTML code:

pi@raspberrypi:~/domoticz/www/views $ cat weerstation.html
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”utf-8″>
<title>Weerstation</title>
<link href=’http://fonts.googleapis.com/css?family=Orbitron:700′ rel=’stylesheet ‘ type=’text/css’>
<script src=”http://code.jquery.com/jquery-3.4.1.min.js”></script>
<style>
div#cnt {
width: 990px;
margin: 0 auto;
text-align: center;
}

a, a:visited { text-decoration: none; color: #336699; }
a:hover { text-decoration: none; color: #003366; }

#frame {
float: left;
margin: 0px;
padding: 0px 2px 0px 2px;
}

#label_lg {
font-family: arial;
font-weight: normal;
color: #999;
font-size: 17px;
margin-top: -20px;
height: 25px;
line-height: 10px;
}

#ilux, #ihum, #astat, #obaro, #otemp, #ohum, #itemp, #inslg, #tnslg, #onslg, #vn slg, #awisp, #mwisp, #gwisp, #vwisp, #gtemp, #wrich
{
font-family: Orbitron, serif;
font-weight: bold;
width: 162px;
padding: 10px;
border: 1px solid #666;
height: 90px;
line-height: 75px;
font-size: 90px;
color: #999;
}

#luxv, #barov, #mwikr
{
font-family: Orbitron, serif;
font-weight: bold;
width: 162px;
padding: 10px;
border: 1px solid #666;
height: 90px;
line-height: 35px;
font-size: 40px;
color: #999;
}

#al {
margin-left: -35px;
margin-top: 55px;
width: 1050px;height: 570px;
}

</style>
</head>
<div id=”images”></div>
<body bgcolor=”#000″ onload=”TijdTonen()”>
<div id=”cnt”>
<div style=”margin-bottom:5px;”>

<div style=”width: 60%; margin: 0px auto;color: white;font-size: 100px;”>
<table width=”100%” border=”0″>
<caption style=”color:white;font-size:30px;text-align: center” bgcolor=”#292 929″>
Weerstation
</caption>
<tbody>
<tr>
<td style=”color:white;font-size:30px;text-align: center” bgcolor=”#2929 29″><SCRIPT TYPE=”text/javascript” LANGUAGE=”JavaScript”><!–

function initArray() {
this.length = initArray.arguments.length ;
for (var i = 0; i < this.length; i++)
this[i+1] = initArray.arguments[ i];
}

var dagArray = new initArray(“Zondag”,”M aandag”, “Dinsdag”,”Woensdag”,”Donderdag”,”Vrijdag”,”Zaterdag”);

var nu = new Date();
var dagtekst = dagArray[(nu.getDay()+1)] ;

document.write(dagtekst);

//–>
</script>
</td>
<td style=”color:white;font-size:30px;text-align: center” bgcolor=”#2929 29″>&nbsp;</td>
<td style=”color:white;font-size:30px;” bgcolor=”#292929″ align= center><script TYPE=”text/javascript” LANGUAGE=”JavaScript”><!–
document.write(‘<FORM NAME=tijdform>’);
document.write(‘<INPUT TYPE=”text” NAME=”tijdvel d” SIZE=”5″ style=”color: white;font-size: 30px;border: none;background-color:#2 92929;text_align: center;padding-top: 30px”/>’);
document.write(‘<\/FORM>’);

function TijdTonen() {
var timerID = null;
var timerRunning = false;
if(timerRunning)
clearTimeout(timerID);
timerRunning = false;

var nu = new Date();
var uren = nu.getHours();
var uren2 = ((uren < 10) ? “0” : “”) + uren;
var minuten = nu.getMinutes();
var minuten2 = ((minuten < 10) ? “:0” : “:”) + m inuten;
var seconden = nu.getSeconds();
var seconden2 = ((seconden < 10) ? “:0” : “:”) + seconden;

var tijdweergave = uren2 + minuten2 + seconden2

document.tijdform.tijdveld.value = tijdweergave;
timerID = setTimeout(“TijdTonen()”,1000);
timerRunning = true;
}

//–>
</SCRIPT>
</td>
<td style=”color:white;font-size:30px;” align=center bgcolor=#29 2929><SCRIPT TYPE=”text/javascript” LANGUAGE=”JavaScript”><!–
var nu = new Date();
var dag = nu.getDate();
var dag2 = ((dag < 10) ? “0” : “”) + dag;
var maand = nu.getMonth() + 1;
var maand2 = ((maand < 10) ? “0” : “”) + maand;
var jaar = nu.getYear();
var jaar4 = ((jaar < 1900) ? (jaar + 1900) : (ja ar));

document.write(dag2 + “-” + maand2 + “-” + jaar4 );
//–>
</SCRIPT>
</td>
</tr>
<tr>
<td>
<a href=”http://192.168.2.29:8080/#/Devices/183/Log”>
<div id=”gtemp” style=”color:lightblue;font-size:50px;text-align: center;border: “>–</div>
<div id=”label_lg” style=”text-align: center”>Gevoelstemperatuur</ div>
</a>
</td>
<td>
<a href=”http://192.168.2.29:8080/#/Devices/87/Log”>
<div id=”otemp” style=”font-size:40px;color:darkorange;text-align: center;”>–</div>
<div id=”label_lg” style=”text-align: center”>Buiten Temp (º<span class=”degsign”>C</span>)</div>
</a>
</td>
<td>
<a href=”http://192.168.2.29:8080/#/Devices/88/Log”>
<div id=”obaro” style=”font-size:40px;color:green;text-align: cent er;”>–</div>
<div id=”label_lg” style=”text-align: center”>Buiten Baro</div>
</a>
</td>
<td>
<a href=”http://192.168.2.29:8080/#/Devices/85/Log”>
<div id=”ilux” style=”font-size:40px;color:yellow;text-align: cent er;”>–</div>
<div id=”label_lg” style=”text-align: center”>Buiten Lux</div>
</a>
</td>
</tr>
</tbody>
</table>
<table width=”100%” border=”0″>
<tbody>
<tr>
<td>
<a href=”http://192.168.2.29:8080/#/Devices/33/Log”>
<div id=”ihum” style=”color:lightblue;font-size:50px;text-align: cente r;”>–</div>
<div id=”label_lg” style=”text-align: center”>Woonkamer Hum (%)</div>
</a>
</td>
<td>
<a href=”http://192.168.2.29:8080/#/Devices/33/Log”>
<div id=”itemp” style=”font-size:40px;color:darkorange;text-align: cen ter;”>–</div>
<div id=”label_lg” style=”text-align: center”>Woonkamer Temp (º<span c lass=”degsign”>C</span>)</div>
</a>
</td>
<td>
<div id=”barov” style=”font-size:20px;color:blue;text-align: center;”>– </div>
<div id=”label_lg” style=”text-align: center”>Voorspelling</div>
</td>
<td>
<div id=”luxv” style=”font-size:20px;color:blue;text-align: center;”>–< /div>
<div id=”label_lg” style=”text-align: center”>Situatie</div>
</td>
</tr>
</tbody>
</table>
<table width=”100%” border=”0″>
<tbody>
<tr>
<td>
<div id=”onslg” style=”color:lightblue;font-size:50px;text-align: cent er;”>–</div>
<div id=”label_lg” style=”text-align: center”>Neerslag 5 min. (ml)</di v>
</td>
<td>
<a href=”http://192.168.2.29:8080/#/Devices/158/Log”>
<div id=”vnslg” style=”font-size:40px;color:darkorange;text-align: cen ter;”>–</div>
<div id=”label_lg” style=”text-align: center”>#Neerslag vandaag (ml)</ div>
</a>
</td>
<td>
<a href=”http://192.168.2.29:8080/#/Devices/84/Log”>
<div id=”ohum” style=”color:lightblue;font-size:50px;text-align: cente r;border: “>–</div>
<div id=”label_lg” style=”text-align: center”>Buiten Humidity (%)</div >
</a>
</td>
<td>
<div id=”wrich” style=”font-size:60px;color:blue;text-align: center;”> </div>
<div id=”label_lg” style=”text-align: center”>Windrichting</div>
</td>
</tr>
</tbody>
</table>
<table width=”100%” border=”0″>
<tbody>
<tr>
<td>
<div id=”awisp” style=”color:lightblue;font-size:50px;text-align: cent er;”>–</div>
<div id=”label_lg” style=”text-align: center”>Act windsnelh km/uur</di v>
</td>
<td>
<a href=”http://192.168.2.29:8080/#/Devices/181/Log”>
<div id=”mwisp” style=”font-size:40px;color:darkorange;text-align: cen ter;”>–</div>
<div id=”label_lg” style=”text-align: center”>Max windsnelh km/uur</di v>
</a>
</td>
<td>
<div id=”vwisp” style=”font-size:40px;color:darkorange;text-align: cen ter;”>–</div>
<div id=”label_lg” style=”text-align: center”>Avg windsnelh km/uur</di v>
</td>
<td>
<div id=”mwikr” style=”font-size:20px;color:blue;text-align: center;”> –</div>
<div id=”label_lg” style=”text-align: center”>Max Windkracht</div>
</td>
</tr>
</tbody>
</table>
<table width=”100%” border=”0″>
<tbody>
<tr>
<td>
<IFRAME SRC=”https://gadgets.buienradar.nl/gadget/radarfivedays” NORESIZ E SCROLLING=NO HSPACE=0 VSPACE=0 FRAMEBORDER=1 MARGINHEIGHT=0 MARGINWIDTH=0 WIDT H=180 HEIGHT=406></IFRAME>
</td>
<td>
<IFRAME NORESIZE SCROLLING=NO HSPACE=0 VSPACE=0 FRAMEBORDER=1 MARGINHEIG HT=0 MARGINWIDTH=0 WIDTH=180 HEIGHT=406></IFRAME>
</td>
<td>
<IFRAME NORESIZE SCROLLING=NO HSPACE=0 VSPACE=0 FRAMEBORDER=1 MARGINHEIG HT=0 MARGINWIDTH=0 WIDTH=180 HEIGHT=406></IFRAME>
</td>
<td>
<IFRAME NORESIZE SCROLLING=NO HSPACE=0 VSPACE=0 FRAMEBORDER=1 MARGINHEIG HT=0 MARGINWIDTH=0 WIDTH=180 HEIGHT=406></IFRAME>
</td>
</tr>
</tbody>
</table>
</div>

<div>
<div id=”frame” style=”position: relative;top: 100px;;”> </div>

<div id=”frame” style=”position: relative;top: 100px”> </div>
</div>

<div>
<div id=”frame” style=”position: relative;top: 100px”> </div>

<div id=”frame” style=”position: relative;top: 100px”> </div>
</div>

<div id=”all”></div><br>
</div>
</div>

<script type=”text/javascript” charset=”utf-8″>
function RefreshData()
{
clearInterval($.refreshTimer);
var jurl=”http://”+$.domoticzusername+”;”+$.domoticzpassword+”@”+$.domoticzurl+”/json.htm?type=devices&plan=”+$.roomplan;
$.getJSON(jurl,
{
format: “json”
},
function(data) {
if (typeof data.result != ‘undefined’) {
if (typeof data.WindSign != ‘undefined’) {
$(‘.windsign’).html(data.WindSign);
}
if (typeof data.TempSign != ‘undefined’) {
$(‘.degsign’).html(data.TempSign);
}
$.each(data.result, function(i,item){
for( var ii = 0, len = $.PageArray.length; ii < len; ii++ ) {
if( $.PageArray[ii][0] === item.idx ) {
var vtype=$.PageArray[ii][1];
var vlabel=$.PageArray[ii][2];
var vdata=item[vtype];
if (typeof vdata == ‘undefined’) {
vdata=”??”;
}
else {
vdata=new String(vdata). split(” “,1)[0];
}
if ( vlabel == ‘ilux’ ) {
if (vdata >= 100000) {
document.getElem entById(“luxv”).innerHTML=”Zonnig”;
}
else if (vdata >= 15000) {
document.getElem entById(“luxv”).innerHTML=”Daglicht”;
}
else if (vdata >= 1000) {
document.getElem entById(“luxv”).innerHTML=”Bewolkt”;
}
else if (vdata >= 100) {
document.getElem entById(“luxv”).innerHTML=”Donkere dag”;
}
else if (vdata >= 0.1) {
document.getElem entById(“luxv”).innerHTML=”Volle maan”;
}
else {
document.getElem entById(“luxv”).innerHTML=”Donker”;
}
}
if ( vlabel == ‘obaro’ ) {
if (vdata >= 1050) {
document.getElem entById(“barov”).innerHTML=”Zeer mooi”;
}
else if (vdata >= 1035) {
document.getElem entById(“barov”).innerHTML=”Mooi weer”;
}
else if (vdata >= 1025) {
document.getElem entById(“barov”).innerHTML=”Goed weer”;
}
else if (vdata >= 1010) {
document.getElem entById(“barov”).innerHTML=”Veranderlijk”;
}
else if (vdata >= 995) {
document.getElem entById(“barov”).innerHTML=”Regen of wind”;
}
else if (vdata >= 980) {
document.getElem entById(“barov”).innerHTML=”Veel regen”;
}
else if (vdata >= 970) {
document.getElem entById(“barov”).innerHTML=”Storm”;
}
else if (vdata >= 955) {
document.getElem entById(“barov”).innerHTML=”Zware storm”;
}
else {
document.getElem entById(“barov”).innerHTML=”Zeer zware storm”;
}
}
if ( vlabel == ‘inslg’ ) {
document.getElementById( “onslg”).innerHTML=parseFloat(vdata).toLocaleString(“en-US”, { maximumFractionDi gits: 2, minimumFractionDigits: 2 });
}
if ( vlabel == ’tnslg’ ) {
document.getElementById( “vnslg”).innerHTML=parseFloat(vdata).toLocaleString(“en-US”, { maximumFractionDi gits: 2, minimumFractionDigits: 2 });
}
if ( vlabel == ‘gwisp’ ) {
document.getElementById( “vwisp”).innerHTML=parseFloat(vdata.split(“;”)[2]).toLocaleString(“en-US”, { max imumFractionDigits: 2, minimumFractionDigits: 2});
}
if ( vlabel == ‘mwisp’ ) {
if (vdata < 1) {
document.getElem entById(“mwikr”).innerHTML=”0 – windstil”;
}
else if (vdata >= 1 && v data < 6) {
document.getElem entById(“mwikr”).innerHTML=”1 – zwakke wind”;
}
else if (vdata >= 6 && v data < 12) {
document.getElem entById(“mwikr”).innerHTML=”2 – zwakke wind”;
}
else if (vdata >= 12 && vdata <= 20) {
document.getElem entById(“mwikr”).innerHTML=”3 – matige wind”;
}
else if (vdata >= 20 && vdata <= 29) {
document.getElem entById(“mwikr”).innerHTML=”4 – matige wind”;
}
else if (vdata >= 29 && vdata <= 39) {
document.getElem entById(“mwikr”).innerHTML=”5 – vrij krachtige wind”;
}
else if (vdata >= 39 && vdata <= 50) {
document.getElem entById(“mwikr”).innerHTML=”6 – krachtige wind”;
}
else if (vdata >= 50 && vdata <= 62) {
document.getElem entById(“mwikr”).innerHTML=”7 – harde wind”;
}
else if (vdata >= 62 && vdata <= 75) {
document.getElem entById(“mwikr”).innerHTML=”8 – stormachtige wind”;
}
else if (vdata >= 75 && vdata <= 89) {
document.getElem entById(“mwikr”).innerHTML=”9 – storm”;
}
else if (vdata >= 89 && vdata <= 103) {
document.getElem entById(“mwikr”).innerHTML=”10 – zware storm”;
}
else if (vdata >= 103 && vdata <= 118) {
document.getElem entById(“mwikr”).innerHTML=”11 – zeer zware storm”;
}
else {
document.getElem entById(“mwikr”).innerHTML=”12 – orkaan”;
}
}
$(‘#’+vlabel).html(vdata);
}
}
});
}
});
$.refreshTimer = setInterval(RefreshData, 10000);
}

$(document).ready(function() {
$.roomplan=21;
$.domoticzurl=”192.168.2.29:8080″;
$.domoticzusername=”c3lkcw==”;
$.domoticzpassword=”WCFkbzIwMTk=”;
//format: idx, value, label, comment
$.PageArray = [
[’33’,’Temp’,’itemp’,’woonkamer’],
[’33’,’Humidity’,’ihum’,’woonkamer’],
[’87’,’Temp’,’otemp’,’buiten’],
[’84’,’Humidity’,’ohum’,’buiten’],
[’88’,’Barometer’,’obaro’,’buiten’],
[’85’,’Data’,’ilux’,’buiten’],
[‘157′,’Data’,’inslg’,’buiten’],
[‘158′,’Data’,’tnslg’,’buiten’],
[‘180′,’Data’,’awisp’,’buiten’],
[‘181′,’Data’,’mwisp’,’buiten’],
[‘182′,’Data’,’gwisp’,’buiten’],
[‘183′,’Temp’,’gtemp’,’buiten’],
[‘208′,’Data’,’wrich’,’buiten’]
];

RefreshData();
});
</script>

</body>
</html>

Windsnelheid

Een digitale anemometer wordt aangesloten op de Wemos D1 mini.

Pinout:

Wemos Anemometer
1 D6 (GPIO12) Yellow
2 G Red (Gnd)

De straal van de Anemometer = 9cm, de omtrek is dan 2π9 = 56,55 cm, met andere woorden bij een volledige omwenteling bedraagt de afgelegde afstand van de wind 56,55 cm.

voorbeeld 1: met een count van 24 per 15 seconden 

windsnelheid = (24 * 56,55)/15/100 = 0,9048 m/sec

windsnelheid  = (0,9048 / 1000) * (60 * 60) = 3,25 km/uur

voorbeeld 2: met een count van 350 per 15 seconden 

windsnelheid = (350 * 56,55)/15/100 = 13,195 m/sec

windsnelheid  = (13,195 / 1000) * (60 * 60) = 47,50 km/uur

Van windsnelheid naar Windkracht in Beaufort

Voorbeeld 1: Een windsnelheid van 3,25 km/uur betekent volgens bovenstaande tabel een windkracht 1 (zwakke wind)

Voorbeeld 2: Een windsnelheid van 47,50 km/uur betekent windkracht 6 (krachtige wind)

Gevoelstemperatuur bereken volgens JAG/TI-methode:

Het KNMI hanteert vanaf de winter 2009/2010 voor de berekening van de gevoelstemperatuur in de winter de zgn. JAG/TI-methode, in formule: 

G = 13,12 + 0,6215 T – 11,37 (3,6 W)0,16 + 0,3965 T (3,6 W)0,16 

met G voor de gevoelstemperatuur, T voor de temperatuur in °C, gemeten op 1,50 meter hoogte en W voor de gemiddelde windsnelheid in m/s, gemeten op 10 meter hoogte. De JAG/TI-methode is ontwikkeld voor een luchttemperatuur tussen -46 en +10 °C en voor een windsnelheid op standaard meethoogte (10 meter) tussen 1,3 en 49,0 m/s en een wandelsnelheid van 4,8 km/uur.

Anemometer geconfigureerd als Device in ESP Easy:

Label Waarde Omschrijving
Device Pulse counter Generieke Pulse counter
Name Anemometer
Delay 15 Zend iedere 15 seconden het aantal getelde pulses (omwentelingen anemometer) naar MQTT
IDX/Var 179 Domoticz virtuele sensor idx 179 Anemometer
1st GPIO GPIO-12 Pin (D6,  GPIO-12) waar de gele draad van de anemometer op is aangesloten
Debounce Time (mSec) 5 Zorgt er voor dat evt. false signalen uitgefilterd worden
Counter Type Delta Zorgt er voor dat iedere 15 seconden het delta teruggegeven wordt tussen de huidige meting van het aantal pulses en de vorige meting
Send Data On Stuur de verzamelde data naar de MQTT-broker pi
Formula Count
Formula Total
Formula Time
Value Name 1 Count
Value Name 2 Total
Value Name 3 Time

In Domoticz virtuele sensors aangemaakt:

IDX Naam Omschrijving
179 Anemometer Gemeten omwentelingen per 15 seconden
180 Actuele windsnelheid km/uur Actuele windsnelheid km/uur
181 Max Windsnelheid km/uur per dag Max Windsnelheid km/uur per dag
182 Gemiddelde Windsnelheid km/uur per dag Gemiddelde Windsnelheid km/uur per dag
183 Gevoelstemperatuur Gevoelstemperatuur volgens JAG/TI-methode 

Sensors in de ruimte ‘Weerstation’ gezet, dit t.b.v. het javascript in weerstation.html die hier op filtert (wordt later uitgelegd)

Node red flow aangemaakt om de volgende waarden uit te rekenen:

In node red de flow ‘Weerstation’ aangemaakt, deze flow voert vijf taken uit, namelijk:

  1. Actuele Windsnelheid km/uur
  2. Max Windsnelheid km/uur per dag
  3. Gemiddelde Windsnelheid km/uur per dag
  4. Reset de Actuele Windsnelheid km/uur vandaag om 23:59 uur, en zet deze op 0.0000
  5. Reset de Max Windsnelheid km/uur per dag vandaag om 23:59 uur, en zet deze op 0
  6. Rekent Gevoelstemperatuur uit

Node Omschrijving
MQTT in Leest de topic ‘domoticz/in’ uit de MQTT-message queue op pi
Select Device Filtert de messages van idx 179 (Anenometer) uit
Store windsnelheid Rekent de gemeten waarde om naar km/uur en stopt deze waarde in de flow variabele ‘windsnelheid_kmuur’
Get #Max Windsnelheid km/uur per dag Haalt het reeds opgebouwde maximum #Max Windsnelheid km/uur per dag vandaag op uit Domoticz via JSON call
Get #Gemiddelde Windsnelheid km/uur per dag Haalt het reeds opgebouwde gemiddelde # #Gemiddelde Windsnelheid km/uur per dag vandaag op uit Domoticz via JSON call
Get #Buitentemperatuur Haalt actuele buitentemperatuur uit Domoticz via JSON call
Actuele windsnelheid km/uur Bouwt een MQTT-message op om de Actuele windsnelheid km/uur in Domoticz te zetten
Max Windsnelheid km/uur per dag Bepaald of de Actuele windsnelheid hoger is dan de maximaal gemeten waarde op die dag, indien dit het geval is, dan wordt er een MQTT-message opgebouwd om de Max Windsnelheid km/uur per dag in Domoticz te zetten
Reset at 23:59 Zet elke dag om 23:59 het dagtotaal Max Windsnelheid km/uur per dag vandaag op 0.0000
Gemiddelde Windsnelheid km/uur per dag Telt de Actuele windsnelheid op bij de Totale windsnelheid per dag en deelt deze door het aantal waarnemingen, dan wordt er een MQTT-message opgebouwd om de Gemiddelde Windsnelheid km/uur en het aantal waarnemingen per dag in Domoticz te zetten
Gevoelstemperatuur Berekent gevoelstemperatuur op basis van Buitentemperatuur en Actuele Windsnelheid volgens JAG/TI-methode, daarna wordt er een MQTT-message opgebouwd om de Gevoelstemperatuur in Domoticz te zetten
Reset at 23:59 Zet elke dag om 23:59 het dagtotaal Gemiddelde Windsnelheid km/uur per dag vandaag op 0.0000
MQTT out Schrijft de in Add Neerslag opgebouwde MQTT-message naar de MQTT-broker op pi

Export van de node red flow: 

[{“id”:”2eb664a8.527cbc”,”type”:”function”,”z”:”ce5a71b4.6f471″,”name”:”Store windsnelheid”,”func”:”var r = 9; // straal Anemometer = 9 cm\nvar omtrek = 2 * 3.14159265358979323846 * r;\nvar interval = 15; // meetinteval in seconden\nvar temp = msg.payload.split(‘,’)[2]\n\ntemp = temp.split(‘:’)[1]\ntemp = temp.replace(‘\”}’, ”)\ntemp = parseInt(temp.replace(‘\”‘,”));\n\n// node.warn(\”temp=\”+temp);\n\nvar windsnelheid_msec = (temp * omtrek)/interval/100;\nvar windsnelheid_kmuur = (windsnelheid_msec/1000)*3600;\n\nnode.warn(\”windsnelheid_msec=\”+windsnelheid_msec);\n// node.warn(\”windsnelheid_kmuur=\”+windsnelheid_kmuur);\n\nflow.set(‘Windsnelheid_msec’,windsnelheid_msec);\nflow.set(‘Windsnelheid_kmuur’,windsnelheid_kmuur.toFixed(1));\n\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:590,”y”:240,”wires”:[[“ce493040.c1818″,”d194c6cc.ce5928″,”13e3ceb3.841f31″,”566af669.e57568”]]},{“id”:”ce493040.c1818″,”type”:”http request”,”z”:”ce5a71b4.6f471″,”name”:”Get #Max Windsnelheid km/uur per dag”,”method”:”GET”,”ret”:”obj”,”paytoqs”:”ignore”,”url”:”http://192.168.2.29:8080/json.htm?type=devices&rid=181″,”tls”:””,”persist”:false,”proxy”:””,”authType”:””,”x”:900,”y”:300,”wires”:[[“f77d7c.c971a288”]]},{“id”:”f77d7c.c971a288″,”type”:”function”,”z”:”ce5a71b4.6f471″,”name”:”Max Windsnelheid km/uur per dag”,”func”:”// \”domoticz/in {\”idx\”:181,\”RSSI\”:5,\”nvalue\”:0,\”svalue\”:\”53\”}\”\n\nvar currentMaxWindsnelheid = parseFloat(msg.payload.result[0].Data);\nvar MQTTString = ‘{\”idx\”:181,\”RSSI\”:6,\”nvalue\”:0,\”svalue\”:\”‘;\n\nif (parseFloat(flow.get(‘Windsnelheid_kmuur’)) > currentMaxWindsnelheid) {\n\n    MQTTString = MQTTString + parseFloat(flow.get(‘Windsnelheid_kmuur’)) + ‘\”}’;\n    \n} else {\n    MQTTString = MQTTString + currentMaxWindsnelheid + ‘\”}’;\n}\n\nmsg.payload = MQTTString;\n\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:1280,”y”:300,”wires”:[[“ad678d8b.e631a”]]},{“id”:”1ec57aa3.ce9c45″,”type”:”inject”,”z”:”ce5a71b4.6f471″,”name”:”Reset at 23:59″,”props”:[{“p”:”payload”}],”repeat”:””,”crontab”:”59 23 * * *”,”once”:false,”onceDelay”:0.1,”topic”:””,”payload”:”{\”idx\”:181,\”RSSI\”:6,\”nvalue\”:0,\”svalue\”:\”0.0000\”}”,”payloadType”:”str”,”x”:1220,”y”:340,”wires”:[[“ad678d8b.e631a”]]},{“id”:”d194c6cc.ce5928″,”type”:”function”,”z”:”ce5a71b4.6f471″,”name”:”Actuele windsnelheid km/uur”,”func”:”// \”domoticz/in {\”idx\”:180,\”RSSI\”:5,\”nvalue\”:0,\”svalue\”:\”43.2\”}\”\n\nvar MQTTString = ‘{\”idx\”:180,\”RSSI\”:6,\”nvalue\”:0,\”svalue\”:\”‘+ parseFloat(flow.get(‘Windsnelheid_kmuur’)) + ‘\”}’;\n\nmsg.payload = MQTTString;\n\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:1260,”y”:240,”wires”:[[“ad678d8b.e631a”]]},{“id”:”13e3ceb3.841f31″,”type”:”http request”,”z”:”ce5a71b4.6f471″,”name”:”Get #Gemiddelde Windsnelheid km/uur per dag”,”method”:”GET”,”ret”:”obj”,”paytoqs”:”ignore”,”url”:”http://192.168.2.29:8080/json.htm?type=devices&rid=182″,”tls”:””,”persist”:false,”proxy”:””,”authType”:””,”x”:920,”y”:400,”wires”:[[“59a0e6fb.a3b2a8”]]},{“id”:”59a0e6fb.a3b2a8″,”type”:”function”,”z”:”ce5a71b4.6f471″,”name”:”Gemiddelde Windsnelheid km/uur per dag”,”func”:”// \”domoticz/in {\”idx\”:182,\”RSSI\”:5,\”nvalue\”:0,\”svalue\”:\”0;N;5.0000;0;5760;0\”}\”\n\nif (parseFloat(flow.get(‘Windsnelheid_kmuur’)) > 0) {\n\nvar currentAvgWindsnelheid = parseFloat(msg.payload.result[0].Data.split(‘;’)[2]);\nvar currentAvgCount = parseFloat(msg.payload.result[0].Data.split(‘;’)[4]);\n\nvar TotalAvgWindsnelheid = currentAvgWindsnelheid * currentAvgCount;\ncurrentAvgCount++;\nTotalAvgWindsnelheid = TotalAvgWindsnelheid + parseFloat(flow.get(‘Windsnelheid_kmuur’));\ncurrentAvgWindsnelheid = (TotalAvgWindsnelheid / currentAvgCount).toFixed(4);\n\n\nvar MQTTString = ‘{\”idx\”:182,\”RSSI\”:6,\”nvalue\”:0,\”svalue\”:\”0;N;’;\nMQTTString = MQTTString + currentAvgWindsnelheid + ‘;0;’\nMQTTString = MQTTString + currentAvgCount + ‘;0\”}’;\n\nmsg.payload = MQTTString;\n\nreturn msg;\n}”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:1300,”y”:400,”wires”:[[“ad678d8b.e631a”]]},{“id”:”11ddaaaa.9e71a5″,”type”:”inject”,”z”:”ce5a71b4.6f471″,”name”:”Reset at 23:59″,”props”:[{“p”:”payload”}],”repeat”:””,”crontab”:”59 23 * * *”,”once”:false,”onceDelay”:0.1,”topic”:””,”payload”:”{\”idx\”:182,\”RSSI\”:6,\”nvalue\”:0,\”svalue\”:\”0;N;0.0000;0;0;0\”}”,”payloadType”:”str”,”x”:1220,”y”:440,”wires”:[[“ad678d8b.e631a”]]},{“id”:”566af669.e57568″,”type”:”http request”,”z”:”ce5a71b4.6f471″,”name”:”Get #Buitentemperatuur”,”method”:”GET”,”ret”:”obj”,”paytoqs”:”ignore”,”url”:”http://192.168.2.29:8080/json.htm?type=devices&rid=87″,”tls”:””,”persist”:false,”proxy”:””,”authType”:””,”x”:850,”y”:520,”wires”:[[“c71fd00f.0018a”]]},{“id”:”c71fd00f.0018a”,”type”:”function”,”z”:”ce5a71b4.6f471″,”name”:”Gevoelstemperatuur”,”func”:”// \”domoticz/in {\”idx\”:183,\”RSSI\”:5,\”nvalue\”:0,\”svalue\”:\”-12.3\”}\”\n// =13,12+(0,6215*C$2)-(13,96*$B3)+(0,4867*C$2*$B3)\n\nvar MQTTString = ‘{\”idx\”:183,\”RSSI\”:6,\”nvalue\”:0,\”svalue\”:\”‘;\nvar Buitentemperatuur = parseFloat(msg.payload.result[0].Data);\nvar Gevoelstemperatuur = 13.12 + (0.6215*Buitentemperatuur) – (11.37 * Math.pow(3.6 * flow.get(‘Windsnelheid_msec’),0.16)) + (0.3965 * Buitentemperatuur * Math.pow(3.6 * flow.get(‘Windsnelheid_msec’),0.16));\nMQTTString = MQTTString + Gevoelstemperatuur.toFixed(2) + ‘\”}’;\n\nmsg.payload = MQTTString;\n\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:1240,”y”:520,”wires”:[[“ad678d8b.e631a”,”3f396361.0746ac”]]},{“id”:”ad678d8b.e631a”,”type”:”mqtt out”,”z”:”ce5a71b4.6f471″,”name”:”MQTT out”,”topic”:”domoticz/in”,”qos”:”2″,”retain”:””,”broker”:”ede154bd.f75f38″,”x”:1640,”y”:260,”wires”:[]},{“id”:”b843c62c.824168″,”type”:”mqtt in”,”z”:”ce5a71b4.6f471″,”name”:”MQTT in”,”topic”:”domoticz/in”,”qos”:”2″,”datatype”:”auto”,”broker”:”ede154bd.f75f38″,”x”:110,”y”:60,”wires”:[[“63c8c3c5.4ccfdc”]]},{“id”:”63c8c3c5.4ccfdc”,”type”:”switch”,”z”:”ce5a71b4.6f471″,”name”:”Select device”,”property”:”payload”,”propertyType”:”msg”,”rules”:[{“t”:”cont”,”v”:”\”idx\”:157″,”vt”:”str”},{“t”:”cont”,”v”:”\”idx\”:207″,”vt”:”str”},{“t”:”cont”,”v”:”\”idx\”:179″,”vt”:”str”}],”checkall”:”true”,”repair”:false,”outputs”:3,”x”:340,”y”:60,”wires”:[[“d5eba41e.1f6c08”],[“3dd2cf0f.5c492”],[“2eb664a8.527cbc”]]},{“id”:”ede154bd.f75f38″,”type”:”mqtt-broker”,”z”:””,”name”:”pi”,”broker”:”192.168.2.29″,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:false,”keepalive”:”60″,”cleansession”:true,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””,”closeTopic”:””,”closeQos”:”0″,”closePayload”:””,”willTopic”:””,”willQos”:”0″,”willPayload”:””}]

Website van het weerstation uitgebreidt met vier waarden:

  1. Act windsnelh km/uur
  2. Max windsnelh km/uur
  3. Avg windsnelh km/uur
  4. Max windkracht
  5. Gevoelstemperatuur

Meer info:

Windrichting

Een digitale Windvaan aangesloten op de analoge poort (A0) van de Wemos D1 mini, analoge poort is met een 10K ohm weerstand aangesloten op de 3,3v voeding van de Wemos.

Pinout:

Wemos Windvaan
1 3,3V 10K weerstand naar A0
2 A0 Zwart
3 G Groen (Gnd)

In de digitale Windvaan zitten weerstanden die er voor zorgen dat er een bepaalde spanning wordt afgegeven op basis van de windrichting, dit op een schaal van 0 tot 1024. 

M.b.v. een kompas heb ik het Noorden met een viltstift aangestreept op de Windvaan. Vervolgens langzaam de windvaan rechtsom gedraaid en daarbij de volgende waarden gemeten (kolom Voltage):

Windrichting Voltage Min Max
N Noord 276 271 281
NNO Noord Noord Oost 236 231 241
NO Noord Oost 593 588 598
ONO Oost Noord Oost 566 561 571
O Oost 878 873 883
OZO Oost Zuid Oost 773 768 778
ZO Zuid Oost 825 820 830
ZZO Zuid Zuid Oost 661 656 666
Z Zuid 736 731 741
ZZW Zuid Zuid West 388 383 393
ZW Zuid West 439 434 444
WZW West Zuid West 82 77 87
W West 91 87 96
WNW West Noord West 65 60 70
NW Noord West 180 175 185
NNW Noord Noord West 123 118 128

Bij dit meten zag ik soms lichte fluctuatie in het voltage, vandaar dat ik voor het bepalen van de windrichting een marge heb genomen van -5 en +5 t.o.v. de gemeten waarde (kolommen min en max)

Windvaan geconfigureerd als Device in ESP Easy:

Label Waarde Omschrijving
Device Analog input A0
Name Windvaan
Delay 300 Zend iedere 300 seconden(5 minuten) het gemeten voltage/ticks naar MQTT
IDX/Var 207 Domoticz virtuele sensor idx 207 Windvaan
Send Data On Stuur de verzamelde data naar de MQTT-broker pi
Formula Voltage
Decimals 2
Value Name 1 Voltage

In Domoticz virtuele sensor aangemaakt:

IDX Naam Omschrijving
207 Windvaan Gemeten voltage
208 Windrichting Windrichting (N, NO, NNO etc.)

Sensors in de ruimte ‘Weerstation’ gezet, dit t.b.v. het javascript in weerstation.html (Zie ook website gebouwd) die hier op filtert

In node red de flow ‘Weerstation’ aangepast, deze flow voert een extra taak uit, namelijk:

  1. Windrichting

Node Omschrijving
MQTT in Leest de topic ‘domoticz/in’ uit de MQTT-message queue op pi
Select Device Filtert de messages van idx 207 (Windvaan) uit
Bepaal windrichting Bepaalt op basis van gemeten voltage de windrichting en creëert op basis daarvan een MQTT-message
MQTT out Schrijft de in Bepaal windrichting opgebouwde MQTT-message naar de MQTT-broker op pi

Export van de node red flow:

[{“id”:”63c8c3c5.4ccfdc”,”type”:”switch”,”z”:”ce5a71b4.6f471″,”name”:”Select device”,”property”:”payload”,”propertyType”:”msg”,”rules”:[{“t”:”cont”,”v”:”\”idx\”:157″,”vt”:”str”},{“t”:”cont”,”v”:”\”idx\”:207″,”vt”:”str”},{“t”:”cont”,”v”:”\”idx\”:179″,”vt”:”str”}],”checkall”:”true”,”repair”:false,”outputs”:3,”x”:340,”y”:60,”wires”:[[“d5eba41e.1f6c08”],[“3dd2cf0f.5c492”],[“2eb664a8.527cbc”]]},{“id”:”b843c62c.824168″,”type”:”mqtt in”,”z”:”ce5a71b4.6f471″,”name”:”MQTT in”,”topic”:”domoticz/in”,”qos”:”2″,”datatype”:”auto”,”broker”:”ede154bd.f75f38″,”x”:110,”y”:60,”wires”:[[“63c8c3c5.4ccfdc”]]},{“id”:”3dd2cf0f.5c492″,”type”:”function”,”z”:”ce5a71b4.6f471″,”name”:”Bepaal Windrichting”,”func”:”// {\”idx\”:207,\”RSSI\”:10,\”nvalue\”:0,\”svalue\”:\”200.00\”}\nvar temp = msg.payload.split(‘,’)[2]\n\n// node.warn(\”temp=\”+temp);\n\ntemp = temp.split(‘:’)[1]\ntemp = temp.replace(‘\”}’, ”)\ntemp = temp.replace(‘\”‘,”);\n\nswitch(true) {\n    case (temp > 271 && temp < 281):\n        windrichting=\”N\”;\n        break;\n    case (temp > 231 && temp < 241):\n        windrichting=\”NNO\”;\n        break;\n    case (temp > 588 && temp < 598):\n        windrichting=\”NO\”;\n        break;\n    case (temp > 561 && temp < 571):\n        windrichting=\”ONO\”;\n        break;\n    case (temp > 873 && temp < 883):\n        windrichting=\”O\”;\n        break; \n    case (temp > 768 && temp < 778):\n        windrichting=\”OZO\”;\n        break;\n    case (temp > 820 && temp < 830):\n        windrichting=\”ZO\”;\n        break;    \n    case (temp > 656 && temp < 666):\n        windrichting=\”ZZO\”;\n        break;\n    case (temp > 731 && temp < 741):\n        windrichting=\”Z\”;\n        break;\n    case (temp > 383 && temp < 393):\n        windrichting=\”ZZW\”;\n        break;\n    case (temp > 434 && temp < 444):\n        windrichting=\”ZW\”;\n        break;\n    case (temp > 77 && temp < 87):\n        windrichting=\”WZW\”;\n        break;\n    case (temp > 87 && temp < 96):\n        windrichting=\”W\”;\n        break;\n    case (temp > 60 && temp < 70):\n        windrichting=\”WNW\”;\n        break; \n    case (temp > 175 && temp < 185):\n        windrichting=\”NW\”;\n        break;\n    case (temp > 118 && temp < 128):\n        windrichting=\”NNW\”;\n        break;\n    default:\n        windrichting=\”—\”;\n}\n\n// node.warn(\”windrichting=\”+windrichting);\n\nvar MQTTString = ‘{\”idx\”:208,\”RSSI\”:6,\”nvalue\”:0,\”svalue\”:\”‘ + windrichting + ‘\”}’;\n\nmsg.payload = MQTTString;\n\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:1240,”y”:160,”wires”:[[“ad678d8b.e631a”]]},{“id”:”ad678d8b.e631a”,”type”:”mqtt out”,”z”:”ce5a71b4.6f471″,”name”:”MQTT out”,”topic”:”domoticz/in”,”qos”:”2″,”retain”:””,”broker”:”ede154bd.f75f38″,”x”:1640,”y”:260,”wires”:[]},{“id”:”ede154bd.f75f38″,”type”:”mqtt-broker”,”z”:””,”name”:”pi”,”broker”:”192.168.2.29″,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:false,”keepalive”:”60″,”cleansession”:true,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””,”closeTopic”:””,”closeQos”:”0″,”closePayload”:””,”willTopic”:””,”willQos”:”0″,”willPayload”:””}]

Website van het weerstation uitgebreidt met windrichting

Meer info vindt je hier:

Neerslag per 24 uur

Een digitale Neerslagmeter wordt op GND en D5 (GPIO14) aangesloten op de tweede Wemos D1 mini.

Pinout:

RJ11:

  1. Groen
  2. Rood
Wemos Neerslagmeter
1 D5 Groen
2 G Red (Gnd)

Verdere beschrijving van hoe de Neerslagmeter aangesloten kan worden op de Wemos vindt je hier:

ESPEasy als volgt geconfigureerd:

Label Waarde Omschrijving
Device Pulse counter Generieke Pulse counter
Name Neerslag
Delay 300 Zend iedere 300 seconden (5 minuten) het aantal getelde pulses naar MQTT
IDX/Var 157 Domoticz virtuele sensor idx 157 Neerslag
1st GPIO GPIO-14 Pin (D5,  GPIO-14) waar de groene draad van de rain gauge op is aangesloten
Debounce Time (mSec) 500 Zorgt er voor dat evt. false signalen uitgefilterd worden
Counter Type Delta Zorgt er voor dat iedere 300 seconden het delta teruggegeven wordt tussen de huidige meting van het aantal pulses en de vorige meting
Send Data On Stuur de verzamelde data naar de MQTT-broker pi
Formula Count %value%*0.30303 Pulses * 0.30303, waarbij 0.30303 de inhoud in ml is van de bucket van de rain gauge, dit levert de Neerslag in ml op per 5 minuten
Formula Total %value%*0.30303 Totaal aantal Pulses * 0.30303, waarbij Totaal aantal Pulses gemeten wordt vanaf de boot van de Wemos, aan deze waarde hebben we dus niet zoveel
Formula Time
Value Name 1 Count
Value Name 2 Total
Value Name 3 Time

In Domoticz twee virtuele sensors aangemaakt:

IDX Naam Omschrijving
157 Neerslag Gemeten neerslag per 5 minuten (300 seconden)
158 #Neerslag vandaag Totale neerslag op een dag, wordt om 23:59 uur gereset naar 0

Beide sensors in de ruimte ‘Weerstation’ gezet, dit t.b.v. het javascript in weerstation.html die hier op filtert

In node red de flow ‘Weerstation’ aangepast, deze flow voert twee extra taken uit, namelijk:

  1. Plust de gemeten neerslag per 5 minuten op bij het dagtotaal #Neerslag vandaag
  2. Reset het dagtotaal #Neerslag vandaag om 23:59 uur, en zet deze op 0.0000
Node Omschrijving
MQTT in Leest de topic ‘domoticz/in’ uit de MQTT-message queue op pi
Select Device Filtert de messages van idx 157 (Rain-gauge) uit
Store neerslag Stopt de gemeten waarde in de flow variabele ‘Neerslag’
Get #Neerslag Haalt het reeds opgebouwde dagtotaal #Neerslag vandaag op uit Domoticz via JSON call
Add Neerslag Telt de gemeten waarde (opgeslagen in flow variabele ‘Neerslag’) op bij het opgehaalde dagtotaal, en bouwt met dit nieuwe dagtotaal een MQTT-message op om het dagtotaal in Domoticz te zetten
Reset at 23:59 Zet elke dag om 23:59 het dagtotaal #Neerslag vandaag op 0.0000
MQTT out Schrijft de in Add Neerslag opgebouwde MQTT-message naar de MQTT-broker op pi

Export van de node red flow:

[{“id”:”63c8c3c5.4ccfdc”,”type”:”switch”,”z”:”ce5a71b4.6f471″,”name”:”Select device”,”property”:”payload”,”propertyType”:”msg”,”rules”:[{“t”:”cont”,”v”:”\”idx\”:157″,”vt”:”str”},{“t”:”cont”,”v”:”\”idx\”:179″,”vt”:”str”}],”checkall”:”true”,”repair”:false,”outputs”:2,”x”:340,”y”:60,”wires”:[[“d5eba41e.1f6c08”],[“2eb664a8.527cbc”]]},{“id”:”d5eba41e.1f6c08″,”type”:”function”,”z”:”ce5a71b4.6f471″,”name”:”Store neerslag”,”func”:”var temp = msg.payload.split(‘,’)[2]\ntemp = temp.split(‘:’)[1]\ntemp = temp.replace(‘\”}’, ”)\ntemp = temp.replace(‘\”‘,”);\n\n// node.warn(\”temp=\”+temp);\n\nflow.set(‘Windsnelheid’,temp);\n\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:580,”y”:60,”wires”:[[“858cb5ad.b08158”]]},{“id”:”bb9abe8e.b8da1″,”type”:”inject”,”z”:”ce5a71b4.6f471″,”name”:”Reset at 23:59″,”props”:[{“p”:”payload”}],”repeat”:””,”crontab”:”59 23 * * *”,”once”:false,”onceDelay”:0.1,”topic”:””,”payload”:”{\”idx\”:158,\”RSSI\”:6,\”nvalue\”:0,\”svalue\”:\”0.0000\”}”,”payloadType”:”str”,”x”:1220,”y”:100,”wires”:[[“ad678d8b.e631a”]]},{“id”:”3f396361.0746ac”,”type”:”debug”,”z”:”ce5a71b4.6f471″,”name”:””,”active”:true,”tosidebar”:true,”console”:false,”tostatus”:false,”complete”:”false”,”statusVal”:””,”statusType”:”auto”,”x”:1650,”y”:60,”wires”:[]},{“id”:”858cb5ad.b08158″,”type”:”http request”,”z”:”ce5a71b4.6f471″,”name”:”Get #Neerslag”,”method”:”GET”,”ret”:”obj”,”paytoqs”:”ignore”,”url”:”http://192.168.2.29:8080/json.htm?type=devices&rid=158″,”tls”:””,”persist”:false,”proxy”:””,”authType”:””,”x”:820,”y”:60,”wires”:[[“be034d40.d05b3”]]},{“id”:”be034d40.d05b3″,”type”:”function”,”z”:”ce5a71b4.6f471″,”name”:”Add Neerslag”,”func”:”// \”domoticz/in {\”idx\”:158,\”RSSI\”:6,\”nvalue\”:0,\”svalue\”:\”0.0000\”}\”\nvar currentNeerslag = parseFloat(msg.payload.result[0].Data);\nvar MQTTString = ‘{\”idx\”:158,\”RSSI\”:6,\”nvalue\”:0,\”svalue\”:\”‘;\n\ncurrentNeerslag = currentNeerslag + parseFloat(flow.get(‘Neerslag’));\nMQTTString = MQTTString + currentNeerslag + ‘\”}’;\n\nmsg.payload = MQTTString;\n\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:1220,”y”:60,”wires”:[[“ad678d8b.e631a”,”3f396361.0746ac”]]},{“id”:”b843c62c.824168″,”type”:”mqtt in”,”z”:”ce5a71b4.6f471″,”name”:”MQTT in”,”topic”:”domoticz/in”,”qos”:”2″,”datatype”:”auto”,”broker”:”ede154bd.f75f38″,”x”:110,”y”:60,”wires”:[[“63c8c3c5.4ccfdc”]]},{“id”:”ede154bd.f75f38″,”type”:”mqtt-broker”,”z”:””,”name”:”pi”,”broker”:”192.168.2.29″,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:false,”keepalive”:”60″,”cleansession”:true,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””,”closeTopic”:””,”closeQos”:”0″,”closePayload”:””,”willTopic”:””,”willQos”:”0″,”willPayload”:””}]

Website van het weerstation uitgebreidt met twee waarden:

  1. Neerslag 5 min. (ml)
  2. #Neerslag vandaag (ml)

Temperatuur in Tuinkas

Omdat het weerstation op de kas bevestigd is, is dit ook een mooie gelegenheid om de temperatuur in de kas te meten. Voor het meten van de temperatuur in kas gebruik ik een tweede DS18B20 Temperatuur Sensor. Als volgt aan te sluiten op de Wemos D1 mini met ESPEasy:

Pinout:

Wemos DS18B20
1 3,3V Rood (VCC)
2 D4 Geel (Data)
3 G Zwart (Gnd)

Noot: Het is mogelijk om meerdere DB18B20 sensors aan te sluiten op dezelfde GPIO doordat ze een uniek adres hebben, dus de D4 pin wordt gedeeld met de DS18B20 welke de buiten temperatuur meet.

Verdere beschrijving van het configureren van ESP kun je vinden op https://ehoco.nl/zelf-ds18b20-thermometer-maken-met-espeasy-voor-domoticz/

Neerslagindicatie

De neerslagmeter registreert 0,33mm per keer. Zodra de eerste 0,33mm geconstateerd wordt heb je je Neerslagindicatie. In de praktijk te testen of dit voldoende is.

Data opgeslagen in Domotica database voor statistieken

Door de Wemos D1 mini’s te voorzien van EspEasy en te configureren voor gebruik met Domoticz worden alle verzamelde waarden opgeslagen in de Domoticz database en zijn beschikbaar voor het aansturen van bijv. raamopeners of ventilatoren. En natuurlijk zijn de actuele gegevens ook raadpleegbaar in de app.

De exacte configuratie van Domoticz moet nog uitgewerkt worden, tevens de te genereren statistieken en rapportages.

Optioneel: data aanleveren aan open data portaal

Deze optie ga ik niet invullen.

Optioneel: display aan de wand

Deze optie heb ik anders uitgewerkt. Ik heb ervoor gezorgd dat de weer website geopend kan worden op mijn Sony Bravia SmartTV.

18 gedachten over “Weerstation

  1. Marien zegt:

    Ik heb een vraag over de windsnelheid.

    Ik heb deze aangesloten op een Wemos mini Pro, (rood aan Gnd) (groen aan D6) maar ik krijg geen data te zien in de esp.

    Beantwoorden
    1. Syds zegt:

      Marien,

      Bij mijn windmeter (WH-SP-WS01) was de plus draad geel, en de min rood. Maar in mijn geval was de windmeter aangesloten op de windvaan, en liep er van de windvaan een 4-polig draad naar de wemos. Groen+zwart was windvaan, geel+rood was windmeter. Zie ook het plaatje onder windvaan.

      Misschien is dat je probleem ?

      Syds

      Beantwoorden
      1. Marien zegt:

        Bedankt voor je snelle reactie.

        ik heb alleen nog maar een windsnelheids meter. Deze heeft 2 kabeltjes (rood en groen) aangesloten. Verder zie ik dat er bij de pinout van windsnelheid geel op D6 wordt aangesloten, terwijl de pinout op de tekening van de windvaan op D4 is aangesloten.

        Ik neem aan dat je data moet kunnen zien als je de windmeter handmatig een slinger geeft. Dan moet de Wemos (esp) omwentelingen weergeven?

        Beantwoorden
        1. Syds zegt:

          Marien,

          Niet de Windvaan zit op D4 aangesloten, maar de neerslagmeter. De Windvaan werkt met allemaal verschillende weerstandjes per windrichting, vandaar dat dit aangesloten wordt op de Analoge poort (A0) van de Wemos. In feite wordt afhankelijk van de spanning die door de weerstandjes loopt de windrichting bepaalt. De Neerslagmeter werkt net als de Windmeter met een pulsecounter, vandaar dat die op één van de digitale poorten van de Wemos is aangesloten.

          Maar in jou geval dus alleen de windsnelheidsmeter, klopt dat deze een groen en rood kabeltje heeft. Als je die aansluit op de RJ10 aansluiting van de Windvaan, dan wordt dit intern omgeleid naar geel en rood en via een 4-aderig kabeltje verder getransporteerd. Dus in jou geval is het Rood aansluiten op Gnd en Groen aansluiten op D6.

          Vervolgens in EspEasy device toevoegen en configureren als ‘Pulse counter’. Als je vervolgens een zwieper aan de windmeter geeft zou je een klikkend geluidje moeten horen van de Reed sensor in de windmeter. Ieder klikje moet een pulse opleveren in EspEasy. Zie ook het plaatje van de EspEasy configuratie onder Windsnelheid. Let op, de UI van EspEasy wordt niet voortdurend gerefreshed, soms moet je even op F5 drukken om je browser te verversen zodat je de nieuwe meetwaarden kunt raadplegen.

          Syds

          Beantwoorden
  2. Thomas zegt:

    Mooi project met duidelijke omschrijvingen en verwijzingen. Ik heb ook je PDF gevonden.
    Welke EspEasy versie draai jij?
    Mijn Tools – Advanced geeft een ander beeld dan bij jou project.
    Omdat de EspEasy versie mij niet kritisch lijkt, wil ik graag dezelfde versie gebruiken.
    (en op die manier ook zoveel mogelijk vragen te voorkomen en zelf proberen alles verder uit te zoeken 😉

    Beantwoorden
  3. Thomas zegt:

    Knap stuk werk! Al puzzelend en klikkend ben ik al een heel eind gekomen.
    B.T.W. je hebt specifiek voor een Domoticz dashboard gekozen? Waarom heb je geen Node-RED dashboard gebouwd? (w.s.s. vanwege de beperkte “data-retain” mogelijkheden?).
    1. MQTT data tussen Domoticz en Node-RED uitwisselen – OK
    2. Domoticz dashboard bouwen – OK
    3 Rekenen in Node-RED – NIET OK ;-(

    Ik had gehoopt je gepubliceerde data met een copy-paste in een Node-RED flow in te kunnen voeren, maar dit lukt niet en blijft hangen op een “leesteken interpretatie” bij de import.
    Niet om alles klakkeloos over te nemen, maar om enkele Node’s open te kunnen klikken en te kijken hoe jij het “uitrekenen” van b.v. maximale windsnelheid, dag neerslag enz. hebt aangepakt.

    Ik blijf verder werken om dit mooie project ook bij mij werkend te krijgen, maar:
    => Kun/wil je een json.file op je site publiceren, zodat het invoeren in een flow makkelijker gaat en ik verder kan puzzlen?
    Thnx.

    Beantwoorden
  4. Albert zegt:

    Hallo Syds,
    Met interesse heb je artikel over het weerstation gelezen.
    Omdat ik zelf ook al aardig wat heb geautomatiseerd met Domoticz leek mij dit een leuk project om ook te gaan doen. Jouw voorbeeld heeft al enorm geholpen. De hardware zat vrij vlot in elkaar.
    Node Red is voor mij kompleet nieuw. heb nog gepoogd een andere route te zoeken maar dat leverde alleen maar nog ingewikkelder zaken op. Heb dus Node Red geïnstalleerd op mijn Pi. Wat voorbeelden uitgevoerd. Maar het echte werk is toch lastiger.
    Ik heb geprobeerd jouw Node Red code vanaf de site te importeren maar krijg veel foutmeldingen over ” tekens die van het verkeerde soort zijn. Zou je mij ook het bestand van je flow toe willen sturen. Als ik deze wel goed kan importeren kan ik hem ombouwen naar mijn eigen situatie. En daarmee verder gaan
    Alvast bedankt voor je moeite.
    Groet, Albert

    Beantwoorden
  5. Jack Peters zegt:

    Hallo Syds,

    Ook ik ben bezig met het maken van een weerstation en jouw Node-Red files zouden een fijne toevoeging zijn. Helaas krijg ik deze niet geïmporteerd. Zou je de flows kunnen doorsturen ?
    Alvast bedankt,
    Jack

    Beantwoorden
  6. Reinier zegt:

    Goedendag,

    Met belangstelling heb ik dit artikel gelezen.
    helaas kan ik net als de overige lezers de node red code niet importeren.
    kun u deze ook aan mij verstrekken?

    alvast bedankt.

    Beantwoorden
  7. Thomas zegt:

    Je hebt nog steeds eer van je verstrekte info en werk Syds 😉
    Omdat mijn via Rflink lopende 865 mHz zender deel kapot is gegaan “noodgedwongen” verder gewerkt met de nog prima werkende Regen/Wind sensors en ESP8266.
    Via jouw Node Red blokken “uitpluizen” uiteindelijk alles werkend gekregen (dank voor jouw voorgaande werk hiervoor).
    De “GET node” om data uit Domoticz op te halen niet werkend gekregen, maar anders opgelost.
    De Min/Max/Avg waarden “destilleer” ik m.b.v. een “Calculate node”.
    Het moeilijkste voor mij is de windrichting.
    Bij jou valt bij “windstil” de richting op “default” die je met “– “ aangeeft.
    Een Getalwaarde – b.v. Neerslag laatste 5 min. – wordt vanuit de “Calculate node“ vast gehouden over de gehele bemonsterings tijd en dus ook in Domoticz weergegeven .
    Een Letter waarde vasthouden zodat steeds de laatste windrichting wordt aangegeven en niet “– “ lukt mij niet.
    Ik ben een Noob in programmeren, maar kan dit m.s.s met een Store functie en hoe pas je hier die dan toe?
    Hoe heb jij dit (of een van de andere Blog lezers) – dit opgelost?
    Dank, Thomas

    Beantwoorden
  8. Thomas zegt:

    Opgelost 😉 Omdat het buiten slecht weer was had ik niet de échte windvaan aangesloten, maar een Dummy gemaakt met de pulsen van een tweede windmeter die ik binnenshuis ter beschikking had. Deze windmeter valt i.d.d. terug naar nul.
    Nu een Dummy gemaakt met een potentiometer die de waarden van de windvaan simuleert.
    Nu blijft de laatst aangegeven windrichting – ook vanuit de “Calculate node” – wel bewaard.
    Nu nog even in de praktijk afwachten indien de windvaan blijft staan op een waarde die net niet in de door Syds gemeten waarden voorkomt. Met de potmeter simulatie krijg ik dan default waarde “¬– “ terug. Millivolt “bandbreedtes” vergroten in de “Bepaal “Windrichting” node??

    Beantwoorden
    1. Syds zegt:

      Thomas, mijn advies is om met de echte windvaan het noorden te bepalen en een zelfde tabel op te bouwen als in mijn bericht. En op basis daarvan eventueel de bandbreedtes aan te passen in de bepaal windrichting node.

      Beantwoorden

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *