Something so simple!
This is why I build my own stuff. It's trivial to include UTC time stamps with each data sample for time synchronization on controllers without accurate time keeping.
{
"RDAQ1name": "Energy_Mqtt_BMC1",
"RDAQ1board": "BMCBoard",
"RDAQ1sequence": 5893,
"RDAQ1mqtt_do_16b": 1,
"RDAQ1mqtt_di_16b": 0,
"RDAQ1bmc_adc0": 4.9963909422158626,
"RDAQ1bmc_adc1": 3.7562726511828224,
"RDAQ1build_date": "Jun 22 2025",
"RDAQ1build_time": "09:42:01",
"RDAQ1sequence_time": 1750699594
}
{
"RDAQ2name": "Energy_Mqtt_BMC2",
"RDAQ2board": "K8055 (VM110)",
"RDAQ2sequence": 15006,
"RDAQ2mqtt_do_16b": 32,
"RDAQ2mqtt_di_16b": 0,
"RDAQ2bmc_adc0": 31.283194167450276,
"RDAQ2bmc_adc1": 30.052978542849083,
"RDAQ2build_date": "Jun 12 2025",
"RDAQ2build_time": "08:47:14",
"RDAQ2sequence_time": 1750699594
}
{
"RDAQ3name": "Energy_Mqtt_BMC3",
"RDAQ3board": "BMCBoard",
"RDAQ3sequence": 586,
"RDAQ3mqtt_do_16b": 2,
"RDAQ3mqtt_di_16b": 0,
"RDAQ3bmc_adc0": 25.227795128151275,
"RDAQ3bmc_adc1": 31.475574896633365,
"RDAQ3build_date": "Jun 22 2025",
"RDAQ3build_time": "09:42:01",
"RDAQ3sequence_time": 1750699601
}

The server power system is pushing excess power into the local house grid.

{
"RDAQ1name": "Energy_Mqtt_BMC1",
"RDAQ1board": "BMCBoard",
"RDAQ1sequence": 5893,
"RDAQ1mqtt_do_16b": 1,
"RDAQ1mqtt_di_16b": 0,
"RDAQ1bmc_adc0": 4.9963909422158626,
"RDAQ1bmc_adc1": 3.7562726511828224,
"RDAQ1build_date": "Jun 22 2025",
"RDAQ1build_time": "09:42:01",
"RDAQ1sequence_time": 1750699594
}
{
"RDAQ2name": "Energy_Mqtt_BMC2",
"RDAQ2board": "K8055 (VM110)",
"RDAQ2sequence": 15006,
"RDAQ2mqtt_do_16b": 32,
"RDAQ2mqtt_di_16b": 0,
"RDAQ2bmc_adc0": 31.283194167450276,
"RDAQ2bmc_adc1": 30.052978542849083,
"RDAQ2build_date": "Jun 12 2025",
"RDAQ2build_time": "08:47:14",
"RDAQ2sequence_time": 1750699594
}
{
"RDAQ3name": "Energy_Mqtt_BMC3",
"RDAQ3board": "BMCBoard",
"RDAQ3sequence": 586,
"RDAQ3mqtt_do_16b": 2,
"RDAQ3mqtt_di_16b": 0,
"RDAQ3bmc_adc0": 25.227795128151275,
"RDAQ3bmc_adc1": 31.475574896633365,
"RDAQ3build_date": "Jun 22 2025",
"RDAQ3build_time": "09:42:01",
"RDAQ3sequence_time": 1750699601
}
C:
/*
* check for incoming data on the MQTT connection
* use UART1 or the MQTT receive data port
* calc_bsoc runs in interrupt low context and uses 16-bit results -> git_power from this
* cmd_value is the buffer variable
*/
void gti_cmds(void)
{
static uint8_t value[] = {0, 0, 0, 0}, vi = 0;
static uint8_t utc_value[DEF_TIME_SIZE] = {0};
static bool utc = false;
uint8_t vcmd_size = sizeof(value);
uint8_t utc_vcmd_size = DEF_TIME_SIZE - 1;
if (Sready()) {
mqtt_r = Sread();
#ifdef GTI_ECHO
UART1_Write(mqtt_r); // debug echo
#endif
switch (mqtt_r) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (!utc) { // process power cmds
if (vi < vcmd_size) {
value[vi++] = mqtt_r - 48; // ascii '0'
} else {
}
} else { // process UTC time from host cmds
if (vi < utc_vcmd_size) {
utc_value[vi++] = mqtt_r;
} else {
}
}
break;
case 'T': // begin UTC value
utc = true;
break;
case 't': // end UTC value
utc = false;
if (vi >= utc_vcmd_size) {
vi = 0;
utc_value[10] = 0;
utc_cmd_value = (time_t) atol((char *) utc_value);
if (utc_cmd_value < DEF_TIME) {
utc_cmd_value = DEF_TIME;
}
set_time(utc_cmd_value);
};
break;
case 'V': // begin power/utc value
vi = 0;
break;
case 'X': // end power value
utc = false;
if (vi >= vcmd_size) {
vi = 0;
cmd_value = value[0]*1000 + value [1]*100 + value[2]*10 + value[3];
if (cmd_value > GTI_MAX) {
cmd_value = GTI_MAX;
}
if (cmd_value < 0) {
cmd_value = 0;
}
INTERRUPT_GlobalInterruptLowDisable(); // 16-bit atomic update
gti_power = cmd_value;
INTERRUPT_GlobalInterruptLowEnable();
};
break;
case 'Z': // zero power
utc = false;
cmd_value = 0;
break;
case '+': // incr power
utc = false;
cmd_value = gti_power + GTI_INCR;
if (cmd_value > GTI_MAX) {
cmd_value = GTI_MAX;
}
break;
case '-': // decr power
utc = false;
cmd_value = gti_power - GTI_INCR;
if (cmd_value < 0) {
cmd_value = 0;
}
break;
case 'I': // idle power
utc = false;
cmd_value = GTI_IDLE;
break;
case 'F': // normal operation
utc = false;
cmd_value = GTI_NORM;
break;
case 'M': // max unit rated power testing
utc = false;
cmd_value = GTI_MAX;
break;
case '#': // execute command symbol
utc = false;
INTERRUPT_GlobalInterruptLowDisable(); // 16-bit atomic update
gti_power = cmd_value;
INTERRUPT_GlobalInterruptLowEnable();
break;
default: // eat extra characters
utc = false;
while (Sready()) {
mqtt_r = Sread();
}
break;
}
}
}
// TMR5 one second time keeping in V.ticks.
void set_time(const time_t t)
{
PIE8bits.TMR5IE = 0;
V.ticks = t;
PIE8bits.TMR5IE = 1;
}
/*
* if t > 0, t is set to memory location of current_time variable
*/
time_t time(time_t * t)
{
static time_t current_time;
PIE8bits.TMR5IE = 0;
current_time = V.ticks;
PIE8bits.TMR5IE = 1;
if (t) {
t = ¤t_time;
}
return current_time;
}

The server power system is pushing excess power into the local house grid.

Last edited:















































































