Beiträge von reimer22

    SolarHeini_1: Warum habt Ihr denn so eine merkwürdige mündliche Konstruktion verwendet ?


    Ich würde an deiner Stelle lieber den 10 tägigen Kurs bei der HWK machen als mich durch die AGs zu klagen, die doch keine rechtliche Bewandtnis haben. Da wird die Revision auch nicht helfen, da die Konstruktion des Falles unsinnig ist. Du müsstest es als Auftrag machen und dann meldet die Anlage der Kunde an und Du unterschreibst.


    Ach und wenn Du den TREI Schein machst, dann willst Du Wohnanlagen installieren, wenn Du gefragt wirst und keine Solaranlagen. Wie bereits gesagt wurde, der Vorsitzende ist vom Netzbetreiber.


    Von den Solar Heinis sind bei mir viele nicht durchgekommen. Das kann ja aber auch nur Zufall gewesen sein ?.

    Für die "Solaranzeige" auf RasPi verwende ich den RS485-Port, hatte bei mir mit RS232 bis zuletzt nicht geklappt.

    Eine andere Frage: lässt sich das Herstellungsdatum der Batterie irgendwie auslesen?


    (Hintergrund: wenn ich meine beiden Batterien auslese, und mir die gelaufenen Zyklen anschaue, fällt mir auf: Meine erste Pylontech ist vom 25. Mai (GreenAkku) und ist ~32 Zyklen gelaufen, meine zweite hab ich am 29. Juli (SolarBasar) gekauft, und die hat 80 Zyklen drauf.

    Also muss ich davon ausgehen, dass die eigentlich neuere Batteie schon mal irgendwo gelaufen ist.)

    Du kannst in der Eventliste nach dem ersten Events suchen. Das liefert den Hinweis auf das Startdatum.

    Bbei 1200baud dauert das 1 sekunde pro pack d.h. bei 8 pack dann 8-9 sekunden ( und entsprechen grossem puffer )

    Habe mitlerweile auch entdeckt, das man per RS485 das ganze auch auslesen kann.

    Ist aber kein modbus protokoll.

    Das läuft das dann mit 115200 baud. Wobei der junge bei dem ich das implementiert habe nur 2 packs hat...

    Wenn man die Timeouts und Retries hinzurechnet ... wird es im Fehlerfall mehr.

    Bei mir ist die ganze Zeitscheibe 10s. Also 10s für 8 Batterien, 2 Wechselrichter, Discovergy Zähler, PIP4048 Charger einstellen um den Überschuss der Einspeiseanlage in die Batterien zu pumpen, Tesla abfragen und bald die Ladesteuerung anzusteuern. Sonst müsste ich auf Multithreading und das lohnt sich nicht für diese Funktionen. Das Umschalten funktioniert auch sauber.

    SUVs sind unnötige, spritfressende, verkehrsgefährdende und gefährliche Umweltsäue, dessen Fahrer nur besoffen sind und ihre Protzkarre zu Schau stellen wollen. So mal der Tenor hier.

    Ja, das hast Du schon ganz gut erfasst. Es fehlt noch das egoistische Parken auf zwei Parkplätzen weil die Karre so riesig ist das der SUV Fahrer sonst nicht aussteigen kann.

    Ui, die Variante hatten wir auch noch nicht... Is bestimmt noch 'illegaler' als den Zähler rückwärts drehen zu lassen. Obwohl...:/ Aber war ja eh nur hypothetisch gemeint... Oder?

    Das hatte ich auch bei mir in der Firma. Vermieter hat den Zählerschrank auf den aktuellen Stand gebracht. Installateur hat dabei den Discovergy Zähler ausgebaut und keinen Zähler eingebaut (ehz). Bezug ohne Messung über mehrere Monat. Discovergy hat Überhaupt nichts unternommen.Beschwerde beim EVU = VNB. EVU hat seinen eigenen Zähler gesetzt. Discovergy will den alten Zähler nicht ersetzen und kündigt den Vertrag weil sie angeblich die Zähler nicht bekommen. Das EVU teilt mir mit das ich jetzt bei denen in der Grundversorgung bin. Geile Sache.

    In den Antragsformularen ist die früher erforderliche Unterschrift des Elektroinstallateurs (Eintragung im Elektroinstallateurverzeichnis) nicht mehr zu finden. Der Eigentümer als Betreiber und der Anschlussnehmer müssen den Antrag (nicht der Solateur!) unterschreiben. Ein Zählerwechsel ist zwingend erfoderlich, um das EEG zu erfüllen. Den Zählerwechsel dürfen aber nur vom Netzbetreiber im Elektroinstallateurverzeichnis eingetragene Installateuer vornehmen. Fakt.


    Folglich, ein Betreiber muss sich einen Installateur suchen, der den Zählerwechsel beantragt und durchführt. Nochmal, der Installateur muss im Elektroinstallateurverzeichnis des Netzbetreibers eingetragen sein.

    Einfach zuerst den Zähler von com metering bestellen und danach die PV Anlage installieren. Und bitte von Discovergy die Finger lassen.

    Was mache ich falsch? Wer kann dazu etwas beitragen? Das haben hier doch diverse Leute schon gemacht.


    Du musst genau den String schicken der im Thread angegeben wurde. Bei dir sieht man im Bild 3 Bytes die im Asc Mode geschickt wurde. Das sind zu wenige Bytes. Den String musst du im Terminal im HEX Mode schicken und die Baudraten umschalten (zuerst 1200 dann 115200). So habe ich das in C++ programmiert.


    const uint8 initstring1[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

    const uint8 initstring2[] = "\r\ninfo\nlogin debug\nconfig\nctrl\nprot\n";

    const uint8 initstring3[] = { 0x7E, 0x32, 0x30, 0x30, 0x31, 0x34, 0x36, 0x38, 0x32, 0x43, 0x30, 0x30, 0x34, 0x38, 0x35, 0x32, 0x30, 0x46, 0x43, 0x43, 0x33, 0x0D, 0x0 };

    const uint8 initstring4[] = "\r\npwr\n";




    void CSolarDatenDlg::QueryBattery()

    {


    CMMTimer timer;

    bool bBattery = m_QueryBattery.GetCheck() != 0;

    bool bGridOff = m_bAlarmGridOff.GetCheck() != 0;

    bool bCurrentDataOk = 1;

    bool bWRDataOk = 1;

    bool bRead;

    bool bReadSuccess = 0;

    bool bReadTimeout = 0;

    UCHAR* pRxBuffer;


    CString s;

    UCHAR rx[10];

    CHAR txbuffer[100];

    UCHAR rxbuffer[255];

    int nBuffer;

    char szbuffer[100];

    uint16 crc;

    char szport[10];



    if (bBattery)

    {


    m_nProgress.SetWindowText(TEXT("Battery"));

    m_nProgress.SetBarBkColor(RGB(0, 255, 0));

    m_nProgress.SetState(PBST_NORMAL);

    m_nProgress.SetPos(10);



    }

    else

    {

    m_nProgress.SetBarBkColor(RGB(255, 0, 0));

    m_nProgress.SetPos(0);

    m_nProgress.SetState(PBST_ERROR);

    m_nProgress.SetWindowText(TEXT("Battery off!"));

    m_nValidBatteryData++;

    return;


    }



    int nPos = m_SelectCom3.GetCurSel();


    sprintf(szport, "\\\\.\\COM%i", nPos + 1);


    if (!m_comport3.open(CString(szport).GetBuffer(), 1200, 15))

    {

    sprintf(szbuffer, "Open COM%i failed!", nPos + 1);

    AddListString(CString(szbuffer));


    }

    else

    {


    }



    if (m_comport3.IsOpen())

    {


    m_comport3.flushRX();


    Sleep(10);


    m_comport3.write((UCHAR*)initstring3, (sizeof(initstring3) / sizeof(initstring3[0])) - 1);


    m_comport3.ImmediateSend();


    Sleep(((sizeof(initstring3) / sizeof(initstring3[0])) - 1)*20);


    m_comport3.flushRX();


    m_comport3.flush();


    Sleep(10);


    m_comport3.close();


    Sleep(10);


    if (!m_comport3.open(CString(szport).GetBuffer(), 115200, 2))

    {

    sprintf(szbuffer, "Open %i failed!", nPos + 1);

    AddListString(CString(szbuffer));


    }

    else

    {


    }



    if (m_comport3.write((UCHAR*)initstring4, (sizeof(initstring4)/sizeof(initstring4[0]))-1))

    {


    timer.Start(1, 1);


    bRead = TRUE;


    pRxBuffer = (UCHAR*)malloc(5000);


    if (pRxBuffer == NULL)

    {

    bRead = FALSE;

    }

    else

    {

    memset(pRxBuffer, 0, 5000);

    }


    m_comport3.ClearStatistics();


    pRxBuffer[0] = '!';

    nBuffer = 1;


    while (bRead)

    {

    if (m_comport3.readX(rx, 1))

    {

    pRxBuffer[nBuffer] = rx[0];

    nBuffer++;

    timer.Reset();

    timer.Stop();

    timer.Start(1, 1);

    m_nProgress.SetPos(nBuffer / (1355/10));


    if ((pRxBuffer[nBuffer-1] == 0x24) && (pRxBuffer[nBuffer-2] == 0x24))

    {

    bRead = FALSE;

    bReadSuccess = TRUE;

    }


    if ((pRxBuffer[nBuffer-1] == '@'))

    {

    pRxBuffer[0] = rx[0];

    nBuffer = 1;

    }



    }

    else

    {

    Sleep(10);

    }



    if (timer.GetTotalMilliseconds() > 500)

    {

    bRead = FALSE;

    bReadTimeout = TRUE;

    AddListString(CString(_T("Battery read timeout!")));

    }


    if (nBuffer == (5000 - 1))

    {

    bRead = FALSE;

    AddListString(CString(_T("Battery read buffer overflow!")));

    }

    }


    if (bReadSuccess)

    {

    // ok

    pRxBuffer[nBuffer] = 0;

    if (pRxBuffer[0] = '@')

    {

    AddListString(CString(_T("Battery read ok!")));

    m_SolarDatenData.UpdateBattery((CHAR*)pRxBuffer);

    m_SolarDatenData.AddTimeStamp();


    float nmax = 0;

    float nmin = 100;

    float navg = 0;

    int nBatteries = 0;


    for (int i = 0; i<8; i++)

    {

    if (m_SolarDatenData.bBatPresent[i])

    {

    if (m_SolarDatenData.BatProzent[i] > nmax)

    {

    nmax = m_SolarDatenData.BatProzent[i];

    }


    if (m_SolarDatenData.BatProzent[i] < nmin)

    {

    nmin = m_SolarDatenData.BatProzent[i];

    }


    navg += m_SolarDatenData.BatProzent[i];


    nBatteries++;

    }


    }


    m_SolarDatenData.BatAvgProz = navg / ((float)nBatteries);

    m_SolarDatenData.BatMinProz = nmin;

    m_SolarDatenData.BatMaxProz = nmax;

    m_SolarDatenData.nBatteries = nBatteries;


    if (nmin <= m_nBatteryLow)

    {

    m_BatteryLow.SetCheck(TRUE);

    }

    else if (nmin >= m_nBatteryBackToBattery)

    {

    if ((m_nBatteryBackToBattery == 100) && (m_SolarDatenData.BatteryVoltage >= 52.0f))

    {

    if (1 || m_BackToBatteryMin <= m_BackToBatteryMinCounter)

    {

    m_BatteryLow.SetCheck(FALSE);

    }

    else

    {

    m_BackToBatteryMinCounter++;

    }


    }

    else if ((m_nBatteryBackToBattery == 100) )

    {


    }

    else

    {

    m_BackToBatteryMinCounter = 0;

    m_BatteryLow.SetCheck(FALSE);

    }


    }


    if (nmin <= m_nBatteryVeryLow)

    {

    m_BatteryVeryLow.SetCheck(TRUE);

    }

    else if (nmin > m_nBatteryStopChargingLevel)

    {

    m_BatteryVeryLow.SetCheck(FALSE);

    }


    if (nmin >= m_nBatteryExcessPower)

    {

    // heater ?


    }


    if (nmin <= m_nBatteryLow)

    {

    SetRelay1(TRUE);

    }

    else

    {

    SetRelay1(FALSE);

    }


    if (nmin <= m_nBatteryVeryLow)

    {

    SetRelay2(TRUE);

    }

    else

    {

    SetRelay2(FALSE);

    }


    if (nmin >= m_nBatteryExcessPower)

    {

    // heater ?


    SetRelay3(TRUE);

    }

    else

    {

    SetRelay3(FALSE);

    }


    if (nmin < m_nBatteryBelowLevelGoStandby)

    {

    // go standby


    SetRelay4(TRUE);

    }

    else

    {

    SetRelay4(FALSE);

    }



    }

    else

    {

    AddListString(CString(_T("Battery read sync failed!")));

    }


    m_nValidBatteryData = 0;


    }

    else

    {

    m_nProgress.SetBarBkColor(RGB(255, 0, 0));

    m_nProgress.SetPos(0);

    m_nProgress.SetState(PBST_ERROR);

    m_nProgress.SetWindowText(TEXT("Battery failed!"));

    AddListString(CString(_T("Battery read failed!")));

    m_nValidBatteryData++;

    }


    free(pRxBuffer);


    }

    m_comport3.flushRX();

    m_comport3.close();

    m_nProgress.SetPos(0);


    }



    }