rasProject_01 / weSweetHome  R. 116 2026-05-14
process control       /     RasPi software         by   weinert-automation
Loading...
Searching...
No Matches
sweetHome2.c File Reference

Common variables and functions for an smart home lab project. More...

#include "sweetHome2.h"
#include "sweetHomeLocal.h"

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.

Detailed Description

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.

Function Documentation

◆ switchHotWpump()

void switchHotWpump ( uint8_t const on)

Hot water comfort pump turn on/off.

It turns the hot water comfort circulation pump on respectively off.

Parameters
on!= 0 : on; else, ==0 : off

◆ setPhPckLimit()

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.

Parameters
powerLimitPPS power limit in W
Returns
the (new) power limit

◆ pckSwPec()

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.

Parameters
powerin W
Returns
the phase packet percentage 0..100

◆ setPckSwPerc()

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.

Parameters
perc0..200; values above PCK_POWER_IND_MAX will have no effect and return the current setting un-altered
Returns
the actual (new) phase packet percentage 0..200

◆ stopBatteryOps()

void stopBatteryOps ( char const * stopCommand)

Stop any battery load or unload operation.

Parameters
stopCommandit is recorded in state_t.controlV of state machine(s) involved; shall have (max.) 6 characters

◆ startBatteryUnl()

void startBatteryUnl ( char const * startCommand)

Start battery unload operation.

Stops all loading and starts unload (if battery charging state allows).

Parameters
startCommandit is recorded in state_t.controlV of state a machine involved; shall have (max.) 6 characters

◆ startBatteryLoad()

void startBatteryLoad ( char const * startCommand)

Start battery normal load operation.

Stops unloading and starts normal battery charging.

Parameters
startCommandit is recorded in state_t.controlV of state a machine involved; shall have (max.) 6 characters

◆ startBatteryKeep()

void startBatteryKeep ( char const * startCommand)

Start battery keep operation.

Stops unloading and starts battery charging for a minimal charging state.

Parameters
startCommandit is recorded in state_t.controlV of state a machine involved; shall have (max.) 6 characters

◆ batKeepInhTimChg()

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.

Parameters
mepointer to the inhibit battery keep alive loading timer

◆ logBatteryState()

void logBatteryState ( )

Log battery state on outLog as line with time stamp.

Logs the battery voltage in the format

◆ switchBatToStepUp()

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.

Parameters
ontrue: switch battery to step up converter; 0, false: turn step up converter off.

◆ setBatLoadPWM()

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.

Parameters
pwmthe pwm ratio 0: 0%; 255: 100%

◆ changeBatLoadPWM()

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).

Parameters
pwmChgthe change of the pwm value

◆ batUnloadStatChg()

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:

See also
batCntBalStatChg switchBatToStepUp() batCntLodStatChg()
Parameters
mepointer to the battery unload SFC, never NULL (not checked!)

◆ batCntBalStatChg()

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.

See also
batUnloadSeq setBatLoadPWM() batCntLodStatChg()
Parameters
mepointer to the battery ballast load SFC, never NULL (not checked)

◆ batCntLodStatChg()

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.

See also
batCntBalStatChg() batUnloadStatChg()
Parameters
mepointer to the battery unload SFC, never NULL

◆ befRiseTimChg()

void befRiseTimChg ( state_t *const me)

Before sunrise timer state change callback.

On timer end .....

Parameters
mepointer to the sunset timer

◆ dawnTimChg()

void dawnTimChg ( state_t *const me)

Dawn timer state change callback.

On timer end .....

Parameters
mepointer to the dawn timer

◆ sunriseTimChg()

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.

Parameters
mepointer to the sunrise timer

◆ sunsetTimChg()

void sunsetTimChg ( state_t *const me)

Sunset timer state change callback.

On timer end .....

Parameters
mepointer to the sunset timer

◆ duskTimChg()

void duskTimChg ( state_t *const me)

Dusk timer state change callback.

On timer end .....

Parameters
mepointer to the sunset timer

◆ genSunStateText()

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..

Parameters
stateTexta character array supplied to hold the state text to be generated; minimal length 80.
mepointer to own state; never null
stamp(time) stamp to be prepended (max. length 23); default " - "

◆ switchSolPow()

void switchSolPow ( state_t *const me)

Solar power producer transition.

At the moment just switch the relays and set a flag.
Note 1: trigger with pSolar
Note 2: Used for state_t solarPowerHyst only.
state_t solarPowerHyst = newFloatHyst("solPowerProd", switchSolPow, ...

Parameters
mepointer to the give away hysteresis

◆ solPowStateText()

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.

Parameters
stateTexta character array supplied to hold the state text to be generated; minimal length 80.
mepointer to own state; never null
stamp(time) stamp to be prepended (max. length 23); default " - "

◆ switchWouldGivAway()

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

Parameters
mepointer to the give away hysteresis

◆ switchWouldGiv250W()

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

Parameters
mepointer to the give away hysteresis

◆ switchConsGiv()

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).

Parameters
mepointer to the give away hysteresis

◆ setConsGiv()

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)

Parameters
mepointer to consumeGiveSFC

◆ surplStateText()

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.

Parameters
stateTexta character array supplied to hold the state text to be generated; minimal length 80.
mepointer to own state; never null
stamp(time) stamp to be prepended (max. length 23); default " - "

◆ mqttInit()

int mqttInit ( )

Initialise as MQTT client.

On success only: subscribe, loop and publish.

Returns
0: success the common mosq is set and usable; else: errno

◆ mqttPlg01Set()

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.

Parameters
onswitch on when true, else off

◆ mqttPlg02Set()

void mqttPlg02Set ( uint8_t const on)

Switch the plug PLG2.

See mqttPlg01Set

◆ mqttPlg03Set()

void mqttPlg03Set ( uint8_t const on)

Switch the plug PLG3.

See mqttPlg01Set

◆ mqttPlg04Set()

void mqttPlg04Set ( uint8_t const on)

Switch the plug PLG4.

See mqttPlg01Set

Variable Documentation

◆ hippoSwitchMode

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)

◆ phPckSwIndex

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

◆ batVoltValid

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.

◆ batKeepInh

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

◆ batUnloadAllowed

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.

See also
BAT_UNL_SUMM
BAT_UNL_WINT

◆ batLoadAllowed

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.

See also
batUnloadAllowed
BAT_LOAD_FORBID

◆ hundredsV

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.

See also
formFixed16 valFilVal batVoltValid

◆ batModPWM

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!

◆ batLoadPowValid

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.

◆ sunriseTimer

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.

◆ sunsetTimer

state_t sunsetTimer

Sunset timer.

This timer will run out every day at (approximated) sunset. See also sunriseTimer

◆ befRiseTimer

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

◆ dawnTimer

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

◆ 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

◆ solarPowerHyst

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

◆ wouldGiveAwayHyst

state_t wouldGiveAwayHyst

Would give away hysteresis.

thresholds (04.03.18): -/+ 7W

◆ wouldGive250WHyst

state_t wouldGive250WHyst

Would give away 250W hysteresis.

thresholds (04.03.18): -250 / -178W

◆ consumeGiveHyst

state_t consumeGiveHyst

Give away hysteresis.

thresholds: PDEL_SGGIVE, PDEL_SGCONS

◆ consumeGiveSFC

state_t consumeGiveSFC

Give away state machine / SFC.

Status ON means consumer: OK.
Status OFF means very low power consumption: Inhibit power delivery.

◆ subTopStPlg01

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.

◆ clientId

char clientId[38]

MQTT client ID.

default value: sweetHomeControl; length: 15; max. length: 36
May be changed before mqttInit().