Opbrengst zonnepanelen (SolarEdge) als notificatie op telefoon
Nu de zon weer volop gaat schijnen is het interessant om te zien hoeveel de SolarEdge zonnepanelen opgebracht hebben. Met onderstaand script krijgt je dagelijks een notificatie op je telefoon met de opbrengst en rendement van de huidige dag, maand en jaar.
Benodigdheden
Maak eerst in Domoticz een virtuele Percentage-sensor aan. De naam mag je zelf kiezen, noteer wel het IDX van de sensor. Ga vervolgens naar de website van SolarEdge om de API en siteID te achterhalen. Nadat je bent ingelogd klik je op “Admin” en vervolgens op “Site toegang”. In dit scherm kun je een API sleutel aanmaken:
SolardEdge script
Het script haalt via de SolarEdge API het aantal opgewekte kW’s per dag/maand/jaar op. Tevens wordt er gekeken hoeveel licht-uren er in een dag/maand/jaar zitten. Deze licht-uren worden gebruikt om het rendement per periode uit te rekenen.
In het script hoef je slechts regel 4 t/m 10 aan te passen (de overige regels moet je niet wijzigen!). Sla het scripts vervolgens op met de naam solaredge.php in de folder /home/pi/domoticz/scripts/php/
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 |
<?php // SETTINGS // $api = 'O43MRATWG7WRTTMBYJH3UKKTEY25HVQK'; //API van SolarEdge $siteID = '1624184'; //siteID van SolarEdge $latitude = 52.364267; //GPS-locatie $longitude = 5.4324679; //GPS-locatie $piekvermogen = 5.4; // Vermogen zonnepanelen in kWp $domoticz_url='http://192.168.2.62:8080/'; //URL Domoticz met poortnummer $idx1 = '551'; // Percentage sensor - Rendement zonnepanelen // HIERONDER NIETS WIJZIGEN!!! // $today = date('Y-m-d'); $time = date('H:i'); $year = date('Y'); $month = date('m'); $start_date = $year.'-01-01'; $start_date_month = $year.'-'.$month.'-01'; // FUNCTIONS // function differenceInHours($opkomst,$ondergang){ $starttimestamp = strtotime($opkomst); $endtimestamp = strtotime($ondergang); $difference = abs($endtimestamp - $starttimestamp)/3600; return $difference; } function UpdateDevice($idx,$perc) { global $domoticz_url; $reply=json_decode(file_get_contents($domoticz_url.'json.htm?type=command¶m=udevice&idx='.$idx.'&nvalue=0&svalue='.$perc),true); if($reply['status']=='OK') $reply='OK';else $reply='ERROR'; return $reply; } function Notification($subject,$thebody) { global $domoticz_url; $reply=json_decode(file_get_contents($domoticz_url.'json.htm?type=command¶m=sendnotification&subject='.$subject.'&body='.$thebody),true); if($reply['status']=='OK') $reply='OK';else $reply='ERROR'; return $reply; } // GEGEGEVENS OPHALEN $url = 'https://monitoringapi.solaredge.com/site/'.$siteID.'/overview.json?api_key='.$api; if (false == ($contents = file_get_contents($url))) { echo "Kan geen gegevens ophalen van SolarEdge"; } else { //Opbrengst en rendement vandaag $solar=json_decode($contents); $energy_today=$solar->overview->lastDayData->energy; $sun_info = date_sun_info(strtotime($today), $latitude, $longitude); $opkomst = date('H:i',$sun_info['sunrise']); $ondergang = date('H:i',$sun_info['sunset']); $urenzon= differenceInHours($opkomst,$ondergang); $rendement = round((($energy_today/1000) / ($piekvermogen*$urenzon)),2)*100; // Aantal lichturen hele jaar $x = 0; while (strtotime($start_date) <= strtotime($today)) { $sun_info1 = date_sun_info(strtotime($start_date), $latitude, $longitude); $opkomst1 = date('H:i',$sun_info1['sunrise']); $ondergang1 = date('H:i',$sun_info1['sunset']); $urenzon= differenceInHours($opkomst1,$ondergang1); $x = $x + $urenzon; $start_date = date ("Y-m-d", strtotime("+1 days", strtotime($start_date))); } $energy_year_total=$solar->overview->lastYearData->energy; // opbrengst hele jaar $rendement2 = round((($energy_year_total/1000) / ($piekvermogen*$x)),2)*100; // rendement hele haar // Aantal lichturen deze maand $y = 0; while (strtotime($start_date_month) <= strtotime($today)) { $sun_info2 = date_sun_info(strtotime($start_date_month), $latitude, $longitude); $opkomst2 = date('H:i',$sun_info2['sunrise']); $ondergang2 = date('H:i',$sun_info2['sunset']); $urenzon_dezemaand= differenceInHours($opkomst2,$ondergang2); $y = $y + $urenzon_dezemaand; $start_date_month = date ("Y-m-d", strtotime("+1 days", strtotime($start_date_month))); } $energy_month_now=$solar->overview->lastMonthData->energy; // opbrengst deze maand $rendement3 = round((($energy_month_now/1000) / ($piekvermogen*$y)),2)*100; // rendement deze maand // Device update en notificatie $text = 'De%20zonnepanelen%20hebben%20vandaag%20'.round(($energy_today/1000),1).'%20kW%20opgebracht.%20Het%20rendement%20is%20'.$rendement.'%25.%0A%0ADeze%20maand%20hebben%20de%20zonnepanelen%20'.round(($energy_month_now/1000),0).'%20kW%20opgebracht%20(rendement%20van%20'.$rendement3.'%25).%0A%0ASinds%201%20januari%20hebben%20de%20zonnepanelen%20'.round(($energy_year_total/1000),0).'%20kW%20opgebracht.%20Dat%20is%20een%20rendement%20van%20'.$rendement2.'%25.'; UpdateDevice($idx1,$rendement); Notification('SolarEdge',$text); } ?> |
Cronjob
Om ervoor te zorgen dat het script iedere dag (om 22.15 uur) uitgevoerd wordt moeten we een cronjob aanmaken. Geef in te terminal onderstaande in:
1 |
sudo crontab -e |
En voeg onderstaande regel toe:
1 |
15 22 * * * sudo php /home/pi/domoticz/scripts/php/solaredge.php |
Sluit het bestand af met CTRL-X, dan Y en tot slot ENTER. De aanpassing is nu opgeslagen in het bestand en het script zal iedere dag om 22.15 uur uitgevoerd worden. Je krijgt, via Domoticz, een notificatie op je telefoon als onderstaand:
Note: het redement zal nooit 100% zijn, aangezien in het script wordt gekeken hoe laat de zon opkomt en ondergaat. De zon zal dus nooit continue in de juiste hoek op de zonnepanelen schijnen. Ik schat dat een rendement van zo’n 45%-50% het maximaal haalbare zal zijn.
Leuk om te lezen. Ik heb zelf een script in DzEvents gemaakt dat iedere dag bij zonsondergang aangeeft via een Telegram bot hoeveel er geproduceerd is met mijn SolarEdge en wat dat in eurootjes is.. En om 23.59 komt daar nog een melding bij wat de totale gas & electriteitskosten zijn van die dag incl saldering.
En heb vorig jaar een dummy meter opgevoerd die een 10kW batterij moet voorstellen. Iedere minuut wordt er gekeken of de batterij geladen of ontladen moet/kan worden, ben benieuwd wat er aan het einde van 2021 voor beeld is ontstaan 🙂 Zou blijf je een beetje bezig…
Hoi Alwin,
zou je het script kunnen delen?
Wil het ook graag proberen.
Welk script bedoel je ? Die van de batterij of die van de TelegramBot ?
telegram bot
Voor de telegram notificatie heb ik een paar dingen gedaan:
ik heb een script global_data, daar heb ik onderstaand ingezet om een makkelijke functie aan te roepen en enkele globale variabelen te zetten
—-
return{
helpers = {
sendtelegram = function(dz, msg)
dz.notify(‘Update’, msg, dz.PRIORITY_NORMAL, dz.SOUND_NONE,”, dz.NSS_TELEGRAM)
end,
euro = function(dz, eur)
local splittedResult = dz.utils.stringSplit(eur,’.’)
eurTekst = splittedResult[1] .. ‘ Euro en ‘ .. splittedResult[2] .. ‘ cent’
return eurTekst
end
},
data = {
notifiedZon = { initial = 0 },
mijlpaal = { initial = 10 },
notifiedVerbruik = { initial = 0 },
Welterusten = { initial = off }
}
}
—
ik heb een script gemaakt dat kijkt naar de opgewekte stroom en bij een mijlpaal (eenheid 10kWh uit de globale variabele) een alert stuurt
return {
on = {
devices = {
‘Opbrengst kWh’
}
},
execute = function(dz, device)
— variabelen definieren
local notified = dz.globalData.notifiedZon
local mijlpaal = dz.globalData.mijlpaal + notified
local actueel = device.counterToday
— reset de dagcounter indien nodig
if ((notified > 0) and (actueel = mijlpaal) and (notified < mijlpaal)) then dz.helpers.sendtelegram(dz, 'Zonnepanelen mijlpaal: '..mijlpaal..'kWh!') dz.globalData.notifiedZon = mijlpaal end end } In de instellingen van Domoticz heb ik bij Notifications de telegram optie ingesteld. In telegram maak je een bot aan en een chatgroep waar de bot inzit en waar jouw account inzit. Het was een beetje googlen hoe je van de groep een chatID achterhaalt: zie ook https://stackoverflow.com/questions/32423837/telegram-bot-how-to-get-a-group-chat-id
Je kunt ook zelf telegram aanroepen via een weburl, dat doe ik als ik een plaatje wil meesturen. Zo heb ik ingesteld dat als de deurbel ingedrukt wordt er een foto van mn foscam camera gericht op de voordeur via telegram naar mij wordt gestuurd. Dat doe ik middels een commando dat ik ook heb opgenomen in global_data als functie sendphoto. Onderstaand de belangrijkste regel daaruit.
os.execute(‘curl -s -X POST https://api.telegram.org/bot' ..VariabeleTok .. ‘/sendPhoto?chat_id=’ .. chatId .. ‘ -F photo=@’ .. photofile .. ‘ -F caption=”‘ ..realcaption..'” &’)
os.execute(“sleep 1”)
Ik heb meerdere foscam camera’s in domoticz gekoppeld die ik met die ene functie kan aanroepen.
bedankt Alwin,
Ik ga er mee aan de slag.