From cec575c435c568b17011bf78f85c20b06107ac15 Mon Sep 17 00:00:00 2001 From: ms Date: Sun, 8 Feb 2026 21:17:40 +0100 Subject: [PATCH] =?UTF-8?q?dodatkowe=20modyfikacje=20dla=20zapobie=C5=BCen?= =?UTF-8?q?ia=20zarowym=20odczytow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cc-modb_orno3.sh | 3 + modb_orno3.c | 374 ++++++++++++++++++++++++-------------------- modborno3 | Bin 90168 -> 91728 bytes read-energy.service | 6 +- 4 files changed, 210 insertions(+), 173 deletions(-) diff --git a/cc-modb_orno3.sh b/cc-modb_orno3.sh index e0875d6..ae2b0f0 100755 --- a/cc-modb_orno3.sh +++ b/cc-modb_orno3.sh @@ -1 +1,4 @@ gcc -g -I /usr/include/modbus modb_orno3.c -lmosquitto -lmodbus -o modborno3 + +cp modborno3 /home/ms/bin/modborno3 +chmod +x /home/ms/bin/modborno3 diff --git a/modb_orno3.c b/modb_orno3.c index 05cfdee..501bc88 100644 --- a/modb_orno3.c +++ b/modb_orno3.c @@ -12,6 +12,15 @@ #include #include +/* ============================================ */ +/* STRUCTS FOR MEASUREMENTS */ +/* ============================================ */ +typedef struct { float U1, U2, U3; } s_voltage; +typedef struct { float I1, I2, I3; } s_current; +typedef struct { float P_Tot, P1, P2, P3; } s_power; +typedef struct { float W_Tot, W1, W2, W3; } s_energy; +typedef struct { float Freq; } s_frequency; + /* ============================================ */ /* KONFIGURACJA PROGRAMU - EDYTUJ TU */ /* ============================================ */ @@ -406,6 +415,13 @@ int main(int argc, char *argv[]) int do_orno = READ_ORNO; int do_sun2k = READ_SUN2K; + s_voltage prev_voltage = {0}, current_voltage = {0}; + s_current prev_current = {0}, current_current = {0}; + s_power prev_power = {0}, current_power = {0}; + s_energy prev_energy = {0}, current_energy = {0}; + s_frequency prev_freq = {0}, current_freq = {0}; + int first_run = 1; + float voltage_buffer_L1[VOLTAGE_BUFFER_SIZE] = {0}; float voltage_buffer_L2[VOLTAGE_BUFFER_SIZE] = {0}; float voltage_buffer_L3[VOLTAGE_BUFFER_SIZE] = {0}; @@ -437,10 +453,9 @@ int main(int argc, char *argv[]) { if (do_orno) { - //Create a new RTU context with proper serial parameters (in this example, - //device name /dev/ttyS0, baud rate 9600, no parity bit, 8 data bits, 1 stop bit) + //Create a new RTU context modbus_t *ctx = modbus_new_rtu(USB_DEV, 9600, 'E', 8, 1); - //Set the Modbus address of the remote slave (to 2) + //Set the Modbus address of the remote slave modbus_set_slave(ctx, ORNO_SLAVE); if (!ctx) { @@ -455,210 +470,229 @@ int main(int argc, char *argv[]) exit(1); } - /* Enable libmodbus debug to print raw frames */ - /* modbus_set_debug(ctx, TRUE); */ /* Disabled - causes timing issues */ - /* Configure RTS delay and timeouts from #define */ modbus_rtu_set_rts_delay(ctx, ORNO_RTS_DELAY); modbus_set_response_timeout(ctx, 0, 900000); /* 0.9s */ modbus_set_byte_timeout(ctx, 0, ORNO_BYTE_TIMEOUT); - /* Display current configuration */ - int rts_delay = modbus_rtu_get_rts_delay(ctx); - uint32_t response_timeout_sec, response_timeout_usec; - uint32_t byte_timeout_sec, byte_timeout_usec; - modbus_get_response_timeout(ctx, &response_timeout_sec, &response_timeout_usec); - modbus_get_byte_timeout(ctx, &byte_timeout_sec, &byte_timeout_usec); - printf("ORNO: RTS Delay %u us\n", rts_delay); - printf("ORNO: Response Timeout %u,%06u s\n", response_timeout_sec, response_timeout_usec); - printf("ORNO: Byte Timeout %u,%06u s\n", byte_timeout_sec, byte_timeout_usec); + printf("ORNO: RTS Delay and Timeouts configured.\n"); - uint16_t reg[32]; // will store read registers values - uint16_t reg2[2]; // will store read registers values - float d = 0.0; + uint16_t reg[32]; + int num; - int num = 0; - int proba = 0; - float U1, U2, U3; - float I1, I2, I3; - float P_Tot, P1, P2, P3; - float W_Tot, W1, W2, W3; - float Freq; - - long l = 0; - - /* Flush serial buffer and wait for device to be ready */ - modbus_flush(ctx); - usleep(100000); /* 100ms delay before first read */ - - memset((char *)reg, 0, sizeof(reg)); - //NAPIECIA - num = modbus_read_timed(ctx, 0xe, 6, reg); // ORNO - // num = modbus_read_registers(ctx, 32072, 2, reg); // SUN2000 - if (num != 6) - { // number of read registers is not the one expected - printf("ORNO: %x \t\n", 0xe); - printf("ORNO: Failed to read: %s\n", modbus_strerror(errno)); + // ---- READ ALL ORNO VALUES ---- + + // VOLTAGES + num = modbus_read_timed(ctx, 0xe, 6, reg); + if (num == 6) { + current_voltage.U1 = modbus_get_float_abcd(®[0]); + current_voltage.U2 = modbus_get_float_abcd(®[2]); + current_voltage.U3 = modbus_get_float_abcd(®[4]); + } else { + printf("ORNO: Failed to read voltages: %s\n", modbus_strerror(errno)); + current_voltage = prev_voltage; // On error, use previous values } - else - { - U1 = modbus_get_float_abcd(®[0]); - U2 = modbus_get_float_abcd(®[2]); - U3 = modbus_get_float_abcd(®[4]); - printf("ORNO: Voltages: L1=%.1f V, L2=%.1f V, L3=%.1f V\n", U1, U2, U3); + usleep(100000); - // Add to circular buffer - voltage_buffer_L1[voltage_buffer_index] = U1; - voltage_buffer_L2[voltage_buffer_index] = U2; - voltage_buffer_L3[voltage_buffer_index] = U3; - voltage_buffer_index = (voltage_buffer_index + 1) % VOLTAGE_BUFFER_SIZE; - if (voltage_buffer_items < VOLTAGE_BUFFER_SIZE) { - voltage_buffer_items++; + // CURRENTS + num = modbus_read_timed(ctx, 0x16, 6, reg); + if (num == 6) { + current_current.I1 = modbus_get_float_abcd(®[0]); + current_current.I2 = modbus_get_float_abcd(®[2]); + current_current.I3 = modbus_get_float_abcd(®[4]); + } else { + printf("ORNO: Failed to read currents: %s\n", modbus_strerror(errno)); + current_current = prev_current; + } + usleep(100000); + + // POWER + num = modbus_read_timed(ctx, 0x1c, 8, reg); + if (num == 8) { + current_power.P_Tot = modbus_get_float_abcd(®[0]); + current_power.P1 = modbus_get_float_abcd(®[2]); + current_power.P2 = modbus_get_float_abcd(®[4]); + current_power.P3 = modbus_get_float_abcd(®[6]); + } else { + printf("ORNO: Failed to read power: %s\n", modbus_strerror(errno)); + current_power = prev_power; + } + usleep(100000); + + // ENERGY + num = modbus_read_timed(ctx, 0x100, 8, reg); + if (num == 8) { + current_energy.W_Tot = modbus_get_float_abcd(®[0]); + current_energy.W1 = modbus_get_float_abcd(®[2]); + current_energy.W2 = modbus_get_float_abcd(®[4]); + current_energy.W3 = modbus_get_float_abcd(®[6]); + } else { + printf("ORNO: Failed to read energy: %s\n", modbus_strerror(errno)); + current_energy = prev_energy; + } + usleep(10000); + + // FREQUENCY + num = modbus_read_timed(ctx, 0x14, 2, reg); + if (num == 2) { + current_freq.Freq = modbus_get_float_abcd(®[0]); + } else { + printf("ORNO: Failed to read frequency: %s\n", modbus_strerror(errno)); + current_freq = prev_freq; + } + + modbus_close(ctx); + modbus_free(ctx); + + // --- VOLTAGE FLUCTUATION DETECTION (uses fresh, unfiltered values) --- + voltage_buffer_L1[voltage_buffer_index] = current_voltage.U1; + voltage_buffer_L2[voltage_buffer_index] = current_voltage.U2; + voltage_buffer_L3[voltage_buffer_index] = current_voltage.U3; + voltage_buffer_index = (voltage_buffer_index + 1) % VOLTAGE_BUFFER_SIZE; + if (voltage_buffer_items < VOLTAGE_BUFFER_SIZE) { + voltage_buffer_items++; + } + + float avg_L1 = 0, avg_L2 = 0, avg_L3 = 0; + for (int i = 0; i < voltage_buffer_items; i++) { + avg_L1 += voltage_buffer_L1[i]; + avg_L2 += voltage_buffer_L2[i]; + avg_L3 += voltage_buffer_L3[i]; + } + avg_L1 /= voltage_buffer_items; + avg_L2 /= voltage_buffer_items; + avg_L3 /= voltage_buffer_items; + + if (fabs(current_voltage.U1 - avg_L1) > avg_L1 * VOLTAGE_FLUCTUATION_THRESHOLD || + fabs(current_voltage.U2 - avg_L2) > avg_L2 * VOLTAGE_FLUCTUATION_THRESHOLD || + fabs(current_voltage.U3 - avg_L3) > avg_L3 * VOLTAGE_FLUCTUATION_THRESHOLD) { + printf("ORNO: Voltage fluctuation detected! Switching to high frequency polling for %d seconds.\n", HIGH_FREQ_MODE_DURATION); + mqtt_send("fluct/start", "on"); + influx_send_post("orno,device=orno,highfluct=start value=true"); + high_frequency_mode_end_time = time(NULL) + HIGH_FREQ_MODE_DURATION; + } + + + // --- DATA VALIDATION AND SENDING --- + + if (first_run) { + prev_voltage = current_voltage; + prev_current = current_current; + prev_power = current_power; + prev_energy = current_energy; + prev_freq = current_freq; + first_run = 0; + printf("ORNO: First run, buffering initial measurements.\n"); + } else { + s_voltage send_voltage; + s_current send_current; + s_power send_power; + s_energy send_energy; + s_frequency send_freq; + + int spike_U = 0; + if (prev_voltage.U1 != 0 && (current_voltage.U1 > prev_voltage.U1 * 1.8 || current_voltage.U1 < prev_voltage.U1 * 0.2)) spike_U = 1; + if (prev_voltage.U2 != 0 && (current_voltage.U2 > prev_voltage.U2 * 1.8 || current_voltage.U2 < prev_voltage.U2 * 0.2)) spike_U = 1; + if (prev_voltage.U3 != 0 && (current_voltage.U3 > prev_voltage.U3 * 1.8 || current_voltage.U3 < prev_voltage.U3 * 0.2)) spike_U = 1; + + if(spike_U) { + send_voltage = prev_voltage; + printf("ORNO: Voltage spike detected. Sending previous values.\n"); + } else { + send_voltage = current_voltage; + prev_voltage = current_voltage; } - float avg_L1 = 0, avg_L2 = 0, avg_L3 = 0; - for (int i = 0; i < voltage_buffer_items; i++) { - avg_L1 += voltage_buffer_L1[i]; - avg_L2 += voltage_buffer_L2[i]; - avg_L3 += voltage_buffer_L3[i]; - } - avg_L1 /= voltage_buffer_items; - avg_L2 /= voltage_buffer_items; - avg_L3 /= voltage_buffer_items; + int spike_I = 0; + if (prev_current.I1 != 0 && (current_current.I1 > prev_current.I1 * 1.8 || current_current.I1 < prev_current.I1 * 0.2)) spike_I = 1; + if (prev_current.I2 != 0 && (current_current.I2 > prev_current.I2 * 1.8 || current_current.I2 < prev_current.I2 * 0.2)) spike_I = 1; + if (prev_current.I3 != 0 && (current_current.I3 > prev_current.I3 * 1.8 || current_current.I3 < prev_current.I3 * 0.2)) spike_I = 1; - if (fabs(U1 - avg_L1) > avg_L1 * VOLTAGE_FLUCTUATION_THRESHOLD || - fabs(U2 - avg_L2) > avg_L2 * VOLTAGE_FLUCTUATION_THRESHOLD || - fabs(U3 - avg_L3) > avg_L3 * VOLTAGE_FLUCTUATION_THRESHOLD) { - printf("ORNO: Voltage fluctuation detected! Switching to high frequency polling for %d seconds.\n", HIGH_FREQ_MODE_DURATION); - high_frequency_mode_end_time = time(NULL) + HIGH_FREQ_MODE_DURATION; + if(spike_I) { + send_current = prev_current; + printf("ORNO: Current spike detected. Sending previous values.\n"); + } else { + send_current = current_current; + prev_current = current_current; + } + + int spike_P = 0; + if (prev_power.P_Tot != 0 && (current_power.P_Tot > prev_power.P_Tot * 1.8 || current_power.P_Tot < prev_power.P_Tot * 0.2)) spike_P = 1; + + if(spike_P) { + send_power = prev_power; + printf("ORNO: Power spike detected. Sending previous values.\n"); + } else { + send_power = current_power; + prev_power = current_power; } - /* Validate voltages (150V - 280V is reasonable range for EU grid) */ - if (is_valid_float(U1, 150.0, 280.0) && - is_valid_float(U2, 150.0, 280.0) && - is_valid_float(U3, 150.0, 280.0)) { - mqtt_send_U(U1, U2, U3); - influx_send_U(U1, U2, U3); + int spike_W = 0; + if (prev_energy.W_Tot != 0 && (current_energy.W_Tot > prev_energy.W_Tot * 1.8 || current_energy.W_Tot < prev_energy.W_Tot)) spike_W = 1; + + if(spike_W) { + send_energy = prev_energy; + printf("ORNO: Energy spike/drop detected. Sending previous values.\n"); + } else { + send_energy = current_energy; + prev_energy = current_energy; + } + + int spike_F = 0; + if (prev_freq.Freq != 0 && (current_freq.Freq > prev_freq.Freq * 1.05 || current_freq.Freq < prev_freq.Freq * 0.95)) spike_F = 1; // 5% for frequency + + if(spike_F) { + send_freq = prev_freq; + printf("ORNO: Frequency spike detected. Sending previous values.\n"); + } else { + send_freq = current_freq; + prev_freq = current_freq; + } + + printf("ORNO: Voltages: L1=%.1f V, L2=%.1f V, L3=%.1f V\n", send_voltage.U1, send_voltage.U2, send_voltage.U3); + if (is_valid_float(send_voltage.U1, 150.0, 280.0) && is_valid_float(send_voltage.U2, 150.0, 280.0) && is_valid_float(send_voltage.U3, 150.0, 280.0)) { + mqtt_send_U(send_voltage.U1, send_voltage.U2, send_voltage.U3); + influx_send_U(send_voltage.U1, send_voltage.U2, send_voltage.U3); printf("ORNO: MQTT: Published voltages\n"); } else { printf("ORNO: MQTT: Skipping voltages - invalid values\n"); } - } - - usleep(100000); /* 100ms delay between queries */ - - // PRADY (Currents) - memset((char *)reg, 0, sizeof(reg)); - num = modbus_read_timed(ctx, 0x16, 6, reg); // ORNO - if (num != 6) - { - printf("ORNO: %x \t\n", 0x16); - printf("ORNO: Failed to read currents: %s\n", modbus_strerror(errno)); - } - else - { - I1 = modbus_get_float_abcd(®[0]); - I2 = modbus_get_float_abcd(®[2]); - I3 = modbus_get_float_abcd(®[4]); - printf("ORNO: Currents: L1=%.2f A, L2=%.2f A, L3=%.2f A\n", I1, I2, I3); - - /* Validate currents (0-100A is reasonable range for home use) */ - if (is_valid_float(I1, 0.0, 100.0) && - is_valid_float(I2, 0.0, 100.0) && - is_valid_float(I3, 0.0, 100.0)) { - mqtt_send_I(I1, I2, I3); - influx_send_I(I1, I2, I3); + + printf("ORNO: Currents: L1=%.2f A, L2=%.2f A, L3=%.2f A\n", send_current.I1, send_current.I2, send_current.I3); + if (is_valid_float(send_current.I1, 0.0, 100.0) && is_valid_float(send_current.I2, 0.0, 100.0) && is_valid_float(send_current.I3, 0.0, 100.0)) { + mqtt_send_I(send_current.I1, send_current.I2, send_current.I3); + influx_send_I(send_current.I1, send_current.I2, send_current.I3); printf("ORNO: MQTT: Published currents\n"); } else { printf("ORNO: MQTT: Skipping currents - invalid values\n"); } - } - usleep(100000); /* 100ms delay between queries */ - - memset((char *)reg, 0, sizeof(reg)); - num = modbus_read_timed(ctx, 0x1c, 8, reg); - if (num != 8) - { // number of read registers is not the one expected - printf("ORNO: %x \t\n", 0x1c); - printf("ORNO: Failed to read: %s\n", modbus_strerror(errno)); - } - else - { - P_Tot = modbus_get_float_abcd(®[0]); - P1 = modbus_get_float_abcd(®[2]); - P2 = modbus_get_float_abcd(®[4]); - P3 = modbus_get_float_abcd(®[6]); - printf("ORNO: Power: Total=%.3f W, L1=%.3f W, L2=%.3f W, L3=%.3f W\n", P_Tot, P1, P2, P3); - - /* Validate power (-25000W to +25000W, allows negative for generation) */ - if (is_valid_float(P_Tot, -25000.0, 25000.0) && - is_valid_float(P1, -10000.0, 10000.0) && - is_valid_float(P2, -10000.0, 10000.0) && - is_valid_float(P3, -10000.0, 10000.0)) { - mqtt_send_P(P_Tot, P1, P2, P3); - influx_send_P(P_Tot, P1, P2, P3); + printf("ORNO: Power: Total=%.3f W, L1=%.3f W, L2=%.3f W, L3=%.3f W\n", send_power.P_Tot, send_power.P1, send_power.P2, send_power.P3); + if (is_valid_float(send_power.P_Tot, -25000.0, 25000.0) && is_valid_float(send_power.P1, -10000.0, 10000.0) && is_valid_float(send_power.P2, -10000.0, 10000.0) && is_valid_float(send_power.P3, -10000.0, 10000.0)) { + mqtt_send_P(send_power.P_Tot, send_power.P1, send_power.P2, send_power.P3); + influx_send_P(send_power.P_Tot, send_power.P1, send_power.P2, send_power.P3); printf("ORNO: MQTT: Published power\n"); } else { printf("ORNO: MQTT: Skipping power - invalid values\n"); } - } - usleep(100000); /* 100ms delay between queries */ - memset((char *)reg, 0, sizeof(reg)); - num = modbus_read_timed(ctx, 0x100, 8, reg); - if (num != 8) - { // number of read registers is not the one expected - printf("ORNO: %x \t\n", 0x100); - printf("ORNO: Failed to read: %s\n", modbus_strerror(errno)); - } - else - { - W_Tot = modbus_get_float_abcd(®[0]); - W1 = modbus_get_float_abcd(®[2]); - W2 = modbus_get_float_abcd(®[4]); - W3 = modbus_get_float_abcd(®[6]); - printf("ORNO: Energy: Total=%.3f kWh, L1=%.3f kWh, L2=%.3f kWh, L3=%.3f kWh\n", W_Tot, W1, W2, W3); - - /* Validate energy (0-1000000 kWh is reasonable range) */ - if (is_valid_float(W_Tot, 0.0, 1000000.0) && - is_valid_float(W1, 0.0, 1000000.0) && - is_valid_float(W2, 0.0, 1000000.0) && - is_valid_float(W3, 0.0, 1000000.0)) { - mqtt_send_W(W_Tot, W1, W2, W3); - influx_send_W(W_Tot, W1, W2, W3); + printf("ORNO: Energy: Total=%.3f kWh, L1=%.3f kWh, L2=%.3f kWh, L3=%.3f kWh\n", send_energy.W_Tot, send_energy.W1, send_energy.W2, send_energy.W3); + if (is_valid_float(send_energy.W_Tot, 0.0, 1000000.0) && is_valid_float(send_energy.W1, 0.0, 1000000.0) && is_valid_float(send_energy.W2, 0.0, 1000000.0) && is_valid_float(send_energy.W3, 0.0, 1000000.0)) { + mqtt_send_W(send_energy.W_Tot, send_energy.W1, send_energy.W2, send_energy.W3); + influx_send_W(send_energy.W_Tot, send_energy.W1, send_energy.W2, send_energy.W3); printf("ORNO: MQTT: Published energy\n"); } else { printf("ORNO: MQTT: Skipping energy - invalid values\n"); } - } - usleep(10000); /* 10ms delay between queries */ - - // CZESTOTLIWOSC (Frequency) - memset((char *)reg, 0, sizeof(reg)); - num = modbus_read_timed(ctx, 0x14, 2, reg); // ORNO - if (num != 2) - { - printf("ORNO: %x \t\n", 0x14); - printf("ORNO: Failed to read frequency: %s\n", modbus_strerror(errno)); - } - else - { - Freq = modbus_get_float_abcd(®[0]); - printf("ORNO: Frequency: %.4f Hz\n", Freq); - - /* Validate frequency (47-53 Hz is reasonable range for EU/US grid) */ - if (is_valid_float(Freq, 47.0, 53.0)) { - mqtt_send_Hz(Freq); - influx_send_Hz(Freq); + printf("ORNO: Frequency: %.4f Hz\n", send_freq.Freq); + if (is_valid_float(send_freq.Freq, 47.0, 53.0)) { + mqtt_send_Hz(send_freq.Freq); + influx_send_Hz(send_freq.Freq); printf("ORNO: MQTT: Published frequency\n"); } else { printf("ORNO: MQTT: Skipping frequency - invalid value\n"); } } - - modbus_close(ctx); - modbus_free(ctx); } if (do_sun2k) { diff --git a/modborno3 b/modborno3 index bb552e9162d18bb097c0713b62db335948a97294..229ca6fb41881d05c69bf005b80522b7406b7021 100755 GIT binary patch literal 91728 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 delta 19812 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 diff --git a/read-energy.service b/read-energy.service index 7ae5e0f..b8e79f9 100644 --- a/read-energy.service +++ b/read-energy.service @@ -4,11 +4,11 @@ Documentation=file:///home/ms/projekty/python3/modebus/ornoserial3/CONFIG.md After=network.target mosquitto.service [Service] -Type=oneshot +Type=simple User=ms Group=dialout -WorkingDirectory=/home/ms/projekty/python3/modebus/ornoserial3 -ExecStart=/home/ms/projekty/python3/modebus/ornoserial3/modborno3 +WorkingDirectory=/home/bin +ExecStart=/home/ms/bin/modborno3 StandardOutput=journal StandardError=journal SyslogIdentifier=read-energy