Search code examples
bashcsvbluetoothmonitor

Bash script? Manipulating & graphing collected data from a csv file


I'm trying to write a script that can detect my presence at home. So far I've written a script that outputs data from hcitool lescan into a csv file in the following format:

    TIMESTAMP MAC_ADDRESS_1 MAC_ADDRESS_2 AD_INFINITUM
    2018-09-22.11:48:34 FF:FF:FF:FF:FF:FF FF:FF:FF:FF:FF:FF FF:FF:FF:FF:FF:FF

I'm trying to figure out how to write a script to convert the data into a graphable format - is gnuplot the program to be used for this? I guess that this would require a bash? script that imports the csv file keeping all timestamps, then adding a new column into the array for each unique MAC address then populating the entries with a 1 or 0 depending if the Mac address is detected per line. Are there any built in commands that can do/help with this or would I have to script it myself?

The code I used to generate the .csv is here. Sorry, its probably not the prettiest as I've just only started with bash scripting.

    cd /home/pi/projects/bluetooth_control;
    while true
    do
        echo 'reset hci0';
        sudo hciconfig hci0 down;
        sudo hciconfig hci0 up;
        echo 'timestamp';
        echo `date +%Y-%m-%d.%H:%M:%S` &> test1.csv;
        echo 'running scan';
        (sudo timeout 20 stdbuf -oL hcitool lescan | grep -Eo '(([A-Z]|[0-9]){2}:){5}([A-Z]|[0-9]){2}') &> test.csv;
        echo 'removing duplicates to test.csv';
        (sort test.csv | uniq) >> test1.csv;
        (paste -s test1.csv) >> data.csv;
        echo 'sleep for 60s';
        sleep 60;
    done

Solution

  • I've had time to play around and in the interest of completing the answer here is the solution I came up with. I'm not sure how efficient it is to run it in Bash vs. Python but here goes:

    #!/bin/bash
    cd /home/pi/projects/bluetooth_control;
    while true
    do
    echo 'reset hci0';
    sudo hciconfig hci0 down;
    sudo hciconfig hci0 up;
    echo 'timestamp';
    
    # Create necessary temp files
    echo "temp" &> test1.csv;
    echo `date +%Y-%m-%d.%H:%M:%S` &> test2.csv;
    echo 'running scan';
    
    # Filter out only MAC addresses
    (sudo timeout 20 stdbuf -oL hcitool lescan | grep -Eo '(([A-Z]|[0-9]){2}:){5}([A-Z]|[0-9]){2}') &> /home/pi/projects/bluetooth_control/test.csv;
    echo 'removing duplicates to test.csv';
    
    # Append each unique value to test1.csv
    (sort test.csv | uniq) >> test1.csv;
    
    # For each line in test1.csv, add text to mac_database if it doesn't exist 
    while read line 
        do 
        grep -q -F $line mac_database || echo $line >> mac_database
    done <test1.csv 
    
    # For each line in mac_database, run an if loop
    while read line 
        do 
        # If $line from mac_database exists in test1.csv, then
        if grep -Fxq "$line" test1.csv
            then
                echo '1' >> test2.csv
            else
                echo '0' >> test2.csv
        fi
    done <mac_database
    
    # Convert file to csv format, and append to data.csv
    (paste -s test2.csv) >> data.csv;
    echo 'sleep for 60s';
    sleep 60;
    done
    

    Hopefully this helps whoever might choose to do this in the future.