Im ersten Teil dieses Tutorials zeigte ich euch, wie Ihr euch eine eigene Z-Wave Wetterstation mit dem Z-UNO bauen könnt. In diesem zweiten Teil soll es um die Visualisierung im Fibaro Home Center und auf einem Display gehen.
Wetterstation Teil 2 :VD & Wetter Display
Nachdem ich mir meine eigene Wetterstation auf Z-Uno basierend gebastelt habe, musste natürlich auch eine Lösung her, um die Werte zusammengefasst anzeigen zu können.
Weiterhin wollte ich die Daten zu EmonCMS übertragen, wo ich auch schon meine Wärmepumpen-Daten gesammelt und visualisiert habe. Im Laufe der letzten Monate wurde die Lösung immer umfangreicher.
Funktionen:
- Alle Konfigurationen werden übersichtlich im LUA Script gemacht.
- Alle Variablen werden automatisch erzeugt
- Das VD holt sich seine Konfigurationen aus den Variablen.
- Alle Labels werden automatisch beschriftet.
- Die Lösung unterstützt alle Arten von Wettersensoren (Temperatur, Wind, Luftdruck,....)
- Die Lösung unterstützt weiters auch Leistung und Stromverbruach (Falls sich wer seine Verbraucher darstellen möchte)
- Bei eingestellten Schwellwerten können Aktionen getriggert werden.
- Die Trigger Konditionen können auch durch Fremd Scripte geändert werden.
- Diverse Webservices können mit Daten versorgt werden. (Wunderground, EmonCMS,...)
- Das Nextion Display kann verwendet werden um Daten lokal anzuzeigen.
- Mit etwas Programmieraufwand könnte das Display auch Retour fähig gemacht werden und auch die HC2 steuern.
- z.B. Alarm Panel
- Übersicht aller Türen und Fenster
- Heizungsteuerung
- ....
- Mit etwas Programmieraufwand könnte das Display auch Retour fähig gemacht werden und auch die HC2 steuern.
- Benutzerverständigung wenn keine Daten mehr geliefert werden. (Heardbeat von Z-UNO)
- Tägliche min/max Zusammenfassung als Mail. (Monats und Jahresstatistik wird auch erzeugt)
- Umrechnung der Wetterparameter auf andere Einheiten. (z.B. °C auf °F)
- Berechnung von Taupunkt
- Lüftungsratgeber
- Kein Lüften
- Lüften
- Oder Heizen, wenn Lüften nicht reichen sollte.
- Irgendetwas habe ich sicher vergessen :-)

DIY - Z-Wave Wetterstation
LUA Configurations Script Erklärung:
Vollständiges Script in "Implementierung".
BASIC Konfig:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function ConfigurationParameters() -- XXXXXXXXXXXXXXXXXXXXXXX Start configuration parameters XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX myConfig.Update = 1 -- <0/1> automatic update of virtual device labels, requires username & password myConfig.USER = '<YOUR_HC2_USER>' -- <HC2 USER> only needed if VD should automatically write its labels :don't forget to clear if you share this script myConfig.PWD = '<YOUR_HC2_PWD>' -- <HC2 PASSWORD> only needed for VD to automatrically change its labels :don't forget to clear if you share this script myConfig.VD_ID = 0 -- <0> for full automatic mode (VD automatic detection), in manual mode(1st parameter) enter <VIRTUAL DEVICE ID> myConfig.Trigger_ID = 0 -- <TRIGGER DEVICE ID> only setup if Z-UNO sends cyclic counter (0-4), synchronizes update of values to the second, enter 0 for timed mode myConfig.Trigger_UpdateFailedDeviceID = {<YOUR_MOBILE_DEVICE_ID>} -- <MOBILE DEVICE IDs> mobile device ID for notifications, multiple ID's coma separated myConfig.DailyReportMailID = {<YOUR_EMAIL_ID>} -- <EMAIL IDs> email ID for daily report, multiple ID's coma separated myConfig.Altitude = <YOUR_HEIGHT_IN_METERS> -- <Meters> set homes altitude in meters for correct airpressure calaculations myConfig.Trigger_UpdateFailedAfter = 10 -- <Minutes> run triggerUpdateFailed routine after x minutes myConfig.VariableUpdateAfterMinutes = 60 -- <Minutes> MIN MAX Alarms will only update Variable after defined time and meeting trigger value UpdateMyRecords = 0 -- Update user variables and records with default parameter after new configuration |0 = keep records |1 = update with default DAILY_RESET = 1 -- reset RAIN & ENERGY counter daily? |
Zumindest alle Parameter welche mit "<>" hervorgehoben sind, müssen auf deine eigenen Werte geänndert werden.
"Full automatic mode" - nur in der eigenen Verantwortung verwenden! (Bitte zuvor ein Backup durchführen)
Sensor Konfiguration:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
-- XXXXXXXXXXXXXXXXXXXXXXX Sensor configurations XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX WS = 0 -- don't change --SENSOR_ID = numeric sensor ID example 613 --SENSOR_ID = or option dew point(DP): 'DP& TEMP_INDEX[1-18 ID]& HUM_INDEX[1-18 ID]' example 'DP&1&2' --SENSOR_ID = or option ventilation adviser(VA): 'VA& TEMP_INDEX_OUT[1-18 ID]& HUM_INDEX_OUT[1-18 ID]& TEMP_INDEX_IN[1-18 ID]& HUM_INDEX_IN[1-18 ID]& Target Humiditdy' example 'VA&1&2&10&11&50' --TYPE = type of sensor, optional 'V' for value(default), 'R' for rain sensor, 'P' for power report of device, 'E' for energy value of sensor. rain and power are counters and will be reset daily --NOTIFY_VARIABLE = optional global variable to get notifications about reaching min or max value (will be automatically created) --MIN = optional if variable is used values bellow MIN will be reported (myConfig.VariableUpdateAfterMinutes timer is used) --MAX = optional if variable is used values above MAX will be reported (myConfig.VariableUpdateAfterMinutes timer is used) --[[ Field description {SENSOR_ID, optional[,TYPE['R'=Rain, 'P'=Power, 'E'=Energy, 'V'= Value], NOTIFY_VARIABLE, MIN, MAX]} --]] --[[Temperatur_OUT--]] v1[1]={653,'V','TEST_TEMP',-0.5,3} -- example use data from sensor 549, update TEST_TMP variable if temperature < -0.5 or > 15° --[[ Humidity_OUT--]] v1[2]={655} -- example use date from sensor 551, no MIN-MAX --[[ DEW_POINT_OUT--]] v1[3]={'DP&1&2'} -- example calculate dew point with temperature from 1. sensor and humitity from 2. sensor --[[ WIND_OUT--]] v1[4]={656} --[[ GUST_OUT--]] v1[5]={657} --[[ DIRECTION_OUT--]] v1[6]={658} --[[ RAIN_OUT--]] v1[7]={660,'R'} --[[ RAIN_RATE_OUT--]] v1[8]={659} --[[ LIGHT_OUT--]] v1[9]={662} --[[ Temperatur_IN--]]v1[10]={583} --[[ Humitity_IN--]]v1[11]={585} --[[ DEW_POINT_IN--]]v1[12]={'DP&10&11'} --[[ Pressure_IN--]]v1[13]={586} --[[ LIGHT_IN--]]v1[14]={588} --[[Ventilation Adviser]]v1[15]={'VA&1&2&10&11&50'} --[[ WZ LICHT W--]]v1[16]={210,'P'} --[[ WZ LICHT KWH--]]v1[17]={210,'E'} --[[ SPARE4--]]v1[18]={} --ADD MORE IF REQUIRED |
Beschreibung aller Funktionen ist im Code kommentiert.
Der Text links von den Sensoren (Field description) ist nur eine Hilfe (Kommentar) und kann auf Eure Bedürfnisse geändert werden. (Bitte auch in den folgenden Teilen ändern)

DIY - Z-Wave Wetterstation
VD Konfiguration:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
--VD_ID = measured value will be written to virtual device label number(ID). [1-20, 1 = 1st label after buttons (MIN, NOW, MAX) --VD_NAME = label name in virtual device (will be automatically written) use '' if device name to be used --VD_UNIT = unit to be suffixed in virtual device after the value --VD_CONVERSION = unit conversion as defined in VD code to convert units for eample m/s to kmh = 'ms2kmh' --[[ {VD_ID, VD_NAME,VD_UNIT,VD_CONVERSION}--]] --[[Temperatur_OUT--]] v2[1]={1,'Temperatur','°C',''} -- example use 1st VD label after buttons, name it Temperatur, append unit °C to measurement and don't convert data --[[ Humidity_OUT--]] v2[2]={2,'Luftfeuchte','%',''} --[[ DEW_POINT_OUT--]] v2[3]={3,'Taupunkt','°C',''} --[[ WIND_OUT--]] v2[4]={5,'Wind','km/h','ms2kmh'} -- example use 5th VD label after buttons, name it Wind, append unit km/h to measurement and convert data from m/s to km/h --[[ GUST_OUT--]] v2[5]={6,'Böen','km/h','ms2kmh'} --[[ DIRECTION_OUT--]] v2[6]={7,'Richtung','','2direction'} --[[ RAIN_OUT--]] v2[7]={8,'Niederschlag','mm',''} --[[ RAIN_RATE_OUT--]] v2[8]={9,'Regenrate','mm/h',''} --[[ LIGHT_OUT--]] v2[9]={10,'Solar','W','lux2watt'} --[[ Temperatur_IN--]]v2[10]={11,'Temperatur','°C',''} --[[ Humitity_IN--]]v2[11]={12,'Luftfeuchte','%',''} --[[ DEW_POINT_IN--]]v2[12]={13,'Taupunkt','°C',''} --[[ Pressure_IN--]]v2[13]={4,'Luftdruck','hpa','2alt'} --[[ LIGHT_IN--]]v2[14]={14,'Licht','lx',''} --[[Ventilation Adviser]]v2[15]={16,'LÜFTEN?','',''} --[[ SPARE2--]]v2[16]={18,'WZ LICHT','W',''} --[[ SPARE3--]]v2[17]={19,'WZ LICHT','KWH','2decimals'} --[[ SPARE4--]]v2[18]={} --ADD MORE IF REQUIRED, MAX VD_ID[1-20] |
Im virtuellen Device:
Wie ihr Emojis in eurem VD anzeigen könnt findet ihr hier (Danke an Hubertus).
Wunderground Konfiguration:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
-- Wunderground configuration WS = WS+1 mySensors.WebService_Name[WS] = {} -- don't change mySensors.WebService_Convert[WS] = {} -- don't change mySensors.WebService_Handling[WS] = {} -- don't change mySensors.WebService_Unit[WS] = {} -- don't change v3[WS]={} -- don't change myConfig.WebService_ID[WS] = "<YOUR_WUNDERGROUND_ID>" -- <USER NAME/ID> enter user name of webservice myConfig.WebService_Key[WS] = "<YOUR_WUNDERGROUND_KEY>" -- <PASSWORD/KEY> enter password of webservice myConfig.WebService_Url[WS] = 'weatherstation.wunderground.com' -- <URL/IP:PORT> enter URL or IP & Port myConfig.WebService_UrlPrefix[WS] = '/weatherstation/updateweatherstation.php?ID=WebService_ID&PASSWORD=WebService_Key&dateutc=now&' -- <PREFIX> String which needs to be prefixed to measurements myConfig.WebService_UrlSuffix[WS] = '&softwaretype=FibaroHC2&action=updateraw' -- <SUFFIX> String which needs to be suffixed to measurements myConfig.WebService_Parameter_prefix[WS] = '&' -- <PREFIX> String/char which needs to be prefixed to every measurement myConfig.WebService_Parameter_seperator[WS] = '=' -- <SEPERATUR> String/char which seperates measurement text and value myConfig.WebService_OneShotUpdate[WS] = 1 -- <0/1> update all measurements with one command per measurement or one combined one myConfig.WebService_UpdateAfterCycles[WS] = 5 -- Update after x Cycles (Trigger Cycles, or Minutes) -- <Minutes> update web service every x minutes -- WEB_NAME = name/identifier of parameter -- WEB_CONVERSION = parameter convertion rule defined in VD -- WEB_AVG = parameter handling for multiple minute updates, AVG=average value, MIN=minimum valus, MAX=maximum value , '' simply takes last value, for example(temperature= AVG, wind gust = MAX) --[[ {WEB_NAME,WEB_CONVERSION,WEB_AVG/MIN/MAX,WEB_UNIT}--]] --[[Temperatur_OUT--]] v3[WS][1]={'tempf','c2f','AVG',''} -- example webservice identifies out side temperature measurements with tempf and expects Farenheit (°C > °F) --[[ Humidity_OUT--]] v3[WS][2]={'humidity','','AVG',''} --[[ DEW_POINT_OUT--]] v3[WS][3]={'dewptf','c2f','AVG',''} --[[ WIND_OUT--]] v3[WS][4]={'windspeedmph','ms2mph','AVG',''} --[[ GUST_OUT--]] v3[WS][5]={'windgustmph','ms2mph','MAX',''} --[[ DIRECTION_OUT--]] v3[WS][6]={'winddir','2dir','',''} --[[ RAIN_OUT--]] v3[WS][7]={'dailyrainin','mm2inch','',''} --[[ RAIN_RATE_OUT--]] v3[WS][8]={'rainin','mm2inch','',''} --[[ LIGHT_OUT--]] v3[WS][9]={'solarradiation','lux2watt','AVG',''} --[[ Temperatur_IN--]]v3[WS][10]={'','','',''} --[[ Humitity_IN--]]v3[WS][11]={'','','',''} --[[ DEW_POINT_IN--]]v3[WS][12]={'','','',''} --[[ Pressure_IN--]]v3[WS][13]={'baromin','hpa2inch','AVG',''} --[[ LIGHT_IN--]]v3[WS][14]={'','','',''} --[[Ventilation Adviser]]v3[WS][15]={'','','',''} --[[ SPARE2--]]v3[WS][16]={'','','',''} --[[ SPARE3--]]v3[WS][17]={'','','',''} --[[ SPARE4--]]v3[WS][18]={'','','',''} --ADD MORE IF REQUIRED |

https://www.wunderground.com/personal-weather-station/signup
Ihr bekommt dann Station ID und Key welche in der Konfig eingetragen werden können. Dann werden Eure Daten alle 5 Minuten zu Wunderground übertragen.
Wenn nicht, könnt ihr alle Zeilen welche zur Wunderground Konfiguration gehören löschen. (Obiger Auszug)
EmonCMS Konfiguration:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
--EMONCMS configuration (ADD ADDITIONAL WEB SERVICES IF REQUIRED, by copying from "COPY START" to "COPY END") -->>>> COPY START WS = WS+1 mySensors.WebService_Name[WS] = {} mySensors.WebService_Convert[WS] = {} mySensors.WebService_Handling[WS] = {} mySensors.WebService_Unit[WS] = {} v3[WS]={} myConfig.WebService_ID[WS] = "" myConfig.WebService_Key[WS] = "<YOUR_EMONCMS_KEY>" myConfig.WebService_Url[WS] = 'emoncms.org' myConfig.WebService_UrlPrefix[WS] = '/input/post?node=wetterNEU&json={{' myConfig.WebService_UrlSuffix[WS] = '}&apikey=WebService_Key' myConfig.WebService_Parameter_prefix[WS] = ',' myConfig.WebService_Parameter_seperator[WS] = ':' myConfig.WebService_OneShotUpdate[WS] = 1 myConfig.WebService_UpdateAfterCycles[WS] = 1 --[[ {WEB_NAME,WEB_CONVERSION,WEB_AVG/MIN/MAX,WEB_UNIT}--]] --[[Temperatur_OUT--]] v3[WS][1]={'TEMP_OUT','','AVG',''} --[[ Humidity_OUT--]] v3[WS][2]={'HUM_OUT','','AVG',''} --[[ DEW_POINT_OUT--]] v3[WS][3]={'DP_OUT','','AVG',''} --[[ WIND_OUT--]] v3[WS][4]={'WIND_OUT','ms2kmh','AVG',''} --[[ GUST_OUT--]] v3[WS][5]={'GUST_OUT','ms2kmh','MAX',''} --[[ DIRECTION_OUT--]] v3[WS][6]={'DIR_OUT','2dir','',''} --[[ RAIN_OUT--]] v3[WS][7]={'RAIN_OUT','','',''} --[[ RAIN_RATE_OUT--]] v3[WS][8]={'RR_OUT','','',''} --[[ LIGHT_OUT--]] v3[WS][9]={'SOLAR_OUT','lux2watt','AVG',''} --[[ Temperatur_IN--]]v3[WS][10]={'TEMP_IN','','AVG',''} --[[ Humitity_IN--]]v3[WS][11]={'HUM_IN','','AVG',''} --[[ DEW_POINT_IN--]]v3[WS][12]={'DP_IN','','AVG',''} --[[ Pressure_IN--]]v3[WS][13]={'PRESS_IN','2alt','AVG',''} --[[ LIGHT_IN--]]v3[WS][14]={'','','',''} --[[Ventilation Adviser]]v3[WS][15]={'','','',''} --[[ SPARE2--]]v3[WS][16]={'WZ_LIGHT_W','','',''} --[[ SPARE3--]]v3[WS][17]={'WZ_LIGHT_KWH','','',''} --[[ SPARE4--]]v3[WS][18]={'','','',''} --ADD MORE IF REQUIRED -->>>> COPY END |
https://emoncms.org/
Alternativ zur gehosteten Lösung gibt es auch die Möglichkeit EMONCMS lokal auf einen Raspberry zu installieren. (myConfig.WebService_Url muss auf lokale IP Adresse geändert werden). Details findet Ihr auf der Webseite.
Meine Integration soll nur eine Hilfe liefern, um die Daten auf EmonCMS darzustellen. Wie ihr den Service konfiguriert würde diesen Bericht sprengen. (Online Manual)
Hinweis: Ab 1. Juli wird für diesen Dienst eine Gebühr verrechnet, lokal ist die Lösung weiterhin als Opensource verfügbar.
Wenn nicht verwendet, bitte löschen.
Nextion Konfiguration:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
--NEXTION configuration (ADD ADDITIONAL WEB SERVICES IF REQUIRED, by copying from "COPY START" to "COPY END") -->>>> COPY START WS = WS+1 mySensors.WebService_Name[WS] = {} mySensors.WebService_Convert[WS] = {} mySensors.WebService_Handling[WS] = {} mySensors.WebService_Unit[WS] = {} v3[WS]={} myConfig.WebService_ID[WS] = "" myConfig.WebService_Key[WS] = "" myConfig.WebService_Url[WS] = '<YOUR_NEXTION_IP>' myConfig.WebService_UrlPrefix[WS] = '/HC2/post?DATA={t99.txt:RESET,' myConfig.WebService_UrlSuffix[WS] = '}' myConfig.WebService_Parameter_prefix[WS] = ',' myConfig.WebService_Parameter_seperator[WS] = ':' myConfig.WebService_OneShotUpdate[WS] = 1 myConfig.WebService_UpdateAfterCycles[WS] = 1 --[[ {WEB_NAME,WEB_CONVERSION,WEB_AVG/MIN/MAX,WEB_UNIT}--]] --[[Temperatur_OUT--]] v3[WS][1]={'TEMPOUT.txt','','AVG',''} --[[ Humidity_OUT--]] v3[WS][2]={'HUMOUT.txt','','AVG',''} --[[ DEW_POINT_OUT--]] v3[WS][3]={'','','',''} --[[ WIND_OUT--]] v3[WS][4]={'WIND.txt','ms2kmh','AVG',''} --[[ GUST_OUT--]] v3[WS][5]={'GUST.txt','ms2kmh','MAX',''} --[[ DIRECTION_OUT--]] v3[WS][6]={'','','',''} --[[ RAIN_OUT--]] v3[WS][7]={'RAIN.txt','','',''} --[[ RAIN_RATE_OUT--]] v3[WS][8]={'RAINRATE.txt','','',''} --[[ LIGHT_OUT--]] v3[WS][9]={'','','',''} --[[ Temperatur_IN--]]v3[WS][10]={'TEMPIN.txt','','AVG',''} --[[ Humitity_IN--]]v3[WS][11]={'HUMIN.txt','','AVG',''} --[[ DEW_POINT_IN--]]v3[WS][12]={'','','',''} --[[ Pressure_IN--]]v3[WS][13]={'PRESS.txt','2alt','AVG',''} --[[ LIGHT_IN--]]v3[WS][14]={'','','',''} --[[Ventilation Adviser]]v3[WS][15]={'','','',''} --[[ SPARE2--]]v3[WS][16]={'','','',''} --[[ SPARE3--]]v3[WS][17]={'','','',''} --[[ SPARE4--]]v3[WS][18]={'','','',''} --ADD MORE IF REQUIRED -->>>> COPY END |

Wenn nicht verwendet bitte löschen.
VD Konvertierungs Regeln und Formeln (bei Bedarf eigene Funktionen zufügen):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
-- START PARAMETER CONVERSION, DEFINE HERE NEW TRANSLATION RULES function convertUnit(vConversion,vValue) local newValue if vConversion == "c2f" then -- Conversion Celsius to Farenheit newValue = string.format("%.1f",vValue * 9 / 5 + 32) elseif vConversion == "ms2mph" then -- Conversion Meter/Second to Miles Per Hour newValue = string.format("%.1f",vValue * 2.2369362920544) elseif vConversion == "ms2kmh" then -- Conversion Meter/Second to Kilometer Per Hour newValue = string.format("%.1f",vValue * 3.6) elseif vConversion == "hpa2inch" then -- Conversion Hecto Pascal to Inch newValue = string.format("%.4f",(vValue/ math.pow((1-(0.0065*myConfig.Altitude)/(273.15+15)),5.255)) / 33.863886666667 ) elseif vConversion == "mm2inch" then -- Conversion Milimeter to Inch newValue = string.format("%.4f",vValue * 0.0393701) elseif vConversion == "2dir" then -- Conversion % to Degrees newValue = string.format("%.1f",vValue * 3.6) elseif vConversion == "lux2watt" then -- Conversion Lux to Watt/m² newValue = string.format("%.1f",vValue * 0.013) elseif vConversion == "2alt" then -- Conversion Preassure to Sea Level newValue = string.format("%.1f",vValue / math.pow((1-(0.0065*myConfig.Altitude)/(273.15+15)),5.255)) elseif vConversion == "kwatt2watt" then -- Conversion Kilo Watt to Watt newValue = string.format("%.0f",vValue *1000) elseif vConversion == "2decimals" then -- Format 2 Decimal Points newValue = string.format("%.2f",vValue) elseif vConversion == "2direction" then -- Conversion Degrees to Cardinal Points if(tonumber(vValue) < 11.25/3.6) then newValue="Nord" elseif(tonumber(vValue) < 33.75/3.6) then newValue="Nordnordost" elseif(tonumber(vValue) < 56.25/3.6) then newValue="Nordost" elseif(tonumber(vValue) < 78.75/3.6) then newValue="Ostnordost" elseif(tonumber(vValue) < 101.25/3.6) then newValue="Ost" elseif(tonumber(vValue) < 123.75/3.6) then newValue="Ostsüdost" elseif(tonumber(vValue) < 146.25/3.6) then newValue="Südost" elseif(tonumber(vValue) < 168.75/3.6) then newValue="Südsüdost" elseif(tonumber(vValue) < 191.25/3.6) then newValue="Süd" elseif(tonumber(vValue) < 213.75/3.6) then newValue="Südsüdwest" elseif(tonumber(vValue) < 236.25/3.6) then newValue="Südwest" elseif(tonumber(vValue) < 258.75/3.6) then newValue="Westsüdwest" elseif(tonumber(vValue) < 281.25/3.6) then newValue="West" elseif(tonumber(vValue) < 303.75/3.6) then newValue="Westnordwest" elseif(tonumber(vValue) < 326.25/3.6) then newValue="Nordwest" elseif(tonumber(vValue) < 348.75/3.6) then newValue="Nordnordwest" else newValue="Nord" end else if tonumber (vValue) then newValue = string.format("%.1f",vValue) else newValue = tostring(vValue) end end return newValue end -- END PARAMETER CONVERSION, DEFINE HERE NEW TRANSLATION RULES |
Taupunkt Berechnung:
1 2 3 4 5 6 7 8 9 10 11 12 |
-- START DEW POINT CALCULATION function DPcalc(vString) local DP ={} for match in string.gmatch(vString, '[^&]+') do table.insert(DP, (match)) end local TEMP = fibaro:getValue(mySensors.ID[tonumber(DP[2])], 'value') local HUM = fibaro:getValue(mySensors.ID[tonumber(DP[3])], 'value') newValue = 234.175*math.log((HUM/100*(6.1078*math.exp(17.08085*TEMP/(234.175+TEMP))))/6.1078)/(17.08085-math.log((HUM/100*(6.1078*math.exp(17.08085*TEMP/(234.175+TEMP))))/6.1078)) return newValue end -- END DEW POINT CALCULATION |
Lüftungs Ratgeber:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
-- START VENTILATION ADVISOR function VAcalc(vString) local VA ={} for match in string.gmatch(vString, '[^&]+') do table.insert(VA, (match)) end TEMP = fibaro:getValue(mySensors.ID[tonumber(VA[2])], 'value') -- Outside temperature HUM = fibaro:getValue(mySensors.ID[tonumber(VA[3])], 'value') -- Outside humidity valueO = tonumber(234.175*math.log((HUM/100*(6.1078*math.exp(17.08085*TEMP/(234.175+TEMP))))/6.1078)/(17.08085-math.log((HUM/100*(6.1078*math.exp(17.08085*TEMP/(234.175+TEMP))))/6.1078))) TEMP = fibaro:getValue(mySensors.ID[tonumber(VA[4])], 'value') -- Inside temperature HUM = fibaro:getValue(mySensors.ID[tonumber(VA[5])], 'value') -- Inside humidity valueI = tonumber(234.175*math.log((HUM/100*(6.1078*math.exp(17.08085*TEMP/(234.175+TEMP))))/6.1078)/(17.08085-math.log((HUM/100*(6.1078*math.exp(17.08085*TEMP/(234.175+TEMP))))/6.1078))) HUM = tonumber(VA[6]) -- Target humidity valueT = tonumber(234.175*math.log((HUM/100*(6.1078*math.exp(17.08085*TEMP/(234.175+TEMP))))/6.1078)/(17.08085-math.log((HUM/100*(6.1078*math.exp(17.08085*TEMP/(234.175+TEMP))))/6.1078))) value = valueI - valueO -- DP Difference if HUM < tonumber(fibaro:getValue(mySensors.ID[tonumber(VA[5])], 'value')) then -- Target humidity lower then inside humidity if tonumber(value) > 0 then -- DP Outside lower then DP inside newValue = 1 -- Ventilation sufficient else newValue = -1 -- Ventilation not adviced, heating required end else newValue = 0 -- No action required end return newValue end -- END VENTILATION ADVISOR |
Implementierung:
Kopiert folgendes Script in ein neues LUA script: Wetterconfig_LUA
Benennt Namen z.B. auf Wetter_Config und führt das Script aus.
Nun werden alle Variablen erzeugt(oder geändert) und das VD kann die Konfiguration lesen.
Ladet das Virtuelle Device hier herunter ":WETTER
Importiert in der HC2 das virtuelle Device:
- Module
- Füge Gerät hinzu
- Importiere Virtuelles Gerät (Datei auswählen)
Fertig!!
Das virtuelle Gerät sollte in ein paar Sekunden alle Tasten und Labels Beschriften und jede Minute die Werte updaten.
Nicht vergessen: Nach jeder Konfigurationsänderung das LUA Konfigurations Script speichern und ausführen.
Danach Rebooted das VD.
Sollte das VD mal wegen nicht existierenden device ID's hängen, Konfiguration richtig stellen und VD einfach Speichern, das sollte das VD aus der Fehlermeldung bringen und das Device neu starten.
Beispiel Wetter Trigger Szene:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
--[[ %% properties %% events %% globals TEST_TEMP --]] trigger = fibaro:getSourceTrigger() varName = trigger['name'] var= fibaro:getGlobal(varName) myNOTIFY = json.decode(var) fibaro:debug('Report:' ..myNOTIFY.report) fibaro:debug('Update after:' ..tostring(tonumber(myNOTIFY.updateAfter)) ..'min') fibaro:debug('Min trigger:' ..myNOTIFY.minTrigger) fibaro:debug('Max trigger:' ..myNOTIFY.maxTrigger) fibaro:debug('Value:' ..tostring(myNOTIFY.Value)) -- myNOTIFY.report = 'N' -- myNOTIFY.updateAfter = 60000 -- 60sec -- myNOTIFY.minTrigger = -5 -- myNOTIFY.maxTrigger = 20 -- var_Value=json.encode(myNOTIFY) -- fibaro:setGlobal(varName, var_Value) -- fibaro:sleep(2000) |
Mit dem auskommentierten Teil könnt ihr auch die Trigger Kriterien im Script ändern.
z.B. keine weiteren Meldungen, oder neue min/max Triggerwerte.
Nextion Display:
Kitlist:
- Nextion 4,3" Display: https://www.itead.cc/nextion-nx4827t043.html
- Nodemcu 8266: http://www.nodemcu.com/index_en.html
Das Amazon bestellt werden.
Den Amazon.
Nodemcu programieren:
Am Besten mit diesem Tutorial starten: http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/arduino-esp8266-lolin-nodemcu-getting-started/
Darin wird das Setup der Arduino Oberfläche und das verwenden des Nodemcu's erklärt.
Das Arduino script gibts hier: https://www.siio.de/wetterstation-nextion
Bitte runterladen und in Arduino Oberfläche öffnen.
Dann noch User Name & Passwort von Eurem WLAN Router ändern und auf NodeMCU laden.
1 2 |
const char* ssid = "YourSSID"; const char* password = "YourPWD"; |
Bitte Eurem NodeMCU eine fixe IP Adresse an eurem Rooter zuweisen und diese IP dem Wetter Display Konfigurations LUA Script eintragen.
Display programieren:
Die Nextion Programierumgebung herunterladen:https://www.itead.cc/display/nextion.html
Das Wetterdisplay.hmi file in den Nextion Editor laden, gibts hier: Wetterdisplay.HMI
Das Programm kompilieren, auf eine micro SD Karte kopieren und Bildschirm neu starten.
Nach dem Aufspielen der SW, micro SD Karte enfernen.
Verkabelung:
Verkabelung ist relativ einfach, da man nur die Stecker des mitglieferten Nextion Kabels auf die NodeMCU Pins stecken muss.
- microUSB vom Netzteil auf Nodemcu microUSB Buchse
- NEXTION 5V - NodeMCU VUSB
- NEXTION GND - NodeMCU GND
- NEXTION TX - NodeMCU RX
- NEXTION RX - NodeMCU TX
Wenn alles richtig gemacht wurde sollte das Display im Minuten Rythmus die neuen Werte anzeigen.
Nun noch ein schmuckes Gehäuse und fertig ist das Display. (Habe ein Gehäuse beim Conrad gefunden wo ich noch die Front ausschneiden musste, genaue Type habe ich leider nicht notiert)