#!/bin/bash # Christopher Jones # x10sqliteadaptor.sh # 03/14/2014 # Handles sensor status data in sqlite database. ## Global Variables ############### # SQLITE Location SQLITEDB="/.security/security" # SQLITE Execution Location SQLITEEXEC="/run/shm/security" # Variable used for comparison comparedata="" # SQLITE3 field seperator SQLSEP='|' # end Global Variables ############ ## Functions ###################### find_in(){ local STRING=${1}; local ARRAY=(${2}); for str in ${ARRAY[@]}; do if [[ ${str##*"$SQLSEP"} == $STRING ]]; then FOUND=${str%"$SQLSEP"*} echo "$FOUND" #echo $str break fi done } # end find_in ################################## # Copy database into ramdrive to execute in memory rsync -u $SQLITEDB $SQLITEEXEC # Read data in data from database ##Get current sensors from database currentsensorstmp=$(sqlite3 $SQLITEEXEC 'select sensor_id from sensors') currentsensors=($currentsensorstmp) ##Get sensor types from database sensortypestmp=$(sqlite3 $SQLITEEXEC 'select sensor_type, sensor_name from sensortypes') sensortypes=($sensortypestmp) ##Get status data from database sensorstatustmp=$(sqlite3 $SQLITEEXEC 'select * from status') sensorstatuses=($sensorstatustmp) # Connect to TCP socket at mochad host and port 1099 on handle 6. exec 6<>/dev/tcp/localhost/1099 while read <&6; do inputdata="$REPLY" # Parse only rf security events and parse out on/off commands if [[ $inputdata =~ "RFSEC" ]] && [[ $inputdata != *"_On_"* ]] && [[ $inputdata != *"_Off_"* ]]; then # if data has not changed wait if [ "$comparedata" == "$inputdata" ]; then sleep 1 # Once data has changed, start parsing else comparedata="$inputdata" DATETIME=$(echo "$inputdata" | cut -d" " -f1-2) SENSORID=$(echo "$inputdata" | cut -d" " -f6) # Added support for rf remotes (KR10A, SH624..etc) SENSORSTATUS=$( if [[ $inputdata =~ "Arm" ]] || [[ $inputdata =~ "Disarm" ]] || [[ $inputdata =~ "Panic" ]]; then # Pull Arm/Disarm/Panic Status #Check for Home and Away options if [[ $inputdata =~ "Home" ]] || [[ $inputdata =~ "Away" ]]; then echo "$inputdata" | cut -d" " -f8 | cut -d"_" -f1-2 else echo "$inputdata" | cut -d" " -f8 | cut -d"_" -f1 fi else # Pull Sensor Status (alert/normal..etc) echo "$inputdata" | cut -d"_" -f2 fi ) SENSORTYPE=$(echo ${inputdata##*_}) # Parse Low Battery Status (Ds10A..etc) SENSORBATTERY=$( if [[ $inputdata =~ "low" ]]; then echo "low" else echo "" fi ) echo ":$SENSORID:$SENSORSTATUS:$SENSORTYPE:$DATETIME:" if [[ ${currentsensors[@]} != "" ]] && [[ ${currentsensors[@]} =~ "$SENSORID" ]]; then # Update Pre-existing Sensor echo "$SENSORID already in database updating status" STATUSID=$( find_in "${SENSORSTATUS}" "${sensorstatuses[*]}" ) if [ "$STATUSID" == "" ]; then case "$SENSORSTATUS" in # SET ALARM STATUS TO ARM Arm) echo "Arming Alarm." #sqlite3 $SQLITEEXEC "update alarmstatus set alarm_mode='',last_update='$DATETIME'" #rsync -u $SQLITEEXEC $SQLITEDB ;; # SET ALARM STATUS TO ARM_HOME Arm_Home) echo "Arming Home Alarm." #sqlite3 $SQLITEEXEC "update alarmstatus set alarm_mode='',last_update='$DATETIME'" #rsync -u $SQLITEEXEC $SQLITEDB ;; # SET ALARM STATUS TO ARM_AWAY Arm_Away) echo "Arming Away Alarm." #sqlite3 $SQLITEEXEC "update alarmstatus set alarm_mode='',last_update='$DATETIME'" #rsync -u $SQLITEEXEC $SQLITEDB ;; # SET ALARM STATUS TO DISARM Disarm) echo "Disarm Alarm." #sqlite3 $SQLITEEXEC "update alarmstatus set alarm_mode='',last_update='$DATETIME'" #rsync -u $SQLITEEXEC $SQLITEDB ;; # SET ALARM STATUS TO PANIC Panic) echo "Panic! Alarm." #sqlite3 $SQLITEEXEC "update alarmstatus set alarm_mode='',last_update='$DATETIME'" #rsync -u $SQLITEEXEC $SQLITEDB ;; # Handle else cases *) echo "Status unknown: $SENSORSTATUS" STATUSID=$( find_in "unknown" "${sensorstatuses[*]}" ) ;; esac else echo "$STATUSID" fi # Update sensor #need to add battery status to database .schema then addd to statement* sqlite3 $SQLITEEXEC "update sensors set sensor_status='$STATUSID',sensor_last_update='$DATETIME' where sensor_id='$SENSORID'" else # Insert New Sensor Found # Handle Sensor Types echo "New sensor, adding to database: $SENSORID" TYPEID=$( find_in "${SENSORTYPE}" "${sensortypes[*]}" ) if [ "$TYPEID" == "" ]; then echo "No Match for Sensor type: $SENSORTYPE" sqlite3 $SQLITEEXEC "insert into sensortypes (sensor_name,sensor_description) values('$SENSORTYPE','Unknown');"; sensortypestmp=$(sqlite3 $SQLITEEXEC 'select sensor_type, sensor_name from sensortypes') sensortypes=($sensortypestmp) TYPEID=$( find_in "${SENSORTYPE}" "${sensortypes[*]}" ) else echo "$TYPEID" fi # Handle Status ID's STATUSID=$( find_in "${SENSORSTATUS}" "${sensorstatuses[*]}" ) if [ "$STATUSID" == "" ]; then echo "Status Unknown: $SENSORSTATUS" STATUSID=$( find_in "unknown" "${sensorstatuses[*]}" ) else echo "$STATUSID" fi # Insert new sensor into database #need to add battery status to database .schema then addd to statement* sqlite3 $SQLITEEXEC "insert into sensors (sensor_id,sensor_locationid,sensor_type,sensor_status,sensor_last_update) values ('$SENSORID','0','$TYPEID','$STATUSID','$DATETIME');" # Update Variable currentsensorstmp=$(sqlite3 $SQLITEEXEC 'select sensor_id from sensors') currentsensors=($currentsensorstmp) echo ${currentsensors[@]} fi fi fi sleep 1 done rsync -u $SQLITEEXEC $SQLITEDB #table schema # SENSOR TYPE #0 1 2 #unknown DS10A MS10A # SENSOR STATUS #0 1 2 #normal alert unknown #test data #12/20 11:53:58 Rx RFSEC Addr: EF:43:80 Func: Contact_alert_min_low_DS10A