…a obecný pohled na výzvy solárních invertorů/skvělé věci.
Aktualizace z 21. listopadu 2020:
Několik lidí se mě zeptalo na aplikaci a zdrojový kód použitý k přemostění tohoto střídače na brokera MQTT. Bohužel tento střídač selhal nedlouho po napsání tohoto příspěvku (nikdy nezapínejte “Auto Bypass/Option 9″…) a jako takový jsem se posunul dál haha .
Utilitu, kterou jsem vytvořil, což je spustitelný soubor C#/Mono zaměřený na CPU arm32/Raspberry Pi, najdete zde . Zdrojový kód je dostupný na Github zde . Možná budete muset nainstalovat mono-complete na váš počítač, abyste mohli spustit binární spustitelný soubor: sudo apt install mono-complete.
Činnost binárního spustitelného souboru je podrobně popsána níže.
Hlavní příběh:
V roce 2012 Eskom (jediná veřejná dodavatelská společnost elektřiny v Jižní Africe) oznámila, že zvýší své tarify za elektřinu zhruba o 16 % a chce zvýšit tarify meziročně o 25,9 % (v závislosti na různých schváleních). To bylo samozřejmě směšné číslo, ale bylo řečeno: elektřina by se stala mnohem dražší a náklady by nadále rostly rychlostí vyšší než inflace. Rozhodl jsem se, že mít několik solárních panelů na kompenzaci některých mých požadavků by byl dobrý nápad a pustil jsem se do získávání cenových nabídek.
První cenová nabídka, kterou jsem obdržel, byla neobyčejně drahá a ani v nejhorším scénáři eskom-sazeb by se instalace nikdy nezaplatila. Takže jsem si obstaral panely a střídače pro připojení k síti sám a provedl vlastní instalaci. To bylo před 8 lety.



Rychlý posun vpřed do roku 2020 a snižování zátěže je zpět... ale technologie invertoru se hodně zlepšila, a tak se zdálo být dobrým nápadem upgradovat. Nějaký průzkum, dotazy na akcie a výlet do železářství Brights později:

Trh s měniči je zaplaven řadou různých značek. Máte Mecer, KODAK(!?), Synerji, THESUNPAYS, MaxPower atd. Je jich spousta, ale všechny vypadají zhruba stejně: kovová krabice s malým LCD panelem.

Zdálo se, že většinu měničů skutečně vyrobila společnost s názvem Voltronic/Axpert. Poněkud známý je protokol Axpert s různými repozitáři demonstrujícími komunikační pokusy dostupné na Githubu a podobně. "Skvělé," pomyslel jsem si, "tato jednotka Synapse musí být jednotka Axpert, koupím ji a použiji nějaký otevřený zdrojový kód k jejímu přečtení."




Jaký má smysl mít solární panely, pokud nechcete být energeticky efektivní? Zadejte Raspberry Pi Zero: malé, levné a s nízkou spotřebou. S připojeným Raspberry Pi Zero jsem se pustil do zkoušení různých úložišť, která se zaměřují na měniče Voltronic... ale nejde to. Viděl jsem, jak data procházejí dráty; Zkoušel jsem RS485 a USB (USB konektor je jen převodník RS485), ale nic. Sakra. Po dlouhém hledání jsem našel tuto nestandardní aplikaci na prodej za 32 $:


Naštěstí software ICC „není kompatibilní“ s mým měničem. Jsem líný, úplně bych šel na variantu 32 dolarů. Budu muset vyzkoušet riskantní čínský software Windows, se kterým tato věc přišla…


Software na dodaném disku obsahoval standardní instalační program s názvem „PowerMonitor“. Nainstaloval aplikaci „PowerMonitor.exe“, což je aplikace .Net a jak se ukázalo, aplikace .Net se dekompilují opravdu dobře. Dekompilovaný kód je super čitelný (ačkoli samotný kód je špatně napsaný (kód běžně používá řetězce jako nedílnou součást funkcí převodu čísel}).
I když je kód aplikace Chinese-Panda-Inverter obecně špatně kódovaný, měl přiměřeně dobré oddělení komunikačních, konverzních a uživatelských modulů, takže zachycení a stubování komunikačního kódu bylo poměrně snadné. Ve skutečnosti je to tak snadné, že jsem opustil svůj pokus o aplikaci Go-app ve prospěch pouhé kompilace s Mono (i když zřídka píšu/pracuji s C#). Také aplikace Mono na CPU Raspberry Pi 1. generace?! Šílený.


Jak se ukázalo, NENÍ to měnič Axpert King, a proto žádný z nástrojů Axpert nefungoval.
Toto je výstup z mé aplikace:
{"_accumulatedBuyPower":"169.9","_accumulatedChargerPower":"19.8","_accumulatedDischargerPower":"12.4","_accumulatedGridChargerPower":"19.8","_accumulatedLoadPower":"159.1","_accumulatedPower":"3.4","_accumulatedPvSellPower":"0","_accumulatedSelfUsePower":"5.9","_accumulatedSellPower":"0","_accumulatedTime":"00:09:02","_acRadiatorTemperature":"47","_acVoltageGrade":"230","_battCurrent":"0","_batteryRelay":"Connect","_batteryVoltage":"54.8","_battPower":"-54","_battVolGrade":"48","_busVoltage":"434.8","_chargerCurrent":"9.4","_chargerPower":"519","_chargerWorkstate":"Work Mode","_chargingState":" Float charge","_combineType":"0000","_controlCurrent":"1.6","_dcRadiatorTemperature":"38","_dcRelayState":"Connect","_chargerId":4,"_earthRelayState":"Disconnect","_errorMessage":"","_externalTemperature":"-53","_gridCurrent":"5.1","_gridFrequency":"49.82","_gridRelayState":"Connect","_gridVoltage":"242.2","_hardwareVersion":"1.02.02","_inverterBatteryVoltage":"54.5","_inverterCurrent":"1.6","_inverterErrorMessage":"","_inverterFrequency":"49.82","_inverterHardwareVersion":"1.01.01","_inverterMachineType":"PH1800","_inverterMaxNumber":"0000","_inverterNumber":"0000","_inverterRelayState":"Connect","_inverterSerialNumber":"FFFFFFFF","_inverterSoftwareVersion":"2.15.19","_inverterVoltage":"239.3","_inverterWarningMessage":"","_loadCurrent":"6.4","_loadPercent":"33","_loadRelayState":"Connect","_machineType":"0708","_mpptState":"Current limiting","_nLineRelayState":"Disconnect","_pGrid":"-984","_pInverter":"391","_pLoad":"1342","_pvRelay":"Connect","_pvVoltage":"106.8","_qgrid":"786","_qinverter":"98","_qload":"721","_radiatorTemperature":"40","_ratedCurrent":"80","_ratedPower":"5000","_serialNumber":"FFFFFFFF","_sGrid":"1259","_sInverter":"400","_sload":"1524","_softwareVersion":"1.16.23","_transformerTemperature":"50","_warningMessage":"","_workState":"Grid-Tie","_inverterId":4,"Id":0,"ChargerId":4,"InverterId":4,"RecordTime":"0001-01-01T00:00:00","MachineType":"0708","SerialNumber":"FFFFFFFF","HardwareVersion":"1.02.02","SoftwareVersion":"1.16.23","PvVoltageC":"4000","BatteryVoltageC":"4000","ChargerCurrentC":"4000","ChargerWorkEnable":"1","AbsorbVoltage":"50","FloatVoltage":"54.8","AbsorptionVoltage":"58.4","BatteryLowVoltage":"34","BatteryHighVoltage":"60","MaxChargerCurrent":"80","AbsorbChargerCurrent":"10","BatteryType":"1","BatteryAh":"200","RemoveTheAccumulatedData":"0","ChargerWorkstate":"Work Mode","MpptState":"Current limiting","ChargingState":" Float charge","PvVoltage":"106.8","BatteryVoltage":"54.8","ChargerCurrent":"9.4","ChargerPower":"519","RadiatorTemperature":"40","ExternalTemperature":"-53","BatteryRelay":"Connect","PvRelay":"Connect","ErrorMessage":"","WarningMessage":"","BattVolGrade":"48","RatedCurrent":"80","AccumulatedPower":"3.4","AccumulatedTime":"00:09:02","InverterMachineType":"PH1800","InverterSerialNumber":"FFFFFFFF","InverterHardwareVersion":"1.01.01","InverterSoftwareVersion":"2.15.19","InverterBatteryVoltageC":"3FEB","InverterVoltageC":"3F95","GridVoltageC":"FFFF","BusVoltageC":"FFFF","ControlCurrentC":"FFFF","InverterCurrentC":"FFFF","GridCurrentC":"FFFF","LoadCurrentC":"FFFF","InverterOffgridWorkEnable":"1","InverterOutputVoltageSet":"230","InverterOutputFrequencySet":"5000","InverterSearchModeEnable":"0","InverterDischargerToGridEnable":"0","EnergyUseMode":"2","GridProtectStandard":"2","SolarUseAim":"1","InverterMaxDischargerCurrent":"13","NormalVoltagePoint":"46","StartSellVoltagePoint":"54.5","GridMaxChargerCurrentSet":"15","InverterBatteryLowVoltage":"45","InverterBatteryHighVoltage":"60","MaxCombineChargerCurrent":"15","SystemSetting":"0100000000000000","ChargerSourcePriority":"0","WorkState":"Grid-Tie","AcVoltageGrade":"230","RatedPower":"5000","InverterBatteryVoltage":"54.5","InverterVoltage":"239.3","GridVoltage":"242.2","BusVoltage":"434.8","ControlCurrent":"1.6","InverterCurrent":"1.6","GridCurrent":"5.1","LoadCurrent":"6.4","PInverter":"391","PGrid":"-984","PLoad":"1342","LoadPercent":"33","SInverter":"400","SGrid":"1259","Sload":"1524","Qinverter":"98","Qgrid":"786","Qload":"721","InverterFrequency":"49.82","GridFrequency":"49.82","InverterMaxNumber":"0000","CombineType":"0000","InverterNumber":"0000","AcRadiatorTemperature":"47","TransformerTemperature":"50","DcRadiatorTemperature":"38","InverterRelayState":"Connect","GridRelayState":"Connect","LoadRelayState":"Connect","N_LineRelayState":"Disconnect","DCRelayState":"Connect","EarthRelayState":"Disconnect","AccumulatedChargerPower":"19.8","AccumulatedDischargerPower":"12.4","AccumulatedBuyPower":"169.9","AccumulatedSellPower":"0","AccumulatedLoadPower":"159.1","AccumulatedSelf_usePower":"5.9","AccumulatedPV_sellPower":"0","AccumulatedGrid_chargerPower":"19.8","InverterErrorMessage":"","InverterWarningMessage":"","BattPower":"-54","BattCurrent":"0"}
Moje stubby app se dotazuje na invertor, serializuje výstup do JSON a pak vypíše výsledek do stdout. To lze vložit do mosquitto_pub a publikovat data brokerovi.
Jak je uvedeno výše, tento měnič není měničem Axpert King/Voltronic. Ve skutečnosti ho vyrábí společnost s názvem Must Power/MustPower, která stejně jako Axpert přeznačuje své vybavení pro nejbližšího prodejce. To bohužel způsobuje velkou fragmentaci trhu z hlediska podpory komunity. Tento konkrétní stroj se identifikuje jako invertor Must Power PH1800 s výkonem 5000 VA. Je důležité, že zde existuje velké množství metrik, které nejsou vystaveny v softwaru pro stolní počítače nebo na displeji LCD zařízení.

Mám data vložená do mého MQTT brokera, teď je musím zalogovat (přečtěte si „integrovat je do Home Assistant“).


Pokles je noční. Kroky jsou způsobeny funkcí MPPT na měniči (napětí naprázdno by bylo kolem 135V). 106,7 V je 35,5 V na sadu panelů, což je výrobcem specifikované napětí pro napětí „nejlepšího výkonu“. Toto napětí bylo vybráno funkcí MPPT měniče... takže je docela působivé, že to udělal tak dobrou práci, aby to zjistil.
Dalším krokem je integrace funkce zápisu do mé malé aplikace, takže Home Assistant (zejména NodeRED) může být použit ke správě střídače.
{"_accumulatedBuyPower":"2651.9","_accumulatedChargerPower":"904.3","_accumulatedDischargerPower":"1884.1","_accumulatedGridChargerPower":"904.3","_accumulatedLoadPower":"3654.1","_accumulatedPower":"1856.3","_accumulatedPvSellPower":"4","_accumulatedSelfUsePower":"1002.1","_accumulatedSellPower":"4","_accumulatedTime":"206:18:58","_acRadiatorTemperature":"27","_acVoltageGrade":"230","_battCurrent":"-2","_batteryRelay":"Connect","_batteryVoltage":"52.2","_battPower":"-146","_battVolGrade":"48","_busVoltage":"415.5","_chargerCurrent":"9.8","_chargerPower":"511","_chargerWorkstate":"Work Mode","_chargingState":" Float charge","_combineType":"0000","_controlCurrent":"1.5","_dcRadiatorTemperature":"24","_dcRelayState":"Connect","_chargerId":4,"_earthRelayState":"Disconnect","_errorMessage":"","_externalTemperature":"-53","_gridCurrent":"1.1","_gridFrequency":"49.97","_gridRelayState":"Connect","_gridVoltage":"218.2","_hardwareVersion":"1.02.02","_inverterBatteryVoltage":"52.1","_inverterCurrent":"1.5","_inverterErrorMessage":"","_inverterFrequency":"49.97","_inverterHardwareVersion":"1.01.01","_inverterMachineType":"PH1800","_inverterMaxNumber":"0000","_inverterNumber":"0000","_inverterRelayState":"Connect","_inverterSerialNumber":"FFFFFFFF","_inverterSoftwareVersion":"2.55.19","_inverterVoltage":"217","_inverterWarningMessage":"","_loadCurrent":"1.5","_loadPercent":"6","_loadRelayState":"Connect","_machineType":"0708","_mpptState":"Current limiting","_nLineRelayState":"Disconnect","_pGrid":"0","_pInverter":"306","_pLoad":"288","_pvRelay":"Connect","_pvVoltage":"107.8","_qgrid":"240","_qinverter":"105","_qload":"171","_radiatorTemperature":"28","_ratedCurrent":"80","_ratedPower":"5000","_serialNumber":"FFFFFFFF","_sGrid":"242","_sInverter":"319","_sload":"335","_softwareVersion":"1.16.26","_transformerTemperature":"47","_warningMessage":"","_workState":"Grid-Tie","_inverterId":4,"Id":0,"ChargerId":4,"InverterId":4,"RecordTime":"0001-01-01T00:00:00","MachineType":"0708","SerialNumber":"FFFFFFFF","HardwareVersion":"1.02.02","SoftwareVersion":"1.16.26","PvVoltageC":"4000","BatteryVoltageC":"4000","ChargerCurrentC":"4000","ChargerWorkEnable":"1","AbsorbVoltage":"50","FloatVoltage":"52","AbsorptionVoltage":"52.5","BatteryLowVoltage":"34","BatteryHighVoltage":"60","MaxChargerCurrent":"80","AbsorbChargerCurrent":"10","BatteryType":"2","BatteryAh":"200","RemoveTheAccumulatedData":"0","ChargerWorkstate":"Work Mode","MpptState":"Current limiting","ChargingState":" Float charge","PvVoltage":"107.8","BatteryVoltage":"52.2","ChargerCurrent":"9.8","ChargerPower":"511","RadiatorTemperature":"28","ExternalTemperature":"-53","BatteryRelay":"Connect","PvRelay":"Connect","ErrorMessage":"","WarningMessage":"","BattVolGrade":"48","RatedCurrent":"80","AccumulatedPower":"1856.3","AccumulatedTime":"206:18:58","InverterMachineType":"PH1800","InverterSerialNumber":"FFFFFFFF","InverterHardwareVersion":"1.01.01","InverterSoftwareVersion":"2.55.19","InverterBatteryVoltageC":"4040","InverterVoltageC":"FFFF","GridVoltageC":"FFFF","BusVoltageC":"FFFF","ControlCurrentC":"FFFF","InverterCurrentC":"FFFF","GridCurrentC":"FFFF","LoadCurrentC":"FFFF","InverterOffgridWorkEnable":"1","InverterOutputVoltageSet":"230","InverterOutputFrequencySet":"5000","InverterSearchModeEnable":"0","InverterDischargerToGridEnable":"0","EnergyUseMode":"2","GridProtectStandard":"2","SolarUseAim":"1","InverterMaxDischargerCurrent":"21.7","NormalVoltagePoint":"46.8","StartSellVoltagePoint":"52","GridMaxChargerCurrentSet":"30","InverterBatteryLowVoltage":"46.8","InverterBatteryHighVoltage":"60","MaxCombineChargerCurrent":"80","SystemSetting":"1100010000000000","ChargerSourcePriority":"2","WorkState":"Grid-Tie","AcVoltageGrade":"230","RatedPower":"5000","InverterBatteryVoltage":"52.1","InverterVoltage":"217","GridVoltage":"218.2","BusVoltage":"415.5","ControlCurrent":"1.5","InverterCurrent":"1.5","GridCurrent":"1.1","LoadCurrent":"1.5","PInverter":"306","PGrid":"0","PLoad":"288","LoadPercent":"6","SInverter":"319","SGrid":"242","Sload":"335","Qinverter":"105","Qgrid":"240","Qload":"171","InverterFrequency":"49.97","GridFrequency":"49.97","InverterMaxNumber":"0000","CombineType":"0000","InverterNumber":"0000","AcRadiatorTemperature":"27","TransformerTemperature":"47","DcRadiatorTemperature":"24","InverterRelayState":"Connect","GridRelayState":"Connect","LoadRelayState":"Connect","N_LineRelayState":"Disconnect","DCRelayState":"Connect","EarthRelayState":"Disconnect","AccumulatedChargerPower":"904.3","AccumulatedDischargerPower":"1884.1","AccumulatedBuyPower":"2651.9","AccumulatedSellPower":"4","AccumulatedLoadPower":"3654.1","AccumulatedSelf_usePower":"1002.1","AccumulatedPV_sellPower":"4","AccumulatedGrid_chargerPower":"904.3","InverterErrorMessage":"","InverterWarningMessage":"","BattPower":"-146","BattCurrent":"-2"}
Aplikaci můžete spouštět v pravidelných intervalech pomocí cronjob, něco podobného tomuto (rychle sestavené z paměti, takže pravděpodobně ne úplně správně):
* * * * * root /usr/bin/dtach -n /dev/shm/mustinv$$ /usr/bin/bash -c "/home/pi/MustInverter.exe | mosquitto_pub -h 192.168.0.5 -t "/mustinverter" -l -u username -P password"
A toto je další YAML, který jsem dal Home Assistant, aby pohltil toto užitečné zatížení:
sensor:
- platform: mqtt
state_topic: "/inverter"
name: "_acRadiatorTemperature"
expire_after: 360
value_template: "{{ value_json._acRadiatorTemperature }}"
unit_of_measurement: '°C'
- platform: mqtt
state_topic: "/inverter"
name: "_dcRadiatorTemperature"
expire_after: 360
value_template: "{{ value_json._dcRadiatorTemperature }}"
unit_of_measurement: '°C'
- platform: mqtt
state_topic: "/inverter"
name: "_transformerTemperature"
expire_after: 360
value_template: "{{ value_json._transformerTemperature }}"
unit_of_measurement: '°C'
- platform: mqtt
state_topic: "/inverter"
name: "_battCurrent"
expire_after: 360
value_template: "{{ value_json._battCurrent }}"
unit_of_measurement: 'A'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_chargerCurrent"
expire_after: 360
value_template: "{{ value_json._chargerCurrent }}"
unit_of_measurement: 'A'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_controlCurrent"
expire_after: 360
value_template: "{{ value_json._controlCurrent }}"
unit_of_measurement: 'A'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_gridCurrent"
expire_after: 360
value_template: "{{ value_json._gridCurrent }}"
unit_of_measurement: 'A'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_inverterCurrent"
expire_after: 360
value_template: "{{ value_json._inverterCurrent }}"
unit_of_measurement: 'A'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_loadCurrent"
expire_after: 360
value_template: "{{ value_json._loadCurrent }}"
unit_of_measurement: 'A'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_gridFrequency"
expire_after: 360
value_template: "{{ value_json._gridFrequency }}"
unit_of_measurement: 'Hz'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_inverterBatteryVoltage"
expire_after: 360
value_template: "{{ value_json._inverterBatteryVoltage }}"
unit_of_measurement: 'V'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_inverterVoltage"
expire_after: 360
value_template: "{{ value_json._inverterVoltage }}"
unit_of_measurement: 'V'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_loadPercent"
expire_after: 360
value_template: "{{ value_json._loadPercent }}"
unit_of_measurement: '%'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_battPower"
expire_after: 360
value_template: "{{ value_json._battPower }}"
unit_of_measurement: 'W'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_pGrid"
expire_after: 360
value_template: "{{ value_json._pGrid }}"
unit_of_measurement: 'W'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_pInverter"
expire_after: 360
value_template: "{{ value_json._pInverter }}"
unit_of_measurement: 'W'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_inverterVoltage"
expire_after: 360
value_template: "{{ value_json._pLoad }}"
unit_of_measurement: 'V'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_busVoltage"
expire_after: 360
value_template: "{{ value_json._busVoltage }}"
unit_of_measurement: 'V'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_sload"
expire_after: 360
value_template: "{{ value_json._sload }}"
unit_of_measurement: 'W'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_chargerPower"
expire_after: 360
value_template: "{{ value_json._chargerPower }}"
unit_of_measurement: 'W'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_sInverter"
expire_after: 360
value_template: "{{ value_json._sInverter }}"
unit_of_measurement: 'V'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_qgrid"
expire_after: 360
value_template: "{{ value_json._qgrid }}"
unit_of_measurement: 'W'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_qinverter"
expire_after: 360
value_template: "{{ value_json._qinverter }}"
unit_of_measurement: 'W'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_qload"
expire_after: 360
value_template: "{{ value_json._qload }}"
unit_of_measurement: 'W'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_sGrid"
expire_after: 360
value_template: "{{ value_json._sGrid }}"
unit_of_measurement: 'V'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_pvVoltage"
expire_after: 360
value_template: "{{ value_json._pvVoltage }}"
unit_of_measurement: 'V'
device_class: power
- platform: mqtt
state_topic: "/inverter"
name: "_mpptState"
expire_after: 360
value_template: "{{ value_json._mpptState }}"
- platform: mqtt
state_topic: "/inverter"
name: "PV Inverter Power"
expire_after: 360
value_template: "{{ value_json.PInverter }}"
unit_of_measurement: 'W'
device_class: power
Rozhraní USB na těchto zařízeních se připojuje k převodníku, který se nakonec připojuje ke stejnému sériovému rozhraní jako vyhrazené rozhraní RS422/RS485 – můžete tedy také použít připojení USB.
Hodně štěstí! a klidně mi napište, pokud vám toto užitečné, vždy zábavné slyšení od lidí, kteří čtou tyto příspěvky (kdo by si to pomyslel?!)
Vlákno PowerForum, kterého se tento příspěvek týká, najdete zde .