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″> </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:
- Actuele Windsnelheid km/uur
- Max Windsnelheid km/uur per dag
- Gemiddelde Windsnelheid km/uur per dag
- Reset de Actuele Windsnelheid km/uur vandaag om 23:59 uur, en zet deze op 0.0000
- Reset de Max Windsnelheid km/uur per dag vandaag om 23:59 uur, en zet deze op 0
- 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:
- Act windsnelh km/uur
- Max windsnelh km/uur
- Avg windsnelh km/uur
- Max windkracht
- Gevoelstemperatuur
Meer info:
- https://www.letscontrolit.com/forum/viewtopic.php?f=4&t=3211&p=16742#p16742.
- https://www.hackster.io/158890/wireless-outdoor-weather-station-using-hardwario-core-module-76079a
- https://github.com/sbiermann/esp8266-anemometer
- https://www.youtube.com/watch?v=KHrTqdmYoAk&ab_channel=ModestMaker
- https://nl.wikipedia.org/wiki/Gevoelstemperatuur#Berekening
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:
- 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:
- https://www.hackster.io/158890/wireless-outdoor-weather-station-using-hardwario-core-module-76079a
- https://esphome.io/components/sensor/ads1115.html
- https://tysonpower.de/blog/esp8266-weather-station
- http://www.switchdoc.com/wp-content/uploads/2015/01/WeatherRack-011514-V1.0.pdf
Neerslag per 24 uur
Een digitale Neerslagmeter wordt op GND en D5 (GPIO14) aangesloten op de tweede Wemos D1 mini.
Pinout:
RJ11:
- –
- Groen
- 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:
- Plust de gemeten neerslag per 5 minuten op bij het dagtotaal #Neerslag vandaag
- 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:
- Neerslag 5 min. (ml)
- #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.
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.
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
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?
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
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 😉
Thomas, ik heb EspEasy versie 2.3.0 build 120 gebruikt. Veel succes met je project.
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.
Heb je het bestand via de mail toegezonden.
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
Heb je het bestand via de mail toegezonden.
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
Jack,
Heb je de json file met de node-red flow via de mail toegestuurd. Succes verder met je project.
Syds
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.
Heb je de flow toegemaild.
bedankt voor de uitleg, ik zou ook graag de flow ontvangen om verder te gaan. Mooi project!
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
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??
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.