From e99422412e9a1372e4e04d38358d44f34527d225 Mon Sep 17 00:00:00 2001 From: marcel Date: Wed, 17 Jan 2024 16:07:02 +0100 Subject: [PATCH] Added heather algorithm --- CHANGELOG.md | 15 + build-doc/images/smart_heater.odg | Bin 0 -> 20768 bytes build-doc/images/smart_heater.svg | 1263 +++++++++++++++++ build-doc/images/wind_speed_diagram.svg | 13 +- build-doc/weather_station.html | 95 +- build-doc/weather_station.md | 61 +- build-doc/weather_station.pdf | Bin 1115183 -> 1129705 bytes firmware/weather_station.ino | 198 ++- .../__pycache__/epever_control.cpython-36.pyc | Bin 4176 -> 5115 bytes test_software/epever_control.py | 20 +- test_software/weather_station_rs485_client.py | 6 +- 11 files changed, 1585 insertions(+), 86 deletions(-) create mode 100644 build-doc/images/smart_heater.odg create mode 100644 build-doc/images/smart_heater.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index 5824673..5da7424 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,3 +26,18 @@ All notable changes to this project will be documented in this file. ### Changed - Heater of humidiy sensor only on when humidity is above 96% (was 80%). When heater is on temperature sensor also heats up, so use temperature sensor of BMP280 when heater is on. + +## [0.2.1] - 2024-01-17 + +### Changed + +- Heater algorithm updated. Idea from datasheet of humidity sensor from Temco Controls HUM-M2 humidity sensor module. +- ModBus read register 1: Scaled wind direction by 10 in order to also get the decimal position of the direction + +### Added + +- ModBus read register 12: Raw rain meter +- ModBus read register 13: Temperature from pressure sensor +- ModBus read register 14: Status bits +- ModBus coil register 0 : enable/disable heather algorithm + diff --git a/build-doc/images/smart_heater.odg b/build-doc/images/smart_heater.odg new file mode 100644 index 0000000000000000000000000000000000000000..b39da354e68e6cf626bc33fbcc17fb4421a6f3b1 GIT binary patch literal 20768 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 z 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 +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Smart heater + + + + + + + + Measure humidityMeasure temperature + + + + + + + + RH>95%for more than 1 hour + + + + + + + + RH>95% + + + + + + + + Heater ON + + + + + + + + Wait 10 minutes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Measure humidityMeasure temperature + + + + + + + + + + + + + + + Heater OFF + + + + + + + + Wait 10 minutes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No + + + + + + Yes + + + + + + No + + + + + + Yes + + + + + + + + + + + + + + + diff --git a/build-doc/images/wind_speed_diagram.svg b/build-doc/images/wind_speed_diagram.svg index 2abd670..1001f69 100644 --- a/build-doc/images/wind_speed_diagram.svg +++ b/build-doc/images/wind_speed_diagram.svg @@ -9,9 +9,9 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.2" - width="125.34mm" - height="165.31999mm" - viewBox="0 0 12534 16531.999" + width="60.926762mm" + height="80.360718mm" + viewBox="0 0 6092.6763 8036.0717" preserveAspectRatio="xMidYMid" fill-rule="evenodd" stroke-width="28.222" @@ -45,7 +45,8 @@ inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="svg439" /> + inkscape:current-layer="svg439" + inkscape:document-rotation="0" /> @@ -347,7 +348,7 @@ + transform="translate(-3234,-4234.9999)"> @@ -362,7 +363,7 @@ + transform="matrix(0.48609191,0,0,0.48609191,-1572.0212,-2058.5992)"> -

Flow chart under development.

+

When the heater algorithm is active, the temperature is updated every +20 minutes instead of every 2 seconds. Statis bit 0 (ModBus register +30014) indicated if the heater is on or off and status bit 1 gives the +update rate of the main temperature sensor.

+

This algorithm can be enabled by setting the HeaterCoil (see ModBus +secion).

+
+ + +

Temperature

The temperature is read from the humidity sensor as this sensor gives the most accurate temperature readings. When the heater is on (see @@ -582,8 +592,8 @@ boring.

now, the ModBus address is hard coded as 14 in the software. The values are available in the input registers and can be read via function code 04.

-

Below an example of how to read the wind direction in Python using -the minimalmodbus library.

+

Below an example of how to read the wind direction and enable the +heater algorithm in Python using the minimalmodbus library.

#!/usr/bin/env python3
 import minimalmodbus
 
@@ -592,10 +602,14 @@ instrument = minimalmodbus.Instrument('/dev/ttyUSB1', 14)
 
 # register number, number of decimals, function code
 wind_direction = instrument.read_register(1, 0, 4)
-print(wind_direction)
-

Input registers

-

The measurements and order of the measurements are the same as for -APRS weather reports. But of course we use SI units.

+print(wind_direction) + +# register address, value, function code +instrument.write_bit(0, 1, 5) +

Input registers (read only)

+

Input registers are numbered 30001 to 39999 but have data addresses +0x000 to 0x270E. The measurements and order of the measurements are the +same as for APRS weather reports. But of course we use SI units.

@@ -611,77 +625,77 @@ APRS weather reports. But of course we use SI units.

- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -705,12 +719,45 @@ from the pressure sensor.

+ + + + + + + + + + + +
3000000 Device ID (0x5758) NO UNIT
3000101 Wind directiondegreesdegrees * 10
3000202 Wind speed (average of 10 minutes) m/s * 100
3000303 Wind gust (peak of last 10 minutes) m/s * 100
3000404 Temperature (two’s complement) degrees Celcius * 100
3000505 Rain last hour l/m2 * 100
3000606 Rain last 24 hours l/m2 * 100
3000707 Rain since midnight NOT IMPLEMENTED
3000808 Humidity percent * 100
3000909 Barometric pressure hPa * 10
3001010 Luminosity W/m2
3001111 Snow fall NOT IMPLEMENTED
3001212 Raw rain counterNOT IMPLEMENTEDl/m2 * 100
3001313 Temperature (two’s complement) degrees Celcius * 100
3001414 Status bits see table below
heater off heater on
1Temp updateevery 2 secevery 20 minutes
2Heater algorithmdisabledenabled

The ModBus registers are 16 bit wide. For better precision, some units are scaled by a factor of 10 or 100. This way, values with up to two decimal points can be stored as 16 bit integer values. Just divide by 10 or 100 to get the floating point values.

+

Output coils (write only)

+

Input registers are numbered 1 to 9999 but have data addresses 0x000 +to 0x270E. The default value is of a register is 0.

+ + + + + + + + + + + + + + + + + +
AddressDescriptionlogic 0logic 1
0Heater algorithmdisabledenabled

Schematic

Schematic

diff --git a/build-doc/weather_station.md b/build-doc/weather_station.md index f9a4e14..78a3b12 100644 --- a/build-doc/weather_station.md +++ b/build-doc/weather_station.md @@ -240,7 +240,11 @@ Via the I²C bus, the humidity value of the sensor is read. As the sensor can be When the humidity rises above 95% for more than an hour the current temperature is stored and the heater is switched on for 10 minutes. Than the heater is switched off again. If after 10 minutes the humidity is still above 95% the heater is turned on again for another 10 minutes. But not before the temperature is measured and stored, as the sensor is now cooled off to ambient temperature. If the humidity is below 95% the sensor is free from moisture and the process is not repeated for another hour. -Flow chart under development. +When the heater algorithm is active, the temperature is updated every 20 minutes instead of every 2 seconds. Statis bit 0 (ModBus register 30014) indicated if the heater is on or off and status bit 1 gives the update rate of the main temperature sensor. + +This algorithm can be enabled by setting the HeaterCoil (see ModBus secion). + +![Heater algorithm](./images/smart_heater.svg "Heater algorithm") ## Temperature @@ -258,7 +262,7 @@ This sensor is still under development. The weather station uses ModBus RTU over a simplex RS-485 line. For now, the ModBus address is hard coded as 14 in the software. The values are available in the input registers and can be read via function code 04. -Below an example of how to read the wind direction in Python using the minimalmodbus library. +Below an example of how to read the wind direction and enable the heater algorithm in Python using the minimalmodbus library. #!/usr/bin/env python3 import minimalmodbus @@ -270,36 +274,49 @@ Below an example of how to read the wind direction in Python using the minimalmo wind_direction = instrument.read_register(1, 0, 4) print(wind_direction) -### Input registers + # register address, value, function code + instrument.write_bit(0, 1, 5) + +### Input registers (read only) -The measurements and order of the measurements are the same as for APRS weather reports. But of course we use SI units. +Input registers are numbered 30001 to 39999 but have data addresses 0x000 to 0x270E. The measurements and order of the measurements are the same as for APRS weather reports. But of course we use SI units. | Address | Description | Units | |---------|-------------------------------------|-----------------------| -| 30000 | Device ID (0x5758) | NO UNIT | -| 30001 | Wind direction | degrees | -| 30002 | Wind speed (average of 10 minutes) | m/s * 100 | -| 30003 | Wind gust (peak of last 10 minutes) | m/s * 100 | -| 30004 | Temperature (two's complement) | degrees Celcius * 100 | -| 30005 | Rain last hour | l/m2 * 100 | -| 30006 | Rain last 24 hours | l/m2 * 100 | -| 30007 | Rain since midnight | NOT IMPLEMENTED | -| 30008 | Humidity | percent * 100 | -| 30009 | Barometric pressure | hPa * 10 | -| 30010 | Luminosity | W/m2 | -| 30011 | Snow fall | NOT IMPLEMENTED | -| 30012 | Raw rain counter | NOT IMPLEMENTED | -| 30013 | Temperature (two's complement) | degrees Celcius * 100 | -| 30014 | Status bits | see table below | +| 00 | Device ID (0x5758) | NO UNIT | +| 01 | Wind direction | degrees * 10 | +| 02 | Wind speed (average of 10 minutes) | m/s * 100 | +| 03 | Wind gust (peak of last 10 minutes) | m/s * 100 | +| 04 | Temperature (two's complement) | degrees Celcius * 100 | +| 05 | Rain last hour | l/m2 * 100 | +| 06 | Rain last 24 hours | l/m2 * 100 | +| 07 | Rain since midnight | NOT IMPLEMENTED | +| 08 | Humidity | percent * 100 | +| 09 | Barometric pressure | hPa * 10 | +| 10 | Luminosity | W/m2 | +| 11 | Snow fall | NOT IMPLEMENTED | +| 12 | Raw rain counter | l/m2 * 100 | +| 13 | Temperature (two's complement) | degrees Celcius * 100 | +| 14 | Status bits | see table below | ^NOTE^ Register 30013 holds the backup temperature reading from the pressure sensor. -| Status bits | Description | logic 0 | logic 1 | -|-------------|---------------|------------|-----------| -| 0 | Heater status | heater off | heater on | +| Status bits | Description | logic 0 | logic 1 | +|-------------|------------------|-------------|------------------| +| 0 | Heater status | heater off | heater on | +| 1 | Temp update | every 2 sec | every 20 minutes | +| 2 | Heater algorithm | disabled | enabled | The ModBus registers are 16 bit wide. For better precision, some units are scaled by a factor of 10 or 100. This way, values with up to two decimal points can be stored as 16 bit integer values. Just divide by 10 or 100 to get the floating point values. +### Output coils (write only) + +Input registers are numbered 1 to 9999 but have data addresses 0x000 to 0x270E. The default value is of a register is 0. + +| Address | Description | logic 0 | logic 1 | +|---------|------------------|----------|---------| +| 0 | Heater algorithm | disabled | enabled | + # Schematic [![Schematic](./images/weather_station_schematic.svg)](./images/weather_station_schematic.pdf) diff --git a/build-doc/weather_station.pdf b/build-doc/weather_station.pdf index f59425d0d95a64bf92a5c96c1820acb16b1efa7c..75769b473bfbbf086ca98a65e87ae79dbb92a651 100644 GIT binary patch delta 50629 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 X2*#JcJP{rYF*7+ZH3}sqMNdWwXzAIs diff --git a/firmware/weather_station.ino b/firmware/weather_station.ino index 98ab594..9d0a1c8 100644 --- a/firmware/weather_station.ino +++ b/firmware/weather_station.ino @@ -67,9 +67,14 @@ const byte SlaveId = 14; * 30004: Temperature (degrees Celcius) * 30005: Rain last hour (l/m2) * 30006: Rain last 24 hours (l/m2) - * 30007: Rain since midnight (l/m2) + * 30007: Rain since midnight (l/m2) [NOT IMPLEMENTED, always 0] * 30008: Humidity (percent) * 30009: Barometric pressure (hPa) + * 30010: Luminosity (W/m2) + * 30011: Snow fall [NOT IMPLEMENTED, always 0] + * 30012: Raw rainfall counter (mm) + * 30013: Temperature pressure sensor (degrees Celsius) + * 30014: Status bits 0=heater, 1-15: reserved * */ const int SensorIDIreg = 0; @@ -82,6 +87,18 @@ const int SensorRainLast24Ireg = 6; const int SensorRainSinceMidnightIreg = 7; const int SensorHumidityIreg = 8; const int SensorPressureIreg = 9; +const int SensorLuminosityIreg = 10; +const int SensorSnowFallIreg = 11; +const int SensorRainfallRawIreg = 12; +const int SensorTemperatureBackupIreg = 13; +const int SensorStatusBitsIreg = 14; + +/* Modbus Registers Offsets (0-9999) + * Coils + * 0 = Heater algorithm (0 = disable, 1 = enable) + */ +const int HeaterCoil = 0; + // RS-485 serial port #define MySerial Serial // define serial port used, Serial most of the time, or Serial1, Serial2 ... if available const unsigned long Baudrate = 9600; @@ -116,68 +133,153 @@ struct MeasuredData { int RainLast24; int SensorRainSinceMidnight; int Pressure; + int Luminosity; + int StatusBits = 0; + unsigned int RainfallCounter = 0; float Temperature; float Humidity; + float TemperatureBackup; bool HeaterStatus = 0; } MeasuredData; +// State machine implementing smart heater to prevent saturation of the sensor +char HeaterSi7021 (float humidity) +{ + static int state=0; + static unsigned long StatemachineTimer=0; + bool TempValid=1; + bool Heater=0; + + // If Smart heater algorithm is disabled, reset the statemachine forever. + // TempValid bit is also forced to 1, but it could be that we just came out of a heater period. + // We assume that the client on the other side of the ModBus is smart enough to understand. + if (MeasuredData.StatusBits & 0x04) + state = 0; + + switch (state) + { + // Default state: humidity is below 95% + case 0: + Heater = 0; + if (humidity >= 95) { + StatemachineTimer = millis(); + state = 1; + } + break; + // Humidity went above 95%. See if humidity stays above 95% for more than an hour, if so turn on heater + case 1: + if (humidity >= 95) { + if ( (millis() - StatemachineTimer) >= 3.6e+6 ) { + Heater = 1; + TempValid = 0; + StatemachineTimer = millis(); + state = 2; + } else { + Heater = 0; + } + } else { + Heater = 0; + state = 0; + } + break; + + // Heater is now on, let the sensor cook for 10 minutes + case 2: + if ( (millis() - StatemachineTimer) >= 600000 ) { + StatemachineTimer = millis(); + Heater = 0; + state = 3; + } else { + Heater = 1; + } + TempValid = 0; + break; + // Heater is now off, let the sensor cool for 10 minutes + case 3: + if ( (millis() - StatemachineTimer) >= 600000 ) { + TempValid = 1; // Sensor cooled, so we can take a valid temperature reading + if (humidity >= 95) { + // Humidity still above 95%, repeat heating/cooling + Heater = 1; + StatemachineTimer = millis(); + state = 2; + } else { + // Humidity below 95%, reset statemachine + Heater = 0; + state = 0; + } + } else { + Heater = 0; + TempValid = 0; + } + break; + + default: + Heater = 0; + state = 0; + break; + } + + return TempValid<<1 | Heater; + +} // Read Si7021 sensor and process data void ReadSi7021 (void) { + char result=0x2; + si7021.triggerMeasurement(); si7021.getHumidity(MeasuredData.Humidity); - si7021.getTemperature(MeasuredData.Temperature); if (MeasuredData.Humidity>100 || MeasuredData.Humidity<0) MeasuredData.Humidity = 100; + + //If humidity is larger than 95% switch on heater to get more acurate measurement and prevent memory offset + result = HeaterSi7021(MeasuredData.Humidity); + MeasuredData.StatusBits &= 0xFFFC; // Reset heater status bits to zero + MeasuredData.StatusBits |= result; // And set the proper bits to one if there are any. The result is we copied the status bits to the register + + // Scale for more decimal positions when converted to integer value for ModBus + MeasuredData.Humidity *= 100; - //If humidity is larger than 96% switch on heater to get more acurate measurement and prevent memory offset - //Switch off when lower than 94% (hysteresis) - if (MeasuredData.Humidity > 96 && !MeasuredData.HeaterStatus) { - Serial.print(F("Heater on.")); - MeasuredData.HeaterStatus = 1; - si7021.setHeater(MeasuredData.HeaterStatus); + // Temperture readings are valid (as the sensor is not heated) + if (result & 0x2) { + si7021.getTemperature(MeasuredData.Temperature); + // Scale for more decimal positions when converted to integer value for ModBus + MeasuredData.Temperature *= 100; + //Serial.print(F("Valid temp")); } - if (MeasuredData.Humidity < 94 && MeasuredData.HeaterStatus) { - Serial.print(F("Heater off.")); + // Statemachine thinks it is time to switch on the heater + if (result & 0x1) { + //Serial.print(F("Heater on.")); + MeasuredData.HeaterStatus = 1; + + } else { + //Serial.print(F("Heater off.")); MeasuredData.HeaterStatus = 0; - si7021.setHeater(MeasuredData.HeaterStatus); } - - // Scale for more decimal positions when converted to integer value for ModBus - MeasuredData.Humidity *= 100; - MeasuredData.Temperature *= 100; + si7021.setHeater(MeasuredData.HeaterStatus); + } // Read BMP280 void ReadBMP280 (void) { -// MeasuredData.Pressure=0; - bmp280.awaitMeasurement(); - float temperature; - bmp280.getTemperature(temperature); - float pascal; bmp280.getPressure(pascal); - pascal = (pascal - PRESSURE_OFFSET) / 10; // Convert to hPa - MeasuredData.Pressure = pascal; + bmp280.getTemperature(MeasuredData.TemperatureBackup); + // Scale for more decimal positions when converted to integer value for ModBus + MeasuredData.TemperatureBackup *= 100; + bmp280.triggerMeasurement(); - // When humidity is high, the heater of the Si7021 is on. This causes the temperature sensor of the humidity sensor to heat up. - // Use temperature sensor of BMP280 instead. - if (MeasuredData.HeaterStatus) { - bmp280.getTemperature(MeasuredData.Temperature); - // Scale for more decimal positions when converted to integer value for ModBus - MeasuredData.Temperature *= 100; - } - } int MaxOfArray (int array[], unsigned int length) @@ -214,7 +316,8 @@ void ReadSparkfunWeatherStation (void) float tmpRegister; - MeasuredData.WindDirection = weatherMeterKit.getWindDirection(); + tmpRegister = 10*weatherMeterKit.getWindDirection(); // Use float for conversion to degrees times 10, than put it in integer register for ModBus + MeasuredData.WindDirection = tmpRegister; tmpRegister = 100*(weatherMeterKit.getWindSpeed())/3.6; // Use float for conversion to m/s times 100, than put it in integer register for ModBus MeasuredData.WindSpeed = tmpRegister; tmpRegister = 100*weatherMeterKit.getTotalRainfall(); // Use float for conversion to l/m2 times 100, than put it in integer register for ModBus @@ -279,6 +382,9 @@ void ReadSparkfunWeatherStation (void) RainPerHourCounter=0; } RainPerHour[RainPerHourCounter] = MeasuredData.Rain; + // Every time before we reset the TotalRainCounter we add the amount to the RawRainCounter. + // This 16 bit register will eventually overflow, but 655.35mm of rain fall is a lot! + MeasuredData.RainfallCounter += MeasuredData.Rain; // We don't care about the rounding error due to the convertion from float to int weatherMeterKit.resetTotalRainfall(); // Calculate rain fall in the last 24 hours @@ -320,13 +426,22 @@ void setup() { mb.addIreg (SensorRainSinceMidnightIreg); mb.addIreg (SensorHumidityIreg); mb.addIreg (SensorPressureIreg); + mb.addIreg (SensorLuminosityIreg); + mb.addIreg (SensorSnowFallIreg); + mb.addIreg (SensorRainfallRawIreg); + mb.addIreg (SensorTemperatureBackupIreg); + mb.addIreg (SensorStatusBitsIreg); + + // Add HeaterCoil register + mb.addCoil (HeaterCoil); // Set Weather station ID mb.Ireg (SensorIDIreg, 0x5758); // Set unused register to zero mb.Ireg (SensorRainSinceMidnightIreg, 0); + mb.Ireg (SensorSnowFallIreg, 0); - Serial.println(F("Weather station v0.1.0")); + Serial.println(F("Weather station v0.2.1")); Serial.println(F("(C)2024 M.T. Konstapel")); Serial.println(F("This project is free and open source")); Serial.println(F("More details: https://meezenest.nl/mees/")); @@ -346,6 +461,14 @@ void setup() { } } + // The standard library of the Si7021 sets the heater element to the default 3.1mA, but we want the full power + // We could alter the library, but than we break compatibility. So for this one time we do a raw-write to the + // heater register. + const uint8_t SI7021_I2C_ADDRESS =(0x40); + const uint8_t SI7021_CMD_WRITE_HEATER_CONTROL_REG =(0x51); + const uint8_t SI7021_HEATER_FULL_BLAST =(0x0F); // Set heater to 94mA + i2c.writeByte(SI7021_I2C_ADDRESS, SI7021_CMD_WRITE_HEATER_CONTROL_REG, SI7021_HEATER_FULL_BLAST); + // Initialize BMP280 pressure sensor Serial.print(F("Pressure sensor BMP280 ")); if (bmp280.initialize()) @@ -467,11 +590,22 @@ void loop() { mb.Ireg (SensorTemperatureIreg, MeasuredData.Temperature); mb.Ireg (SensorHumidityIreg, MeasuredData.Humidity); mb.Ireg (SensorPressureIreg, MeasuredData.Pressure); + mb.Ireg (SensorTemperatureBackupIreg, MeasuredData.TemperatureBackup); + mb.Ireg (SensorLuminosityIreg, MeasuredData.Luminosity); + mb.Ireg (SensorRainfallRawIreg, MeasuredData.RainfallCounter); + mb.Ireg (SensorStatusBitsIreg, MeasuredData.StatusBits); // Debug wind vane //Serial.print(F("\n Measured ADC: ")); //Serial.print(analogRead(windDirectionPin)); + // enable or disable smart heater + if (mb.Coil (HeaterCoil)) { + MeasuredData.StatusBits |= 0x04; // Set bit + } else { + MeasuredData.StatusBits &= 0x0B; // Reset bit + } + digitalWrite(LED_BUILTIN, LOW); // LED as heartbeat diff --git a/test_software/__pycache__/epever_control.cpython-36.pyc b/test_software/__pycache__/epever_control.cpython-36.pyc index 5fe7fbf5ef3cb62454e4142338bd7827fe8cc17d..a38d4ad9008efdd15273d37302ca9edb0be587db 100644 GIT binary patch delta 883 zcmZ`%F>KR76!pbUWBU@jZPKI(l*Y7m;xvV#E-VO&gb)a#BGiEl4Q}s54Wx=Lj!>&C zs9`7)(;t{vVMA0bOo)L6CT1k0?u?8Th<`~)0ur|LzI^Z9d*}b}Oa8cEt|Sts_5Bt9 zVI7)zm3)Ln_2MLtGL1#q*s} z^lvan`o@F_7!J+fSVyHyWZ5blCy z7vYIj#ob5N8RCO&pM?%xgm=~qO>_@5IO=@*9uI3FuQ#~x!8reT5MgVK_&kFa>9+ReCPn zK98fuBO(noJ(o@Jo$m0qxgT;-N2=EV0&mQJNEuKV3BZU!fZ7ij^*(8_pgCgR7@F@b z$ZIk2H(&8GuxekuJdHY$m2g7BjD%AXW+gZh<|NEZa3vHalq4)lD8r%ctVl+WX%XE_ X=_xH0)wTb;s!&nt#l$ik+v~ppHD<~- delta 410 zcmeyZenElDn3tC;@YJ-_nLHc06qp$&Ox9+$XG`Hu;b~!*T*K_c7R;cja7%3RLLsru zJS-M0lQ(cHOy=VZV6>bZ&*?R}j)zNGEFerFv8X7qQlTiZBsE1LxwNP#HLs+Im4Shw zh!I4HPQJ)#!e~30k3)H~CRZAx=;T6PHJF zF5u>4be&w!UBV^`5|jXGnk>)5&FBeMeM*3Pax70Uk`6A8^wg60qQuNR-^mYox?nPe zyoQW{5G}lAK)W6JEEz*5SM#;Q6kOy~oUF;u%NRNN1;6^_IQ}T0B9PcEpja$WOrP0L zQ)u!@A@?wGkV7Ovgfxhd0THqwLLNjYf(RuLp#ma!Q3*Z}ml;Ta^cRD)a7ad3%n UOl}kw;RH)*vKMJgUM3t00GE4V6#xJL diff --git a/test_software/epever_control.py b/test_software/epever_control.py index bcf0386..4c42a90 100644 --- a/test_software/epever_control.py +++ b/test_software/epever_control.py @@ -52,6 +52,10 @@ class EpeverChargeController(minimalmodbus.Instrument): @retry(wait_fixed=200, stop_max_attempt_number=5) def retriable_read_bit(self, registeraddress, functioncode): return self.read_bit(registeraddress, functioncode) + + @retry(wait_fixed=200, stop_max_attempt_number=5) + def retriable_write_bit(self, registeraddress, data, functioncode): + return self.write_bit(registeraddress, data, functioncode) #Address range 0x3000 def get_id(self): @@ -60,7 +64,7 @@ class EpeverChargeController(minimalmodbus.Instrument): def get_wind_direction(self): """PV array rated current""" - return self.retriable_read_register(1, 0, 4) + return self.retriable_read_register(1, 1, 4) def get_wind_speedl(self): """PV array rated power (low 16 bits)""" @@ -93,3 +97,17 @@ class EpeverChargeController(minimalmodbus.Instrument): def get_pressure(self): """Charging mode: 0x0001 = PWM""" return self.retriable_read_register(9, 1, 4) + + def get_temperature_backup(self): + """Charging mode: 0x0001 = PWM""" + return self.retriable_read_register(13, 2, 4) + + def get_status_bits(self): + """Charging mode: 0x0001 = PWM""" + return self.retriable_read_register(14, 0, 4) + + def enable_heater(self): + self.retriable_write_bit(0, 1, 5) + + def disable_heater(self): + self.retriable_write_bit(0, 0, 5) diff --git a/test_software/weather_station_rs485_client.py b/test_software/weather_station_rs485_client.py index 5509005..62118d8 100644 --- a/test_software/weather_station_rs485_client.py +++ b/test_software/weather_station_rs485_client.py @@ -594,7 +594,9 @@ elif dump_file: dump_all_registers() else: - + status = 1 + print("Enable heater function") + controller.enable_heater() while (1): time.sleep(3) # Sleep for 3 seconds print ("Retrieving all known registers.") @@ -608,6 +610,8 @@ else: rawdat['Temperature'] = controller.get_temperature() rawdat['Humidity'] = controller.get_humidity() rawdat['Pressure'] = controller.get_pressure() + rawdat['Temp backup'] = controller.get_temperature_backup() + rawdat['Status bits'] = controller.get_status_bits() print (json.dumps(rawdat, indent=1, sort_keys=False))