I have a file/data I can fetch via curl. It returns something like this:
<usage>
<down1>436710585066</down1>
<up1>92408242773</up1>
<allowance1_mb>100000000</allowance1_mb>
<left1>99470881172161</left1>
<down2>0</down2>
<up2>0</up2>
<allowance2_mb>0</allowance2_mb>
<left2>0</left2>
<lastupdated>2019-03-22 13:57:03</lastupdated>
<rollover>6</rollover>
</usage>
It’s longer than 255 characters so I can’t read it in.
How would I go about making this a sensor with attributes?
the command is this:
"curl -c cookie.txt -b cookie.txt -sf -L -d 'login_username=***redact***' -d 'login_password=***redact***' --url 'https://my.aussiebroadband.com.au/usage.php?xml=yes'"
1 Like
Jman
March 22, 2019, 3:51am
2
Hi @DavidFW1960
I was able to do something similar with the command_line sensor (may need to install jq)
- platform: command_line
command: 'curl -s -m 20 -H "Content-Type: application/json" -X GET http://192.168.1.x/solar_api/v1/GetPowerFlowRealtimeData.fcgi | jq .Body.Data.Site'
name: power_solar
unit_of_measurement: 'W'
json_attributes:
- E_Day
- P_Grid
- P_Load
- rel_Autonomy
- rel_SelfConsumption
value_template: '{{ value_json.P_PV |int }}'
scan_interval: 20
command_timeout: 30
I hope that helps
I just edited to include the curl command (from secrets file)… Not sure it can be adapted as you have done…
Thanks for responding
Jman
March 22, 2019, 4:19am
4
Can you request the data in json instead of xml? That would make it more straightforward
‘https://my.aussiebroadband.com.au/usage.php?json=yes ’"
Jman
March 22, 2019, 5:22am
6
I found this little python script, which seems to do the job
import xmltodict
import pprint
import json
with open(testdata.xml) as fd:
doc = xmltodict.parse(fd.read())
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))
Nice… I was in the process of writing a bash script to reformat the file (I made the back curl write to a file)
Can you show me how I’d configure that python script to create a sensor with attributes?
Jman
March 22, 2019, 6:04am
8
Sorry, that’s beyond my copy and paste skills
I was able to come up with this in bash, but I can’t get the braces at first and last character
| grep -oP '<.+?<'|cut -d\> -f1-2 --output-delimiter='": "'|cut -d\< -f1-4 --output-delimiter='"'
I can write the data to a json file no problem… but what then?
Jman
March 22, 2019, 6:50am
10
How about using the HTTP sensor ?
It lets you use curl to post your json data and create the sensor
So in my bash script, these extra lines:
grep "down1" /config/abbusage.log | sed 's/<down1>/{"download":/g' | sed 's/<[/]down1>/}/g' > /config/abbdownload.log
grep "up1" /config/abbusage.log | sed 's/<up1>/{"upload":/g' | sed 's/<[/]up1>/}/g' > /config/abbupload.log
grep "allowance1_mb" /config/abbusage.log | sed 's/<allowance1_mb>/{"allowance":/g' | sed 's/<[/]allowance1_mb>/}/g' > /config/abballowance.log
grep "lastupdated" /config/abbusage.log | sed 's/<lastupdated>/{"updated":"/g' | sed 's/<[/]lastupdated>/"}/g' | sed 's/[ ]/T/g' | sed 's/T{/ {/g' > /config/abbupdated.log
grep "rollover" /config/abbusage.log | sed 's/<rollover>/{"rollover":/g' | sed 's/<[/]rollover>/}/g' > /config/abbrollover.log
Then I can use a file sensor like this:
# ABB Usage
- platform: file
name: "ABB Allowance"
file_path: /config/abballowance.log
value_template: '{{ value_json.allowance }}'
- platform: file
name: "ABB Download"
file_path: /config/abbdownload.log
value_template: '{{ value_json.download }}'
- platform: file
name: "ABB Upload"
file_path: /config/abbupload.log
value_template: '{{ value_json.upload }}'
- platform: file
name: "ABB Last Updated"
file_path: /config/abbupdated.log
value_template: '{{ value_json.updated }}'
- platform: file
name: "ABB Rollover"
file_path: /config/abbrollover.log
value_template: '{{ value_json.rollover }}'
And
homeassistant:
# Whitelisted Directories
whitelist_external_dirs:
- /config
shell_command:
abbusagemeas: /bin/bash /config/abbusage.sh
Automation to read usage
- id: 'readabbusage'
alias: Update ABB Usage
trigger:
- event: start
platform: homeassistant
- platform: time_pattern
minutes: '/15'
action:
- service: shell_command.abbusagemeas
initial_state: 'true'
Now onto Lovelace…
So bummed the file sensor only reads the last line of the file… so I had to break it up…
I have a python that reads a json, also for a sensor… If still interested
Of course… the sucky way I’ve done it… totally open to a better way… It reads a JSON file right? Yes please
look at this post, i am using that one also to change the state of a switch in my case, based on a json value that i read
the python also includes logging in, thats not needed for you i think? so you need to drop some code
I used @fanaticDavid 's example and created a way to toggle the home mode in the Surveillance Station. I don’t want to have my cameras recording while I’m at home. Using home mode makes it easy to change the recording settings of all cameras with a single switch.
synology_home_mode.py:
#!/usr/bin/python3
import sys
import requests
import json
PROTOCOL = "http"
IP_ADDRESS = "XXX.XXX.XXX.XXX" #your Synology NAS ip address
PORT = "XXXX" #the port used by Synology DiskSta…
For working with xml I recommend xmltodict . However you can probably use https://www.home-assistant.io/components/sensor.scrape/
The problem is I don’t see any way to read a from a file - only a URL and I don’t see any way of converting the xml I am getting from the URL and reading it as a attribute for a sensor…
I think you have 2 sensible options:
Custom bash/python/whatever script
Fork the scrape sensor and modify for parsing an xml file -> maybe check on github incase anyone created a custom component for this already
Not a bad idea Rob… I might see if that’s feasible…