Created
October 6, 2018 11:50
-
-
Save ptagell/c3875c0e51da9e12dd0721dbf96f327d to your computer and use it in GitHub Desktop.
Selenium script to retrieve data from Fronius Solar Web and United Energy distributor.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'selenium-webdriver' | |
require 'dotenv/load' | |
require 'mailgun-ruby' | |
require 'open-uri' | |
require 'date' | |
require 'time' | |
require 'nokogiri' | |
require 'json' | |
require 'csv' | |
@headless = Selenium::WebDriver.for :firefox | |
@emailAddresses = ENV['RECIPIENT_EMAILS'] | |
def retrieveGenerationDataFronius | |
@headless.navigate.to 'https://www.solarweb.com/' | |
loginButton = @headless.find_element(:xpath => "//a[@class='dropdown-toggle js-login-toggle-dropdown-btn']") | |
loginButton.click | |
username = @headless.find_element(:id => "UserName") | |
password = @headless.find_element(:id => "Password") | |
submit = @headless.find_element(:xpath => "//button[@class='js-stateful-button btn btn-primary btn-block js-login-btn']") | |
username.send_keys ENV['FRONIUS_USERNAME'] | |
password.send_keys ENV['FRONIUS_PASSWORD'] | |
sleep 3 | |
submit.click() | |
sleep 5 | |
@headless.navigate.to 'https://www.solarweb.com/Chart/Chart?pvSystemId=9955e9ce-f595-43a1-8648-9e6773064720' | |
sleep 5 | |
nextButton = @headless.find_element(:xpath => "//div[@class='chart-nav-arrow chart-nav-arrow-left chart-nav-bg js-chart-nav-prev icon-sw-arrow-back-01']") | |
nextButton.click | |
sleep 3 | |
@solarGeneratedYesterday = @headless.find_element(:xpath => "//span[@class='second-level-nav-element-text chart-sum-value js-sum-value']").text | |
puts @solarGeneratedYesterday | |
end | |
def requestRefreshData | |
refreshPage = @headless.find_element(:id => "refresh-data") | |
refreshPage.click() | |
# Add capability to only refresh if required. | |
sleep 30 | |
extractJSON | |
end | |
def dayOfTheWeek | |
today = Time.now.wday | |
if today == 0 | |
6 | |
else | |
today - 2 | |
end | |
end | |
def extractJSON | |
@headless.navigate.to 'https://energyeasy.ue.com.au/electricityView/period/week/0' | |
sleep 5 | |
convertRaw = @headless.find_element(:id => "rawdata-tab") | |
convertRaw.click | |
sleep 1 | |
payload = @headless.find_element(:class => "panelContent").text | |
@payload = JSON.parse(payload) | |
puts @payload | |
puts dayOfTheWeek | |
@dailyConsumptionData = @payload["selectedPeriod"]["consumptionData"]["peak"][dayOfTheWeek]["total"] | |
@dailyExportData = @payload["selectedPeriod"]["consumptionData"]["generation"][dayOfTheWeek]["total"] | |
puts @dailyConsumptionData | |
puts @dailyExportData | |
@refreshCount == 0 | |
if @dailyExportData == 0 && @refreshCount == 0 | |
@refreshCount += 1 | |
requestRefreshData | |
end | |
end | |
def retriveExportDataUnitedEnergy | |
@headless.navigate.to 'https://energyeasy.ue.com.au/login/index' | |
username = @headless.find_element(:id => "login_email") | |
password = @headless.find_element(:id => "login_password") | |
submit = @headless.find_element(:id => "loginButton") | |
username.send_keys ENV['UNITED_ENERGY_USERNAME'] | |
password.send_keys ENV['UNITED_ENERGY_PASSWORD'] | |
sleep 5 | |
submit.click() | |
sleep 5 | |
extractJSON | |
end | |
def quit | |
@headless.quit | |
end | |
def performCalculations | |
solarFeedIn = @dailyExportData.round(2) | |
solarFeedInRebate = ((solarFeedIn.to_f*11.17)/100).round(2) | |
powerPurchase = (@dailyConsumptionData).round(2) | |
powerPurchaseCost = ((powerPurchase.to_f*28.8)/100).round(2) | |
solarConsumption = (@solarGeneratedYesterday.to_f-solarFeedIn.to_f).round(2) | |
solarConsumptionSavings = ((solarConsumption.to_f*30.14)/100).round(2) | |
dailyServiceFee = "0.86".to_f | |
totalConsumption = (solarConsumption+powerPurchase).round(2) | |
potentialBatterySavings = ((solarFeedIn.to_f*30.14)/100).round(2) | |
potentialBatteryModifiedGridUsage = (powerPurchase-solarFeedIn).round(2) | |
@overallCost = (powerPurchaseCost-solarFeedInRebate+dailyServiceFee).round(2) | |
def determinePositiveNegative | |
if @overallCost < 0 | |
"you were credited " | |
else | |
"you paid " | |
end | |
end | |
report = "Yesterday, you used #{totalConsumption.to_s}kWh of ⚡️ (#{solarConsumption.to_s} kWh of ☀️ - saving $#{solarConsumptionSavings.to_s} & #{powerPurchase.to_s}kWh of 🔌 - costing $#{powerPurchaseCost.to_s}). You exported an additional #{solarFeedIn.to_s} kWh ☀️ to the grid (earning $#{solarFeedInRebate.to_s} credit). Yesterday #{determinePositiveNegative}$#{@overallCost.abs.to_s} (including service fees)." | |
puts report | |
sendNotification(report) | |
writeToCSV(solarFeedIn, solarFeedInRebate,powerPurchase,powerPurchaseCost,solarConsumption,solarConsumptionSavings,totalConsumption,potentialBatterySavings,potentialBatteryModifiedGridUsage,@overallCost) | |
end | |
def sendNotification(report) | |
mg_client = Mailgun::Client.new ENV['MAILGUNAPIKEY'] | |
message_params = { from: '[email protected]', | |
to: @emailAddresses, | |
subject: report, | |
text: report | |
} | |
mg_client.send_message 'discuss.kyneton.town', message_params | |
end | |
def writeToCSV(solarFeedIn,solarFeedInRebate,powerPurchase,powerPurchaseCost,solarConsumption,solarConsumptionSavings,totalConsumption,potentialBatterySavings,potentialBatteryModifiedGridUsage,overallCost) | |
@csv_headers = [ | |
"date", | |
"solar Feed In (kWh)", | |
"solar Feed In Rebate ($)", | |
"power Purchase (kWh)", | |
"power Purchase Cost ($)", | |
"solar Consumption (kWh)", | |
"solar Consumption Savings ($)", | |
"total Consumption (kWh)", | |
"potential Battery Savings ($)", | |
"potential Battery Usage (kWh)", | |
"overall Cost ($)" | |
] | |
@csv_name = "/Users/tagell/Sites/home-server/scripts/mums/wardElectricityUsageData.csv" | |
def write_to_csv(row) | |
if csv_exists? | |
CSV.open(@csv_name, 'a+') { |csv| csv << row } | |
else | |
# create and add headers if doesn't exist already | |
CSV.open(@csv_name, 'wb') do |csv| | |
csv << @csv_headers | |
csv << row | |
end | |
end | |
end | |
def csv_exists? | |
@exists ||= File.file?(@csv_name) | |
end | |
todaysDate = Time.now | |
array = [ [todaysDate,solarFeedIn,solarFeedInRebate,powerPurchase,powerPurchaseCost,solarConsumption,solarConsumptionSavings,totalConsumption,potentialBatterySavings,potentialBatteryModifiedGridUsage,overallCost]] | |
array.each { |row| write_to_csv(row) } | |
end | |
@solarGeneratedYesterday = 30.16 | |
puts Time.now.to_s+" - Daily Ward Solar Check Starting" | |
retrieveGenerationDataFronius | |
retriveExportDataUnitedEnergy | |
performCalculations | |
quit | |
puts Time.now.to_s+" - Daily Ward Check Completed" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment