![]() |
rasProject_01 / weSweetHome
R. 116 2026-05-14
process control / RasPi software by weinert-automation
|
Common variables and functions for an smart home lab project. More...
Functions | |
| void | batCntBalStatChg (state_t *const me) |
| Battery as controlled ballast SFC state changes. | |
| void | batCntLodStatChg (state_t *const me) |
| Battery controlled load - SFC state changes. | |
| void | batKeepInhTimChg (state_t *const me) |
| Inhibit battery keep alive loading timer state change function. | |
| void | batUnloadStatChg (state_t *const me) |
| Battery unload SFC state changes. | |
| void | befRiseTimChg (state_t *const me) |
| Before sunrise timer state change callback. | |
| void | changeBatLoadPWM (int pwmChg) |
| Change battery loader module PWM. | |
| void | dawnTimChg (state_t *const me) |
| Dawn timer state change callback. | |
| void | duskTimChg (state_t *const me) |
| Dusk timer state change callback. | |
| void | genSunStateText (char *stateText, state_t const *const me, char const *stamp) |
| Generate the sun's status text. | |
| void | logBatteryState () |
| Log battery state on outLog as line with time stamp. | |
| void | mqttClean () |
| End as MQTT client. | |
| int | mqttInit () |
| Initialise as MQTT client. | |
| void | mqttPlg01Set (uint8_t const on) |
| Switch the plug Plug01. | |
| void | mqttPlg02Set (uint8_t const on) |
| Switch the plug PLG2. | |
| void | mqttPlg03Set (uint8_t const on) |
| Switch the plug PLG3. | |
| void | mqttPlg04Set (uint8_t const on) |
| Switch the plug PLG4. | |
| uint8_t | pckSwPec (float power) |
| Set and get package switch percentage by power. | |
| void | setBatLoadPWM (int const pwm) |
| Set battery loader module PWM. | |
| void | setConsGiv (state_t *const me) |
| Power consumer / producer (give away) SFC transition. | |
| uint8_t | setPckSwPerc (uint8_t perc) |
| Set package switch percentage. | |
| float | setPhPckLimit (float powerLimit) |
| Set and get package switch power limit. | |
| void | solPowStateText (char *stateText, state_t const *const me, char const *stamp) |
| Generate solar power status text. | |
| void | startBatteryKeep (char const *startCommand) |
| Start battery keep operation. | |
| void | startBatteryLoad (char const *startCommand) |
| Start battery normal load operation. | |
| void | startBatteryUnl (char const *startCommand) |
| Start battery unload operation. | |
| void | stopBatteryOps (char const *stopCommand) |
| Stop any battery load or unload operation. | |
| void | sunriseTimChg (state_t *const me) |
| Sunrise timer state change callback. | |
| void | sunsetTimChg (state_t *const me) |
| Sunset timer state change callback. | |
| void | surplStateText (char *stateText, state_t const *const me, char const *stamp) |
| Generate surplus power status text. | |
| void | switchBatToStepUp (uint8_t const on) |
| Switch battery to step up converter. | |
| void | switchConsGiv (state_t *const me) |
| Power consumer / producer (give away) transition. | |
| void | switchHotWpump (uint8_t const on) |
| Hot water comfort pump turn on/off. | |
| void | switchSolPow (state_t *const me) |
| Solar power producer transition. | |
| void | switchWouldGiv250W (state_t *const me) |
| Would give 250W or more away, the transition. | |
| void | switchWouldGivAway (state_t *const me) |
| Would give away transition. | |
Variables | |
| state_t | batCntBalSeq |
| Battery controlled load as ballast. | |
| state_t | batCntLodSeq |
| Battery loading and keeping. | |
| state_t | batKeepInh |
| Inhibit battery keep alive loading. | |
| int | batLoadAllowed |
| Battery loading allowed. | |
| uint8_t | batLoadPowValid |
| Valid battery charging power. | |
| volatile int | batModPWM |
| The actual battery load module's PWM input. | |
| int | batUnloadAllowed |
| Battery unload allowed. | |
| state_t | batUnloadSeq |
| Battery controlled unload via inverter. | |
| uint8_t | batVoltValid |
| The measured battery voltage is valid. | |
| state_t | befRiseTimer |
| Before sunrise timer. | |
| char | clientId [38] |
| MQTT client ID. | |
| state_t | consumeGiveHyst |
| Give away hysteresis. | |
| state_t | consumeGiveSFC |
| Give away state machine / SFC. | |
| state_t | dawnTimer |
| Dawn timer. | |
| state_t | duskTimer |
| Dusk timer. | |
| uint8_t | heaterAllowed |
| phase packet load enabled (always) | |
| int | hippoSwitchMode |
| Hippogreiff on/off times. | |
| uint16_t | hundredsV |
| The battery voltage in 0.01V units. | |
| volatile uint16_t | logBatStrCnt |
| counter to log battery state if < 3 | |
| volatile uint8_t | phPckCnt |
| current switch state duration counter | |
| volatile uint8_t | phPckOff |
| current phase packet switch OFF duration | |
| volatile uint8_t | phPckOn |
| current phase packet switch ON duration | |
| volatile uint8_t | phPckRelOffDelay |
| PPS relay off delay. | |
| volatile uint8_t | phPckS2 |
| heater 2 pps switch state: 0 off; 1 on | |
| volatile uint8_t | phPckSw |
| phase packet switch state: 0 off; 1 on | |
| volatile uint8_t | phPckSwIndex |
| Actual index (0..200%) determining power. | |
| volatile uint8_t | phPpow2 |
| heater 2 power * 50% (0:0% .. 2:100%) | |
| float | pStdW |
| actual power delivery to home | |
| oneWireDevice_t | sensors [NUM1W_SENSORS] |
| The 1-wire sensors used. | |
| state_t | solarPowerHyst |
| Solar power producer hysteresis. | |
| char | subTopStPlg01 [14] |
| State sub topic of S20 plug Number 01 to 09. | |
| state_t | sunriseTimer |
| Sunrise timer. | |
| state_t | sunsetTimer |
| Sunset timer. | |
| state_t | wouldGive250WHyst |
| Would give away 250W hysteresis. | |
| state_t | wouldGiveAwayHyst |
| Would give away hysteresis. | |
Common variables and functions for an smart home lab project.
Revision history
This file is the addendum to sweetHome.c and sweetHome.h containing those process IO related issues, not necessary for pure HMI or logging related programs.
| void switchHotWpump | ( | uint8_t const | on | ) |
Hot water comfort pump turn on/off.
It turns the hot water comfort circulation pump on respectively off.
| on | != 0 : on; else, ==0 : off |
| float setPhPckLimit | ( | float | powerLimit | ) |
Set and get package switch power limit.
This function sets the PPS power limit in the range 0.0 ... PCK_POWER_LIM_MAX.
| powerLimit | PPS power limit in W |
| uint8_t pckSwPec | ( | float | power | ) |
Set and get package switch percentage by power.
Besides determining an returning the percentage(power), this function sets the process control values via setPckSwPerc() returns its value.
| power | in W |
| uint8_t setPckSwPerc | ( | uint8_t | perc | ) |
Set package switch percentage.
This function sets phPckSwIndex by the parameter value in the range 0..200; respectively PCK_POWER_IND_MAX. Additionally it adjusts the current phPckCnt should its value be higher than by the new setting.
On transitions from respectively to 0 the control relay (PCK_POWER_REL) is actuated before respectively after actuating the electronic switch.
This function also sets .phPckpower in valFilVal according to the values in table (array) phPckSwPow.
| perc | 0..200; values above PCK_POWER_IND_MAX will have no effect and return the current setting un-altered |
| void stopBatteryOps | ( | char const * | stopCommand | ) |
Stop any battery load or unload operation.
| stopCommand | it is recorded in state_t.controlV of state machine(s) involved; shall have (max.) 6 characters |
| void startBatteryUnl | ( | char const * | startCommand | ) |
Start battery unload operation.
Stops all loading and starts unload (if battery charging state allows).
| startCommand | it is recorded in state_t.controlV of state a machine involved; shall have (max.) 6 characters |
| void startBatteryLoad | ( | char const * | startCommand | ) |
Start battery normal load operation.
Stops unloading and starts normal battery charging.
| startCommand | it is recorded in state_t.controlV of state a machine involved; shall have (max.) 6 characters |
| void startBatteryKeep | ( | char const * | startCommand | ) |
Start battery keep operation.
Stops unloading and starts battery charging for a minimal charging state.
| startCommand | it is recorded in state_t.controlV of state a machine involved; shall have (max.) 6 characters |
| void batKeepInhTimChg | ( | state_t *const | me | ) |
Inhibit battery keep alive loading timer state change function.
It turns the "battery keep alive loading" on when timer ends. see BAT_KEEP_PWM.
| me | pointer to the inhibit battery keep alive loading timer |
| void logBatteryState | ( | ) |
Log battery state on outLog as line with time stamp.
Logs the battery voltage in the format
| void switchBatToStepUp | ( | uint8_t | on | ) |
Switch battery to step up converter.
When the parameter is !=0 respectively ON, this function connects the battery to the step up converter (12V DC to 56V DC) feeding one input of a solar inverter (40..60V DC to 230V ~).
When the parameter is 0 or OFF, the step up converter will be disconnected resp. turned off.
| on | true: switch battery to step up converter; 0, false: turn step up converter off. |
| void setBatLoadPWM | ( | int | pwm | ) |
Set battery loader module PWM.
This function sets the battery load module power PWM signal and hence its output voltage. 0 is the lowest and 255 the highest possible setting. While this function allows setting to 0, the highest value is limited to BAT_LDMX_PWM.
| pwm | the pwm ratio 0: 0%; 255: 100% |
| void changeBatLoadPWM | ( | int | pwmChg | ) |
Change battery loader module PWM.
This function adds the parameter pwmChg's value to the current one limits the result to BAT_NOLD_PWM ... BAT_LDMX_PWM and sets it (see setBatLoadPWM).
| pwmChg | the change of the pwm value |
| void batUnloadStatChg | ( | state_t *const | me | ) |
Battery unload SFC state changes.
This sequential function chart (SFC) state machine organises the battery unload via a step up converter module. It's output (approx. 40V) is fed to the input of a low voltage (60V) two input solar inverter (EVT560).
This SFC handles all switching steps and (inhibit) conditions. Used in:
| me | pointer to the battery unload SFC, never NULL (not checked!) |
| void batCntBalStatChg | ( | state_t *const | me | ) |
Battery as controlled ballast SFC state changes.
This sequential state machine organises the battery load as ballast for surplus energy.
| me | pointer to the battery ballast load SFC, never NULL (not checked) |
| void batCntLodStatChg | ( | state_t *const | me | ) |
Battery controlled load - SFC state changes.
This sequential state machine organises the battery loading and keeping it in good load state. Not to be confused with batCntBalStatChg, i.e. using battery as storage/ballast.
| me | pointer to the battery unload SFC, never NULL |
| void befRiseTimChg | ( | state_t *const | me | ) |
Before sunrise timer state change callback.
On timer end .....
| me | pointer to the sunset timer |
| void dawnTimChg | ( | state_t *const | me | ) |
Dawn timer state change callback.
On timer end .....
| me | pointer to the dawn timer |
| void sunriseTimChg | ( | state_t *const | me | ) |
Sunrise timer state change callback.
On timer end turn off Hippogreiff (again) and mqttPlg02.
No more turning off battery unload due to replacing the one input miniJoule inverter by a two input Enversys. One input is for the PV panels and one for the battery discharge step up converter. Hence, solar power and battery discharging can be used simultaneously and do not have to be guarded against each other.
| me | pointer to the sunrise timer |
| void sunsetTimChg | ( | state_t *const | me | ) |
Sunset timer state change callback.
On timer end .....
| me | pointer to the sunset timer |
| void duskTimChg | ( | state_t *const | me | ) |
Dusk timer state change callback.
On timer end .....
| me | pointer to the sunset timer |
| void genSunStateText | ( | char * | stateText, |
| state_t const *const | me, | ||
| char const * | stamp ) |
Generate the sun's status text.
This function makes the special log text for sun's times: set, rise etc..
| stateText | a character array supplied to hold the state text to be generated; minimal length 80. |
| me | pointer to own state; never null |
| stamp | (time) stamp to be prepended (max. length 23); default " - " |
| void switchSolPow | ( | state_t *const | me | ) |
| void solPowStateText | ( | char * | stateText, |
| state_t const *const | me, | ||
| char const * | stamp ) |
Generate solar power status text.
This function generates the log text for the solar power on/off discriminator.
| stateText | a character array supplied to hold the state text to be generated; minimal length 80. |
| me | pointer to own state; never null |
| stamp | (time) stamp to be prepended (max. length 23); default " - " |
| void switchWouldGivAway | ( | state_t *const | me | ) |
Would give away transition.
At the moment just switch the relays and set a flag. Note: trigger wouldGiveAwayHyst with pGiveAway
| me | pointer to the give away hysteresis |
| void switchWouldGiv250W | ( | state_t *const | me | ) |
Would give 250W or more away, the transition.
At the moment just switch the relays and set a flag. Note: trigger with pGiveAway
| me | pointer to the give away hysteresis |
| void switchConsGiv | ( | state_t *const | me | ) |
Power consumer / producer (give away) transition.
Triggered with pHome, at transitions relay and plug are switched for signalling via the switchConsGiv() SFC to have minimal on and off times.
At transitions to OFF, i.e. producer role imminent, battery ballast loading will be started (if not yet ON).
| me | pointer to the give away hysteresis |
| void setConsGiv | ( | state_t *const | me | ) |
Power consumer / producer (give away) SFC transition.
At the moment just switch the relays and set a flag. Note: trigger with pHome (hyst)
| me | pointer to consumeGiveSFC |
| void surplStateText | ( | char * | stateText, |
| state_t const *const | me, | ||
| char const * | stamp ) |
Generate surplus power status text.
This function generates the log text for the surplus power status machine.
| stateText | a character array supplied to hold the state text to be generated; minimal length 80. |
| me | pointer to own state; never null |
| stamp | (time) stamp to be prepended (max. length 23); default " - " |
| int mqttInit | ( | ) |
Initialise as MQTT client.
On success only: subscribe, loop and publish.
| void mqttPlg01Set | ( | uint8_t const | on | ) |
Switch the plug Plug01.
This function publishes the switch command via MQTT to the relay device Plug01, usually a Sonoff S20 with Tasmota.
| on | switch on when true, else off |
| void mqttPlg02Set | ( | uint8_t const | on | ) |
Switch the plug PLG2.
See mqttPlg01Set
| void mqttPlg03Set | ( | uint8_t const | on | ) |
Switch the plug PLG3.
See mqttPlg01Set
| void mqttPlg04Set | ( | uint8_t const | on | ) |
Switch the plug PLG4.
See mqttPlg01Set
| int hippoSwitchMode |
Hippogreiff on/off times.
Bit 1,0, ( 3): switch at sunset resp. sunrise (winter)
Bit 3,2 (12): switch at dusk resp. dawn (summer)
| volatile uint8_t phPckSwIndex |
Actual index (0..200%) determining power.
This is the control variable for the electric heater elements in the hot water tank. Until June 2023 there was one such element of PCK100PERC_POWER W and this variable had a range of 0..100%. Since July 2023 there are two heater elements of equal power. The range of this control variable was extended to 0..200%. The power distribution between the two heater elements is done by software; see setPckSwPerc(uint8_t const perc) and PCK_POWER_IND_MAX
| uint8_t batVoltValid |
The measured battery voltage is valid.
When not 0 the last MQTT battery voltage measurement respectively message is not older than 2.4s and hence considered the actual valid value.
| state_t batKeepInh |
Inhibit battery keep alive loading.
This timer will be started after battery loading and unloading for a specific time BATkeepInhContLoad, BATkeepInhUnload or BATkeepInhByCmd. This timer is initially OFF and will be stopped in advance by battery keep command via HMI/GUI.
It will be started after battery unload, after battery ballast load and by battery off command via GUI.
When running out it will start battery keep alive with BAT_KEEP_PWM by startBatteryKeep.
Note: The feature seems/is unnecessarily complicated due to its lead acid battery past
| int batUnloadAllowed |
Battery unload allowed.
Bit 0 (1): allow after sunset
Bit 1 (2): allow before sunrise
Bit 3 (4): allow when Pimp > 400W, i.e. allow also at daylight.
Bit 4 (8): default (usually 2 in winter and 3 in summer)
Start value: 8 = default
Note: Must be a standard integer (no uint_8 e.g.) for use in getopt_long.
| int batLoadAllowed |
Battery loading allowed.
Bit 0 (1): allow ballast loading
Bit 1 (2): allow automatic / controlled loading
start value: 3 = all allowed
Note: Must be a standard integer (no uint_8 e.g.) for use in getopt_long.
| uint16_t hundredsV |
The battery voltage in 0.01V units.
This is just an integer value consistent to the last valid battery voltage measurement valFilVal.batVolt. Contrary to valFilVal.batVolt which is set to -0.9 to indicate invalidity after 2.4s without new (MQTT) measurements, this integer value will be kept "forever".
It is preset with 1289 (12.89 V) to avoid "battery low" status before the first valid MQTT measurement / message.
Receiving a good MQTT message from the battery voltmeter will set valFilVal.batVolt, batVoltValid and this value.
Use
to format as "12.89" without trailing zero.
| volatile int batModPWM |
The actual battery load module's PWM input.
The range of the Pi's pwm output control register 0 for 0 % or permanent off to 255 for 100% respectively permanent on. The eight bit register, hence, is to be fed with an unsigned 8 bit value which was for many years the type of this variable.
A new loader module since August 2025 uses the full range 0..255. This variable was made a standard int to simplify underflow and overflow detection.
Note: Keeping this variable's value in the range 0 .. +255 is essential!
| uint8_t batLoadPowValid |
Valid battery charging power.
Currently (2018..22026) the electric water tank heater and battery charging share a power meter. It will yield charging power (0..270 W) if and only if water heating (0..4 kW) is off. The criterion is the contactor to the water heaters is off or all electronic relays (SSRs) to the resistor strads are off.
| state_t sunriseTimer |
Sunrise timer.
This timer will run out every day at (approximated) sunrise. For the "every day" behaviour, its state change function will — after all due actions — restart this timer for the next 24h to hit (very approximately) the next sunrise. This acceptable guess will be adjusted at day change or at program start.
| state_t sunsetTimer |
Sunset timer.
This timer will run out every day at (approximated) sunset. See also sunriseTimer
| state_t befRiseTimer |
Before sunrise timer.
This timer will run out every day at about 180 min before (approximated) sunrise. The offset must be sufficient time to unload the battery before sunrise.
See also: sunriseTimer BEFORE_RISE
| state_t dawnTimer |
Dawn timer.
This timer will run out every day at (approximated) dawn, meaning the beginning of civil twilight. See also sunriseTimer and duskTimer
| state_t duskTimer |
Dusk timer.
This timer will run out every day at (approximated) dusk, meaning the end of civil twilight. About this time street lamps and position lights may be lit. See also sunriseTimer
| state_t solarPowerHyst |
Solar power producer hysteresis.
The limits of the power of the biggest (or all) PV panels to recognise the availability / generation of solar power.
Current limits 7.9W (off), 40.0 W (on); since 03.07.2025
Former values 4.8, 12.02
| state_t wouldGiveAwayHyst |
Would give away hysteresis.
thresholds (04.03.18): -/+ 7W
| state_t wouldGive250WHyst |
Would give away 250W hysteresis.
thresholds (04.03.18): -250 / -178W
| state_t consumeGiveHyst |
Give away hysteresis.
thresholds: PDEL_SGGIVE, PDEL_SGCONS
| state_t consumeGiveSFC |
Give away state machine / SFC.
Status ON means consumer: OK.
Status OFF means very low power consumption: Inhibit power delivery.
| char subTopStPlg01[14] |
State sub topic of S20 plug Number 01 to 09.
It's preset as plug01/POWER for 01, but the digit at index [5] will be set before each use accordingly.
| char clientId[38] |
MQTT client ID.
default value: sweetHomeControl; length: 15; max. length: 36
May be changed before mqttInit().