33 * Copyright (C) 2022 Thomas Basler and others
44 */
55#include " Hoymiles.h"
6+ #include " Utils.h"
67#include " inverters/HMS_1CH.h"
78#include " inverters/HMS_2CH.h"
89#include " inverters/HMS_4CH.h"
1213#include " inverters/HM_4CH.h"
1314#include < Arduino.h>
1415
15- #define HOY_SEMAPHORE_TAKE () \
16- do { \
17- } while (xSemaphoreTake(_xSemaphore, portMAX_DELAY) != pdPASS)
18- #define HOY_SEMAPHORE_GIVE () xSemaphoreGive(_xSemaphore)
19-
2016HoymilesClass Hoymiles;
2117
2218void HoymilesClass::init ()
2319{
24- _xSemaphore = xSemaphoreCreateMutex ();
25- HOY_SEMAPHORE_GIVE (); // release before first use
26-
2720 _pollInterval = 0 ;
2821 _radioNrf.reset (new HoymilesRadio_NRF ());
2922 _radioCmt.reset (new HoymilesRadio_CMT ());
@@ -41,7 +34,7 @@ void HoymilesClass::initCMT(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8
4134
4235void HoymilesClass::loop ()
4336{
44- HOY_SEMAPHORE_TAKE ( );
37+ std::lock_guard<std::mutex> lock (_mutex );
4538 _radioNrf->loop ();
4639 _radioCmt->loop ();
4740
@@ -57,67 +50,90 @@ void HoymilesClass::loop()
5750 }
5851
5952 if (iv != nullptr && iv->getRadio ()->isInitialized () && iv->getRadio ()->isQueueEmpty ()) {
60- _messageOutput->print (" Fetch inverter: " );
61- _messageOutput->println (iv->serial (), HEX);
6253
63- if (! iv->isReachable ()) {
64- iv-> sendChangeChannelRequest ( );
65- }
54+ if (iv->getEnablePolling () || iv-> getEnableCommands ()) {
55+ _messageOutput-> print ( " Fetch inverter: " );
56+ _messageOutput-> println (iv-> serial (), HEX);
6657
67- iv->sendStatsRequest ();
58+ if (!iv->isReachable ()) {
59+ iv->sendChangeChannelRequest ();
60+ }
6861
69- // Fetch event log
70- bool force = iv->EventLog ()->getLastAlarmRequestSuccess () == CMD_NOK;
71- iv->sendAlarmLogRequest (force);
62+ iv->sendStatsRequest ();
7263
73- // Fetch limit
74- if ((iv->SystemConfigPara ()->getLastLimitRequestSuccess () == CMD_NOK)
75- || ((millis () - iv->SystemConfigPara ()->getLastUpdateRequest () > HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL)
76- && (millis () - iv->SystemConfigPara ()->getLastUpdateCommand () > HOY_SYSTEM_CONFIG_PARA_POLL_MIN_DURATION))) {
77- _messageOutput->println (" Request SystemConfigPara" );
78- iv->sendSystemConfigParaRequest ();
79- }
64+ // Fetch event log
65+ bool force = iv->EventLog ()->getLastAlarmRequestSuccess () == CMD_NOK;
66+ iv->sendAlarmLogRequest (force);
8067
81- // Set limit if required
82- if (iv->SystemConfigPara ()->getLastLimitCommandSuccess () == CMD_NOK) {
83- _messageOutput->println (" Resend ActivePowerControl" );
84- iv->resendActivePowerControlRequest ();
85- }
68+ // Fetch limit
69+ if (((millis () - iv->SystemConfigPara ()->getLastUpdateRequest () > HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL)
70+ && (millis () - iv->SystemConfigPara ()->getLastUpdateCommand () > HOY_SYSTEM_CONFIG_PARA_POLL_MIN_DURATION))) {
71+ _messageOutput->println (" Request SystemConfigPara" );
72+ iv->sendSystemConfigParaRequest ();
73+ }
8674
87- // Set power status if required
88- if (iv->PowerCommand ()->getLastPowerCommandSuccess () == CMD_NOK) {
89- _messageOutput->println (" Resend PowerCommand " );
90- iv->resendPowerControlRequest ();
91- }
75+ // Set limit if required
76+ if (iv->SystemConfigPara ()->getLastLimitCommandSuccess () == CMD_NOK) {
77+ _messageOutput->println (" Resend ActivePowerControl " );
78+ iv->resendActivePowerControlRequest ();
79+ }
9280
93- // Fetch dev info (but first fetch stats)
94- if (iv->Statistics ()->getLastUpdate () > 0 ) {
95- bool invalidDevInfo = !iv-> DevInfo ()-> containsValidData ()
96- && iv->DevInfo ()-> getLastUpdateAll () > 0
97- && iv-> DevInfo ()-> getLastUpdateSimple () > 0 ;
81+ // Set power status if required
82+ if (iv->PowerCommand ()->getLastPowerCommandSuccess () == CMD_NOK ) {
83+ _messageOutput-> println ( " Resend PowerCommand " );
84+ iv->resendPowerControlRequest ();
85+ }
9886
99- if (invalidDevInfo) {
100- _messageOutput->println (" DevInfo: No Valid Data" );
87+ // Fetch dev info (but first fetch stats)
88+ if (iv->Statistics ()->getLastUpdate () > 0 ) {
89+ bool invalidDevInfo = !iv->DevInfo ()->containsValidData ()
90+ && iv->DevInfo ()->getLastUpdateAll () > 0
91+ && iv->DevInfo ()->getLastUpdateSimple () > 0 ;
92+
93+ if (invalidDevInfo) {
94+ _messageOutput->println (" DevInfo: No Valid Data" );
95+ }
96+
97+ if ((iv->DevInfo ()->getLastUpdateAll () == 0 )
98+ || (iv->DevInfo ()->getLastUpdateSimple () == 0 )
99+ || invalidDevInfo) {
100+ _messageOutput->println (" Request device info" );
101+ iv->sendDevInfoRequest ();
102+ }
101103 }
102104
103- if ((iv->DevInfo ()->getLastUpdateAll () == 0 )
104- || (iv->DevInfo ()->getLastUpdateSimple () == 0 )
105- || invalidDevInfo) {
106- _messageOutput->println (" Request device info" );
107- iv->sendDevInfoRequest ();
105+ // Fetch grid profile
106+ if (iv->Statistics ()->getLastUpdate () > 0 && iv->GridProfile ()->getLastUpdate () == 0 ) {
107+ iv->sendGridOnProFileParaRequest ();
108108 }
109+
110+ _lastPoll = millis ();
109111 }
110112
111113 if (++inverterPos >= getNumInverters ()) {
112114 inverterPos = 0 ;
113115 }
116+ }
114117
115- _lastPoll = millis ();
118+ // Perform housekeeping of all inverters on day change
119+ int8_t currentWeekDay = Utils::getWeekDay ();
120+ static int8_t lastWeekDay = -1 ;
121+ if (lastWeekDay == -1 ) {
122+ lastWeekDay = currentWeekDay;
123+ } else {
124+ if (currentWeekDay != lastWeekDay) {
125+
126+ for (auto & inv : _inverters) {
127+ if (inv->getZeroYieldDayOnMidnight ()) {
128+ inv->Statistics ()->zeroDailyData ();
129+ }
130+ }
131+
132+ lastWeekDay = currentWeekDay;
133+ }
116134 }
117135 }
118136 }
119-
120- HOY_SEMAPHORE_GIVE ();
121137}
122138
123139std::shared_ptr<InverterAbstract> HoymilesClass::addInverter (const char * name, uint64_t serial)
@@ -195,9 +211,8 @@ void HoymilesClass::removeInverterBySerial(uint64_t serial)
195211{
196212 for (uint8_t i = 0 ; i < _inverters.size (); i++) {
197213 if (_inverters[i]->serial () == serial) {
198- HOY_SEMAPHORE_TAKE ( );
214+ std::lock_guard<std::mutex> lock (_mutex );
199215 _inverters.erase (_inverters.begin () + i);
200- HOY_SEMAPHORE_GIVE ();
201216 return ;
202217 }
203218 }
0 commit comments