<?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);
}
?>
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.