Z-Uno

Hallo, den Z-uno musst nur neu inkludieren wenn du Sensoren zufügst oder entfernst. Mit Size 2 und Precission 0 musst die Temperatur durch 10 und nicht 100 dividieren.

@mdietinger danke funktioniert. Ich muss mich umbedingt mal weiter einlesen. Der Großteil ist ja wirklich komplett anders zur normalen Arduino Programmierung.

Mosche,

ich wollte mal einen Zwischenstand geben.
Ich habe deinen Sketch @mdietinger für mich ein wenig angepasst und anstelle des BH1750 den MAX44009 aufgrund der größeren Lux-Range verbaut.
Ansonsten habe ich noch auf einen BME280 gesetzt, da dieser noch vorhanden war. Zusätzlich kam gestern das Davis Windgeschwindigkeits- und Windrichtungsmodul, sodass ich gestern Abend zur Kontrolle noch die ersten Debuginfos in den Code eingebaut und den Z-Uno ins Fibaro HC2 eingelernt habe.

Anbei mal der veränderte Code


//PIN4 ADC1
//PIN9-SCL
//PIN10-SDA
//GND-Ground
//3V3-3Volts</pre>
//WIND:
//*
//2-3V3(Yellow)
//3-PIN4-Winddirection(Green)
//4-GND(Red)
//5-PIN17-Windspeed(Black)
//*

//RAIN:
//*
//*
//3-PIN18-Rainsensor
//4-GND
//*
//*

//I2C Temperature & Light:
//*
//2-3V3
//3-PIN9-SCL
//4-GND
//5-PIN10-SDA
//*
#define DEBUG
#include <Wire.h>
#include <math.h>
#include "EEPROM.h"
#define EEPROM_ADDR 0x800 // EEPROM address
#define EEPROM_UPDATE_INTERVAL 12000 // Delayed EEPROM writing to minimize writting attempts
#include "ZUNO_BME280.h"

//M44009
#define Addr 0x4A

//BME
BME280 bme;

#define wind2_factor 1.22 //m/s per pulse in 2 seconds
#define rain_factor 0.2794 //mm per pulse
ZUNO_SETUP_ISR_INT0(int0_handler); // Davis Windsensor
ZUNO_SETUP_ISR_INT1(int1_handler); // Davis Regensensor
ZUNO_SETUP_ISR_GPTIMER(gpt_handler); // 2" Timer (2" & 1 Minute measurements)

struct meter_data {
  dword rain_total;
  byte crc8;
};
meter_data my_meter_data;
struct sensor_data {
  int temperature = 0;
  unsigned int humidity = 0;
  float pressure = 0;
  unsigned int wind_speed = 0;
  unsigned int wind_gust = 0;
  unsigned int wind_direction = 0;
  unsigned int rain_rate = 0;
  dword light = 0;
};
sensor_data my_sensor;
long last_write_EEPROM_millis = 0;
unsigned int wind_pulses = 0;
unsigned int wind_pulses60 = 0;
unsigned int wind_boe60 = 0;
unsigned int rain_pulses = 0;
unsigned int rain_pulses300 = 0;
byte data_updated = FALSE;
byte GPT_2sec = 0;
byte count_2sec = 0;
byte minute_Count = 0;
byte hour_Count = 0;
byte RR[12];

ZUNO_SETUP_CHANNELS(// set up channels
  ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_TEMPERATURE,
                         SENSOR_MULTILEVEL_SCALE_CELSIUS,
                         SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
                         SENSOR_MULTILEVEL_PRECISION_TWO_DECIMALS,
                         getterTemperature),
  ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_RELATIVE_HUMIDITY,
                         SENSOR_MULTILEVEL_SCALE_PERCENTAGE_VALUE,
                         SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
                         SENSOR_MULTILEVEL_PRECISION_TWO_DECIMALS,
                         getterHumidity) ,
  ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_VELOCITY,
                         SENSOR_MULTILEVEL_SCALE_METERS_PER_SECOND,
                         SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
                         SENSOR_MULTILEVEL_PRECISION_TWO_DECIMALS,
                         getterVelocity),
  ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_VELOCITY,
                         SENSOR_MULTILEVEL_SCALE_METERS_PER_SECOND,
                         SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
                         SENSOR_MULTILEVEL_PRECISION_TWO_DECIMALS,
                         getterVelocityBoe),
  ZUNO_SENSOR_MULTILEVEL_ANGLE_POSITION (getterDirection),
  ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_RAIN_RATE,
                         SENSOR_MULTILEVEL_SCALE_MILLIMETERS_PER_HOUR,
                         SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
                         SENSOR_MULTILEVEL_PRECISION_ONE_DECIMAL,
                         getterRainRate),
  ZUNO_METER(ZUNO_METER_TYPE_WATER,
             METER_RESET_ENABLE,
             ZUNO_METER_WATER_SCALE_PULSECOUNT,
             METER_SIZE_FOUR_BYTES,
             METER_PRECISION_ONE_DECIMAL,
             getterRain,
             resetterRain),
  ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_LUMINANCE,
                         SENSOR_MULTILEVEL_SCALE_LUX,
                         SENSOR_MULTILEVEL_SIZE_FOUR_BYTES,
                         SENSOR_MULTILEVEL_PRECISION_ZERO_DECIMALS,
                         GetterLightLux),
  ZUNO_SENSOR_MULTILEVEL_ANGLE_POSITION (getterCount),
  ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_BAROMETRIC_PRESSURE,
                         SENSOR_MULTILEVEL_SCALE_KILOPASCAL,
                         SENSOR_MULTILEVEL_SIZE_FOUR_BYTES,
                         SENSOR_MULTILEVEL_PRECISION_TWO_DECIMALS,
                         getterPressure)
);

void setup() {
  Serial.begin(9600);
  zunoExtIntMode(ZUNO_EXT_INT0, RISING);
  zunoExtIntMode(ZUNO_EXT_INT1, RISING);
  zunoGPTInit(ZUNO_GPT_SCALE1024 | ZUNO_GPT_CYCLIC);
  zunoGPTSet(62500); // 2 Sekunden Timer
  zunoGPTEnable(1);
  EEPROM.get(EEPROM_ADDR, &my_meter_data, sizeof(meter_data));
  if (my_crc8((byte*)&my_meter_data, sizeof(meter_data) - 1) != my_meter_data.crc8) {
    my_meter_data.rain_total = 0;
    update_meter_data();
  }
  bme.begin();
  bme.setOversampling(4);

  Wire.beginTransmission(Addr);
  Wire.write(0x02);
  Wire.write(0x40);
  Wire.endTransmission();
  delay(300);
}

void int0_handler() // PIN17-wind sensor interupt
{
  wind_pulses++;
}

void int1_handler() // PIN18-rain sensor interupt
{
  rain_pulses++;
}

void gpt_handler() // 2" Timer
{
  GPT_2sec++;
}

void readanddebugM44009() {
  unsigned int data[2];
  Wire.beginTransmission(Addr);
  Wire.write(0x03);
  Wire.endTransmission();

  // Request 2 bytes of data
  Wire.requestFrom(Addr, 2);

  // Read 2 bytes of data luminance msb, luminance lsb
  if (Wire.available() == 2)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
  }

  // Convert the data to lux
  int exponent = (data[0] & 0xF0) >> 4;
  int mantissa = ((data[0] & 0x0F) << 4) | (data[1] & 0x0F);
  my_sensor.light = pow(2, exponent) * mantissa * 0.045;

#ifdef DEBUG
  Serial.print("Helligkeit  ");
  Serial.print(my_sensor.light);
  Serial.println(" Lux");
#endif
}

void readanddebugBME280() {
  char result = bme.startMeasurement();
  my_sensor.temperature = (bme.getTemperature100());
  my_sensor.humidity = (bme.getHum() * 100);
  my_sensor.pressure = ((bme.getPressure100() / pow( 1 - ( 84 / 44330.0 ), 5.255 )));
#ifdef DEBUG
  Serial.print("Temperature  ");
  Serial.print(bme.getTemperature100() / 100.00);
  Serial.println(" C");
  Serial.print("Pressure     ");
  Serial.print(my_sensor.pressure / 100);
  Serial.println(" hPa");
  Serial.print("Humidity     ");
  Serial.print(my_sensor.humidity / 100);
  Serial.println(" %");
#endif
}

void loop() {
  if (count_2sec != GPT_2sec) {
    count_2sec = GPT_2sec;
    if (wind_pulses > wind_boe60) {
      my_sensor.wind_direction = map(analogRead(A1), 0, 1024, 0, 100); //PIN4- wind direction 0-100 in 3.6° steps 100=N
      wind_boe60 = wind_pulses ;
    }
    wind_pulses60 = (wind_pulses60 + wind_pulses);
    wind_pulses = 0;
    if (rain_pulses > 0) {
      my_meter_data.rain_total = my_meter_data.rain_total + 1; //Debounce 2 would be 180-360mm/h
      rain_pulses300 = rain_pulses300 + 1;
      rain_pulses = 0;
      data_updated = true;
    }
    if (count_2sec > 29) {
      minute_Count++;
      if (minute_Count > 4) {
        minute_Count = 0;
        hour_Count++;
        if (hour_Count > 11) {
          hour_Count = 0;
        }
        RR[hour_Count] = rain_pulses300;
        rain_pulses300 = 0;
        for (byte i = 0; i < 12; i++) {
          rain_pulses300 = rain_pulses300 + RR[i] ;
        }
        my_sensor.rain_rate = rain_pulses300 ;
        rain_pulses300 = 0;
      }
      my_sensor.wind_speed = wind_pulses60 * wind2_factor / 30 * 100; //Measurement in m/s
      my_sensor.wind_gust = wind_boe60 * wind2_factor * 100; //Measurement in m/s
      wind_boe60 = 0;
      wind_pulses60 = 0;
      GPT_2sec = 0;
      readSensor();
#ifdef DEBUG
      Serial.print("Windrichtung ");
      Serial.println(my_sensor.wind_direction);
      Serial.print("Regen-Clicks  ");
      Serial.println(my_meter_data.rain_total);
      Serial.print("Windspeed     ");
      Serial.println(my_sensor.wind_speed);
      Serial.print("Regenmenge    ");
      Serial.println(my_meter_data.rain_total * rain_factor * 10);

#endif
    }
  }
  if (data_updated && (millis() - last_write_EEPROM_millis) > EEPROM_UPDATE_INTERVAL) { // To save EEPROM from a lot of r/w operation write it once in EEPROM_UPDATE_INTERVAL if data was updated
    update_meter_data();
    data_updated = false;
    last_write_EEPROM_millis = millis();
  }
  delay(100);

}

void readSensor () {
  readanddebugM44009();
  readanddebugBME280();
  zunoSendReport(1);
  zunoSendReport(2);
  zunoSendReport(3);
  zunoSendReport(4);
  zunoSendReport(5);
  zunoSendReport(6);
  zunoSendReport(7);
  zunoSendReport(8);
  zunoSendReport(9);
  zunoSendReport(10);
}

byte my_crc8(byte * data, byte count) {
  byte result = 0xDF;
  while (count--) {
    result ^= *data;
    data++;
  }
  return result;
}

void update_meter_data() {
  my_meter_data.crc8 = my_crc8((byte*)&my_meter_data, sizeof(meter_data) - 1);
  EEPROM.put(EEPROM_ADDR, &my_meter_data, sizeof(meter_data));
}

word getterTemperature() {
  return my_sensor.temperature;
}

word getterHumidity() {
  return my_sensor.humidity;
}

word getterVelocity() {
  return my_sensor.wind_speed;
}

word getterVelocityBoe() {
  return my_sensor.wind_gust;
}

word getterDirection() {
  return my_sensor.wind_direction;
}

word getterRainRate() {
  return my_sensor.rain_rate * rain_factor * 10;
}

word getterCount() {
  return minute_Count;
}

void resetterRain(byte v) {
  my_meter_data.rain_total = 0;
  update_meter_data();
}

dword getterRain(void) {
  return my_meter_data.rain_total * rain_factor * 10;
}

dword GetterLightLux() {
  return my_sensor.light;
}

dword getterPressure() {
  return my_sensor.pressure;
}

Offen sind jetzt noch die Kontrolle und Ergänzung der Debuginfos, sodass diese vollständig und an der richtigen Stelle sind, denn es war gestern einfach zu spät dafür.
Nachlesen ob ich den Luftdruck wirklich nicht in hpa im Fibaro angegeben bekomme und noch herausfinden, was 364.9 für ein Wert ist.
Hiernach werde ich mich mal an deine Luascripte und das virtual Device wagen.
Und zu guter Letzt noch eine kleine Platine löten, damit die Wetterstation nicht auf dem Breadboard an die frische Luft muss.

In Summe kann ich bis jetzt deine Anleitung nur loben und der Nachbau war eigentlich, bis auf die Unterschiede in der Arduinoprogrammierung, nicht wirklich schwer.
Vielen Dank demnach.

Anmerkung.png

364.9 ist der Heartbeat vom Z-UNO. (Zählt 0 bis 4)
Damit kann das LUA VD feststellen ob noch Daten kommen.
Wenn der Heartbeat ausbleibt, dann gibt es eine Nachricht.
Grund ist dass das HC2 nur die Werte updated wenn es geänderte Werte gibt.
Damit kann es vorkommen das über Minuten keine Änderung kommt.
Mit dem Heartbeat hat das Script eine Kontrolle ob Z-UNO noch sendet.
Das Script ist in der derzeitigen Form sehr stabil, in der Anfangsphase hatte ich einige Hänger da ich die Interrupts überladen hatte.

Danke für die schnelle Info. Schaue mir das morgen alles nochmal genauer an, denn ich habe zwar auf die schnelle das Luascript und das virtuelle Modul eingefügt, jedoch zieht er trotz richtiger IDs nur die Temperatur.

Anmerkung3.png

Wenn du den Heartbeat richtig konfiguriert hast sollte sich jede Minute die Zeit bei Update ändern.
Vlt. Postet mal das Lua config Script ohne Passwörter und Usernamen.

@mdietinger:
Das war schonmal der richtige Tipp, die nächgsten Werte werden gefüllt. Lag offensichlich an einem Fehler im Luacsript. Jetzt werden alle Werte bis auf Luftdruck, Lux und Solar gefüllt. Das muss ich mir nochmal anschauen. Ich poste das Script trtozdem mal, falls du Zeit und Lust hast, immer gerne.
Kannst du mir aber bitte den Unterschied im Luascript zwischen Rain_out und Rain_Rate erläutern? Ich bekomme im Fibaro lediglich das Modul mit dem mm/h angezeigt.

danke


--[[
%% properties
%% value
%% events
%% globals
--]]

varConfig = 'WetterConfig'
varSensor = 'WetterSensors'
varRecord = 'WetterRecords'

function ConfigurationParameters()
-- XXXXXXXXXXXXXXXXXXXXXXX   Start configuration parameters  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
myConfig.Update = 1					   	-- <0/1> automatic update of virtual device labels, requires username & password 
myConfig.USER = 'XXX'    -- <HC2 USER> only needed if VD should automatically write its labels :don't forget to clear if you share this script
myConfig.PWD = 'XXX'            -- <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 = 401				   	-- <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 = {8}	-- <MOBILE DEVICE IDs> mobile device ID for notifications, multiple ID's coma separated
myConfig.DailyReportMailID = {2}			-- <EMAIL IDs> email ID for daily report, multiple ID's coma separated
myConfig.Altitude = 107						-- <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?

-- 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]={386,'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]={391, 'V'}					   -- 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]={392, 'V'}		
--[[      GUST_OUT--]] v1[5]={393, 'V'}		
--[[ DIRECTION_OUT--]] v1[6]={374, 'V'}		
--[[      RAIN_OUT--]] v1[7]={367,'R'}		
--[[ RAIN_RATE_OUT--]] v1[8]={396}		
--[[     LIGHT_OUT--]] v1[9]={400}		
--[[ Temperatur_IN--]]v1[10]={583}	
--[[   Humitity_IN--]]v1[11]={585}		
--[[  DEW_POINT_IN--]]v1[12]={'DP&10&11'}
--[[   Pressure_OUT--]]v1[13]={402, 'V'}		
--[[      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
			    
					
--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_OUT--]]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]

-- XXXXXXXXXXXXXXXXXXXXXXX   Web service configurations  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-- 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] = "XXX" 													-- <USER NAME/ID> enter user name of webservice
myConfig.WebService_Key[WS] = "XXX"													-- <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_OUT--]]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

--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] = "XXX"
myConfig.WebService_Url[WS] = 'emoncms.org'
myConfig.WebService_UrlPrefix[WS] = '/input/post?node=wetter&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_OUT--]]v3[WS][13]={'PRESS_OUT','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

--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] = 'XX.XXX.XXX.XXX'
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_OUT--]]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
-- XXXX   End configuration parameters  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
end

-- NO CHANGES BELLOW THIS POINT   NO CHANGES BELLOW THIS POINT NO CHANGES BELLOW THIS POINT (UNLESS YOU KNOW WHAT YOU DO)
function globalVar(var,val)
  local http = net.HTTPClient()
  http:request("http://127.0.0.1:11111/api/globalVariables", {
    options = {
    method = 'POST',
    headers = {},
    data = '{"name":"'..var..'","value":"'..val..'"}',
    timeout = 10000
  },
  success = function(response)
            local result = response.data;
            if response.status == 200 or response.status == 201 then
              fibaro:debug('Status: ' ..response.status.. ' - Variable wurde angelegt')
            else
              fibaro:debug('Error: ' ..response.status.. ' - Zugriff verweigert')
            end
            end,
  error = function(err)
          fibaro:debug('[ERROR] ' .. err)
          end
  })
end

-- Setup

myConfig = {"USER","PWD","Update","VariableUpdateAfterMinutes","WebService_ID","WebService_Key","WebService_Url","WebService_UrlPrefix","WebService_UrlSuffix","WebService_Parameter_prefix","WebService_Parameter_seperator","WebService_OneShotUpdate","WebService_UpdateAfterCycles","Altitude","VD_ID","Trigger_ID","Trigger_maxCount","Trigger_UpdateFailedAfter","Trigger_UpdateFailedDeviceID","DailyReportMailID"}
myConfig.WebService_ID ={}
myConfig.WebService_Key={}
myConfig.WebService_Url={}
myConfig.WebService_UrlPrefix={}
myConfig.WebService_UrlSuffix={}
myConfig.WebService_Parameter_prefix={}
myConfig.WebService_Parameter_seperator={}
myConfig.WebService_OneShotUpdate={}
myConfig.WebService_UpdateAfterCycles={}

if (fibaro:getGlobal(varRecord) ~= nil) and UpdateMyRecords == 0 then
		   vREC= fibaro:getGlobal(varRecord)
		   myRecords = json.decode(vREC)
else
	myRecords = {'MIN','MAX','NOW','COUNT','NOTIFY_Variable','NOTIFY_MIN','NOTIFY_MAX','PDmin','PDmax','PDcount','CMmin','CMmax','CMcount','PMmin','PMmax','PMcount','CYmin','CYmax','CYcount','PYmin','PYmax','PYcount','TSMIN','TSMAX','TSCOUNT','TSPDmin','TSPDmax','TSPDcount','TSCMmin','TSCMmax','TSCMcount','TSPMmin','TSPMmax','TSPMcount','TSCYmin','TSCYmax','TSCYcount','TSPYmin','TSPYmax','TSPYcount'}
	myRecords.MIN = {}
	myRecords.MAX = {}
	myRecords.NOW = {}
	myRecords.COUNT = {}
	myRecords.NOTIFY_Variable = {}
	myRecords.NOTIFY_MIN= {}
	myRecords.NOTIFY_MAX = {}
	myRecords.PDmin = {}
	myRecords.PDmax = {}
	myRecords.PDcount = {}
	myRecords.CMmin = {}
	myRecords.CMmax = {}
	myRecords.CMcount = {}
	myRecords.PMmin = {}
	myRecords.PMmax = {}
	myRecords.PMcount = {}
	myRecords.CYmin = {}
	myRecords.CYmax = {}
	myRecords.CYcount = {}
	myRecords.PYmin = {}
	myRecords.PYmax = {}
	myRecords.PYcount = {}
		
	myRecords.TSMIN = {}
	myRecords.TSMAX = {}
	myRecords.TSCOUNT = {}
	myRecords.TSPDmin = {}
	myRecords.TSPDmax = {}
	myRecords.TSPDcount = {}
	myRecords.TSCMmin = {}
	myRecords.TSCMmax = {}
	myRecords.TSCMcount = {}
	myRecords.TSPMmin = {}
	myRecords.TSPMmax = {}
	myRecords.TSPMcount = {}
	myRecords.TSCYmin = {}
	myRecords.TSCYmax = {}
	myRecords.TSCYcount = {}
	myRecords.TSPYmin = {}
	myRecords.TSPYmax = {}
	myRecords.TSPYcount = {}

end

mySensors = {"ID","VD_LBL","VD_Name","VD_Unit","VD_Convert","WebService_Name","WebService_Convert","WebService_Handling","WebService_Unit","RainCounterReset"}
mySensors.ID = {} 
mySensors.VD_LBL = {}
mySensors.VD_Name = {}
mySensors.VD_Unit = {}
mySensors.VD_Convert = {}
mySensors.WebService_Name = {}
mySensors.WebService_Convert = {}
mySensors.WebService_Handling = {}
mySensors.WebService_Unit = {}

mySensors.RainCounterReset = {}

v1={}
v2={}
v3={}
-- CODE
ConfigurationParameters()
if myConfig.Trigger_ID > 0 then
	myConfig.Trigger_maxCount = 4		   		-- = > 0 if trigger device counts up to max and the rolls over to 0, for timed mode use 0
else
	myConfig.Trigger_maxCount = 0
end
if myConfig.WebService_Url[1] ~= nil then
	mySensors.WebService_Name[1] = {}
end

sCount= 1
for Index, Value in pairs( v1) do

	if v1[Index][1]~=nil then
   		mySensors.ID[sCount] = v1[Index][1]
    	if v2[Index][1] == nil then
		
          mySensors.VD_LBL[sCount] = 0
          mySensors.VD_Name[sCount] = ''
          mySensors.VD_Unit[sCount] = ''
          mySensors.VD_Convert[sCount] = ''
		else
          mySensors.VD_LBL[sCount] = v2[Index][1]
		  if v2[Index][2] == '' then
			v2[Index][2] = fibaro:getName(tonumber(v2[Index][1]))
		  end
		  if string.len(v2[Index][2]) > 15 then
			v2[Index][2] = string.sub(v2[Index][2],1,15)
		  end
          mySensors.VD_Name[sCount] = v2[Index][2]
          mySensors.VD_Unit[sCount] = v2[Index][3]
          mySensors.VD_Convert[sCount] = v2[Index][4]
		end
		mySensors.RainCounterReset[sCount] =''
		if v1[Index][2] ~= nil then
			if DAILY_RESET == 1 then
				if v1[Index][2] == 'R' then
					mySensors.RainCounterReset[sCount] = "RD"			
				end
				if v1[Index][2] == 'E' then
					mySensors.RainCounterReset[sCount] = "ED"			
				end
			else
				if v1[Index][2] == 'R' then
					mySensors.RainCounterReset[sCount] = "R"			
				end
				if v1[Index][2] == 'E' then
					mySensors.RainCounterReset[sCount] = "E"			
				end		
			end
			if v1[Index][2] == 'P' then
				mySensors.RainCounterReset[sCount] = "P"		
			end
		end
		
		if v1[Index][3] == nil then
			myRecords.NOTIFY_Variable[sCount] = ''
		else
			myRecords.NOTIFY_Variable[sCount] = v1[Index][3]
		end
		if v1[Index][4] == nil then
			myRecords.NOTIFY_MIN[sCount] = 0
		else
			myRecords.NOTIFY_MIN[sCount] = v1[Index][4]
		end
		if v1[Index][5] == nil then
			myRecords.NOTIFY_MAX[sCount] = 0
		else
			myRecords.NOTIFY_MAX[sCount] = v1[Index][5]
		end
		for IndexWS, Value in pairs( v3) do
      		if myConfig.WebService_Url[IndexWS] ~= nil then
				mySensors.WebService_Name[IndexWS][sCount] = v3[IndexWS][Index][1]
				mySensors.WebService_Convert[IndexWS][sCount] =v3[IndexWS][Index][2]
				mySensors.WebService_Handling[IndexWS][sCount] =v3[IndexWS][Index][3]
				mySensors.WebService_Unit[IndexWS][sCount] =v3[IndexWS][Index][4]
				
			end
		end
	myRecords.MIN[sCount] = ''
	myRecords.MAX[sCount] = ''
	myRecords.NOW[sCount] = ''
	myRecords.COUNT[sCount] =0
	myRecords.PDmin[sCount] = ''
	myRecords.PDmax[sCount] = ''
	myRecords.PDcount[sCount] = 0
	myRecords.CMmin[sCount] = ''
	myRecords.CMmax[sCount] = ''
	myRecords.CMcount[sCount] = 0
	myRecords.PMmin[sCount] = ''
	myRecords.PMmax[sCount] = ''
	myRecords.PMcount[sCount] = 0
	myRecords.CYmin[sCount] = ''
	myRecords.CYmax[sCount] = ''
	myRecords.CYcount[sCount] = 0
	myRecords.PYmin[sCount] = ''
	myRecords.PYmax[sCount] = ''
	myRecords.PYcount[sCount] = 0
	
	myRecords.TSMIN[sCount] = ''
	myRecords.TSMAX[sCount] = ''
	myRecords.TSCOUNT[sCount] =''
	myRecords.TSPDmin[sCount] = ''
	myRecords.TSPDmax[sCount] = ''
	myRecords.TSPDcount[sCount] = ''
	myRecords.TSCMmin[sCount] = ''
	myRecords.TSCMmax[sCount] = ''
	myRecords.TSCMcount[sCount] = ''
	myRecords.TSPMmin[sCount] = ''
	myRecords.TSPMmax[sCount] = ''
	myRecords.TSPMcount[sCount] = ''
	myRecords.TSCYmin[sCount] = ''
	myRecords.TSCYmax[sCount] = ''
	myRecords.TSCYcount[sCount] = ''
	myRecords.TSPYmin[sCount] = ''
	myRecords.TSPYmax[sCount] = ''
	myRecords.TSPYcount[sCount] = ''
	
    sCount= sCount +1
	end
	
end

var_Value=json.encode(mySensors)
if (fibaro:getGlobal(varSensor) ~= nil) then
 fibaro:debug('Benötigte Variable ' ..varSensor.. ' erkannt.')
   fibaro:setGlobal(varSensor,'')
  fibaro:setGlobal(varSensor,var_Value)
  fibaro:debug(var_Value)
else
 fibaro:debug('Benötigte Variable ' ..varSensor.. ' NICHT erkannt. Wird erstellt.')
 globalVar(varSensor, var_Value)
    fibaro:debug(var_Value)
end

var_Value=json.encode(myRecords)
if (fibaro:getGlobal(varRecord) ~= nil) then
 fibaro:debug('Benötigte Variable ' ..varRecord.. ' erkannt.')
   fibaro:setGlobal(varRecord,'')
  fibaro:setGlobal(varRecord,var_Value)
  fibaro:debug(var_Value)
else
 fibaro:debug('Benötigte Variable ' ..varRecord.. ' NICHT erkannt. Wird erstellt.')
 globalVar(varRecord, var_Value)
    fibaro:debug(var_Value)
end

var_Value= json.encode(myConfig)
if (fibaro:getGlobal(varConfig) ~= nil) then
 fibaro:debug('Benötigte Variable ' ..varConfig.. ' erkannt.')
   fibaro:setGlobal(varConfig,'')
  fibaro:setGlobal(varConfig,var_Value)
  fibaro:debug(var_Value)
else
 fibaro:debug('Benötigte Variable ' ..varConfig.. ' NICHT erkannt. Wird erstellt.')
 globalVar(varConfig, var_Value)
    fibaro:debug(var_Value)
end

for Index, Value in pairs( mySensors.ID ) do
  if myRecords.NOTIFY_Variable[Index] ~= '' then 
      if (fibaro:getGlobal(myRecords.NOTIFY_Variable[Index]) ~= nil) then
		fibaro:debug('Benötigte Variable ' ..myRecords.NOTIFY_Variable[Index] .. ' erkannt.')
		if UpdateMyRecords == 1 then
			myMeasurement  = {"report","updateAfter","minTrigger","maxTrigger","Value"}
			myMeasurement.report = "Y"
			myMeasurement.updateAfter = myConfig.VariableUpdateAfterMinutes
			myMeasurement.minTrigger = myRecords.NOTIFY_MIN[Index]
			myMeasurement.maxTrigger = myRecords.NOTIFY_MAX[Index]
			var_Value=json.encode(myMeasurement)
			fibaro:setGlobal(myRecords.NOTIFY_Variable[Index], var_Value)	
		end
      else
		myMeasurement  = {"report","updateAfter","minTrigger","maxTrigger","Value"}
		myMeasurement.report = "Y"
		myMeasurement.updateAfter = myConfig.VariableUpdateAfterMinutes
        fibaro:debug('Benötigte Variable ' ..myRecords.NOTIFY_Variable[Index] .. ' NICHT erkannt. Wird erstellt.')
        globalVar(myRecords.NOTIFY_Variable[Index], var_Value)
		myMeasurement.minTrigger = myRecords.NOTIFY_MIN[Index]
		myMeasurement.maxTrigger = myRecords.NOTIFY_MAX[Index]
		var_Value=json.encode(myMeasurement)
		fibaro:setGlobal(myRecords.NOTIFY_Variable[Index], var_Value)		
      end
	  

  end

end


Hallo,

Für Windrichtung solltest du 394! nehmen.
Regen ist 398! und ein Zähler welcher auch im EEPROM gespeichert wird.
Das VD rechnet die Tagessumme aus und stellt den Regen auf 0, aber der Zähler zählt weiter hoch.
Luftdruck sollte passen.
Achtung Innentemperatur und meine Beispiele für Strom rauslöschen wenn du keine Sensoren und Device hast.
Falls du nicht existierende Komponenten aus dem VD abfragst oder Taupunkt bei nicht existierenden Temperatur & Feuchtesensoren berechnest bricht das VD mit einer Fehlermeldung ab.
Das ganze kannst nur reparieren indem du die Device ID’s im LUA Script löscht oder richtigstellst und das Script ausführst.
Das VD musst dann nochmal speichern um den Code wieder auszuführen.
Konnte viele Fehler abfangen aber nicht falsche Device ID’s.
Wenn alles passt bekommst du alle Minuten einen neuen Wert und auch die Uhrzeit wird angezeigt.

Hallo,

hab mal zur Sicherheit das Konfig LUA aufgeräumt und alle Beispiele entfernt.
Webservices sind gelöscht und alle Sensoren außer Außensensoren entfernt.
Brauchst nur mehr User & PWD eingeben.
Bitte prüfe auch ob Email(2) & Mobile Device ID (8) richtig sind.
brauchst nur Lua Script anlegen (Kannst auch ein neues machen und das alte lassen. (Zum Testen)
LUA Script ausführen
VD Device aufmachen, Speichern drücken.
Kannst dann in der VD Konsole die richtige Funktion überprüfen.
Alle Minuten solltest einen neuen Wert bekommen.

--[[
%% properties
%% value
%% events
%% globals
--]]
 
varConfig = 'WetterConfig'
varSensor = 'WetterSensors'
varRecord = 'WetterRecords'
 
function ConfigurationParameters()
-- XXXXXXXXXXXXXXXXXXXXXXX   Start configuration parameters  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
myConfig.Update = 1					   	-- <0/1> automatic update of virtual device labels, requires username & password 
myConfig.USER = 'XXX'    -- <HC2 USER> only needed if VD should automatically write its labels :don't forget to clear if you share this script
myConfig.PWD = 'XXX'            -- <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 = 401				   	-- <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 = {8}	-- <MOBILE DEVICE IDs> mobile device ID for notifications, multiple ID's coma separated
myConfig.DailyReportMailID = {2}			-- <EMAIL IDs> email ID for daily report, multiple ID's coma separated
myConfig.Altitude = 107						-- <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?
 
-- 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]={386}	 --'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]={391}					   -- 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]={392}		
--[[      GUST_OUT--]] v1[5]={393}		
--[[ DIRECTION_OUT--]] v1[6]={394}		
--[[      RAIN_OUT--]] v1[7]={398,'R'}		
--[[ RAIN_RATE_OUT--]] v1[8]={396}		
--[[     LIGHT_OUT--]] v1[9]={400}		
--[[  Pressure_OUT--]]v1[10]={402}	
--[[         SPARE--]]v1[11]={}		
--[[         SPARE--]]v1[12]={}
--[[         SPARE--]]v1[13]={}		
--[[         SPARE--]]v1[14]={}	
--[[         SPARE--]]v1[15]={}
--[[         SPARE--]]v1[16]={}	
--[[         SPARE--]]v1[17]={}	
--[[        SPARE4--]]v1[18]={}	
--ADD MORE IF REQUIRED
			    
					
--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'}		
--[[  Pressure_OUT--]]v2[10]={4,'Luftdruck','hpa⛰️','2alt'}	
--[[         SPARE--]]v2[11]={}		
--[[         SPARE--]]v2[12]={}
--[[         SPARE--]]v2[13]={}		
--[[         SPARE--]]v2[14]={}	
--[[         SPARE--]]v2[15]={}	
--[[         SPARE--]]v2[16]={}	
--[[         SPARE--]]v2[17]={}	
--[[        SPARE4--]]v2[18]={}	
--ADD MORE IF REQUIRED, MAX VD_ID[1-20]

-- XXXX   End configuration parameters  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
end

 
-- NO CHANGES BELLOW THIS POINT   NO CHANGES BELLOW THIS POINT NO CHANGES BELLOW THIS POINT (UNLESS YOU KNOW WHAT YOU DO)
function globalVar(var,val)
  local http = net.HTTPClient()
  http:request("http://127.0.0.1:11111/api/globalVariables", {
    options = {
    method = 'POST',
    headers = {},
    data = '{"name":"'..var..'","value":"'..val..'"}',
    timeout = 10000
  },
  success = function(response)
            local result = response.data;
            if response.status == 200 or response.status == 201 then
              fibaro:debug('Status: ' ..response.status.. ' - Variable wurde angelegt')
            else
              fibaro:debug('Error: ' ..response.status.. ' - Zugriff verweigert')
            end
            end,
  error = function(err)
          fibaro:debug('[ERROR] ' .. err)
          end
  })
end
 
-- Setup
 
myConfig = {"USER","PWD","Update","VariableUpdateAfterMinutes","WebService_ID","WebService_Key","WebService_Url","WebService_UrlPrefix","WebService_UrlSuffix","WebService_Parameter_prefix","WebService_Parameter_seperator","WebService_OneShotUpdate","WebService_UpdateAfterCycles","Altitude","VD_ID","Trigger_ID","Trigger_maxCount","Trigger_UpdateFailedAfter","Trigger_UpdateFailedDeviceID","DailyReportMailID"}
myConfig.WebService_ID ={}
myConfig.WebService_Key={}
myConfig.WebService_Url={}
myConfig.WebService_UrlPrefix={}
myConfig.WebService_UrlSuffix={}
myConfig.WebService_Parameter_prefix={}
myConfig.WebService_Parameter_seperator={}
myConfig.WebService_OneShotUpdate={}
myConfig.WebService_UpdateAfterCycles={}
 
if (fibaro:getGlobal(varRecord) ~= nil) and UpdateMyRecords == 0 then
		   vREC= fibaro:getGlobal(varRecord)
		   myRecords = json.decode(vREC)
else
	myRecords = {'MIN','MAX','NOW','COUNT','NOTIFY_Variable','NOTIFY_MIN','NOTIFY_MAX','PDmin','PDmax','PDcount','CMmin','CMmax','CMcount','PMmin','PMmax','PMcount','CYmin','CYmax','CYcount','PYmin','PYmax','PYcount','TSMIN','TSMAX','TSCOUNT','TSPDmin','TSPDmax','TSPDcount','TSCMmin','TSCMmax','TSCMcount','TSPMmin','TSPMmax','TSPMcount','TSCYmin','TSCYmax','TSCYcount','TSPYmin','TSPYmax','TSPYcount'}
	myRecords.MIN = {}
	myRecords.MAX = {}
	myRecords.NOW = {}
	myRecords.COUNT = {}
	myRecords.NOTIFY_Variable = {}
	myRecords.NOTIFY_MIN= {}
	myRecords.NOTIFY_MAX = {}
	myRecords.PDmin = {}
	myRecords.PDmax = {}
	myRecords.PDcount = {}
	myRecords.CMmin = {}
	myRecords.CMmax = {}
	myRecords.CMcount = {}
	myRecords.PMmin = {}
	myRecords.PMmax = {}
	myRecords.PMcount = {}
	myRecords.CYmin = {}
	myRecords.CYmax = {}
	myRecords.CYcount = {}
	myRecords.PYmin = {}
	myRecords.PYmax = {}
	myRecords.PYcount = {}
		
	myRecords.TSMIN = {}
	myRecords.TSMAX = {}
	myRecords.TSCOUNT = {}
	myRecords.TSPDmin = {}
	myRecords.TSPDmax = {}
	myRecords.TSPDcount = {}
	myRecords.TSCMmin = {}
	myRecords.TSCMmax = {}
	myRecords.TSCMcount = {}
	myRecords.TSPMmin = {}
	myRecords.TSPMmax = {}
	myRecords.TSPMcount = {}
	myRecords.TSCYmin = {}
	myRecords.TSCYmax = {}
	myRecords.TSCYcount = {}
	myRecords.TSPYmin = {}
	myRecords.TSPYmax = {}
	myRecords.TSPYcount = {}
 
end
 
mySensors = {"ID","VD_LBL","VD_Name","VD_Unit","VD_Convert","WebService_Name","WebService_Convert","WebService_Handling","WebService_Unit","RainCounterReset"}
mySensors.ID = {} 
mySensors.VD_LBL = {}
mySensors.VD_Name = {}
mySensors.VD_Unit = {}
mySensors.VD_Convert = {}
mySensors.WebService_Name = {}
mySensors.WebService_Convert = {}
mySensors.WebService_Handling = {}
mySensors.WebService_Unit = {}
 
mySensors.RainCounterReset = {}
 
v1={}
v2={}
v3={}
-- CODE
ConfigurationParameters()
if myConfig.Trigger_ID > 0 then
	myConfig.Trigger_maxCount = 4		   		-- = > 0 if trigger device counts up to max and the rolls over to 0, for timed mode use 0
else
	myConfig.Trigger_maxCount = 0
end
if myConfig.WebService_Url[1] ~= nil then
	mySensors.WebService_Name[1] = {}
end
 
sCount= 1
for Index, Value in pairs( v1) do
 
	if v1[Index][1]~=nil then
   		mySensors.ID[sCount] = v1[Index][1]
    	if v2[Index][1] == nil then
		
          mySensors.VD_LBL[sCount] = 0
          mySensors.VD_Name[sCount] = ''
          mySensors.VD_Unit[sCount] = ''
          mySensors.VD_Convert[sCount] = ''
		else
          mySensors.VD_LBL[sCount] = v2[Index][1]
		  if v2[Index][2] == '' then
			v2[Index][2] = fibaro:getName(tonumber(v2[Index][1]))
		  end
		  if string.len(v2[Index][2]) > 15 then
			v2[Index][2] = string.sub(v2[Index][2],1,15)
		  end
          mySensors.VD_Name[sCount] = v2[Index][2]
          mySensors.VD_Unit[sCount] = v2[Index][3]
          mySensors.VD_Convert[sCount] = v2[Index][4]
		end
		mySensors.RainCounterReset[sCount] =''
		if v1[Index][2] ~= nil then
			if DAILY_RESET == 1 then
				if v1[Index][2] == 'R' then
					mySensors.RainCounterReset[sCount] = "RD"			
				end
				if v1[Index][2] == 'E' then
					mySensors.RainCounterReset[sCount] = "ED"			
				end
			else
				if v1[Index][2] == 'R' then
					mySensors.RainCounterReset[sCount] = "R"			
				end
				if v1[Index][2] == 'E' then
					mySensors.RainCounterReset[sCount] = "E"			
				end		
			end
			if v1[Index][2] == 'P' then
				mySensors.RainCounterReset[sCount] = "P"		
			end
		end
		
		if v1[Index][3] == nil then
			myRecords.NOTIFY_Variable[sCount] = ''
		else
			myRecords.NOTIFY_Variable[sCount] = v1[Index][3]
		end
		if v1[Index][4] == nil then
			myRecords.NOTIFY_MIN[sCount] = 0
		else
			myRecords.NOTIFY_MIN[sCount] = v1[Index][4]
		end
		if v1[Index][5] == nil then
			myRecords.NOTIFY_MAX[sCount] = 0
		else
			myRecords.NOTIFY_MAX[sCount] = v1[Index][5]
		end
		for IndexWS, Value in pairs( v3) do
      		if myConfig.WebService_Url[IndexWS] ~= nil then
				mySensors.WebService_Name[IndexWS][sCount] = v3[IndexWS][Index][1]
				mySensors.WebService_Convert[IndexWS][sCount] =v3[IndexWS][Index][2]
				mySensors.WebService_Handling[IndexWS][sCount] =v3[IndexWS][Index][3]
				mySensors.WebService_Unit[IndexWS][sCount] =v3[IndexWS][Index][4]
				
			end
		end
	myRecords.MIN[sCount] = ''
	myRecords.MAX[sCount] = ''
	myRecords.NOW[sCount] = ''
	myRecords.COUNT[sCount] =0
	myRecords.PDmin[sCount] = ''
	myRecords.PDmax[sCount] = ''
	myRecords.PDcount[sCount] = 0
	myRecords.CMmin[sCount] = ''
	myRecords.CMmax[sCount] = ''
	myRecords.CMcount[sCount] = 0
	myRecords.PMmin[sCount] = ''
	myRecords.PMmax[sCount] = ''
	myRecords.PMcount[sCount] = 0
	myRecords.CYmin[sCount] = ''
	myRecords.CYmax[sCount] = ''
	myRecords.CYcount[sCount] = 0
	myRecords.PYmin[sCount] = ''
	myRecords.PYmax[sCount] = ''
	myRecords.PYcount[sCount] = 0
	
	myRecords.TSMIN[sCount] = ''
	myRecords.TSMAX[sCount] = ''
	myRecords.TSCOUNT[sCount] =''
	myRecords.TSPDmin[sCount] = ''
	myRecords.TSPDmax[sCount] = ''
	myRecords.TSPDcount[sCount] = ''
	myRecords.TSCMmin[sCount] = ''
	myRecords.TSCMmax[sCount] = ''
	myRecords.TSCMcount[sCount] = ''
	myRecords.TSPMmin[sCount] = ''
	myRecords.TSPMmax[sCount] = ''
	myRecords.TSPMcount[sCount] = ''
	myRecords.TSCYmin[sCount] = ''
	myRecords.TSCYmax[sCount] = ''
	myRecords.TSCYcount[sCount] = ''
	myRecords.TSPYmin[sCount] = ''
	myRecords.TSPYmax[sCount] = ''
	myRecords.TSPYcount[sCount] = ''
	
    sCount= sCount +1
	end
	
end
 
var_Value=json.encode(mySensors)
if (fibaro:getGlobal(varSensor) ~= nil) then
 fibaro:debug('Benötigte Variable ' ..varSensor.. ' erkannt.')
   fibaro:setGlobal(varSensor,'')
  fibaro:setGlobal(varSensor,var_Value)
  fibaro:debug(var_Value)
else
 fibaro:debug('Benötigte Variable ' ..varSensor.. ' NICHT erkannt. Wird erstellt.')
 globalVar(varSensor, var_Value)
    fibaro:debug(var_Value)
end
 
var_Value=json.encode(myRecords)
if (fibaro:getGlobal(varRecord) ~= nil) then
 fibaro:debug('Benötigte Variable ' ..varRecord.. ' erkannt.')
   fibaro:setGlobal(varRecord,'')
  fibaro:setGlobal(varRecord,var_Value)
  fibaro:debug(var_Value)
else
 fibaro:debug('Benötigte Variable ' ..varRecord.. ' NICHT erkannt. Wird erstellt.')
 globalVar(varRecord, var_Value)
    fibaro:debug(var_Value)
end
 
var_Value= json.encode(myConfig)
if (fibaro:getGlobal(varConfig) ~= nil) then
 fibaro:debug('Benötigte Variable ' ..varConfig.. ' erkannt.')
   fibaro:setGlobal(varConfig,'')
  fibaro:setGlobal(varConfig,var_Value)
  fibaro:debug(var_Value)
else
 fibaro:debug('Benötigte Variable ' ..varConfig.. ' NICHT erkannt. Wird erstellt.')
 globalVar(varConfig, var_Value)
    fibaro:debug(var_Value)
end
 
for Index, Value in pairs( mySensors.ID ) do
  if myRecords.NOTIFY_Variable[Index] ~= '' then 
      if (fibaro:getGlobal(myRecords.NOTIFY_Variable[Index]) ~= nil) then
		fibaro:debug('Benötigte Variable ' ..myRecords.NOTIFY_Variable[Index] .. ' erkannt.')
		if UpdateMyRecords == 1 then
			myMeasurement  = {"report","updateAfter","minTrigger","maxTrigger","Value"}
			myMeasurement.report = "Y"
			myMeasurement.updateAfter = myConfig.VariableUpdateAfterMinutes
			myMeasurement.minTrigger = myRecords.NOTIFY_MIN[Index]
			myMeasurement.maxTrigger = myRecords.NOTIFY_MAX[Index]
			var_Value=json.encode(myMeasurement)
			fibaro:setGlobal(myRecords.NOTIFY_Variable[Index], var_Value)	
		end
      else
		myMeasurement  = {"report","updateAfter","minTrigger","maxTrigger","Value"}
		myMeasurement.report = "Y"
		myMeasurement.updateAfter = myConfig.VariableUpdateAfterMinutes
        fibaro:debug('Benötigte Variable ' ..myRecords.NOTIFY_Variable[Index] .. ' NICHT erkannt. Wird erstellt.')
        globalVar(myRecords.NOTIFY_Variable[Index], var_Value)
		myMeasurement.minTrigger = myRecords.NOTIFY_MIN[Index]
		myMeasurement.maxTrigger = myRecords.NOTIFY_MAX[Index]
		var_Value=json.encode(myMeasurement)
		fibaro:setGlobal(myRecords.NOTIFY_Variable[Index], var_Value)		
      end
	  
 
  end
 
end

Vielen Dank. Ich war gestern Abend schon soweit, dass alles bis auf der Luftdruck und die Helligkeitsangabe in Lux sauber gezogen wurden.
Ich probiere natürlich auch das aufgeräumte Script aus. Finde das vollständige Script gar nicht schlecht, da ich Zeile für Zeile durchgehe und somit auch das Lua an sich nach und nach besser verstehe.

Hast du dir schon einmal Gedanken über das Problem Schnee und Eis in Bezug auf die Regenmesswippe gemacht? Einige verbauen Heizmatten, damit der Schnee schmilzt und als Regen erkannt wird.

// Ergänzend:
Auch bei dem aufgeräumten Script stimmen LUX und Luftdruck nicht mit dem Sensor überein, siehe Foto.
Da muss ich wohl nochmal im Detail nachschauen.

Anmerkung5.png

Schaut ja schon sehr gut aus.
Der Lux Wert stimmt nicht da das VD LUX auf Watt umrechnet(Dies wird üblicherweise für Außensensoren verwendet)
Wenn du LUX angezeigt haben willst, dann nimm einfach die VD Einstellung vom LUX Innensensor :{10,‘Licht’,‘lx?️’,’’}
Bezüglich Luftdruck:
Dein BME liefert scheinbar schon Meereshöhen Druck.
Deswegen liefert die Druckumrechnung falsche Werte.
Du kannst den unkorregierten Wert anzeigen wenn du:
{4,‘Luftdruck’,‘hpa⛰️’,‘2alt’} auf {4,‘Luftdruck’,‘hpa⛰️’,’’}
änderst.

Regensensorheizung habe ich keine implementiert.
Bei Schnee wird zur Zeit nichts angezeigt, nicht sicher ob ich noch eine Heizung mache.

Neuerste Erweiterung ist ein SDS011 Feinstaubsensor.
Der hängt jetzt auch am Z-UNO welcher die Wetterdaten misst.
Falls du Interesse hast kann ich den neuen Code teilen.

Auf alle Fälle ist es schön dass ich das Ganze nicht umsonst dokumentiert habe und das die Lösung nachgebaut wurde.

Übrigens:Beim VD musst nur auf Speichern drücken, wenn der Code sich wegen Fehler in der Konfiguration aufgehängt hat.
Ansonsten Konfi LUA ausführen und das VD rebootet sich automatisch.
In der mobilen App, musst nur auf Netzwerk aktualisieren gehen damit das neue VD sich läd.

Zwei gute Einwände, ich glaube ich habe die Höhe schon im Arduino Script korrigiert, schaue ich mir aber nochmal an.
Und der Hinweis mit dem Solar anstelle von Lux ist auch gut. Ich habe zu sehr an die zukünftige Gartenbeleuchtung gedacht, welche über die Helligkeit gesteuert werden soll.
Macht aber hier im VD gar keinen Sinn, da ich diese ja im Gartenscript ansprechen werden, also wieder zurück zu Solar. Ich werde heute und morgen Abend noch ein wenig basteln und die erste Platine löten und dann weiter berichten.
Der Feinstaubsensor klingt auf jedenfall interessant, wobei der Z-Uno doch nur 10 Channels, wenn ich mich richtig erinnere?
Ich melde mich auf jedenfall noch wegen dem Code, will jedoch aktuell erstmal die Wetterstation fertig machen, nicht dass das näschte quer durch den Kopf spuckt.

Z-uno v2.1.1 kann 32 Kanäle. Also noch ausreichend Platz:-)

Gutes Gelingen.

32? Oha, da ging wohl wieder was in meiner Birne durcheinander. Bei so vielen Kanälen stellt sich ja nur noch die Frage, was gibt es auf dem Markt noch für Sensoren?

Ich werde die Woche auf jeden Fall noch einen analogen UV Sensor auflöten und das ganze Konstrukt mal testweise am Balkon befestigen.
Vorher noch die Korrektur des Sketches bezüglich der Höhenberechnung rausnehmen, damit ich dein Script im Standard verwenden kann.
Hiernach muss ich dann wohl mal tief ins Sparschwein greifen um einen 3D Drucker zu kaufen. Die Wetterstation soll ja auch ein passendes Gehäuse bekommen.

Schweben dir noch weitere Sensoren vor?
Alternativ müsste man ja mal schauen, welche Module montiert werden können, damit eine Kommunikation unter einem Arduino oder Esp32 und dem Z-UNO möglich ist. So könnte ich z.B. weite Kanäle für meine Garagentorerkennung nutzen und müsste keinen zweiten Z-UNO kaufen.

Wie gesagt habe ich noch Feinstaub.
Wenn Du meteorologisch interessiert bist bieten sich noch:
5cm Temperatur
Bodentemperatur
an.
Bzgl. Umwelt wären dann noch Ozon, No2 interessant.
Was Du unbedingt beachten solltest ist dass du den Code nicht überlädst. Zur Zeit ist der Code sehr stabil und hat in der derzeitigen Form keine Abstürze. Die Interupt Routinen sind schlank und Abfrage der Sensoren ist gut getimed.

@mdietinger: Welchen Feinstaub-Sensor benutzt Du? Ich habe da bisher keine guten Erfahrungen gemacht (was die Messergebnisse betrifft).
Hatte es deswegen letztes Jahr wieder beiseite gelegt.

SDS011.
Habe relativ genaue Ergebnisse.
Wenn Ost Wind herrscht dann bekomme ich den Feinstaub aus dem Wiener Becken und ich sehe eine Korrelation mit den offiziellen Stations Werten.
Einziges Problem aller “billigen” Sensoren ist Feinstaubmessung bei hoher Luftfeuchtigkeit.
Da werden zu hohe Werte angezeigt.
Das konnte ich bedingt auch beobachten.
Habe vorige Woche einen 12v Heizpad von Conrad zusammengerollt, über den Luftansaugstutzen gestülpt und an 5V angeschlossen.
Damit wird die Luft vorgewärmt.
Wie stark der Effekt ist konnte ich bis jetzt nicht beobachten da die Feinstaubsituation besser geworden ist.
Aber da ich in der Nähe eine Station von Luftdaten.info habe habe ich eine Referenz.
Mein Sensor zeigt minimal niedrigere Werte bei hoher Luftfeuchtigkeit an, aber da ist es noch zu früh.
In Kürze sollte der SPS30 von Sensirion auf den Markt kommen, der sollte eine Spur genauer messen.
Werde ich mir auch noch zulegen und mal einen Vergleich geheizt/ungeheizt durchführen.
Auch wenn die Werte nicht 100% richtig sind, ist es ein bisschen ein Augenöffner das Feinstaub keine Grenzen kennt und sich je nach Wetterlage auch in Reinluftgebiete ausbreitet.
SDS011 kann relativ einfach an den Zuno über die Serielle Schnittstelle angeschlossen werden.
Code ist auch sehr einfach.
Die hohen Werte im Bild waren noch vor Einbau der Heizung, aber da war die Belastung bei den offiziellen Stationen auch hoch.

FS.png

FeinStaub.jpg

Du hast vollkommen Recht. Sowohl der Arduino Sketch als auch das Luascript und das VD laufen sehr stabil.
Ich habe jetzt erstmal einen Lüfter bestellt, da der Sensor oftmals Probleme mit der Feuchtigkeit hat und ich davon ausgehe, dass er in dem Gehäuse einfach einen Feuchtigkeitsstau hat. Bezüglich der Heizmatte habe ich einfach mal
QLZR 30 x 40 mm 5 V 1 W PI Kunststoff-Klebeband Heizfolie
mitbestellt und werde mal testen, ob es was taugt. Wenn ich heute Zeit zum UV-Sensor verlöten finde, mache ich auch mal ein paar Fotos.

Mahlzeit,

es hat alles einen Moment länger gedauert, da mir ständig der BME ausgestiegen ist, sodass ich nunmehr eine ganze Reihe von Chinasensoren verbraten habe, bis der jetzige verlässlich läuft. Das nennt man dann wohl an der falschen Stelle gespart. Im Nachhinein betrachtet, hätte ich einfach den von dir empfohlenen Honeywell Sensor kaufen und mir Gedanken über den Luftdruck separat machen sollen. Um den UV-Sensor habe ich mich auch noch nicht gekümmert, wird aber jetzt im Winter erledigt, wenn die Sonne mal scheint oder ich meine UV-Lampe finde.

Anbei noch ein paar Fotos zum jetzigen Testaufbau. Diesen soll die Wetterstation über den Winter meistern, sodass ich die Station nächstes Jahr bei wärmeren Temperaturen aufs Dach montieren werde.

P.S. @mdietinger: Kennst du diesen Artikel (Thingpulse Welcome OpenWeatherMap, bye bye Wunderground), welcher den notwendigen Wechsel der Daten von Wunderground zu Openweathermap thematisiert? Vielleicht eine Anregung für dein Script, damit es für alle Neulinge zukunftsicher bleibt.

thehackisback,

das mit den Fotos hat wohl nicht funktioniert :wink:
Openweathermap API zu implementieren ist relativ leicht, sehe aber für mich als User keinen Zusatznutzen.
Bei Wunderground kann ich meine Stationsdaten (Echtzeit und Historisch) ansehen, be Openweathermatp konnte ich keine Stationsansicht sehen.

lg,

Markus