Some strange bug/feature...
Information is transmitted only when the device got time from KNX, I have put 
        if (timeStatus() == timeSet && resetPeriod != 0)
        {
           resetEnergyLoop();
        }

But don't know if it's enough...
This commit is contained in:
zelogik 2021-01-23 21:16:13 +01:00 committed by GitHub
parent 7618e82c00
commit 81a0a1a164
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -38,7 +38,7 @@ const uint8_t physicalCount = 6; // voltage,current,power_factor,power,energy,fr
uint8_t percentCycle = 0; // better to define a global or read knx.paramByte each time... ? uint8_t percentCycle = 0; // better to define a global or read knx.paramByte each time... ?
uint32_t timePeriod = 0; // same here, uint32_t timePeriod = 0; // same here,
uint8_t resetPeriod = 0; //same here ... uint8_t resetPeriod = 0; //same here ...
uint8_t resetEnergy = 0; // and here... disabled/day/week/month //uint8_t resetEnergy = 0; // and here... disabled/day/week/month
bool progMode = true; bool progMode = true;
@ -54,11 +54,10 @@ struct Physical {
void loop(){ void loop(){
// unsigned long currentMillis = millis(); // unsigned long currentMillis = millis();
// Delta Change update as defined in ETS // Delta Change update as defined in ETS
int32_t deltaPercent = ( 100 * ( _value - _lastValue ) / _value ); float deltaPercent = ( 100 * ( _value - _lastValue ) / _value );
if ( percentCycle != 0 && abs(deltaPercent) >= percentCycle ) if ( percentCycle != 0 && abs(deltaPercent) >= percentCycle )
{ {
_trigger = true; _trigger = true;
_lastValue = _value;
} }
// Refresh groupAddress value as defined in ETS since last update // Refresh groupAddress value as defined in ETS since last update
@ -70,6 +69,7 @@ struct Physical {
// UpdateGO but send to bus only if triggered by time or value change percentage // UpdateGO but send to bus only if triggered by time or value change percentage
if (_trigger){ if (_trigger){
knx.getGroupObject(_GOaddr).value(_value, _dpt); knx.getGroupObject(_GOaddr).value(_value, _dpt);
_lastValue = _value;
_lastMillis = millis(); _lastMillis = millis();
_trigger = false; _trigger = false;
}else{ }else{
@ -143,7 +143,6 @@ class Blinker
Blinker led = Blinker(ledPin); Blinker led = Blinker(ledPin);
void callBackProgMode(GroupObject& go){ void callBackProgMode(GroupObject& go){
progMode = (bool)go.value(); progMode = (bool)go.value();
} }
@ -172,7 +171,7 @@ void resetCallback(GroupObject& go)
{ {
if (go.value()) if (go.value())
{ {
resetEnergy = true; pzem.resetEnergy();
goReset.value(false); goReset.value(false);
} }
} }
@ -181,7 +180,7 @@ void setup() {
pinPeripheral(PIN_SERIAL2_RX, PIO_SERCOM); pinPeripheral(PIN_SERIAL2_RX, PIO_SERCOM);
pinPeripheral(PIN_SERIAL2_TX, PIO_SERCOM); pinPeripheral(PIN_SERIAL2_TX, PIO_SERCOM);
SerialUSB.begin(9600); // SerialUSB.begin(9600);
Serial2.begin(9600); Serial2.begin(9600);
ArduinoPlatform::SerialDebug = &SerialUSB; ArduinoPlatform::SerialDebug = &SerialUSB;
@ -238,12 +237,17 @@ void loop() {
if (knx.configured() && !progMode) if (knx.configured() && !progMode)
{ {
refreshValueLoop(); refreshValueLoop();
resetEnergyLoop();
for (uint8_t i=0; i< physicalCount; i++) for (uint8_t i=0; i< physicalCount; i++)
{ {
Physical[i].loop(); Physical[i].loop();
} }
if (timeStatus() == timeSet && resetPeriod != 0)
{
resetEnergyLoop();
}
} }
else if (progMode) else if (progMode)
{ {
@ -257,7 +261,7 @@ void refreshValueLoop(){
if (millis() - lastPzemUpdate >= pzemInterval) if (millis() - lastPzemUpdate >= pzemInterval)
{ {
for (uint8_t i=0; i< physicalCount; i++) for (uint8_t i=0; i < physicalCount; i++)
{ {
float isaValue; float isaValue;
switch (i) { //maybe a pointer or reference could be nicer... switch (i) { //maybe a pointer or reference could be nicer...
@ -282,11 +286,18 @@ void refreshValueLoop(){
default: default:
break; break;
} }
if(!isnan(isaValue)) if(!isnan(isaValue))
{ {
Physical[i].setValue(isaValue); Physical[i].setValue(isaValue);
} }
else
{
Physical[i].setValue(-1);
}
} }
lastPzemUpdate = millis();
led.set(500, 1000);
} }
} }
@ -339,14 +350,14 @@ void prodModeLoop(){ // run Only if progMode triggered ( at start or callback)
{ {
knx.progMode(true); knx.progMode(true);
timerProgPrevMillis = millis(); timerProgPrevMillis = millis();
led.set(500, 250); led.set(50, 100);
} }
else else
{ {
if (millis() - timerProgPrevMillis > timerProgMode) { if (millis() - timerProgPrevMillis > timerProgMode) {
knx.progMode(false); knx.progMode(false);
goProgMode.value(false); goProgMode.value(false);
progMode = 0; progMode = false;
} }
} }
} }