Skip to content

Instantly share code, notes, and snippets.

@ptagell
Created October 6, 2018 11:50
Show Gist options
  • Save ptagell/c3875c0e51da9e12dd0721dbf96f327d to your computer and use it in GitHub Desktop.
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.
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: 'noreply@discuss.kyneton.town',
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