I have bin searching a solution for my question but didn't find a or better said I did not get it with what I found.
So lets talk about what my problem is about.
I am using a Smart Home Control Software on a Raspberry Pi and as I found out this weekend using pilight-receive I can catch the data from my outdoor temperature sensor. The output of pilight-receive looks like that:
{
"message": {
"id": 4095,
"temperature": 409.5
},
"origin": "receiver",
"protocol": "alecto_wsd17",
"uuid": "0000-b8-27-eb-0f3db7",
"repeats": 3
}
{
"message": {
"id": 1490,
"temperature": 25.1,
"humidity": 40.0,
"battery": 1
},
"origin": "receiver",
"protocol": "alecto_ws1700",
"uuid": "0000-b8-27-eb-0f3db7",
"repeats": 3
}
{
"message": {
"id": 2039,
"temperature": 409.5
},
"origin": "receiver",
"protocol": "alecto_wsd17",
"uuid": "0000-b8-27-eb-0f3db7",
"repeats": 4
}
Now my question to you:
How the heck can I extract the temperature and humidity from where the id is 1490. And how would you recommend me to do check this frequently? By a cron job that runs every 10 minutes, creates an output of the pilight-receive, extracts the data of the output and pushes it to the Smart Home Control Api.
Someone having an idea – thanks a lot
Best Answer
You can use
jq
to process json files in shell.For example, I saved your sample json file as
raul.json
and then ran:jq is available pre-packaged for most linux distros.
There's probably a way to do it in
jq
itself, but the simplest way I found to get both the wanted values on one line is to usexargs
. For example:or, if you want to loop through each
.message.id
instance, we can add.message.id
to the output and usexargs -n 3
as we know that there will be three fields (id, temperature, humidity):You could then post-process that output with awk or whatever.
Finally, both python and perl have excellent libraries for parsing and manipulating json data. As do several other languages, including php and java.