To add yet another possible solution… I can use a webhook to populate the sensor directly!
Ironically, a few days after I started working on this my ISP changed from an XML file to Json!!!
I did this for 2 reasons… mosquitto_pub is not available under a shell_command in Hassio so it won’t run there. I also found basic date commands are similarly unavailable in hassio so this limits you to having to use cron and a script - again, not available for hassio users.
So here is my script:
#!/bin/bash
###### Only edit the following setup lines with correct login information #####
# Aussie Broadband Details
abblogin=******
abbpassword=******
usageid=******
# Home Assistant Config
server=http://ipaddress:8123
token=******
entitypicture=/local/icons/abb/abb.png
###### DO NOT ALTER ANYTHING BELOW THIS LINE ######
# Retrieving ABB Usage Data
cookie="$(mktemp)"
curl -c $cookie -d "username=$abblogin" -d "password=$abbpassword" --url 'https://myaussie-auth.aussiebroadband.com.au/login'
abbusagestring=$(curl -b $cookie --url "https://myaussie-api.aussiebroadband.com.au/broadband/$usageid/usage")
rm $cookie
# Get Variables from String
usedMb=$(echo "$abbusagestring" | jq '.["usedMb"]')
downloadedMb=$(echo "$abbusagestring" | jq '.["downloadedMb"]')
uploadedMb=$(echo "$abbusagestring" | jq '.["uploadedMb"]')
remainingMb=$(echo "$abbusagestring" | jq '.["remainingMb"]')
daysTotal=$(echo "$abbusagestring" | jq '.["daysTotal"]')
daysRemaining=$(echo "$abbusagestring" | jq '.["daysRemaining"]')
lastUpdated=$(echo "$abbusagestring" | jq '.["lastUpdated"]')
# Remove leading and trailing "'s
lastUpdated=$(echo "$lastUpdated" | sed 's/.$//g')
lastUpdated=$(echo $lastUpdated | cut -c2-)
# Calculate Dates
todaydatetime=$(date -Is)
lastUpdatedISO=$(echo "$todaydatetime" |sed "s/${todaydatetime:11:8}/${lastUpdated:11:8}/g")
lastUpdated=$(date -d "$lastUpdated" +%s)
daysRemainingEpochs=$(($daysRemaining*86400))
nextRollover=$(($lastUpdated + $daysRemainingEpochs))
nextRollover=$(date -d @"$nextRollover" -Is)
nextRollover=$(echo "$nextRollover" |sed "s/${nextRollover:11:8}/00:00:00/g")
lastUpdated=$lastUpdatedISO
####### ONLY FOR HASSIO.... COMMENT OUT FOR OTHERS #######
nextRollover=$(echo "$nextRollover" |sed "s/.\{2\}$/:&/")
lastUpdated=$(echo "$lastUpdated" |sed "s/.\{2\}$/:&/")
####### END FOR HASSIO ONLY COMMENTS #######
# Build daysUsed from daysTotal and daysRemaining
daysUsed=$(echo "$(($daysTotal - $daysRemaining))")
# Build JSON output
abbusagestring='{"state":"","attributes":{"usage":"","usedMb":'"$usedMb"',"downloadedMb":'"$downloadedMb"',"uploadedMb":'"$uploadedMb"',"remainingMb":'"$remainingMb"',"daysTotal":'"$daysTotal"',"daysRemaining":'"$daysRemaining"',"lastUpdated":"'"$lastUpdated"'","nextRollover":"'"$nextRollover"'","daysUsed":'"$daysUsed"',"friendly_name":"ABB Usage","icon":"mdi:blank","entity_picture":"'"$entitypicture"'"}}'
# Publish to HA with token
curl -X POST -H "Authorization: Bearer $token" \
-H "Content-Type: application/json" \
-d "$abbusagestring" \
"$server"/api/states/sensor.abb_usage
Then you need an automation (so it populates on HA start and every 15 minutes)…
- id: 'updateabbusage'
alias: Update ABB Usage
trigger:
- event: start
platform: homeassistant
- platform: time_pattern
minutes: '/15'
action:
- service: shell_command.abbusage
initial_state: 'true'
Also need to create the shell_command:
shell_command:
abbusage: /bin/bash /config/abbusage_ha.sh
Lovelace: (Uses Template card and bar cards)
- type: vertical-stack
cards:
- type: 'custom:config-template-card'
variables:
- states['sensor.abb_usage'].state
- states['sensor.abb_usage'].attributes['usedMb']
- states['sensor.abb_usage'].attributes['downloadedMb']
- states['sensor.abb_usage'].attributes['uploadedMb']
- states['sensor.abb_usage'].attributes['remainingMb']
- states['sensor.abb_usage'].attributes['daysTotal']
- states['sensor.abb_usage'].attributes['daysRemaining']
- states['sensor.abb_usage'].attributes['lastUpdated']
- states['sensor.abb_usage'].attributes['nextRollover']
- states['sensor.abb_usage'].attributes['daysUsed']
entities:
- sensor.abb_usage
card:
type: 'custom:hui-entities-card'
title: ABB Usage
show_header_toggle: false
entities:
- entity: sensor.abb_usage
name: "${'Last Update at' + '\xa0'.repeat(3) + new Date(vars[7]).toLocaleDateString('en-AU', {weekday: 'short', year: 'numeric', month: 'short', day: 'numeric'}) + '\xa0' + 'at' + '\xa0' + new Date(vars[7]).toLocaleTimeString('en-AU')}"
- entity: sensor.abb_usage
name: "${'Updated' + '\xa0'.repeat(14) + Number.parseInt((new Date().getTime() - new Date(vars[7])) / 60000) + '\xa0' + 'minutes ago'}"
icon: mdi:clock
- entity: sensor.abb_usage
name: "${var usedinfo= ((vars[5] - vars[6]) + Number.parseFloat(((new Date(vars[7]) - new Date().setHours(0,0,0,0)) / 86400000))).toFixed(2); var usedpercent= ((usedinfo / vars[5])*100).toFixed(2); 'Used' + '\xa0'.repeat(20) + usedinfo + '\xa0' + 'days' + '\xa0'.repeat(2) + '-' + '\xa0'.repeat(2) + usedpercent + '%' + '\xa0' + 'of month'}"
icon: mdi:calendar
- entity: sensor.abb_usage
name: "${var remaininfo= ((vars[5] - vars[9]) - Number.parseFloat(((new Date(vars[7]) - new Date().setHours(0,0,0,0)) / 86400000))).toFixed(2); var remainpercent= ((remaininfo / vars[5])*100).toFixed(2); 'Remaining' + '\xa0'.repeat(10) + remaininfo + '\xa0' + 'days' + '\xa0'.repeat(2) + '-' + '\xa0'.repeat(2) + remainpercent + '%' + '\xa0' + 'of month'}"
icon: mdi:calendar
- entity: sensor.abb_usage
name: "${var usedinfo= ((vars[5] - vars[6]) + Number.parseFloat(((new Date(vars[7]) - new Date().setHours(0,0,0,0)) / 86400000))).toFixed(2); var usedpercent= ((usedinfo / vars[5])*100).toFixed(2); var projected= ((vars[1] / usedpercent) / 10 ).toFixed(2); 'Projected Use' + '\xa0'.repeat(4) + projected + '\xa0' + 'GB'}"
icon: mdi:lan-connect
- entity: sensor.abb_usage
name: "${'Next Rollover' + '\xa0'.repeat(5) + new Date(vars[8]).toLocaleDateString('en-AU', {weekday: 'short', year: 'numeric', month: 'short', day: 'numeric'})}"
icon: mdi:calendar
- entity: sensor.abb_usage
name: "${'Today is Day' + '\xa0'.repeat(6) + ((vars[9] + 1)) + '\xa0'.repeat(2) + 'of' + '\xa0'.repeat(2) + vars[5] + '\xa0'.repeat(2) + 'days'}"
icon: mdi:calendar
- entity: sensor.abb_usage
name: "${'Downloaded' + '\xa0'.repeat(6) + ((vars[2]/1E3).toFixed(2)) + '\xa0' + 'GB' }"
icon: mdi:file-download
- entity: sensor.abb_usage
name: "${'Uploaded' + '\xa0'.repeat(11) + ((vars[3]/1E3).toFixed(2)) + '\xa0' + 'GB' }"
icon: mdi:file-upload
- entity: sensor.abb_usage
name: "${'Total' + '\xa0'.repeat(19) + (((vars[2] +vars[3]) / 1E3).toFixed(2)) + '\xa0' + 'GB of' + '\xa0' + (vars[4] =! 'null' ? vars[4] : 'Unlimited' + '\xa0' + 'GB')}"
icon: mdi:lan-connect
- type: 'custom:bar-card'
title: Month Used
entity: sensor.abb_usage
attribute: daysUsed
min: 1
max: sensor.abb_usage.attributes.daysTotal
height: 20px
direction: right
unit_of_measurement: days
Here’s what the card looks like:
Hope this will help someone else.