Acties:
  • +2 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
EDIT snelle samenvatting naar de oplossing:
Ondertussen heb ik 2 werkende python scripts gemaakt, werkt op Raspberry Pi en Windows 10, Python 3.7+.
1. Solis omvormer data naar PVOutput. zie github.
2. Combineren van 2 PVOutput systemen naar een gecombineerd systeem: zie github

Meer informatie naar de oplossing toe en achtergrond informatie

Ik heb een Solis omvormer (Solis S6-GR1P1.5K-M) met Wifi stick voor de 5 zonnepanelen op mijn dubbele carport. Zie hier voor meer informatie van mijn systeem: Uitbreiding zonnepanelen dubbele carport.

De Solis omvormer stuurt de data naar SolisCloud, die je kan bekijken met de SolisCloud app of met de browser op de PC.

Afbeeldingslocatie: https://tweakers.net/i/0L1kADFZ-aVk8uyAO-G_2B1ge0Q=/800x/filters:strip_exif()/f/image/lRPGFmSEu8CL54lgfeu1iBzj.png?f=fotoalbum_large

Ik had al gezocht naar de mogelijkheid om de Solis data ook naar PVOutput te sturen, zodat systemen beter vergeleken kunnen worden.

Er is een HomeAssistent integratie met SolisCloud, hier het github archief. Er wordt ook een API document, maar wanneer ik naar de API in de browser kijk, komt deze niet (helemaal) overeen.
The new portal requires a key-id, secret and username to function.
De laatste lijkt een probleem te zijn, om aan de key-id en secret te komen. Zijn er mensen die dit gekregen hebben via de Solis/ginlong support?

En hier op tweakers wordt er ook hierover gediscussieerd, onder andere uitlezen via Wifi stick of RS485. En zie ook dit topic:
Remco45 in "Ginlong Solis omvormer uitlezen voor Domoticz"

Zijn er meer mensen die informatie uitlezen van de Solis omvormer? Zo ja, misschien handig om informatie in dit topic te delen.

Aangezien ik de authenticatie als het grootste probleem zie (om SolisCloud API calls te doen), heb ik een half geautomatiseerde oplossing gemaakt. In SolisCloud maak ik een rapport (Report button rechtsboven in bovenstaand plaatje). In de xls staat in tweede workbook de Solis data die nodig is voor PVoutput.

Deze tweede workbook in de .xls converteer ik automatisch via een script naar .csv. Bijvoorbeeld

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
....
Number,Time,Working State,Alarm Code,DC Voltage Pv1(V),Total Inverter Power(W),Today Yield(kWh),Total 
Yield(kWh)
1,03/06/2022 04:59:23,Normal, ,64.4,20.000,0.000,45.000
2,03/06/2022 05:04:23,Normal, ,62.2,20.000,0.000,45.000
3,03/06/2022 05:09:23,Normal, ,162.5,20.000,0.000,45.000
4,03/06/2022 05:14:23,Normal, ,147.0,20.000,0.000,45.000
5,03/06/2022 05:19:23,Normal, ,147.4,20.000,0.000,45.000
6,03/06/2022 05:24:23,Normal, ,148.2,20.000,0.000,45.000
7,03/06/2022 05:29:23,Normal, ,148.4,20.000,0.000,45.000
8,03/06/2022 05:34:23,Normal, ,148.9,20.000,0.000,45.000
9,03/06/2022 05:39:23,Normal, ,149.1,20.000,0.000,45.000
10,03/06/2022 05:44:23,Normal, ,149.4,20.000,0.000,45.000
11,03/06/2022 05:49:23,Normal, ,153.5,20.000,0.100,45.000
12,03/06/2022 05:54:23,Normal, ,169.7,20.000,0.100,45.000
13,03/06/2022 05:59:23,Normal, ,169.5,20.000,0.100,45.000
14,03/06/2022 06:04:23,Normal, ,169.5,20.000,0.100,45.000
15,03/06/2022 06:09:23,Normal, ,173.7,30.000,0.100,45.000
16,03/06/2022 06:14:23,Normal, ,173.5,30.000,0.100,45.000
17,03/06/2022 06:19:23,Normal, ,173.6,40.000,0.100,45.000
18,03/06/2022 06:24:23,Normal, ,177.8,40.000,0.100,45.000
19,03/06/2022 06:29:23,Normal, ,177.7,40.000,0.100,45.000
20,03/06/2022 06:34:23,Normal, ,177.4,50.000,0.100,45.000
21,03/06/2022 06:39:23,Normal, ,181.5,50.000,0.100,45.000
22,03/06/2022 06:44:23,Normal, ,181.7,50.000,0.100,45.000
23,03/06/2022 06:49:23,Normal, ,185.6,50.000,0.100,45.000
24,03/06/2022 06:54:23,Normal, ,185.5,60.000,0.100,45.000
25,03/06/2022 06:59:23,Normal, ,185.5,60.000,0.100,45.000
26,03/06/2022 07:04:23,Normal, ,185.6,60.000,0.100,45.000
27,03/06/2022 07:09:23,Normal, ,185.8,60.000,0.100,45.000
28,03/06/2022 07:14:23,Normal, ,189.4,70.000,0.100,45.000
29,03/06/2022 07:19:23,Normal, ,189.7,70.000,0.100,45.000
30,03/06/2022 07:24:23,Normal, ,189.4,70.000,0.100,45.000
31,03/06/2022 07:29:23,Normal, ,154.1,390.000,0.100,45.000
32,03/06/2022 07:34:23,Normal, ,165.4,440.000,0.200,45.000
33,03/06/2022 07:39:23,Normal, ,181.7,500.000,0.200,45.000
....



Deze .csv lees ik uit via een script en converteer naar .pvoutput formaat.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
20220603,05:59,0,20,-1,-1,,64
20220603,06:04,0,20,-1,-1,,62
20220603,06:09,0,20,-1,-1,,163
20220603,06:14,0,20,-1,-1,,147
20220603,06:19,0,20,-1,-1,,147
20220603,06:24,0,20,-1,-1,,148
20220603,06:29,0,20,-1,-1,,148
20220603,06:34,0,20,-1,-1,,149
20220603,06:39,0,20,-1,-1,,149
20220603,06:44,0,20,-1,-1,,149
20220603,06:49,100,20,-1,-1,,154
20220603,06:54,100,20,-1,-1,,170
20220603,06:59,100,20,-1,-1,,170
20220603,07:04,100,20,-1,-1,,170
20220603,07:09,100,30,-1,-1,,174
20220603,07:14,100,30,-1,-1,,174
20220603,07:19,100,40,-1,-1,,174
20220603,07:24,100,40,-1,-1,,178
20220603,07:29,100,40,-1,-1,,178
20220603,07:34,100,50,-1,-1,,177
20220603,07:39,100,50,-1,-1,,182
20220603,07:44,100,50,-1,-1,,182
20220603,07:49,100,50,-1,-1,,186
20220603,07:54,100,60,-1,-1,,186
20220603,07:59,100,60,-1,-1,,186
20220603,08:04,100,60,-1,-1,,186
20220603,08:09,100,60,-1,-1,,186
20220603,08:14,100,70,-1,-1,,189
20220603,08:19,100,70,-1,-1,,190
20220603,08:24,100,70,-1,-1,,189
20220603,08:29,100,390,-1,-1,,154
20220603,08:34,200,440,-1,-1,,165
20220603,08:39,200,500,-1,-1,,182
...


Deze pvoutput csv stuur ik daarna naar via een script naar PVOutput.

Dit is dus wel achteraf, maar aangezien ik ook de SolisCloud data kan bekijken via App of Windows PC hoeft dit voor mij niet realtime te zijn.

Hier de data van 3 juni 2022 op PVOutput:

Afbeeldingslocatie: https://tweakers.net/i/64IP7h12sKFuXrPp84ODXZeSHkg=/800x/filters:strip_exif()/f/image/wFQWt2Eob85DA24COYcfbeXF.png?f=fotoalbum_large

Jammer genoeg is de resolutie van de opwekking van de dag per 100 Wh oplopend, dus misschien wil ik daar nog iets aan verbeteren, door de huidige opwek per 5 minuten mee te nemen in de increments om een nauwkeurigere resolutie te krijgen.

Zelf heb ik ook een script op een raspberry pi lopen om mijn SMA omvormer data per 5 minuten naar PVOutput te sturen. Dat zou ik ook graag willen voor de Solis data (maar wil ook de SolisCloud data nog hebben), dus als iemand dit voor elkaar gekregen heeft, zou ik graag weten hoe.

[ Voor 3% gewijzigd door ZuinigeRijder op 25-08-2022 12:58 ]


Acties:
  • +1 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Ik heb de resolutie beperking van de Solis omvormer van 100 Wh kunnen verbeteren, door bij de opwek van de dag rekening te houden met het huidige AC wattage, zodat er kleinere stappen van 100 Wh mogelijk zijn.

Wanneer je in PVOutput de insolation aanzet, zie je goed hoe de gemiddelde Watt over 5 minuten op en neer schiet bij de oude data, zonder verbeterd algoritme:

Afbeeldingslocatie: https://tweakers.net/i/QeCedncaH2DEJSrZ1fiMpf17Qjw=/800x/filters:strip_exif()/f/image/HzWuFcITUIR4tltBQ1RXa8fX.png?f=fotoalbum_large

Na het verbeterde algoritme, opwek van de dag + verwachte opwek in komende 5 minuten aan de hand van huidige wattage, geeft dit een veel rustiger beeld (maar nog steeds niet perfect):

Afbeeldingslocatie: https://tweakers.net/i/w4XDDdoV4D8qLwRt0ePIEBiA6g0=/800x/filters:strip_exif()/f/image/13XZZbM0tlcNI4wsrW1uehfY.png?f=fotoalbum_large

Acties:
  • +1 Henk 'm!

  • klump4u
  • Registratie: Februari 2008
  • Niet online

klump4u

Gasloos in Zuid-Limburg

Ik lees bij mijn dochter een Solis 6KW 3 fase 4G uit dmv een CH340 USB naar RS485 op een oude Raspberry Pi B uit.
Eerst dmv een Python script van omvormer naar Domoticz en van daaruit naar PVOutput.
De WiFi module voor de Solis was pas half juli leverbaar (waarschijnlijk) dus maar zelf wat in elkaar geknutseld voor haar.

Onderop de omvormer zit dus die ronde stekker. Als je goed kijkt, zul je zien dat de pinnetjes genummerd zijn. Je hebt pin 3 en pin 4 nodig. Pin 3 is A+, pin 4 is B-. Er is geen terminator weerstand nodig, aan geen van beide kanten. Het gaat dus van A op de RS485 aansluiting van de pi, naar de A op de omvormer, en van B naar B.
De Usb naar RS485 https://www.amazon.nl/KYY...x=ch340%2Caps%2C86&sr=8-6

Het Pyhon 3 script voor van omvormer naar Domoticz.
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/python3

import minimalmodbus
import socket
import serial
import paho.mqtt.client as paho
import time

instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1)
instrument.serial.baudrate = 9600
instrument.serial.bytesize = 8
instrument.serial.parity   = serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout  = 2

broker="192.168.178.45"

# callback for mqtt
def on_message(client, userdata, message):
    time.sleep(1)
    print("received message =",str(message.payload.decode("utf-8")))

try:

        # get data from solis
        Realtime_ACW = instrument.read_long(3004, functioncode=4, signed=False) #Read AC Watts as Unsigned 32-Bit
        print("AC_Watts: " + str(Realtime_ACW) + "W")
        Realtime_DCV = instrument.read_register(3021, functioncode=4, signed=False) /10 #Read DC Volts as Unsigned 16$
        print("DC Volt: " + str(Realtime_DCV/1) + "V")
        Realtime_DCI = instrument.read_register(3022, functioncode=4, signed=False) /10 #Read DC Current as Unsigned $
        print("DC Current : " + str(Realtime_DCI) + "A")
        Realtime_ACV = instrument.read_register(3035, functioncode=4, signed=False) / 10 #Read AC Volts as Unsigned 1$
        print("AC volt : " + str(Realtime_ACV/1) + "V")
        Realtime_ACI = instrument.read_register(3038, functioncode=4, signed=False) / 10 #Read AC Current as Unsigned$
        print("AC Current :" + str(Realtime_ACI) + "A")
        Realtime_ACF = instrument.read_register(3042, functioncode=4, signed=False) / 100 #Read AC Frequency as Unsig$
        print("AC Frequency :"+ str(Realtime_ACF/1) + "Hz")
        Inverter_C = instrument.read_register(3041, functioncode=4, signed=True) /10 #Read Inverter Temperature as Si$
        print("Inverter Temperature :" + str(Inverter_C) + "C")
        AlltimeEnergy_KW = instrument.read_long(3008, functioncode=4, signed=False) # Read All Time Energy (KWH Total$
        print("Generated (All time):" +str(AlltimeEnergy_KW) + "kW")
        Today_KW = instrument.read_register(3014, functioncode=4, signed=False) /10 # Read Today Energy (KWH Total) a$
        print("Generated (Today) :" + str(Today_KW) + "kW")
        LastMonthEnergy_KW = instrument.read_register(3013, functioncode=4, signed=False) # Read All Time Energy (KWH$
        print("Generated (Last Month):" +str(LastMonthEnergy_KW) + "kW")
        ThisMonthEnergy_KW = instrument.read_long(3010, functioncode=4, signed=False) # Read All Time Energy (KWH Tot$
        print("Generated (This Month):" +str(ThisMonthEnergy_KW) + "kW")

client= paho.Client("solipi")
        client.on_message=on_message
        client.connect(broker)
        client.loop_start()
        client.subscribe("domoticz/in")
        time.sleep(2)
        client.publish("domoticz/in",'{"command":"udevice","idx":1,"nvalue":0,"svalue":"' + str(Realtime_ACW) + ';' +$
        client.publish("domoticz/in",'{"command":"udevice","idx":2,"nvalue":0,"svalue":"' + str(Realtime_DCV) + '"}')
        client.publish("domoticz/in",'{"command":"udevice","idx":3,"nvalue":0,"svalue":"' + str(Realtime_DCI) + '"}')
        client.publish("domoticz/in",'{"command":"udevice","idx":11,"nvalue":0,"svalue":"' + str(AlltimeEnergy_KW) + $
        client.publish("domoticz/in",'{"command":"udevice","idx":5,"nvalue":0,"svalue":"' + str(Realtime_ACV) + '"}')
        client.publish("domoticz/in",'{"command":"udevice","idx":6,"nvalue":0,"svalue":"' + str(Realtime_ACF) + '"}')
        client.publish("domoticz/in",'{"command":"udevice","idx":7,"nvalue":0,"svalue":"' + str(Inverter_C) + '"}')
        client.publish("domoticz/in",'{"command":"udevice","idx":8,"nvalue":0,"svalue":"' + str(Realtime_ACI) + '"}')
        client.publish("domoticz/in",'{"command":"udevice","idx":10,"nvalue":0,"svalue":"' + str(ThisMonthEnergy_KW) $
        client.publish("domoticz/in",'{"command":"udevice","idx":9,"nvalue":0,"svalue":"' + str(LastMonthEnergy_KW) +$
        client.disconnect()
        client.loop_stop()


except Exception as e:

        print(str(e));


En het Lua script voor naar PVOutput:

Lua:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
--script_time_wpb.lua

local PVoutputPostInterval = 5   -- The number of minutes between posts to PVoutput (normal is 5 but when in donation mode it's max 1)



commandArray = {}

if (timeofday['Daytime']) then

time = os.date("*t")

      
    if PVoutputPostInterval>1 then
        TimeToGo = PVoutputPostInterval - (time.min % PVoutputPostInterval)
        print('Time to go before upload Solis to PVoutput: ' ..TimeToGo.. " minutes")
    end
 
    if((time.min % PVoutputPostInterval)==0)then
        
    Opwek = otherdevices_svalues['Solis-Vandaag']
    now, total = Opwek:match("([^;]+);([^;]+)")
        print("Opwek=" ..now..' '..total)
        
    DCV = otherdevices_svalues['Solis-DC-Voltage']:match("([^;]+)")
    Temp = otherdevices_svalues['Solis-Temperatuur']:match("([^;]+)")
            print("DCV-Temp=" ..DCV..' '..Temp)
        
baseURL = "https://pvoutput.org/service/r2/addstatus.jsp?"
SID = "xxxxx"
API = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
PVO_URL = baseURL .. "sid=" .. SID .. "&key=" .. API .. "&d=" .. os.date("%Y%m%d") .. "&t=" .. os.date("%H:%M")
PVO_URL = PVO_URL .. "&v1=" .. total .. "&v2=" .. now .. "&v5=" .. Temp .. "&v6=" .. DCV .. "&c1=1"

commandArray['OpenURL'] = PVO_URL

end

end

if (timeofday['Nighttime']) then
    print('It is night. ')
end

return commandArray

[ Voor 93% gewijzigd door klump4u op 05-06-2022 18:45 ]

18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 7,6🔋


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@klump4u hoe kwam je aan de informatie die over de RS485 gestuurd wordt? Is daar een API document van de Solis van?

Acties:
  • 0 Henk 'm!

  • klump4u
  • Registratie: Februari 2008
  • Niet online

klump4u

Gasloos in Zuid-Limburg

ZuinigeRijder schreef op zondag 5 juni 2022 @ 21:24:
@klump4u hoe kwam je aan de informatie die over de RS485 gestuurd wordt? Is daar een API document van de Solis van?
Er zijn verschillende scriptjes in omloop en daar heb ik van alles uitgehaald met telkens proberen.
Hier staan wat nummers in van de omvormer.
https://gathering.tweaker...message/63646960#63646960

18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 7,6🔋


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Ik ben zelf wel tevreden over de combinatie van Wifi stick met SolisCloud App of site in de browser. Er staan best wel wat extra gegevens in SolisCloud, zoals realtime informatie van de omvormer. Waaronder temperatuur van de omvormer, DC én AC spanningen. Dat laatste weer handig om te zien of het net nog niet vol zit :+

Afbeeldingslocatie: https://tweakers.net/i/ZND2FHjNBepGon1HUy5Y9QJuyu4=/800x/filters:strip_exif()/f/image/EFGVPhr0N47zRuiclYdRvR7F.png?f=fotoalbum_large

Maar voor vergelijken van systemen is dan met PVOutput weer handig. Dus het beste van 2 werelden.

Via de browser kun je met de webhulpmiddelen de API calls goed zien. Bijvoorbeeld opvragen van de detail gegevens van een bepaalde dag:

code:
1
2
POST https://www.soliscloud.com:15555/chart/inverter/day/v2
{"id":"1308675217946412345","time":"2022-06-06","timeZone":1,"searchInfo":"pac","language":"8"}


Maar bij iedere call wordt de autorisatie opnieuw bepaald/meegestuurd:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
POST /chart/inverter/day/v2 HTTP/2
Host: www.soliscloud.com:15555
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0
Accept: application/json, text/plain, */*
Accept-Language: nl,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: application/json;charset=UTF-8
Content-MD5: EKFJLZKw//zjbbOmvc72Vw==
Authorization: WEB 2424:RSElUE7ApDUl5h86hz5khw3WzVE=
Time: Mon, 06 Jun 2022 06:40:50 GMT
language: 8
token: 1300386381676554750de31a9a9-a00f-418d-9b3f-5870bdcc2fa6
Device-Id: UB5V4hWLhoHL9Ep47WEFnw6sq1SgbtF6uYRsXZjjKKXfaOaTd969JlFBYqFTfglW
Version: 3.2
Content-Length: 95
Origin: https://www.soliscloud.com
DNT: 1
Connection: keep-alive
Referer: https://www.soliscloud.com/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
TE: trailers


Met name het volgende is het probleem:
code:
1
Authorization: WEB 2424:RSElUE7ApDUl5h86hz5khw3WzVE=


Volgens een gevonden API document wordt deze Authorization als volgt bepaald:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2.1. Authorization Field calculation method
Authorization = "API " + KeyId + ":" + Sign

Sign = base64(HmacSHA1(KeySecret,
VERB + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedResource))

KeyID Visitor ID. (Contact technical support to obtain)

KeySecret It means that the key required for signature must be kept strictly confidential to prevent
leakage. (Contact technical support to obtain)

VERBRepresents the method of the HTTP request, this protocol is POST.
\n Represents a line break

Content-MD5 Represents the MD5 value of the requested content data, calculates the MD5 value of the
message content (excluding the header) to obtain a 128-bit number, and then base64 encodes the number.
When the message content is empty, the string is empty.

Content-Type Indicates the type of request content, here is "application/json"

Date Indicates the time of this operation, and must be in GMT format, such as "Wed, 10 Jul 2019
13:16:22 GMT"

CanonicalizedResource Indicates the API interface you want to access, such as
"/v1/api/userStationList"

sign Represents digital signature, HmacSHA1 key encryption and base64 encoding


In hetzelfde API document wordt er een voorbeeld getoond. Bij HomeAssistent is er een python script, wat deze samenstelt, zie deze discussie.

Ik heb zelf een uitgekleed python script gemaakt, om het voorbeeld te gebruiken om de Authorization uit te rekenen, echter bij mij komt niet hetzelfde resultaat 8)7

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import hashlib
import hmac
import base64
from datetime import datetime
from datetime import timezone
import json
from typing import Any

VERB = "POST"
content_md5 = 'mBAcWORUK93FBOz6jsAuqw=='
content_type = "application/json"
date = 'Fri, 26 Jul 2019 06:00:46 GMT'
canonicalized_resource = '/v1/api/userStationList'

encrypt_str = (
    VERB + "\n"
    + content_md5 + "\n"
    + content_type + "\n"
    + date + "\n"
    + canonicalized_resource
)

keySecret = b'6680182547'

hmac_obj = hmac.new(
    keySecret,
    msg=encrypt_str.encode('utf-8'),
    digestmod=hashlib.sha1
)
sign = base64.b64encode(hmac_obj.digest())
authorization = "WEB 2424:" + sign.decode('utf-8')

print("WEB 2424:ForAqMkym0v7R94RSU0rRqpEkf0=")
print(authorization)


Helaas komt hier niet het verwachtte antwoord, maar een ander bij het uitvoeren:
WEB 2424:ForAqMkym0v7R94RSU0rRqpEkf0=
WEB 2424:uekAKExD1NPkS0f3imdl6NG9qug=
Dus al zou ik de keySecret van support krijgen, ben ik bang dat ik dan de authorization toch niet goed krijg. Of zou het voorbeeld in het API document fout zijn :?

Acties:
  • +1 Henk 'm!

  • klump4u
  • Registratie: Februari 2008
  • Niet online

klump4u

Gasloos in Zuid-Limburg

Tja via WiFi stick kan ik niet beoordelen hoe dat gaat, maar rechtstreeks van de omvormer krijg ik ook die extra data. Ik zie nu zelfs dat ik van alle drie de fases info kan opvragen.
Dit is wat ik log op PVOutput:https://pvoutput.org/intraday.jsp?id=103352&sid=90813

[ Voor 20% gewijzigd door klump4u op 06-06-2022 10:22 ]

18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 7,6🔋


Acties:
  • 0 Henk 'm!

  • Cranberry
  • Registratie: Juni 2004
  • Laatst online: 07-06 08:06
Recent heb ik ook een Solis-omvormer aangeschaft. Graag zou ik deze ook dmv RS485 uitlezen.
Nergens kan ik echter vinden welke connector ik moet aanschaffen.
Heeft iemand al een geschikte connector gevonden?
Als dat niet lukt, dan overweeg ik de wifi-stick uit elkaar te halen. Dat lijkt vrij eenvoudig te zijn

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@Cranberry ik heb er geen ervaring mee, maar dit kon ik vinden.
Blijkbaar heb je aan de omvormer kant een female GX16-4 stekker nodig.

Zie ook deze post, waarbij gerefereerd wordt naar Conrad:

SuperJoker in "Ginlong Solis omvormer uitlezen voor Domoticz"

Acties:
  • +1 Henk 'm!

  • klump4u
  • Registratie: Februari 2008
  • Niet online

klump4u

Gasloos in Zuid-Limburg

Cranberry schreef op dinsdag 14 juni 2022 @ 10:43:
Recent heb ik ook een Solis-omvormer aangeschaft. Graag zou ik deze ook dmv RS485 uitlezen.
Nergens kan ik echter vinden welke connector ik moet aanschaffen.
Heeft iemand al een geschikte connector gevonden?
Als dat niet lukt, dan overweeg ik de wifi-stick uit elkaar te halen. Dat lijkt vrij eenvoudig te zijn
2 van die krokodil klemmen op de staafjes die in de aansluiting uitsteken.

18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 7,6🔋


Acties:
  • 0 Henk 'm!

  • EJonk
  • Registratie: November 2006
  • Laatst online: 06-06 07:46
Cranberry schreef op dinsdag 14 juni 2022 @ 10:43:
Recent heb ik ook een Solis-omvormer aangeschaft. Graag zou ik deze ook dmv RS485 uitlezen.
Nergens kan ik echter vinden welke connector ik moet aanschaffen.
Heeft iemand al een geschikte connector gevonden?
Als dat niet lukt, dan overweeg ik de wifi-stick uit elkaar te halen. Dat lijkt vrij eenvoudig te zijn
Het is heel dichtbij de GX connector, maar het is er eentje van ExceedConn. Zijn naar mijn idee niet makkelijk te verkrijgen. Iemand op Ebay bied ze aan voor een iets meer dan een tientje: Dure connector.

Je kan ze op Ali krijgen voor minder dan een euro.. maar wel 50 tegelijk afnemen helaas.

You can't be happy all the time, they will come and break your legs!


Acties:
  • +2 Henk 'm!

  • merijntjuh
  • Registratie: Februari 2009
  • Laatst online: 06-06 17:29
Deze week heb ik contact gehad met de Solis support dienst.
Ik had ze de vraag voorgelegd hoe het zit met de authenticatie naar de API om de integratie met Home Assistant te gaan maken (met add-on) omdat ik tegen exact dit probleem aan liep: Waar haal je de benodigde gegevens vandaan?
Dit kreeg ik als reactie:
Momenteel is het vanwege een veiligheid issue niet mogelijk een API aan te vragen.

Ze werken in China hard om dit te herstellen.

De bedoeling is dat het in ons portaal geïmplementeerd wordt, zodat u de API dan zelf kan aanvragen.
Ofwel, god mag weten hoelang dit "veiligheid issue" gaat duren.
Maar als dit is opgelost zouden we het vanaf dan zelf moeten kunnen regelen.
Het enige wat ik niet weet is of dit via SolisCloud gaat kunnen of dat dit via deze website moet. Hiervoor had de persoon in kwestie, waar ik mail contact me heb gehad, een account voor me aangemaakt.

Vanzelfsprekend is dit niet de oplossing, maar dan weet je in ieder geval meer :)

Update: Ik kwam net dit tegen: https://solis-service.sol...es/44002212561-api-access
In de volgende patch kun je schijnbaar weer een API key genereren.
En dat bericht was van 6 Juli. Dus hopelijk binnen een weekje of iets dergelijks 8)

[ Voor 11% gewijzigd door merijntjuh op 06-07-2022 21:10 ]


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
merijntjuh schreef op woensdag 15 juni 2022 @ 22:59:

Update: Ik kwam net dit tegen: https://solis-service.sol...es/44002212561-api-access
In de volgende patch kun je schijnbaar weer een API key genereren.
En dat bericht was van 6 Juli. Dus hopelijk binnen een weekje of iets dergelijks 8)
Laten we hopen dat het binnenkort komt. Ik weet trouwens niet hoe ik de huidige versie van SolisCloud kan opvragen, maar blijkbaar moeten we wachten op 3.6.0 of later.

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Blijkbaar staat het Solis versienummer bij de basis instellingen.

Huidige versie: V3.6.0

Dus nu maar wachten op een nieuwer versie, waarbij de API key opvragen mogelijk is....

Afbeeldingslocatie: https://s3.amazonaws.com/cdn.freshdesk.com/data/helpdesk/attachments/production/2043357237369/original/Lmnw89P2EQBDXTAxljZoKb-l3LrA1mFnkg.png

Acties:
  • 0 Henk 'm!

  • merijntjuh
  • Registratie: Februari 2009
  • Laatst online: 06-06 17:29
Zojuist nog eens gekeken. Je kunt nu daadwerkelijk een api key opvragen!
Zie deze link: https://www.soliscloud.com/#/apiManage

Het enige wat voor mij niet helemaal duidelijk was is waar je de plant_id kan vinden. Maar deze staat gelukkig gewoon in de URL als je naar je op je "plant" klikt :)

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
merijntjuh schreef op dinsdag 19 juli 2022 @ 21:11:
Zojuist nog eens gekeken. Je kunt nu daadwerkelijk een api key opvragen!
Zie deze link: https://www.soliscloud.com/#/apiManage

Het enige wat voor mij niet helemaal duidelijk was is waar je de plant_id kan vinden. Maar deze staat gelukkig gewoon in de URL als je naar je op je "plant" klikt :)
Ik zag de API Manage optie er niet bij staan, ook niet na refresh van de pagina. Na het openen van bovenstaande link stond "API management" er wel ineens erbij 8)7

Na activeren van de API key, zit ik vast in het bekijken "View Key" van de API key en de bijbehorende "Security verificatie". Het puzzelstukje moet je op de juiste plaats schuiven, echter reageert deze niet op slepen, selectie, dubbelklikken, rechtsklik of iets anders. Wat doe ik verkeerd?

Geprobeerd in Firefox, Edge en Chrome.

P.S. er is blijkbaar ook een nieuwe versie 1.1.1 van het API document. Het voorbeeld in dit document werkt wel met mijn testscript.....zie deze post:

ZuinigeRijder in "Solis omvormer data naar PVOutput"

[ Voor 15% gewijzigd door ZuinigeRijder op 19-07-2022 22:03 ]


Acties:
  • +1 Henk 'm!

  • merijntjuh
  • Registratie: Februari 2009
  • Laatst online: 06-06 17:29
Goeie ja...
Dat puzzelstukje kan je als het goed is met de ietwat vage scrollbar direct onder het plaatje van links naar rechts schuiven.
Althans, dat werkte bij mij gewoon in Chrome.
Maar die verificatie werkt niet echt optimaal. Eerst gebeurde er bij mij niks, toen maar wat willekeurigs ingevuld in het invoerveld waar je normaal gesproken de code die je opgestuurd krijgt moet invullen en op iets van "verify" geklikt (die knop naast dat veld). Toen kreeg ik ineens direct een code per email opgestuurd die ik in dat zelfde veld in had gevuld. Dan op confirm.
Geen idee meer of ik dat puzzelstukje nou voor de bovenstaande stappen kreeg of daarna :9

Acties:
  • +1 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@merijntjuh tja, vage scrollbar. :X Gelukt :Y Nu maar eens stoeien met de API en Python skills aanleren, ken een heleboel andere programmeertalen en ook Perl.

Acties:
  • +2 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
De eerste stapjes in Python maar gemaakt, gebruik makend van het API document 1.1.1.
Het voorbeeld van UserStationsList in het API document is niet goed, aangezien er een Chinese foutmelding komt bij gebruik van de API onder mijn API key informatie :(
Dus maar een translatie module geïnstalleerd, zie ik de foutmelding tenminste O-)

P.S. API_ID en API_Secret in voorbeeld aanpassen :+
En de volgende modules moeten installeren: requests, pinyin, translate

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import hashlib
import hmac
import base64
from datetime import datetime
from datetime import timezone
import json
import requests
import pinyin
from translate import Translator
from http import HTTPStatus
from typing import Any

# API URL
API_URL = "https://www.soliscloud.com:13333"

# API_ID Visitor ID. (Contact technical support to obtain)
API_ID = "13003863816xxxxxxxx"

# API_Secret It means that the key required for signature must be kept strictly confidential to prevent leakage.
API_Secret = b'304abf2bd8a44242913d704bxxxxxxxx'

# canonicalized_resource Indicates the API interface you want to access, such as "/v1/api/userStationList"
canonicalized_resource = '/v1/api/userStationList'

# content_type Indicates the type of request content, here is "application/json"
content_type = "application/json"

# VERB represents the method of the HTTP request, this protocol is POST.
VERB = "POST"

DEBUG = False

translator= Translator(from_lang="zh", to_lang="en")

# content_md5
# Represents the MD5 value of the requested content data, calculates the
# MD5 value of the message content (excluding the header) to obtain a 128-bit number,
# and then base64 encodes the number. When the message content is empty, the string is empty.
body = '{"pageNo":1,"pageSize":10}'
content_md5 = base64.b64encode(
    hashlib.md5(body.encode('utf-8')).digest()
).decode('utf-8')

print("content_md5  : " + content_md5)

# date Indicates the time of this operation, and must be in GMT format, such as " Fri, 26 Jul 2019 06:00:46 GMT "
now = datetime.now(timezone.utc)
date = now.strftime("%a, %d %b %Y %H:%M:%S GMT")
print("date=" + date)

encrypt_str = (
    VERB + "\n"
    + content_md5 + "\n"
    + content_type + "\n"
    + date + "\n"
    + canonicalized_resource
)

hmac_obj = hmac.new(
    API_Secret,
    msg=encrypt_str.encode('utf-8'),
    digestmod=hashlib.sha1
)
sign = base64.b64encode(hmac_obj.digest())
authorization = "API " + API_ID + ":" + sign.decode('utf-8')

if DEBUG: print("authorization: " + authorization)

header: dict [str, str] = {
    "Content-MD5":content_md5,
    "Content-Type":content_type,
    "Date":date,
    "Authorization":authorization
}

response = requests.post(url=API_URL+canonicalized_resource, json=body, headers=header)
print("Status Code", response.status_code)
result = response.json();
print("JSON Response ", result)

if response.status_code == HTTPStatus.OK:
    print("content: " + response.text)
    msg = result["msg"];
    pinyinMsg = pinyin.get(msg, format="strip", delimiter=" ")
    print("msg: " + pinyin.get(msg, format="strip", delimiter=" "))
    print("Translation pinyin: " + translator.translate(pinyinMsg))
    print("Translation zh    : " + translator.translate(msg))
else: 
    print("Got http statuscode: %d" % (response.status))


Dit is de output van commando "python UserStationList.py"

code:
1
2
3
4
5
6
7
8
content_md5  : kxdxk7rbAsrzSIWgEwhH4w==
date=Fri, 22 Jul 2022 10:02:28 GMT
Status Code 200
JSON Response  {'success': True, 'code': 'I0000', 'msg': '必要参数为空', 'data': None}
content: {"success":true,"code":"I0000","msg":"必要参数为空","data":null}
msg: bi yao can shu wei kong
Translation pinyin: bi yao can shu wei kong
Translation zh    : Required parameter is empty

Acties:
  • +1 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Aha, "Required parameter is empty" fout gevonden. De requests.post was fout op regel 76 van de vorige post.

De volgende regel was fout:
code:
1
response = requests.post(url=API_URL+canonicalized_resource, json=body, headers=header)


Dit moet zijn:
code:
1
2
json_body = json.loads(body)
response = requests.post(url=API_URL+canonicalized_resource, json=json_body, headers=header)


Output nu:

code:
1
2
3
4
5
6
7
8
content_md5  : kxdxk7rbAsrzSIWgEwhH4w==
date=Fri, 22 Jul 2022 11:20:04 GMT
Status Code 200
JSON Response  {'success': True, 'code': '0', 'msg': 'success', 'data': {'stationStatusVo': {'all': 1, 'normal': 1, 'fault': 0, 'offline': 0, 'building': 0, 'mppt': 0}, 'page': {'records': [{'id': '12984919194xxxxxxxx', ....}}
content: {"success":true,"code":"0","msg":"success","data":{"stationStatusVo":{"all":1,"normal":1,"fault":0,"offline":0,"building":0,"mppt":0},"page":{"records":[{"id":"12984919194xxxxxxxx",.....}}
msg: s u c c e s s
Translation pinyin: s u c c e s s
Translation zh    : success

Acties:
  • +1 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Ik ben wat verder gegaan met het python script SolisCloud2PVOutput.py.

Het script gaat iedere 5 minuten de informatie ophalen van SolisCloud voor naar PVOutput te sturen, zodat dit bijvoorbeeld op een Raspberry Pi gedraaid kan worden (of een andere server). Het is nog niet af, maar dan krijg je een idee hoe je het moet aanpakken.

Even jouw SOLISCLOUD_* informatie invullen en dan zou het moeten werken O-)
Trouwens, je kunt ook DEBUG=True zetten, zie je meer informatie wat er allemaal terugkomt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
import hashlib
import hmac
import base64
import time
from datetime import datetime
from datetime import timezone
import json
import requests
from http import HTTPStatus
from typing import Any

#==============================================================================
# Constants please fill in yours 
SOLISCLOUD_API_ID = "1300386381612345678" # this is the userId in calls
SOLISCLOUD_API_SECRET = b'304abf2bd8a44242913d704b12345678' # for encryption
SOLISCLOUD_API_URL = "https://www.soliscloud.com:13333"
DEBUG=False

#==============================================================================
# Other constants

VERB = "POST"
CONTENT_TYPE = "application/json"
USER_STATION_LIST = '/v1/api/userStationList'
INVERTER_LIST = '/v1/api/inveterList'
INVERTER_DETAIL = '/v1/api/inveterDetail'

#==============================================================================
# log
# parameter 1: msg string
#===============================================================================
def log(msg):
    print(msg)

#==============================================================================
# logDebug
# parameter 1: msg string
#===============================================================================
def logDebug(msg):
    if DEBUG:
        log(msg)

#==============================================================================
# logJson
# parameter 1: jsonString
#===============================================================================
def logJson(jsonString):
    parsed = json.loads(jsonString)        
    log(json.dumps(parsed, indent=4))
        
#==============================================================================
# logDebugJson
# parameter 1: jsonString
#===============================================================================
def logDebugJson(jsonString):
    if DEBUG:        
        logJson(jsonString)

#==============================================================================
# solisCloudPost
# parameter 1: urlPart string
# parameter 2: data string
# return content string
#===============================================================================
def solisCloudPost(urlPart, data) -> str: 
    logDebug("url          : " + urlPart) 
    logDebug("data         : ")
    logDebugJson(data)

    while True:
        content_md5 = base64.b64encode(
            hashlib.md5(data.encode('utf-8')).digest()
        ).decode('utf-8')

        logDebug("content_md5  : " + content_md5)

        now = datetime.now(timezone.utc)
        date = now.strftime("%a, %d %b %Y %H:%M:%S GMT")
        logDebug('date/time    : ' + date)

        encrypt_str = (
            VERB + "\n"
            + content_md5 + "\n"
            + CONTENT_TYPE + "\n"
            + date + "\n"
            + urlPart
        )

        hmac_obj = hmac.new(
            SOLISCLOUD_API_SECRET,
            msg=encrypt_str.encode('utf-8'),
            digestmod=hashlib.sha1
        )
        sign = base64.b64encode(hmac_obj.digest())
        authorization = "API " + SOLISCLOUD_API_ID + ":" + sign.decode('utf-8')

        logDebug("authorization: " + authorization)

        header: dict [str, str] = {
            "Content-MD5":content_md5,
            "Content-Type":CONTENT_TYPE,
            "Date":date,
            "Authorization":authorization
        }

        dateNow = datetime.now().strftime("%a, %d %b %Y %H:%M:%S")
        try:
            response = requests.post(url=SOLISCLOUD_API_URL+urlPart, data=data, headers=header)    
            logDebug('date/time    : ' + dateNow) 
            logDebug("Status Code  : " + str(response.status_code))

            if response.status_code == HTTPStatus.OK:
                logDebug("content:")
                content = response.text
                logDebugJson(content)
                return content # exit loop and function
            else:                
                log('ERROR STATUS date/time    : ' + dateNow) 
                log("ERROR STATUS url          : " + urlPart) 
                log("ERROR STATUS Status Code: %d" % (response.status))
                logJson(content)
                time.sleep(60) # retry after 1 minute
        except requests.exceptions.RequestException as e:
            log('EXCEPTION date/time        : ' + dateNow) 
            log("EXCEPTION url              : " + urlPart) 
            log('EXCEPTION RequestsException: ' + str(e))
            time.sleep(60) # retry after 1 minute
    
    
#==============================================================================
# MAIN

logDebug('---> userId ' + SOLISCLOUD_API_ID + ' <---')

body = '{"userid":"'+ SOLISCLOUD_API_ID + '"}'
content = solisCloudPost(USER_STATION_LIST, body)
stationInfo = json.loads(content)["data"]['page']['records'][0]
stationId = stationInfo["id"]
logDebug('---> stationId ' + stationId + ' <---')

body = '{"stationId":"'+ stationId + '"}'
content = solisCloudPost(INVERTER_LIST, body)
inverterInfo = json.loads(content)["data"]['page']['records'][0]
inverterId = inverterInfo["id"]
inverterSn = inverterInfo["sn"]
dataloggerSn = inverterInfo["collectorSn"]
dataloggerId = inverterInfo["collectorId"]

logDebug('---> inverterId ' + inverterId + ' <---')
logDebug('---> inverterSn ' + inverterSn + ' <---')
logDebug('---> dataloggerSn ' + dataloggerSn + ' <---')
logDebug('---> dataloggerId ' + dataloggerId + ' <---')

body = '{"id":"'+ inverterId + '","sn":"' + inverterSn + '"}'

while True:
    content = solisCloudPost(INVERTER_DETAIL, body)
    inverterDetail = json.loads(content)["data"]
    inverterTemp = inverterDetail["inverterTemperature"]
    timeStr = inverterDetail["timeStr"]
    acVoltage = inverterDetail["uAc1"]
    dcPV = inverterDetail["uPv1"] + inverterDetail["uPv2"] + inverterDetail["uPv3"] + inverterDetail["uPv4"]
    wattCurrent = round(inverterDetail["pac"] * 1000)
    wattToday = round(inverterDetail["eToday"] * 1000)

    logDebug('---> timeStr ' + timeStr + ' <---')
    logDebug('---> inverterTemp ' + str(inverterTemp) + ' <---')
    logDebug('---> acVoltage ' + str(acVoltage) + ' <---')
    logDebug('---> dcPV ' + str(dcPV) + ' <---')
    logDebug('---> wattCurrent ' + str(wattCurrent) + ' <---')
    logDebug('---> wattToday ' + str(wattToday) + ' <---')

    pvoutputString = \
        timeStr[0:4] + timeStr[5:7] + timeStr[8:10] \
        + ',' + timeStr[11:16] \
        + ',' + str(wattToday) \
        + ',' + str(wattCurrent) \
        + ',-1' \
        + ',-1' \
        + ',,' \
        + str(dcPV)

    log(pvoutputString)
    time.sleep(300) # wait 5 minutes


Output voor PVOutput Add Status Service na 3x informatie ophalen (Output Date,Time,Energy Generation,Power Generation,Energy Consumption,Power Consumption,Temperature,Voltage):

code:
1
2
3
20220724,10:07,2400,1400,-1,-1,,153.6
20220724,10:12,2600,1420,-1,-1,,161.7
20220724,10:17,2700,1440,-1,-1,,153.6


Deze informatie moet nog naar PVOutput gestuurd worden. Aangezien de opbrengst van vandaag in stappen van 100 Watt gaat, moet daar nog een lopende schatting aan toegevoegd worden aan de hand van huidige Power Generation. Dat had ik ook al eens toegevoegd voor uploaden van csv van de SolisCloud naar PVOutput.

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Heb nu ook een hogere resolutie totalWatt toegevoegd, debug statements verwijderd en oneindige loop om data op te halen van SolisCloud en te sturen naar PVoutput. Alleen tussen 5 uur en 23 uur wordt er data opgehaald en gestuurd.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#===============================================================================
# SolisCloud2PVOutput.py
# Author: Zuinige Rijder
import hashlib
import hmac
import base64
import time
from datetime import datetime
from datetime import timezone
import json
import requests
from http import HTTPStatus
from typing import Any

#==============================================================================
# Secrets, fill in yours 
SOLISCLOUD_API_ID = 'xxxx'
SOLISCLOUD_API_SECRET = b'xxxx'
SOLISCLOUD_API_URL = 'https://www.soliscloud.com:13333'

PVOUTPUT_API_KEY = 'xxxx'
PVOUTPUT_SYSTEM_ID = 'xxxx'

#==============================================================================
# Other constants
VERB = "POST"
CONTENT_TYPE = "application/json"
USER_STATION_LIST = '/v1/api/userStationList'
INVERTER_LIST = '/v1/api/inveterList'
INVERTER_DETAIL = '/v1/api/inveterDetail'

PVOUTPUT_ADD_BATCH_STATUS_URL='http://pvoutput.org/service/r2/addbatchstatus.jsp'

#==============================================================================
# log
def log(msg):
    dateNow = datetime.now().strftime("%Y%m%d %H:%M:%S")
    print(dateNow + ': '+ msg)

#==============================================================================
# logJson
def logJson(jsonString):
    parsed = json.loads(jsonString)        
    log(json.dumps(parsed, indent=4))
        
#==============================================================================
# solisCloudPost
def solisCloudPost(urlPart, data) -> str: 
    while True:
        content_md5 = base64.b64encode(
            hashlib.md5(data.encode('utf-8')).digest()
        ).decode('utf-8')
        date = datetime.now(timezone.utc).strftime("%a, %d %b %Y %H:%M:%S GMT")
        encrypt_str = (VERB+"\n"+content_md5+"\n"+CONTENT_TYPE+"\n"+date+"\n"+urlPart)
        hmac_obj = hmac.new(SOLISCLOUD_API_SECRET, msg=encrypt_str.encode('utf-8'), digestmod=hashlib.sha1)
        sign = base64.b64encode(hmac_obj.digest())
        authorization = 'API ' + SOLISCLOUD_API_ID + ':' + sign.decode('utf-8')
        header: dict [str, str] = {'Content-MD5':content_md5, 'Content-Type':CONTENT_TYPE, 'Date':date, 'Authorization':authorization}
        try:
            response = requests.post(url=SOLISCLOUD_API_URL+urlPart, data=data, headers=header)    
            if response.status_code == HTTPStatus.OK:
                content = response.text
                return content # exit loop and function
            else:                
                log('SolisCloud ERROR STATUS url: ' + urlPart) 
                log('SolisCloud Status Code     : ' + str(response.status_code))
                log('SolisCloud content         : ' + response.text)
        except requests.exceptions.RequestException as e:
            log('SolisCloud EXCEPTION url       : ' + urlPart) 
            log('SolisCloud EXCEPTION           : ' + str(e))

        time.sleep(60) # retry after 1 minute

#==============================================================================
# pvoutputPost
def pvoutputPost(dt, totalWattHour, watt, dcPV): 
    pvoutputString = 'data='+dt.strftime("%Y%m%d")+','+dt.strftime("%H:%M")+','+str(totalWattHour)+','+str(watt)+',-1,-1,,'+str(dcPV)
    log(pvoutputString)
    header: dict [str, str] = {'X-Pvoutput-Apikey': PVOUTPUT_API_KEY, 'X-Pvoutput-SystemId': PVOUTPUT_SYSTEM_ID, 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'}
    while True:
        try:
            response = requests.post(url=PVOUTPUT_ADD_BATCH_STATUS_URL, data=pvoutputString, headers=header)
            if response.status_code == HTTPStatus.OK:
                return # exit loop and function
            else:                
                log('SolisCloud Status Code: ' + str(response.status_code))
                log('PVOUTPUT content      : ' + response.text)
        except requests.exceptions.RequestException as e:
            log('PVOUTPUT EXCEPTION: ' + str(e))
            
        time.sleep(60) # retry after 1 minute

#==============================================================================
# MAIN
body = '{"userid":"' + SOLISCLOUD_API_ID + '"}'
content = solisCloudPost(USER_STATION_LIST, body)
stationInfo = json.loads(content)['data']['page']['records'][0]
stationId = stationInfo['id']

body = '{"stationId":"'+ stationId + '"}'
content = solisCloudPost(INVERTER_LIST, body)
inverterInfo = json.loads(content)['data']['page']['records'][0]
inverterId = inverterInfo['id']
inverterSn = inverterInfo['sn']

body = '{"id":"'+ inverterId + '","sn":"' + inverterSn + '"}'
prevDataTimestamp = '0'
prevWatt = 0
hiResTotalWattHour = 0
while True:
    dateNow = datetime.now()
    if dateNow.hour < 5 or dateNow.hour > 22: # only check between 5 and 23 hour
        log('Outside solar generation hours (5..23)')
        time.sleep(round((60-dateNow.minute)*60)) # wait till next hour
        prevDataTimestamp = '0'
        continue # start loop over again

    content = solisCloudPost(INVERTER_DETAIL, body)
    inverterDetail = json.loads(content)['data']
    dataTimestamp = inverterDetail['dataTimestamp']
    acVoltage = inverterDetail['uAc1']
    dcPV = inverterDetail['uPv1'] + inverterDetail['uPv2'] + inverterDetail['uPv3'] + inverterDetail['uPv4']
    watt = round(inverterDetail['pac'] * 1000)
    totalWattHour = round(inverterDetail['eToday'] * 1000)

    if prevDataTimestamp == '0':
        hiResTotalWattHour = totalWattHour
        prevWatt = 0
  
    if dataTimestamp != prevDataTimestamp: 
        dt = datetime.fromtimestamp(int(dataTimestamp)/1000) # compute local time, soliscloud did not take care of leap year
        if prevDataTimestamp != '0': # check for multiple of 5 minutes
            elapsedMinutes = round((int(dataTimestamp) - int(prevDataTimestamp)) / 60000) # round to nearest 5 minutes
            hiResTotalWattHour += int(prevWatt/(60/elapsedMinutes)) # compute hiResTotalWattHour with previous watts (assuming same solar radiation) over elapsed minutes
            if hiResTotalWattHour < totalWattHour:
                hiResTotalWattHour = totalWattHour # hiResTotalWattHour was too low
            else: 
                if totalWattHour + 100 < hiResTotalWattHour: 
                    hiResTotalWattHour = totalWattHour + 99 # hiResTotalWattHour was too high
            
        pvoutputPost(dt, hiResTotalWattHour, watt, dcPV)
        prevDataTimestamp = dataTimestamp
        prevWatt = watt

    time.sleep(60) # wait 1 minute before checking again, although SolisCloud is only updated once per 5 minutes


Naar standaard output wordt de pvoutput data geschreven met de tijd van loggen ervoor. En eventueel foutmeldingen. Voorbeeld van 4 regels output:
code:
1
2
3
4
20220725 16:06:39: data=20220725,16:06,5000,1460,-1,-1,,164.5
20220725 16:11:43: data=20220725,16:11,5121,400,-1,-1,,162.0
20220725 16:16:46: data=20220725,16:16,5154,530,-1,-1,,165.8
20220725 16:21:50: data=20220725,16:21,5200,430,-1,-1,,165.6


Ik heb nog een oude Raspberry pi draaien met Weezy OS, welke ik gebruik om via SMAspot de SMA omvormer output om de 5 minuten via bluetooth naar PVOutput te sturen. Hier wilde ik bovenstaande script ook op laten draaien (inclusief herstart wanneer gecrashed). De python requests module benodigd Python 3.7. Echter het OS is te oud om bijvoorbeeld Python 3.7 op te draaien (nu staat Python 3.2-3.6 erop). Zelfs "sudo apt-get update" werkt niet meer, omdat Weezy niet meer ondersteund wordt.

Dat wordt nadenken of ik de Raspberry pi moet upgraden naar laatste OS en hopen dat SMAspot daar nog op draait. Backup maken van SD kaart en dan of een upgrade doen of helemaal vanaf scratch beginnen :'(
Moet ik weer even terugdenken wat ik allemaal gedaan heb in 2012 >:)

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Aangezien ik mijn Raspberry pi Wheezy niet wil upgraden (veel werk en mogelijk werkt mijn oude SMASpot niet meer), heb ik de afhankelijkheid van module requests eruit geschreven. Het script runt nu ook op mijn Raspberry Pi Wheezy met Python 3.2.3 versie O-)

Hier de aangepaste versie:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#== SolisCloud2PVOutput.py Author: Zuinige Rijder 20220726 ====================
import base64
import hashlib
import hmac
import json
import time
from datetime import datetime, timezone
from urllib.error import HTTPError, URLError
from urllib.request import urlopen, Request

#== Secrets, fill in yours ====================================================
SOLISCLOUD_API_ID = 'xxxx'
SOLISCLOUD_API_SECRET = b'xxxx'
SOLISCLOUD_API_URL = 'https://www.soliscloud.com:13333'
PVOUTPUT_API_KEY = 'xxxx'
PVOUTPUT_SYSTEM_ID = 'xxxx'

#== Constants =================================================================
VERB = "POST"
CONTENT_TYPE = "application/json"
USER_STATION_LIST = '/v1/api/userStationList'
INVERTER_LIST = '/v1/api/inveterList'
INVERTER_DETAIL = '/v1/api/inveterDetail'
PVOUTPUT_ADD_BATCH_STATUS_URL = 'http://pvoutput.org/service/r2/addbatchstatus.jsp'

#== log ======================================================================= 
def log(msg):
    print(datetime.now().strftime("%Y%m%d %H:%M:%S") + ': ' + msg)

#== post ======================================================================
def post(url, data, header) -> str: 
    post_data = data.encode("utf-8")
    request = Request(url, data=post_data, headers=header)
    errorstring = ''
    try:
        with urlopen(request, timeout=10) as response:
            body = response.read()
            content = body.decode("utf-8")
            return content
    except HTTPError as error:
        errorstring = str(error.status) + ': ' + error.reason
    except URLError as error:
        errorstring = str(error.reason)
    except TimeoutError:
         errorstring = 'Request timed out'

    log('ERROR: ' + url + ' -> ' + errorstring)
    time.sleep(60) # retry after 1 minute
    return 'ERROR'

#== solisCloudPost ============================================================
def solisCloudPost(urlPart, data) -> str: 
    content_md5 = base64.b64encode(hashlib.md5(data.encode('utf-8')).digest()).decode('utf-8')
    while True:
        date = datetime.now(timezone.utc).strftime("%a, %d %b %Y %H:%M:%S GMT")
        encrypt_str = (VERB+"\n"+content_md5+"\n"+CONTENT_TYPE+"\n"+date+"\n"+urlPart)
        hmac_obj = hmac.new(SOLISCLOUD_API_SECRET, msg=encrypt_str.encode('utf-8'), digestmod=hashlib.sha1)
        authorization = 'API ' + SOLISCLOUD_API_ID + ':' + base64.b64encode(hmac_obj.digest()).decode('utf-8')
        header = {'Content-MD5':content_md5, 'Content-Type':CONTENT_TYPE, 'Date':date, 'Authorization':authorization}
        content = post(SOLISCLOUD_API_URL+urlPart, data, header) 
        if content != 'ERROR':
            return content

#== pvoutputPost ==============================================================
def pvoutputPost(dt, totalWattHour, watt, dcPV) -> str:
    pvoutputString = 'data='+dt.strftime("%Y%m%d")+','+dt.strftime("%H:%M")+','+str(totalWattHour)+','+str(watt)+',-1,-1,,'+str(dcPV)
    log(pvoutputString)
    header = {'X-Pvoutput-Apikey': PVOUTPUT_API_KEY, 'X-Pvoutput-SystemId': PVOUTPUT_SYSTEM_ID, 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'}
    while True:
        content = post(PVOUTPUT_ADD_BATCH_STATUS_URL, pvoutputString, header)
        if content != 'ERROR':
            return content 

#== MAIN ======================================================================
body = '{"userid":"' + SOLISCLOUD_API_ID + '"}'
content = solisCloudPost(USER_STATION_LIST, body)
stationInfo = json.loads(content)['data']['page']['records'][0]
stationId = stationInfo['id']

body = '{"stationId":"'+ stationId + '"}'
content = solisCloudPost(INVERTER_LIST, body)
inverterInfo = json.loads(content)['data']['page']['records'][0]
inverterId = inverterInfo['id']
inverterSn = inverterInfo['sn']

body = '{"id":"'+ inverterId + '","sn":"' + inverterSn + '"}'
prevDataTimestamp = '0'
prevWatt = 0
hiResTotalWattHour = 0
while True:
    dateNow = datetime.now()
    if dateNow.hour < 5 or dateNow.hour > 22: # only check between 5 and 23 hour
        log('Outside solar generation hours (5..23)')
        time.sleep(round((60-dateNow.minute)*60)) # wait till next hour
        prevDataTimestamp = '0'
        continue # start loop over again

    content = solisCloudPost(INVERTER_DETAIL, body)
    inverterDetail = json.loads(content)['data']
    dataTimestamp = inverterDetail['dataTimestamp']
    acVoltage = inverterDetail['uAc1']
    dcPV = inverterDetail['uPv1'] + inverterDetail['uPv2'] + inverterDetail['uPv3'] + inverterDetail['uPv4']
    watt = round(inverterDetail['pac'] * 1000)
    totalWattHour = round(inverterDetail['eToday'] * 1000)

    if prevDataTimestamp == '0':
        hiResTotalWattHour = totalWattHour
        prevWatt = 0
  
    if dataTimestamp != prevDataTimestamp: 
        dt = datetime.fromtimestamp(int(dataTimestamp)/1000) # compute local time, soliscloud did not take care of leap year
        if prevDataTimestamp != '0': # check for multiple of 5 minutes
            elapsedMinutes = round((int(dataTimestamp) - int(prevDataTimestamp)) / 60000) # round to nearest 5 minutes
            hiResTotalWattHour += int(prevWatt/(60/elapsedMinutes)) # compute hiResTotalWattHour with previous watts (assuming same solar radiation) over elapsed minutes
            if hiResTotalWattHour < totalWattHour:
                hiResTotalWattHour = totalWattHour # hiResTotalWattHour was too low
            else: 
                if totalWattHour + 100 < hiResTotalWattHour: 
                    hiResTotalWattHour = totalWattHour + 99 # hiResTotalWattHour was too high
            
        pvoutputPost(dt, hiResTotalWattHour, watt, dcPV)
        prevDataTimestamp = dataTimestamp
        prevWatt = watt

    time.sleep(60) # wait 1 minute before checking again


Wat ik wel zag is dat SolisCloud soms achterloopt (druk op server?), dus zou zo maar kunnen dat ik daardoor gebufferde data mis die later is verzonden door de Solis omvormer met Wifi stick. Want uiteindelijk lijkt de data wel (vertraagd) aan te komen van mijn Solis omvormer.

[ Voor 3% gewijzigd door ZuinigeRijder op 26-07-2022 13:56 ]


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Ik heb de code gepubliceerd op github en het script draait nu al 2 dagen op mijn Raspberry pi Wheezy. Let op, ik heb het script SolisCloud2PVOutput nog een heel klein beetje aangepast t.o.v. vorige post. Dus laatste versie staat op github.

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Helaas is mijn Raspberry pi SDCard stuk geraakt (schrijf fouten), maar ja, die was ook al 10 jaar oud. Dus heb nu maar op een nieuwe 16 GB SDCard (voor 1 euro 50 bij de blokker :Y ) de laatse Raspberry pi versie (Raspbian GNU/Linux 11 (bullseye)) gezet en daar SBFSpot geconfigureerd (voor mijn SMA omvormer) en het script SolisCloud2PVOutput.

Het script stopt nu wanneer niet binnen 5 en 23 uur en via crontab start deze om 5:02 en na reboot. Nieuwe versie staat op github.

[ Voor 4% gewijzigd door ZuinigeRijder op 29-07-2022 13:43 ]


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Ik had graag live een gecombineerd PVOutput systeem van mijn 2 aparte systemen:
- live data SMA omvormer naar PVOutput Zuinig Rijder dak 4900 Wp
- live data Solis omvormer naar PVOutput Zuinige Rijder dubbele carport 2000 Wp

Nu heb ik een python script CombinePVOutputSystems.py gemaakt, welke live de 2 systemen doet monitoren en de gecombineerde data naar een ander systeem stuurt:
- live data gecombineerd Zuinige Rijder dak+carport 6900 Wp

Je hebt dan 3 accounts nodig O-) Ik weet ook dat PVOutput donateurs extra functionaliteit krijgen, waarbij ook de mogelijkheid om meerdere systemen te combineren. Maar voor mij is dit simpele combineren goed genoeg en gratis.

[ Voor 3% gewijzigd door ZuinigeRijder op 31-07-2022 13:02 ]


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Vandaag komt er ineens geen goede data meer terug met de SolisCloud API 8)7
Zie dit issue:
SolisCloud API no longer returns the inverter list.

Traceback (most recent call last):
File "C:\Users\Rick\git\Python\soliscloud_to_pvoutput.py", line 206, in
main_loop()
File "C:\Users\Rick\git\Python\soliscloud_to_pvoutput.py", line 147, in main_loop
inverter_detail_body = get_inverter_list_body()
File "C:\Users\Rick\git\Python\soliscloud_to_pvoutput.py", line 131, in get_inverter_list_body
station_info = json.loads(content)['data']['page']['records'][0]
IndexError: list index out of range

If I look what is now returned for my inverter, this is much different than it was before (I checked also with older code, does no longer work). This is now returned for the call https://www.soliscloud.com:13333/v1/api/userStationList
{
"success": true,
"code": "0",
"msg": "success",
"data": {
"stationStatusVo": {
"all": 1,
"normal": 1,
"fault": 0,
"offline": 0,
"building": 0,
"mppt": 0
},
"page": {
"records": [],
"total": 0,
"size": 10,
"current": 1,
"orders": [],
"optimizeCountSql": true,
"searchCount": true,
"pages": 0
},
"mpptSwitch": 1
}
}
Iemand anders nog problemen met de API? Of werkt het wel?

Ik zie wel dat de SolisCloud versie nu V3.6.2 is, voorheen was dit V3.6.0. Zouden ze software hebben geupdate, zodat de SolisCloud API niet meer werkt :(

Acties:
  • 0 Henk 'm!

  • klump4u
  • Registratie: Februari 2008
  • Niet online

klump4u

Gasloos in Zuid-Limburg

ZuinigeRijder schreef op zaterdag 6 augustus 2022 @ 21:30:
Vandaag komt er ineens geen goede data meer terug met de SolisCloud API 8)7
Zie dit issue:


[...]


Iemand anders nog problemen met de API? Of werkt het wel?

Ik zie wel dat de SolisCloud versie nu V3.6.2 is, voorheen was dit V3.6.0. Zouden ze software hebben geupdate, zodat de SolisCloud API niet meer werkt :(
Daarom lees ik de Solis rechtstreeks met de pi uit, geen gezeik met updates of niet werkende Chinese servers e.d.
Ik hoop dat het van korte duur is.
Ik doneer wel aan PVOutput en vind de extra’s wel de centen waard.

18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 7,6🔋


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
ZuinigeRijder schreef op zaterdag 6 augustus 2022 @ 21:30:
Vandaag komt er ineens geen goede data meer terug met de SolisCloud API 8)7
Zie dit issue:


[...]


Iemand anders nog problemen met de API? Of werkt het wel?

Ik zie wel dat de SolisCloud versie nu V3.6.2 is, voorheen was dit V3.6.0. Zouden ze software hebben geupdate, zodat de SolisCloud API niet meer werkt :(
Vandaag is het probleem opgelost, zonder dat ik zelf wat aangepast heb. 2 dagen heeft het niet gewerkt. Blijkbaar hebben ze iets gefixed na het weekend bij SolisCloud, want gisteravond werkte het nog niet.

Acties:
  • 0 Henk 'm!

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 23:24
Ik heb zelf tijdens onderhouds momenten van Ginlong = Solis geen problemen met het uitlezen van data vanuit de cloud omgeving.
Zou het zelf liever direct uit de omvormer halen maar nog geen echte energie ingestoken om te kijken of dat voor mij mogelijk is.
De data die ik uitlees push ik vervolgens ook naar pvoutput en naar influxdb.

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
SolisCloud heeft nu ook zomer/wintertijd setting, zodat via website of App de juiste tijd weergegeven wordt.....
bij "Basisinstellingen" kun je nu de optie "Daylight Saving Time" aan/uitzetten. Ik denk dat dit toegevoegd is in versie 3.6.2.

In de website worden echter de data van vandaag nog met de verkeerde tijd aangegeven (de omvormer begint 1 uur vroeger). Misschien dat het morgen goed is 8)7

De update van de Android App meldt de toevoeging van zomer/wintertijd setting ook. De Android App versie is ook 3.6.2. Ook daar wordt het (nog) niet goed weergegeven |:(

Acties:
  • 0 Henk 'm!

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 23:24
Ik gebruik Solis Home 1.3.4 en nooit problemen met DST. (ook Android)

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


Acties:
  • 0 Henk 'm!

  • BenPi
  • Registratie: Februari 2013
  • Laatst online: 23-09-2024
Hoi ZuinigeRijder, top dat je een oplossing hebt gevonden om de data vanaf de SolisCloud te halen.
Zelf heb ik jouw script aan het draaien, dus er komt weer data binnen, weliswaar ik gebruik Domoticz (nog wel).
Echter ik heb twee omvormers, kan ik die beiden in 1 script uitlezen?. Helaas zijn mijn skills van python minimaal.
Kun jij mij op weg helpen?

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@BenPi waarschijnlijk is het gemakkelijker en beter inzichtelijk om twee scripts te laten lopen, ieder met hun eigen API SECRETS, voor iedere omvormer 1. En daarnaast het Python script CombinePVOutputSystems om een gecombineerd PVOutput systeem te hebben. Moet je wel 3 PVOutput accounts aanmaken O-)

Hierdoor kun je de individuele omvormers/zonnepanelen vergelijken, maar ook de combinatie :P

Zie ook deze post:

ZuinigeRijder in "Solis omvormer data naar PVOutput"

[ Voor 11% gewijzigd door ZuinigeRijder op 13-08-2022 10:02 ]


Acties:
  • +1 Henk 'm!

  • BenPi
  • Registratie: Februari 2013
  • Laatst online: 23-09-2024
Bedankt voor de reactie. Nu draait er ook twee scrips naast elkaar. Maar het was vrij simpel om de andere uit te lezen:
Extra info;
Als ik in deze regel:
" stationInfo = json.loads(content)["data"]['page']['records'][0] "

bij records de 0 een 1 maak, dan kan ik direkt de andere omvormer uitlezen.

[ Voor 25% gewijzigd door BenPi op 13-08-2022 11:09 ]


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@BenPi Ah, natuurlijk, je hebt beide Solis omvormers in hetzelfde SolisCloud account zitten. Ja, hiermee haal je het tweede station op. Ik weet niet of de volgorde altijd hetzelfde is die je terugkrijgt.

Je kunt natuurlijk de Inverter_id en inverter_sn éénmaal uitzoeken en dan "hard"coderen in het script (duplicatie van script), zijn die 2 andere aanroepen niet meer nodig.

code:
1
2
3
4
    inverter_id = '1308675217123456789'
    inverter_sn = '1001020123456789'

    body = '{"id":"' + inverter_id + '","sn":"' + inverter_sn + '"}'


En je moet dan 2 configuratie files hebben (2 PVOutput accounts)

code:
1
    parser.read('soliscloud_to_pvoutput.cfg')

[ Voor 27% gewijzigd door ZuinigeRijder op 13-08-2022 11:31 ]


Acties:
  • 0 Henk 'm!

  • BenPi
  • Registratie: Februari 2013
  • Laatst online: 23-09-2024
Zoiets dacht ik ook. Maar omdat in python te combineren gaat me qua skills iets te ver. Heb je misschien een voorzetje ?

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Maak 2 versies en wijzig de cfg files om naar 2 verschillende PVOutput accounts te wijzen:

soliscloud_to_pvoutput1.cfg
soliscloud_to_pvoutput1.py

soliscloud_to_pvoutput2.cfg
soliscloud_to_pvoutput2.py

en verander/comment de regels:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# == get_inverter_list_body ==================================================
def get_inverter_list_body() -> str:
    """get inverter list body"""
    # body = '{"userid":"' + SOLISCLOUD_API_ID + '"}'
    # content = get_solis_cloud_data(USER_STATION_LIST, body)
    # station_info = json.loads(content)['data']['page']['records'][0]
    # station_id = station_info['id']

    # body = '{"stationId":"' + station_id + '"}'
    # content = get_solis_cloud_data(INVERTER_LIST, body)
    # inverter_info = json.loads(content)['data']['page']['records'][0]

    inverter_id = '1308675217123456789'
    inverter_sn = '1001020123456789'

    body = '{"id":"' + inverter_id + '","sn":"' + inverter_sn + '"}'
    log('body: ' + body)
    return body


en verander de verwijzing naar de cfg naam

code:
1
    parser.read('soliscloud_to_pvoutput1.cfg')


en

code:
1
    parser.read('soliscloud_to_pvoutput2.cfg')


Dus geen combineer script, maar gewoon uploaden naar 2 verschillende PVOutput accounts

[ Voor 6% gewijzigd door ZuinigeRijder op 13-08-2022 11:48 ]


Acties:
  • 0 Henk 'm!

  • BenPi
  • Registratie: Februari 2013
  • Laatst online: 23-09-2024
Ok. Ik ga ermee bezig.
Update:
Draait inmiddels. Ik heb 2 x het inlog/dataophaal script lopen 1x Oostpaneel + 1x Westpaneel.
De 2 x data gaat naar een txt file.
Die file wordt door een derde script gelezen en bewerkt en stuurt dan de data voor Domoticz en mijn Toon thermostaat. PVOutput komt misschien nog.
Nu nog finetunen.

[ Voor 87% gewijzigd door BenPi op 15-08-2022 16:41 ]


Acties:
  • 0 Henk 'm!

  • TheChris
  • Registratie: Juli 2005
  • Laatst online: 21-04-2024
Is het mogelijk om deze code te gebruiken in Domoticz? Met Python Version: 3.9.2.

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@TheChris dit script is compatible met Python 3.9 zover ik weet.

Acties:
  • 0 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
Mooi script @ZuinigeRijder , heb de boel vrij simpel draaiend gekregen en voorlopig prima. Uiteindelijk wil ik ook afhankelijk van Soliscloud mn data kunnen hebben.
Maar ja, waar ik van baal is dat ik voor mezelf als projectje had verzonnen om de WiFi-stick lokaal te benaderen, maar de lokale login werkt na een paar uur niet meer met t standaard admin-ww dus de gegevens lokaal uitlezen is dan een no-go.

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@Oogje je kunt ook eens hier kijken.....
Oogje schreef op dinsdag 30 augustus 2022 @ 14:28:
heb de boel vrij simpel draaiend gekregen en voorlopig prima.
Heb je nog iets moeten aanpassen aan het python script?

[ Voor 45% gewijzigd door ZuinigeRijder op 30-08-2022 16:46 ]


Acties:
  • 0 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
ZuinigeRijder schreef op dinsdag 30 augustus 2022 @ 16:45:
@Oogje je kunt ook eens hier kijken.....


[...]


Heb je nog iets moeten aanpassen aan het python script?
Nope behalve dan dat ik vanuit de cronjob python3 gebruik ipv python (Dat is op mijn PI nog python2).
Ik zie wel t voltage in pvoutput op 600v staan...moet ik nog ff induiken.

Die hardware oplossing is cool, maar ik ben meer van de software. Ik zag ook al een oplossing van iemand die een 2e server kon aangeven in de wifi-stick. (ik zie wel een remote A en B, maar kan t nergens instellen).
En die 2e server is dan lokaal en ontvangt de data.
Misschien maar eens een mailtje aan wagen richting Solis :)

[ Voor 4% gewijzigd door Oogje op 30-08-2022 19:46 ]

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@Oogje ik heb de 'nieuwste' Solis datalogging stick WIFI + Antenne (artikelnummer fabrikant SOLIS-DLS-W-A (1.4-U)). Zover ik begrepen heb, kun je hiermee niet op inloggen op de omvormer (na instellen Wifi). Ik zie ook mijn omvormer niet om naartoe te connecten. Dus instellen helemaal niet. Hoe heb jij dat dan (tijdelijk) voor elkaar gekregen?

Acties:
  • 0 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
ZuinigeRijder schreef op dinsdag 30 augustus 2022 @ 20:01:
@Oogje ik heb de 'nieuwste' Solis datalogging stick WIFI + Antenne (artikelnummer fabrikant SOLIS-DLS-W-A (1.4-U)). Zover ik begrepen heb, kun je hiermee niet op inloggen op de omvormer (na instellen Wifi). Ik zie ook mijn omvormer niet om naartoe te connecten. Dus instellen helemaal niet. Hoe heb jij dat dan (tijdelijk) voor elkaar gekregen?
Ik zat ook niet op de omvormer, maar ik kon connecten op het ip van de wifi-stick en dan krijg je een mooie webpagina te zien met oa de info die je nodig hebt. En op http://ip/status.html zonder de opmaak.
Was een javascript pagina, dus ik dacht mooi met puppeteer oid aan de gang te kunnen maar helaas.

Ik heb een Data Logging Stick S3-WIFI-ST

Ah, kiek: https://community.home-as...g-stick-s3-wifi-st/437427

[ Voor 7% gewijzigd door Oogje op 30-08-2022 21:47 ]

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Oogje schreef op dinsdag 30 augustus 2022 @ 21:41:
[...]

Ik zat ook niet op de omvormer, maar ik kon connecten op het ip van de wifi-stick en dan krijg je een mooie webpagina te zien met oa de info die je nodig hebt. En op http://ip/status.html zonder de opmaak.
Was een javascript pagina, dus ik dacht mooi met puppeteer oid aan de gang te kunnen maar helaas.

Ik heb een Data Logging Stick S3-WIFI-ST

Ah, kiek: https://community.home-as...g-stick-s3-wifi-st/437427
Ik heb ook een Data Logging Stick model S3-WIFI-ST. Wanneer ik naar http://192.168.178.220/status.html ga krijg ik een gebruikersnaam/wachtwoord voor mijn neus. Heb jij wel een combinatie gevonden die werkt?

Die link die jij stuurt had ik ook al ooit gevonden, het probleem van de nieuwere Wifi stick.

Acties:
  • +1 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
ZuinigeRijder schreef op woensdag 31 augustus 2022 @ 08:29:
[...]


Ik heb ook een Data Logging Stick model S3-WIFI-ST. Wanneer ik naar http://192.168.178.220/status.html ga krijg ik een gebruikersnaam/wachtwoord voor mijn neus. Heb jij wel een combinatie gevonden die werkt?
Bij die initiële inrichting werkt de standaard user/pas. Na het instellen van de wifi-verbinding kon ik dus nog een aantal uren met dezelfde combi inloggen, daarna niet meer.

code:
1
2
3
4
5
6
7
8
9
10
11
curl -vvv x.x.x.x -u admin
Enter host password for user ‘admin’:
*   Trying x.x.x.x:80...
* Connected to x.x.x.x (x.x.x.x) port 80 (#0)
* Server auth using Basic with user ‘admin’
> GET / HTTP/1.1
> Host: x.x.x.x
> Authorization: Basic YWRtaW46MTIzNDU2Nzg5
> User-Agent: curl/7.79.1
> Accept: */*
< Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • +1 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Ik heb een nieuwe release gemaakt, waarbij ik de inverter temperatuur in de temperatuur kolom schrijf en AC Voltage in the "Power Used" kolom. Dan kun je op PVOutput terugkijken wat de inverter temperatuur was op verschillende tijdstippen en ook wat de net voltage voor de fase van je omvormer is (voor het geval dat deze te hoog wordt).

[ Voor 29% gewijzigd door ZuinigeRijder op 04-09-2022 21:25 ]


Acties:
  • 0 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
Die temp had ik er zelf ook al ingezet, ik heb een 3F omvormer dus moet daarvoor nog ff aan de slag.

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Oogje schreef op zondag 4 september 2022 @ 22:38:
Die temp had ik er zelf ook al ingezet, ik heb een 3F omvormer dus moet daarvoor nog ff aan de slag.
Heeft weinig nut om ze bij elkaar op te tellen, want je wil vooral dat je niet over het maximum van het net gaat van 252 Volt. Dus ik heb een commit gedaan, waarbij ik het maximum van de 3 fases bepaal en wegschrijf. Dan werkt het zowel met 1 fase systeem als met 3 fase systeem O-)

Kun je het testen, bij mij werkt het met 1 fase systeem. Wanneer het ook bij jou werkt, kan ik van deze commit een release maken.....

Acties:
  • 0 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
Zal t van de week ff testen. Ik wou ze alle 3 wegschrijven in de extended fields van pvoutput.

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Oogje schreef op maandag 5 september 2022 @ 08:26:
Zal t van de week ff testen. Ik wou ze alle 3 wegschrijven in de extended fields van pvoutput.
Ja, maar dan moet je wel donateur zijn. Ik heb trouwens een nieuwe release gemaakt, inclusief de max AC Voltage van de 3 fases en een bugfix van de high resolution watt die sinds de vorige release erin geslopen was :(

[ Voor 9% gewijzigd door ZuinigeRijder op 05-09-2022 20:34 ]


  • TheChris
  • Registratie: Juli 2005
  • Laatst online: 21-04-2024
Heeft iemand dit ook al werkend voor een Domoticz omgeving?

  • klump4u
  • Registratie: Februari 2008
  • Niet online

klump4u

Gasloos in Zuid-Limburg

TheChris schreef op woensdag 28 september 2022 @ 15:00:
Heeft iemand dit ook al werkend voor een Domoticz omgeving?
Heb je dit topic doorgenomen?

18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 7,6🔋


  • TheChris
  • Registratie: Juli 2005
  • Laatst online: 21-04-2024
klump4u schreef op woensdag 28 september 2022 @ 15:26:
[...]

Heb je dit topic doorgenomen?
Ja, maar sorry mijn vraag is denk ik onjuist. Mijn vraag had moeten zijn, hoe implementeer ik het script in Domoticz?

  • klump4u
  • Registratie: Februari 2008
  • Niet online

klump4u

Gasloos in Zuid-Limburg

TheChris schreef op woensdag 28 september 2022 @ 16:07:
[...]


Ja, maar sorry mijn vraag is denk ik onjuist. Mijn vraag had moeten zijn, hoe implementeer ik het script in Domoticz?
In de 3e post van dit topic heb ik beschreven hoe je de omvormer zonder de Solis WiFi stick rechtstreeks kunt uitlezen en direct de data naar Domoticz kan sturen. Hoe dit met WiFi stick gaat kan ik je niet vertellen. Maar misschien kun je iets uit mijn script gebruiken.

18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 7,6🔋


  • coenvb96
  • Registratie: Oktober 2015
  • Laatst online: 22:22
Zijn er meer mensen waarvan de API van Solis Cloud niet meer werkt? API heeft voor z'n 3 weken goed gewerkt (heb de panelen en omvormer net 3 weken), maar werkt plotseling niet meer. Ik kan deze ook niet meer activeren in de online portal.

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@coenvb96 bij mij werkt het nog. Er is echter wel maintenance geweest, misschien dat het daarmee te maken heeft? Maar als ik naar de instellingen ga, zie ik ook dat het niet meer geactiveerd is. Ga er vanuit dat het dan een tijdelijk probleem bij jou is?

  • coenvb96
  • Registratie: Oktober 2015
  • Laatst online: 22:22
ZuinigeRijder schreef op woensdag 28 september 2022 @ 21:34:
@coenvb96 bij mij werkt het nog. Er is echter wel maintenance geweest, misschien dat het daarmee te maken heeft? Maar als ik naar de instellingen ga, zie ik ook dat het niet meer geactiveerd is. Ga er vanuit dat het dan een tijdelijk probleem bij jou is?
Dan zal er vast een storing zijn bij Solis o.i.d.. Toch maar eens tijd gaan inversteren om de data rechtstreeks vanuit de Datalogger in HA te krijgen. Geen afhankelijkheid meer van de API...

Acties:
  • 0 Henk 'm!

  • coenvb96
  • Registratie: Oktober 2015
  • Laatst online: 22:22
coenvb96 schreef op donderdag 29 september 2022 @ 19:32:
[...]

Dan zal er vast een storing zijn bij Solis o.i.d.. Toch maar eens tijd gaan inversteren om de data rechtstreeks vanuit de Datalogger in HA te krijgen. Geen afhankelijkheid meer van de API...
Deze week bericht ontvangen van Solis dat de API om GDPR redenen tijdelijk is uitgeschakeld. Ze verwachten dat bij de volgende update van Solis cloud de API weer beschikbaar wordt gesteld. :|

Nu wel voor elkaar om de data rechtstreeks uit de datalogger te halen, en werkend te krijgen in het Energy dashboard binnen HA. :)

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@coenvb96 wel vreemd dat het bij mij nog steeds werkt O-)

Acties:
  • 0 Henk 'm!

  • nhimf
  • Registratie: September 2000
  • Laatst online: 02-04 16:11

nhimf

Lekker belangrijk allemaal

coenvb96 schreef op donderdag 6 oktober 2022 @ 19:40:
[...]

Deze week bericht ontvangen van Solis dat de API om GDPR redenen tijdelijk is uitgeschakeld. Ze verwachten dat bij de volgende update van Solis cloud de API weer beschikbaar wordt gesteld. :|

Nu wel voor elkaar om de data rechtstreeks uit de datalogger te halen, en werkend te krijgen in het Energy dashboard binnen HA. :)
Inmiddels is die versie er (3.7.0) en ik zie nog niets en wil heel graag dit aan mijn grafana hangen :'(

Is er een andere manier om dit te doen?

Ik stink niet, ik ruik gewoon anders


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@nhimf en @coenvb96 bij werkt de API nog steeds. Echter ik zie het menu om de API te bekijken niet. Wanneer ik echter naar deze pagina ga, staat er dat deze niet geactiveerd is 8)7 Aangezien het nog steeds werkt, verander ik niets O-)

Misschien dat het activeren werkt voor jullie?

[ Voor 8% gewijzigd door ZuinigeRijder op 13-10-2022 16:46 ]


Acties:
  • 0 Henk 'm!

  • nhimf
  • Registratie: September 2000
  • Laatst online: 02-04 16:11

nhimf

Lekker belangrijk allemaal

ZuinigeRijder schreef op donderdag 13 oktober 2022 @ 16:44:
@nhimf en @coenvb96 bij werkt de API nog steeds. Echter ik zie het menu om de API te bekijken niet. Wanneer ik echter naar deze pagina ga, staat er dat deze niet geactiveerd is 8)7 Aangezien het nog steeds werkt, verander ik niets O-)

Misschien dat het activeren werkt voor jullie?
Bedankt voor de link die werkt grappig genoeg.
Maarrrrr het activeren zelf niet. Dus deactiveer hem maar niet.

Afbeeldingslocatie: https://tweakers.net/i/1bSdziUI66XSFHuh6ckmAe2-q2I=/800x/filters:strip_exif()/f/image/J7v1eNkJay1OblUdTZiZyldQ.png?f=fotoalbum_large

Ik stink niet, ik ruik gewoon anders


Acties:
  • 0 Henk 'm!

  • coenvb96
  • Registratie: Oktober 2015
  • Laatst online: 22:22
Vandaag bericht ontvangen dat de API weer zou moeten werken. Ik kan inderdaad ook weer de API inschakelen, helaas werkt de integratie in HA nog niet zoals voorheen..

Acties:
  • 0 Henk 'm!

  • coenvb96
  • Registratie: Oktober 2015
  • Laatst online: 22:22
coenvb96 schreef op dinsdag 1 november 2022 @ 20:21:
Vandaag bericht ontvangen dat de API weer zou moeten werken. Ik kan inderdaad ook weer de API inschakelen, helaas werkt de integratie in HA nog niet zoals voorheen..
De API werkt weer O+

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
typisch dat het bij mij al die tijd is blijven werken :9
gelukkig dat het voor jullie weer werkt.......

Acties:
  • 0 Henk 'm!

  • Speedfightserv
  • Registratie: September 2004
  • Laatst online: 05-06 20:03
@ZuinigeRijder werkt het activeren ook weer?

30 x Trina 390wp Op SE en Solis. | MHI 3,5kw


Acties:
  • +1 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@Speedfightserv Weet ik niet, ik ga het ook niet proberen, omdat het bij mij gewoon nog steeds werkte. De API optie wordt bij mij niet getoond bij Basisinstellingen.

En deze pagina zegt nog steeds dat mijn API niet geactiveerd is, maar werkt nog steeds 8)7

Acties:
  • 0 Henk 'm!

  • dudok
  • Registratie: Januari 2011
  • Laatst online: 29-04 00:18
Ook bericht gekrregen dat de API geactiveerd kan worden.

De solis inverter in HA krijg ik niet aan de praat.

pv portal : https://www.soliscloud.com:13333/
pv version: soliscloud
credentials ingevuld maar krijg : Cannot login with provided URL and credentials

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@dudok volgens mij moet je niet de credentials hebben, maar de volgende id/secrets bij HA, zoiets:

portal_key_id: "1300386381123456789"
portal_secret: "304abf2bd8a44242913d704123456789"

P.S. geen ervaring met HA. Maar zie ook dit issue.....

Acties:
  • 0 Henk 'm!

  • dudok
  • Registratie: Januari 2011
  • Laatst online: 29-04 00:18
ZuinigeRijder schreef op donderdag 3 november 2022 @ 16:37:
@dudok volgens mij moet je niet de credentials hebben, maar de volgende id/secrets bij HA, zoiets:

portal_key_id: "1300386381123456789"
portal_secret: "304abf2bd8a44242913d704123456789"

P.S. geen ervaring met HA. Maar zie ook dit issue.....
Ik heb in het tweede scherm inderdaad de andere gegevens ingevuld
portal username: simpel
api secret provided by Soliscloud : dae68b8c741c4437a39b61ef20xxxxxx
api key id provided by Soliscloud : 1300386381676xxxxxx
station id as found on portalwebsite: ik twijfel over welke ik moet nemen echter beide geprobeerd.

collectordetail?id=1306858901387579052&stationId=1298491919448858888
Ik denk dat
id=1306858901387579052 = de datalogger
stationId=1298491919448858888 = de omvormer

Acties:
  • 0 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
Bij mij vliegt het script er nu meerdere keren per dag uit op socket.timeout: The read operation timed out en af en toe komt ERROR: https://www.soliscloud.com:13333/v1/api/inveterDetail -> 502: Bad Gateway ook nog voorbij.
Ik ben wel klaar met die chinezen, ik ga voor @klump4u zn oplossing :)

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • 0 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
Ik moet alleen nog ff uitvogelen waarom via modbus het op 1 cijfer achter de komma nauwkeurig is, en via de Solis portal was het op 4 cijfers.

Verder mooie stabiele situatie, de nieuwe wifi-stick is anders dan de oude, dus er moest wel gesoldeerd worden. Maar de boel netjes aangepast, USB kabel naar de PI en dan een python script om elke 5 minuten de data op te halen van de omvormer en uploaden naar PVOutput :)

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • 0 Henk 'm!

  • Pjelle
  • Registratie: Juli 2006
  • Laatst online: 16-01-2024
Bij het draaien van soliscloud_to_pvoutput.py krijg ik de volgende error in de "solis.log"

enig idee?

code:
1
2
3
4
5
6
7
8
Traceback (most recent call last):
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 221, in <module>
    main_loop()
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 150, in main_loop
    inverter_detail_body = get_inverter_list_body()
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 133, in get_inverter_list_body
    station_info = json.loads(content)['data']['page']['records'][0]
TypeError: 'NoneType' object is not subscriptable


Heb de API gegevens in de cfg file gezet.

[ Voor 3% gewijzigd door Pjelle op 31-12-2022 10:39 ]


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Pjelle schreef op zaterdag 31 december 2022 @ 10:38:
Bij het draaien van soliscloud_to_pvoutput.py krijg ik de volgende error in de "solis.log"

enig idee?

code:
1
2
3
4
5
6
7
8
Traceback (most recent call last):
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 221, in <module>
    main_loop()
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 150, in main_loop
    inverter_detail_body = get_inverter_list_body()
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 133, in get_inverter_list_body
    station_info = json.loads(content)['data']['page']['records'][0]
TypeError: 'NoneType' object is not subscriptable


Heb de API gegevens in de cfg file gezet.
Ik denk dat je Python 3.9 of hoger moet hebben. Gebruik je een oudere versie?

Acties:
  • 0 Henk 'm!

  • Pjelle
  • Registratie: Juli 2006
  • Laatst online: 16-01-2024
ZuinigeRijder schreef op maandag 2 januari 2023 @ 21:04:
[...]


Ik denk dat je Python 3.9 of hoger moet hebben. Gebruik je een oudere versie?
python3 is already the newest version (3.9.2-3).

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Pjelle schreef op dinsdag 3 januari 2023 @ 21:11:
[...]

python3 is already the newest version (3.9.2-3).
Het is een van de eerste calls naar de solis server en blijkbaar wordt er niets teruggegeven.

Is soliscloud_api_id goed gevuld in soliscloud_to_pvoutput.cfg?
Is soliscloud_api_secret goed ingevuld?
Staat de datum/tijd goed van het systeem?

Acties:
  • 0 Henk 'm!

  • Pjelle
  • Registratie: Juli 2006
  • Laatst online: 16-01-2024
ZuinigeRijder schreef op dinsdag 3 januari 2023 @ 21:19:
[...]


Het is een van de eerste calls naar de solis server en blijkbaar wordt er niets teruggegeven.

Is soliscloud_api_id goed gevuld in soliscloud_to_pvoutput.cfg?
Is soliscloud_api_secret goed ingevuld?
Staat de datum/tijd goed van het systeem?
Soliscloud API id = 13003863816765*****
Soliscloud API secret = 956c3015ee4a4cc9a39ff90a1*******

code:
1
2
3
4
5
6
7
8
timedatectl status
               Local time: Tue 2023-01-03 21:31:47 CET
           Universal time: Tue 2023-01-03 20:31:47 UTC
                 RTC time: n/a
                Time zone: Europe/Amsterdam (CET, +0100)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@Pjelle Dat lijkt allemaal goed te zijn.
Je kunt regel 103 het commentaar teken weghalen, kun je zien wat er teruggegeven wordt.

Even gechecked, mijn script liep vandaag zonder problemen.

Acties:
  • 0 Henk 'm!

  • Pjelle
  • Registratie: Juli 2006
  • Laatst online: 16-01-2024
ZuinigeRijder schreef op dinsdag 3 januari 2023 @ 21:39:
@Pjelle Dat lijkt allemaal goed te zijn.
Je kunt regel 103 het commentaar teken weghalen, kun je zien wat er teruggegeven wordt.

Even gechecked, mijn script liep vandaag zonder problemen.
code:
1
2
3
4
5
6
7
8
9
20230103 21:46:26: https://www.soliscloud.com:13333/v1/api/userStationList->{"success":true,"code":"1","msg":"数据异常 请联系管理员","data":null}
Traceback (most recent call last):
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 221, in <module>
    main_loop()
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 150, in main_loop
    inverter_detail_body = get_inverter_list_body()
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 133, in get_inverter_list_body
    station_info = json.loads(content)['data']['page']['records'][0]
TypeError: 'NoneType' object is not subscriptable


is de output :? chinees

vertaling chinees stukje: The data is abnormal, please contact the administrator

mijn inverter is wel offline, weet niet of dit nu uitmaakt

[ Voor 6% gewijzigd door Pjelle op 03-01-2023 21:50 ]


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@Pjelle Ja, Vereenvoudigd Chinees, Google Translate zegt als vertaling:

De gegevens zijn abnormaal, neem contact op met de beheerder 8)7

Acties:
  • 0 Henk 'm!

  • Pjelle
  • Registratie: Juli 2006
  • Laatst online: 16-01-2024
ZuinigeRijder schreef op dinsdag 3 januari 2023 @ 21:49:
@Pjelle Ja, Vereenvoudigd Chinees, Google Translate zegt als vertaling:

De gegevens zijn abnormaal, neem contact op met de beheerder 8)7
Heb de API gegevens van mijn soliscloud pagina gehaald zoals door jou duidelijk omscreven was :P

SolisCloud installatie voor API-bewaking : Activated

zojuist nog gecontroleerd

[ Voor 10% gewijzigd door Pjelle op 03-01-2023 21:59 ]


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Pjelle schreef op dinsdag 3 januari 2023 @ 21:52:
[...]


Heb de API gegevens van mijn soliscloud pagina gehaald zoals door jou duidelijk omscreven was :P
Is het systeem gekoppeld via Wifi?
Zou er misschien een configuratieprobleem van je Solis omvormer zijn?
Ik neem aan dat je op de Solis web-pagina's gewoon de opbrengst kan zien.
En in de hoofdpagina staat in de installatielijst jouw inverter?

Anders toch iemand van de Solis helpdesk zien te vinden |:(

Acties:
  • 0 Henk 'm!

  • Pjelle
  • Registratie: Juli 2006
  • Laatst online: 16-01-2024
ZuinigeRijder schreef op dinsdag 3 januari 2023 @ 22:02:
[...]


Is het systeem gekoppeld via Wifi?
Zou er misschien een configuratieprobleem van je Solis omvormer zijn?
Ik neem aan dat je op de Solis web-pagina's gewoon de opbrengst kan zien.
En in de hoofdpagina staat in de installatielijst jouw inverter?

Anders toch iemand van de Solis helpdesk zien te vinden |:(
Heb zojuist mijn API gegevens opgehaald en daarbij zag ik dat het secret veld leeg was????
ga een nieuwe sleutel aanvragen.

edit:
wel een nieuwe secret sleutel, maar helaas de zelfde uitkomst qua log.
Ik kan gewoon mijn opbrengst zien voor vandaag, ook via de soliscloud app :*)
En de inverter staat idd in m,n installatie lijst.

[ Voor 22% gewijzigd door Pjelle op 14-01-2023 15:10 ]


Acties:
  • 0 Henk 'm!

  • Pjelle
  • Registratie: Juli 2006
  • Laatst online: 16-01-2024
Vandaag nog weer een keer getest met m'n inverter online.
Geen succes.
code:
1
2
3
4
5
6
7
8
9
20230114 16:18:49: https://www.soliscloud.com:13333/v1/api/userStationList->{"success":true,"code":"1","msg":"数据异常 请联系管理员","data":null}
Traceback (most recent call last):
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 221, in <module>
    main_loop()
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 150, in main_loop
    inverter_detail_body = get_inverter_list_body()
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 133, in get_inverter_list_body
    station_info = json.loads(content)['data']['page']['records'][0]
TypeError: 'NoneType' object is not subscriptable


Is er een manier om de soliscloud api te testen wat voor data er uit komt?

[ Voor 68% gewijzigd door Pjelle op 14-01-2023 16:24 ]


Acties:
  • +1 Henk 'm!

  • klump4u
  • Registratie: Februari 2008
  • Niet online

klump4u

Gasloos in Zuid-Limburg

Daarom lees ik de omvormer rechtstreeks uit, nog nooit iets gemist en altijd de juiste data.

18950Wp🌞, Atlantic 270V3💧, Pana 5J🔥. Zendure 7,6🔋


Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Pjelle schreef op zaterdag 14 januari 2023 @ 16:23:
Vandaag nog weer een keer getest met m'n inverter online.
Geen succes.
code:
1
2
3
4
5
6
7
8
9
20230114 16:18:49: https://www.soliscloud.com:13333/v1/api/userStationList->{"success":true,"code":"1","msg":"数据异常 请联系管理员","data":null}
Traceback (most recent call last):
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 221, in <module>
    main_loop()
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 150, in main_loop
    inverter_detail_body = get_inverter_list_body()
  File "/home/Domoticz/solis/soliscloud_to_pvoutput.py", line 133, in get_inverter_list_body
    station_info = json.loads(content)['data']['page']['records'][0]
TypeError: 'NoneType' object is not subscriptable


Is er een manier om de soliscloud api te testen wat voor data er uit komt?
De eerste call gaat al fout en geeft in het Chinees terug:
De gegevens zijn abnormaal, neem contact op met de beheerder
Dus wat er precies mis is, weet ik ook niet.

Acties:
  • +1 Henk 'm!

  • Pjelle
  • Registratie: Juli 2006
  • Laatst online: 16-01-2024
ZuinigeRijder schreef op zaterdag 14 januari 2023 @ 17:36:
[...]


De eerste call gaat al fout en geeft in het Chinees terug:


[...]


Dus wat er precies mis is, weet ik ook niet.
Heb weer een nieuwe API aangevraagt.
Heb het nu draaien, perfecto _/-\o_

Acties:
  • 0 Henk 'm!

  • exponential
  • Registratie: Maart 2016
  • Laatst online: 05-06 14:04
Ik ben op zoek naar een Wifi-Stick voor mijn Solis GR1P2K omvormer. Ik had deze van Warmteservice op het oog.

Maar het lijkt erop dat er meerdere versies zijn. Weet iemand welke versie dit is en welke versie ik het best kan kopen? Ik hoef niet per se een koppeling met PVoutpout oid, maar een beetje moderne/veilige app zou wel fijn zijn.

Acties:
  • +1 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@exponential ik heb dezelfde voor mijn Solis S6-GR1P1.5K-Mini bij warmteservice besteld, artikelnummer 07751105.

Er zijn inderdaad 2 versies in omloop, op mijn wifistick staat:
Model: S3-WIFI-ST

Bij warmteservice staat bij dat artikelnummer SOLIS-DLS-W-A (1.4-U), volgens mij is dat het oude model, maar heb dus wel de goede (nieuwere model) gekregen, namelijk S3-WIFI-ST. Ik denk dus dat de informatie bij warmteservice niet goed is.

  • exponential
  • Registratie: Maart 2016
  • Laatst online: 05-06 14:04
ZuinigeRijder schreef op dinsdag 21 februari 2023 @ 20:54:
@exponential ik heb dezelfde voor mijn Solis S6-GR1P1.5K-Mini bij warmteservice besteld, artikelnummer 07751105.

Er zijn inderdaad 2 versies in omloop, op mijn wifistick staat:
Model: S3-WIFI-ST

Bij warmteservice staat bij dat artikelnummer SOLIS-DLS-W-A (1.4-U), volgens mij is dat het oude model, maar heb dus wel de goede (nieuwere model) gekregen, namelijk S3-WIFI-ST. Ik denk dus dat de informatie bij warmteservice niet goed is.
Thanks voor de info. Inmiddels inderdaad de v3 binnen via warmteservice. Met een beetje geluk gaat komend weekend mijn pv systeem draaien. Zal me daarna eens verdiepen in alle info in dit topic :)

Acties:
  • 0 Henk 'm!

  • Adeo
  • Registratie: Oktober 2018
  • Laatst online: 23-05 07:59
Ik heb hier deze: https://www.warmteservice...rigin=-tl009-10078-11003-
Hangt onder een Solis S6GR1P omvormer.
Probleem is wel dat ik die stick niet meer lokaal kan benaderen. :?

Acties:
  • 0 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
Adeo schreef op zondag 23 april 2023 @ 12:13:
Ik heb hier deze: https://www.warmteservice...rigin=-tl009-10078-11003-
Hangt onder een Solis S6GR1P omvormer.
Probleem is wel dat ik die stick niet meer lokaal kan benaderen. :?
Zodra je em aan de cloud koppelt verlies je de mogelijkheid tot lokaal benaderen. Als je alleen lokaal wilt benaderen kun je die stick mooi ombouwen naar modbus to USB.

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • 0 Henk 'm!

  • Adeo
  • Registratie: Oktober 2018
  • Laatst online: 23-05 07:59
@Oogje , ben er niet erg blij mee, heb die omvormer sinds een paar dagen (is inmiddels mijn 7de omvormer).
Had het niet door, de installateur sloot dat ding aan en ik zag alleen dat die stick op een, voor mij, verkeerd IP-adres zat.
Heb dat IP-adres nog wel kunnen wijzigen naar het oude adres van de vorige omvormer.
Ook de installateur was hier kennelijk niet van op de hoogte.

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
TheChris schreef op woensdag 28 september 2022 @ 16:07:
[...]


Ja, maar sorry mijn vraag is denk ik onjuist. Mijn vraag had moeten zijn, hoe implementeer ik het script in Domoticz?
Iemand heeft in deze discussie het voor domoticz aan de praat gekregen:

Acties:
  • +1 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
Nu is er ook officieel support voor Domoticz. Je kunt nu SolisCloud data naar PVOutput en/of Domoticz sturen. En ook is er support voor meerdere SolisCloud Solis omvormers.

Eigenlijk zou de titel van dit topic nu moeten zijn:

SolisCloud Solis omvormer data naar PVOutput en/of Domoticz.

Acties:
  • 0 Henk 'm!

  • BounceMeister
  • Registratie: Maart 2002
  • Niet online
ZuinigeRijder schreef op vrijdag 12 mei 2023 @ 12:02:
Nu is er ook officieel support voor Domoticz. Je kunt nu SolisCloud data naar PVOutput en/of Domoticz sturen. En ook is er support voor meerdere SolisCloud Solis omvormers.

Eigenlijk zou de titel van dit topic nu moeten zijn:

SolisCloud Solis omvormer data naar PVOutput en/of Domoticz.
Heeft iemand hier bij het activeren van de api ook de melding "no authority" gehad?

Acties:
  • 0 Henk 'm!

  • ZuinigeRijder
  • Registratie: Oktober 2009
  • Niet online
@BounceMeister In dit topic wel. Ik weet niet wat de oorzaak is en of diegene die dit hadden dit opgelost hebben.

EDIT: ah, jijzelf hebt dit daar gepost.

[ Voor 8% gewijzigd door ZuinigeRijder op 12-05-2023 21:23 ]

Pagina: 1 2 3 Laatste