A long while ago I got myself a Geiger counter, soldered it together, stored it in a drawer, and forgot about it for literally more than a year. However, once I found it again, I did the only thing that could be done - I connected it to a computer and decided to track its values.
My default approach would usually be to create an application to track it. But, since I connected it to a Linux server, it seemed appropriate to merge this functionality into a bash script that already sends ZFS data to my telegraf server.
Since my Geiger counter has UART output, the natural way of collecting its output under Linux was a simple cat
command:
cat /dev/ttyUSB0
That gave me a constant output of readings, about once a second:
CPS, 0, CPM, 12, uSv/hr, 0.06, SLOW
CPS, 1, CPM, 13, uSv/hr, 0.07, SLOW
CPS, 0, CPM, 13, uSv/hr, 0.07, SLOW
CPS, 1, CPM, 14, uSv/hr, 0.07, SLOW
CPS, 1, CPM, 15, uSv/hr, 0.08, SLOW
CPS, 0, CPM, 15, uSv/hr, 0.08, SLOW
In order to parse this line easier, I wanted two things. First, to remove extra empty lines caused by CRLF line ending, and secondly to have all values separated by a single space. Simple adjustment sorted that out:
cat /dev/ttyUSB0 | sed '/^$/d' | tr -d ','
While this actually gave me a perfectly usable stream of data, it would never exit. It would just keep showing new data. Perfectly suitable for some uses, but I wanted my script just to take the last data once a minute and be done with it. And no, you cannot just use tail
command alone for this - it needs to be combined with something that will stop the stream - like timeout
.
timeout --foreground 1 cat /dev/ttyUSB0 | sed '/^$/d' | tr -d ',' | tail -1
If we place this into a variable, we can extract specific values - I just ended up using uSv/h
but the exact value might depend on your use case.
OUTPUT=`timeout --foreground 1 cat /dev/ttyUSB0 | sed '/^$/d' | tr -d ',' | tail -1`
CPS=`echo $OUTPUT | awk '{print $2}'`
CPM=`echo $OUTPUT | awk '{print $4}'`
USVHR=`echo $OUTPUT | awk '{print $6}'`
MODE=`echo $OUTPUT | awk '{print $7}'`
With those variables in hand, you can feed whatever upstream data sink you want.