pablozg / freeds

Derivador de energía solar excedente
GNU General Public License v3.0
98 stars 34 forks source link

Inversor SOLAREDGE requiere algunas modificaciones en el código para mostrar los datos #64

Closed nislate closed 1 year ago

nislate commented 1 year ago

Hola Pablo, felicidades por tu trabajo, tengo un inversor solaredge, para conseguir que mostrara correctamente los datos tuve que incrementar en uno el numero de datos solicitados (tanto para 40083 como 40206) en modbustcp.ino (esto es coherente con la documentación del protocolo que proporciona Solaredge para sus inversores): registerData solaredgeRegisters[] = { &inverter.wsolar, 1, 40083, 24, SOLAREDGEINVERTER, //MMG pongo 24 datos para que tome temp, tenia puesto 23 &inverter.wgrid, 1, 40206, 5, SOLAREDGEMETER // MMG pongo 5 datos para que tome el FS, tenia puesto 4 };

También defino una nueva variable "uint16_t uvalue" para aplicar signed o unsigned en función de como define el fabricante cada dato en la documentación en "void parseSolarEdgeInverter(uint8_t data)" del mismo modbustcp.ino: void parseSolarEdgeInverter(uint8_t data) { int16_t value = 0; uint16_t uvalue = 0; // MMG tambien hay valores del tipo uint16 int16_t SF = 0;

// MMG 40083 ACPOWER 40084 SF (Registros 40084 - 40085) value = (data[0] << 8) | (data[1]); // MMG es int16 SF = (data[2] << 8) | (data[3]); inverter.wsolar = value * pow(10, SF); Serial.printf("parseSolarEdgeInverter() inverter.wsolar= %f SF= %d \n", inverter.wsolar, SF); //MMG // Ignoramos registros 40086 - 40096

// MMG 40096 DCcurrent 97 SF 98 DCvoltage 99 SF 100 DCpower 101 SF (Registros 40097 - 400102) uvalue = (data[26] << 8) | (data[27]); // MMG es uint16 SF = (data[28] << 8) | (data[29]); inverter.pv1c = uvalue * pow(10, SF);

uvalue = (data[30] << 8) | (data[31]); // MMG es uint16 SF = (data[32] << 8) | (data[33]); inverter.pv1v = uvalue * pow(10, SF);

value = (data[34] << 8) | (data[35]); // MMG es int16 SF = (data[36] << 8) | (data[37]); inverter.pw1 = value * pow(10, SF);

// Ignoramos registro 400103 (MMG seria el 102)

// Registros 40104 - 400107 (MMG seria del 103 al 106) value = (data[40] << 8) | (data[41]); SF = (data[46] << 8) | (data[47]); inverter.temperature = value * pow(10, SF); }

Esto funciona correctamente modificando el código fuente en la version 1..0.7(aunque tengo problemas de desconexión), en la beta no lo he podido probar por que no dispongo del fuente.

Saludos