In meantime, and because I had no time to check projects like Sofar2mqtt, I created a rule which gets the data from the cloud (not my preferred way, but it works…)
The only thing you need is access to the API, you can request this by sending a mail to customerservice@solarmanpv.com
I created a lot of items, and a rule which is triggered every 5 minutes (0 0/5 * * * ? *
)
items:
Group solarman "Solarman" <energy> (General) ["Sensor"]
String solarman_token "Bearer token" <energy> (solarman) ["Sensor"]
String solarman_SN "SN" <energy> (solarman) ["Sensor"]
String solarman_HardwareVersion "Hardware Version" <energy> (solarman) ["Sensor"]
String solarman_MasterSoftwareVersion "Master Software Version" <energy> (solarman) ["Sensor"]
String solarman_ViceSoftwareVersion "Vice Software Version" <energy> (solarman) ["Sensor"]
String solarman_StandardMainVersion "Standard Main Version" <energy> (solarman) ["Sensor"]
String solarman_CommunicationCPUSoftwareVersion "Communication CPU Software Version" <energy> (solarman) ["Sensor"]
Number:ElectricPotential solarman_DCVoltagePV1 "DC Voltage PV1" <energy> (solarman) ["Sensor"] {stateDescription="unit"[pattern="%.1f %unit%"]}
Number:ElectricPotential solarman_DCVoltagePV2 "DC Voltage PV2" <energy> (solarman) ["Sensor"]
Number:ElectricCurrent solarman_DCCurrentPV1 "DC Current PV1" <energy> (solarman) ["Sensor"]
Number:ElectricCurrent solarman_DCCurrentPV2 "DC Current PV2" <energy> (solarman) ["Sensor"]
Number:Power solarman_DCPowerPV1 "DC Power PV1" <energy> (solarman) ["Sensor"]
Number:Power solarman_DCPowerPV2 "DC Power PV2" <energy> (solarman) ["Sensor"]
Number:ElectricPotential solarman_ACVoltageRUA "AC Voltage R/U/A" <energy> (solarman) ["Sensor"]
Number:ElectricCurrent solarman_ACCurrentRUA "AC Current R/U/A" <energy> (solarman) ["Sensor"]
Number:Power solarman_TotalACOutputPower "Total AC Output Power" <energy> (solarman) ["Sensor"]
Number:Frequency solarman_ACOutputFrequencyR "AC Output Frequency R" <energy> (solarman) ["Sensor"]
Number:ElectricPotential solarman_OutputVoltageOffgridRphase "Output Voltage Off-grid--R phase" <energy> (solarman) ["Sensor"]
Number:Energy solarman_CumulativeProductionActive "Cumulative Production (Active)" <energy> (solarman) ["Sensor"]
Number:Energy solarman_DailyProductionActive "Daily Production (Active)" <energy> (solarman) ["Sensor"]
Number:Power solarman_ActivePowerPVExt "ActivePower PV Ext" <energy> (solarman) ["Sensor"]
Number:ElectricCurrent solarman_DcComponentPhaseRCurrent "Dc Component- Phase R Current" <energy> (solarman) ["Sensor"]
Number:ElectricPotential solarman_DcComponentPhaseRVoltage "Dc Component- Phase R Voltage" <energy> (solarman) ["Sensor"]
Number:ElectricCurrent solarman_PpcAcCurrentR "Ppc Ac Current R" <energy> (solarman) ["Sensor"]
Number:Power solarman_TotalReactivePower "Total Reactive Power" <energy> (solarman) ["Sensor"]
Number:Power solarman_RPhaseLoadRctivePower "R-Phase Load Rctive Power" <energy> (solarman) ["Sensor"]
String solarman_GridStatus "Grid Status" <energy> (solarman) ["Sensor"]
Number:Frequency solarman_GridFrequency "Grid Frequency" <energy> (solarman) ["Sensor"]
Number:Power solarman_TotalGridPower "Total Grid Power" <energy> (solarman) ["Sensor"]
Number:Energy solarman_CumulativeGridFeedin "Cumulative Grid Feed-in" <energy> (solarman) ["Sensor"]
Number:Energy solarman_CumulativeEnergyPurchased "Cumulative Energy Purchased" <energy> (solarman) ["Sensor"]
Number:Energy solarman_DailyGridFeedin "Daily Grid Feed-in" <energy> (solarman) ["Sensor"]
Number:Energy solarman_DailyEnergyPurchased "Daily Energy Purchased" <energy> (solarman) ["Sensor"]
Number:ElectricCurrent solarman_LeakCurrent "Leak Current" <energy> (solarman) ["Sensor"]
Number:ElectricResistance solarman_InsulationImpedance1 "Insulation Impedance 1" <energy> (solarman) ["Sensor"]
Number:ElectricPotential solarman_NBUSVoltage "NBUS Voltage" <energy> (solarman) ["Sensor"]
Number:ElectricCurrent solarman_ConsumptionCurrentRUA "Consumption Current R/U/A" <energy> (solarman) ["Sensor"]
Number:Power solarman_TotalConsumptionPower "Total Consumption Power" <energy> (solarman) ["Sensor"]
Number:Energy solarman_CumulativeConsumption "Cumulative Consumption" <energy> (solarman) ["Sensor"]
Number:Energy solarman_DailyConsumption "Daily Consumption" <energy> (solarman) ["Sensor"]
String solarman_BatteryStatus "Battery Status" <energy> (solarman) ["Sensor"]
Number:Power solarman_BatteryPower "Battery Power" <energy> (solarman) ["Sensor"]
Number:Energy solarman_TotalChargingEnergy "Total Charging Energy" <energy> (solarman) ["Sensor"]
Number:Energy solarman_TotalDischargingEnergy "Total Discharging Energy" <energy> (solarman) ["Sensor"]
Number:Energy solarman_DailyChargingEnergy "Daily Charging Energy" <energy> (solarman) ["Sensor"]
Number:Energy solarman_DailyDischargingEnergy "Daily Discharging Energy" <energy> (solarman) ["Sensor"]
Number:Power solarman_PowerBatteryPack1 "Power Battery Pack 1" <energy> (solarman) ["Sensor"]
Number:ElectricPotential solarman_TotalVoltageBatteryPack1 "Total Voltage Battery Pack 1" <energy> (solarman) ["Sensor"]
Number:ElectricCurrent solarman_CurrentBatteryPack1 "Current- Battery Pack 1" <energy> (solarman) ["Sensor"]
Number:Dimensionless solarman_SoCBatteryPack1 "SoC- Battery Pack 1" <energy> (solarman) ["Sensor"] {stateDescription="unit"[pattern="%.1f %unit%"]}
Number solarman_CycleTimesBatteryPack1 "Cycle Times-Battery Pack1" <energy> (solarman) ["Sensor"]
Number:Temperature solarman_TemperatureBatteryPack1 "Temperature- Battery Pack 1" <energy> (solarman) ["Sensor"]
Number:Temperature solarman_ModuleTemperature "Module Temperature" <energy> (solarman) ["Sensor"]
Number:Temperature solarman_SinglePlateAmbientTemperature "Single Plate Ambient Temperature" <energy> (solarman) ["Sensor"]
Number:Temperature solarman_RadiatorTemperature1 "Radiator Temperature 1" <energy> (solarman) ["Sensor"]
DateTime solarman_SystemTime "System Time" <energy> (solarman) ["Sensor"] {stateDescription="date"[pattern="%1$td-%1$tm-%1$tY %1$tH:%1$tM"]}
Number:ElectricCurrent solarman_BalancedCurrent "Balanced Current" <energy> (solarman) ["Sensor"]
Number:Time solarman_GenerationTimeToday "Generation Time Today" <energy> (solarman) ["Sensor"]
Number:Time solarman_GenerationTimeTotal "Generation Time Total" <energy> (solarman) ["Sensor"]
Number:Time solarman_TotalRunningHour "Total Running Hour" <energy> (solarman) ["Sensor"]
Number solarman_BootCountdown "Boot Countdown" <energy> (solarman) ["Sensor"]
Number:ElectricCurrent solarman_BuckCurrent "Buck Current" <energy> (solarman) ["Sensor"]
Number:ElectricPotential solarman_BusVoltage "Bus Voltage" <energy> (solarman) ["Sensor"]
Number:ElectricPotential solarman_PBUSVoltage "PBUS Voltage" <energy> (solarman) ["Sensor"]
String solarman_Inverterstatus "Inverter status" <energy> (solarman) ["Sensor"]
Number:Energy solarman_CumulativeSelfUsed "Cumulative Self Used" <energy> (solarman) ["Sensor"]
rule:
You first need some things:
- Device serial number, can be found here
- Bearer token, this can be obtained via this API call.
curl --request POST \
--url 'https://api.solarmanpv.com/account/v1.0/token?appId=<appId>&language=en&=' \
--header 'Content-Type: application/json' \
--data '{
"appSecret": "<appSecret>",
"email": "<email>",
"password": "<passwordConvertedToSHA256>"
}'
I also scheduled a rule to obtain a new token every 30 days (token expires after 60 days) (0 0 8 1 * ? *
)
val appId = "***********"
val appSecret = "***********"
val email = "***********"
val pwd = "***********"
val url = "https://api.solarmanpv.com/account/v1.0/token?appId=" + appId + "&language=en"
val content = '{"appSecret": "' + appSecret + '", "email": "' + email + '", "password": "' + pwd + '"}'
val headers = newHashMap("Content-Type" -> "application/json")
var String request = sendHttpPostRequest(url, "application/json", content, headers, 3000)
logInfo("Solarman", "update token")
val token = transform("JSONPATH", "$..access_token", request)
//logInfo("Solarman", "token : " + token)
solarman_token.postUpdate(token)
Main rule:
val deviceSn = "************"
val url = "https://api.solarmanpv.com/device/v1.0/currentData?language=en&="
val token = solarman_token.state
val content = '{"deviceSn": "' + deviceSn + '"}'
val headers = newHashMap("Authorization" -> "Bearer " + token)
var String request = sendHttpPostRequest(url, "application/json", content, headers, 3000)
val keys = transform("JSONPATH", "$..dataList..key", request)
val data = transform("JSONPATH", "$..dataList", request)
val Integer dataCount = Integer::parseInt(transform("JSONPATH", "$..dataList.length()", data))
var Integer j = 0
while (j < dataCount) {
var String dataKey = transform("JSONPATH", "$[" + j +"].key", data)
var String dataValue = transform("JSONPATH", "$[" + j +"].value", data)
var String dataUnit = transform("JSONPATH", "$[" + j +"].unit", data)
var String dataName = transform("JSONPATH", "$[" + j +"].name", data)
var String itemName = "solarman_" + dataName.replace(" ", "").replace("-","").replace("/","").replace("(","").replace(")","").replace("Single Pla","SinglePla")
itemName.postUpdate(dataValue)
j++
}
This rule loops trough all received data and adds the values to the items. Maybe not the best way, but it works fine for me since 2 months 