2019-03-02 15:57:06 +00:00
#!/bin/bash
2019-03-03 20:10:50 +00:00
# edl21.sh reads data from the EDL21 electricity meter and writes it up to a MySQL/MariaDB.
# https://code.hw12.org/tilman/edl21
#
# Version 0.5 - 03.03.2019
#
# License GPL3.0 or later
# https://code.hw12.org/tilman/edl21/src/branch/master/LICENSE
#Device configuration
2019-03-02 15:57:06 +00:00
INPUT_DEV = "/dev/ttyUSB0" ;
stty -F $INPUT_DEV 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
2019-03-03 20:10:50 +00:00
#Log file and temporary txt.
2019-03-02 15:57:06 +00:00
FILE = $PFAD "/" $DATE ."txt" ;
LOG = $PFAD "/edl.log" ;
2019-03-03 20:10:50 +00:00
PFAD = $( dirname " $( readlink -e " $0 " ) " ) ;
2019-03-02 15:57:06 +00:00
2019-03-03 20:10:50 +00:00
#Database
DB_USER = "dbuser" ;
DB_PASS = "dbpasswd" ;
DB_HOST = "dbhost" ;
DB_NAME = "dbname" ;
DB_TAB = "dbtable" ;
2019-03-02 15:57:06 +00:00
2019-03-03 20:10:50 +00:00
#Get date and round to nearest 5min (for harmonized use with data from other scripts in pChart)
DATE_RAW = $( /bin/date +%s) ;
DATE = $( /bin/date -d @$DATE_RAW "+%Y-%m-%d %H:%M:%S" ) ;
DATE_N5M = $( echo " ( $DATE_RAW % 300) " | bc) ;
if [ $DATE_N5M -lt 150 ] ; then
DATE_N5M = $( echo " ( $DATE_RAW - ( $DATE_RAW % 300)) " | bc) ;
else
DATE_N5M = $( echo " ( $DATE_RAW - ( $DATE_RAW % 300) + 300) " | bc) ;
fi
DATE_N5M = $( /bin/date -d @$DATE_N5M "+%Y-%m-%d %H:%M:%S" ) ;
#Starting sequence
2019-03-02 15:57:06 +00:00
SEQ_START = "1B1B1B1B01010101" ;
2019-03-03 20:10:50 +00:00
#Ending sequence
2019-03-02 15:57:06 +00:00
SEQ_END = "001B1B1B1B1A00" ;
2019-03-03 20:10:50 +00:00
#Start of counter 1.8.0 (incoming active energy)
2019-03-02 15:57:06 +00:00
SEQ_180 = "070100010800FF" ;
2019-03-03 20:10:50 +00:00
#Start of counter 2.8.0 (outgoing acive energy)
2019-03-02 15:57:06 +00:00
SEQ_280 = "070100020800FF" ;
2019-03-03 20:10:50 +00:00
#Start of actual aktive power
2019-03-02 15:57:06 +00:00
SEQ_PWR = "070100100700FF" ;
2019-03-03 20:10:50 +00:00
#Max possiple power value as mark of power direction
2019-03-02 15:57:06 +00:00
INOUT = 2147483647;
2019-03-03 20:10:50 +00:00
#Read from device
2019-03-02 15:57:06 +00:00
cat $INPUT_DEV 2>/dev/null | xxd -p -u -l 600 1> $FILE ;
2019-03-03 20:10:50 +00:00
#Delete line breaks
2019-03-02 15:57:06 +00:00
STRING = ` tr -d "\n" < $FILE ` ;
2019-03-03 20:10:50 +00:00
#Find first starting sequence forwards and delete everything before
2019-03-02 15:57:06 +00:00
STRING = ${ STRING #* $SEQ_START } ;
2019-03-03 20:10:50 +00:00
#Find last ending sequence backwards and delete everything behind
2019-03-02 15:57:06 +00:00
STRING = ${ STRING %% $SEQ_END * } ;
2019-03-03 20:10:50 +00:00
#Identify incoming active energy value and transform from hex to decimal
2019-03-02 15:57:06 +00:00
STRING_180 = ${ STRING #* $SEQ_180 } ;
let STRING_180 = 0x${ STRING_180 : 20 : 10 } ;
2019-03-03 20:10:50 +00:00
#Identify outgoing active energy value and transform from hex to decimal
2019-03-02 15:57:06 +00:00
STRING_280 = ${ STRING #* $SEQ_280 } ;
let STRING_280 = 0x${ STRING_280 : 20 : 10 } ;
2019-03-03 20:10:50 +00:00
#Identify active power value and transform from hex to decimal.
2019-03-02 15:57:06 +00:00
STRING_PWR = ${ STRING #* $SEQ_PWR } ;
let STRING_PWR = 0x${ STRING_PWR : 14 : 8 } ;
2019-03-03 20:10:50 +00:00
#Calculate direction of active power and convert in W (Watt)
2019-03-02 15:57:06 +00:00
if [ $STRING_PWR -gt $INOUT ] ; then
STRING_PWR_OUT = $( echo " (4294967295 - $STRING_PWR ) / (10) " | bc) ;
STRING_PWR_IN = 0;
else
STRING_PWR_IN = $( echo " $STRING_PWR / 10 " | bc) ;
STRING_PWR_OUT = 0;
fi
2019-03-03 20:10:50 +00:00
#Convert both active energy values in Wh (Watt hours)
2019-03-02 15:57:06 +00:00
STRING_180 = $( echo " scale=4; $STRING_180 / 10 " | bc) ;
STRING_280 = $( echo " scale=4; $STRING_280 / 10 " | bc) ;
2019-03-03 20:10:50 +00:00
#Write to log file
echo $DATE ";" $DATE_N5M ";" $STRING_180 ";" $STRING_280 ";" $STRING_PWR_IN ";" $STRING_PWR_OUT >> $LOG ;
2019-03-02 15:57:06 +00:00
2019-03-03 20:10:50 +00:00
#Send data to database
2019-03-02 15:57:06 +00:00
mysql -u $DB_USER -p$DB_PASS -h $DB_HOST -D $DB_NAME <<EOF
2019-03-03 20:10:50 +00:00
INSERT INTO $DB_TAB ( TimeStamp,Nearest5min,zaehlerstand_in,zaehlerstand_out,active_in,active_out) VALUES ( '$DATE' ,'$DATE_N5M' ,'$STRING_180' ,'$STRING_280' ,'$STRING_PWR_IN' ,'$STRING_PWR_OUT' ) ;
2019-03-02 15:57:06 +00:00
EOF
2019-03-03 20:10:50 +00:00
#Delete temporary file
2019-03-02 15:57:06 +00:00
rm $FILE ;