Solarmax PV-Wechselrichter über PicoC abfragen

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Gast

    #1

    Solarmax PV-Wechselrichter über PicoC abfragen

    Hallo zusammen,

    Nach einigen Versuchen verteilt über längere Zeit habe ich ein PicoC Programm fertiggestellt, welches die aktuelle Leistung von meinem Solarmax 10MT2 abrufen und als analogen Wert ausgeben kann. Durch anpassen des Anfragestrings {FB;01;16|64:PAC|0436} können auch alle anderen verfügbaren Werte abgerufen werden.
    #codierung der query: http://blog.dest-unreach.be/2009/04/...rse-engineered
    #Checksumme berechnen: http://webnet77.com/cgi-bin/helpers/crc.pl
    Der Anfragestring muss zwingend in zwei Teile getrennt werden, sonst wird die führende geschwungene Klammer "verschluckt".

    Die Konvertierung von hex String in dezimal Integer könnte man sicher noch eleganter lösen.

    // write program here in PicoC
    char* p;
    char szBuffer[30];
    char i;
    int nLen,j,iPower,iTemp,iLength;

    printf("Starting SolarMax watch");
    while(TRUE)
    {
    STREAM* stream = stream_create("/dev/tcp/192.168.1.10/12345",0,0);
    if (stream != NULL)
    {
    szBuffer[0] = 0;
    szBuffer[1] = 6;
    stream_write(stream,"{",1);
    stream_write(stream,"FB;01;16|64:PAC|0436}",22);
    stream_flush(stream);
    nLen = stream_read(stream,szBuffer,sizeof(szBuffer) - 1,100);
    stream_close(stream);
    szBuffer[nLen] = 0;
    szBuffer[nLen + 1] = 0;
    //printf("SolarMax Power=%s",szBuffer);
    //printf("SolarMax Answer lenght=%f",sizeof(szBuffer));
    p = strstrskip(szBuffer,"PAC=");
    //setoutputtext(0,p);
    //printf("SolarMax Answer=%s",p);
    iTemp = 0;
    iPower = 0;
    iLength = 0;
    if (p != NULL)
    {
    for ( j=0; j<5; j++ ) {
    i = (int)szBuffer[j+17];
    //printf( "Zeichen: %c", i );
    if ( i == '|'){
    iLength = j;
    //printf( "%d", iLength );
    }
    }
    for ( j=0; j<iLength; j++ ) {
    //printf( "%c", (int)szBuffer[j+17] );
    i = (int)szBuffer[j+17];
    //printf( "Zeichen: %c", i );
    if ( i == '0'){
    iTemp = 0;
    }
    if ( i == '1'){
    iTemp = 1;
    }
    if ( i == '2'){
    iTemp = 2;
    }
    if ( i == '3'){
    iTemp = 3;
    }
    if ( i == '4'){
    iTemp = 4;
    }
    if ( i == '5'){
    iTemp = 5;
    }
    if ( i == '6'){
    iTemp = 6;
    }
    if ( i == '7'){
    iTemp = 7;
    }
    if ( i == '8'){
    iTemp = 8;
    }
    if ( i == '9'){
    iTemp = 9;
    }
    if ( i == 'A'){
    iTemp = 10;
    }
    if ( i == 'B'){
    iTemp = 11;
    }
    if ( i == 'C'){
    iTemp = 12;
    }
    if ( i == 'D'){
    iTemp = 13;
    }
    if ( i == 'E'){
    iTemp = 14;
    }
    if ( i == 'F'){
    iTemp = 15;
    }
    //printf( "Wert: %d", iTemp);
    if ( j-iLength == -1 ){
    iPower = iPower + iTemp;
    //printf( "SolarMax Power -1=%d", iPower);
    }
    if ( j-iLength == -2 ){
    iPower = iPower + 16*iTemp;
    //printf( "SolarMax Power -2=%d", iPower);
    }
    if ( j-iLength == -3 ){
    iPower = iPower + 256*iTemp;
    //printf( "SolarMax Power -3=%d", iPower);
    }
    if ( j-iLength == -4 ){
    iPower = iPower + 4096*iTemp;
    //printf( "SolarMax Power -4=%d", iPower);
    }
    }
    iPower = iPower/2;
    //printf( "SolarMax Power=%d", iPower);
    setoutput(0,iPower);
    }
    sleeps(60);
    }
    else
    {
    //printf("Solarmax no connection");
    setoutput(0,0);
    sleeps(60); // wait 60 seconds
    }
    }

    Ich hoffe, das hilft vielleicht mal jemandem weiter.
  • Gast

    #2
    Zitat von brohrer
    Die Konvertierung von hex String in dezimal Integer könnte man sicher noch eleganter lösen.
    So in etwa (nicht getestet)?

    Code:
    char x;
    
    for ( j=0; j<iLength; j++ ) {
       x = szBuffer[j+17];
       if ( x >= '0' && x<= '9' ) {
          iTemp = x-'0';
       }
       if ( x >= 'A' && x<= 'F' ) {
          iTemp = x-'A'+10;
       }
       iPower=(iPower<<4) | iTemp;
      ...
    }
    Zuletzt geändert von Gast; 05.09.2017, 22:39.

    Kommentar

    • frankxxx
      Azubi
      • 06.02.2019
      • 6

      #3
      Funktioniert super 👍
      Danke
      Ich habe beide Programme zusammengefasst.
      Angehängte Dateien

      Kommentar

      Lädt...