Home Monitor Conversion
I finally have some ‘free’ time so i upgraded a few things on the pi server but not without issues,
From jessie to stretch - network drive
For some reason the old command for mounting a network drive on the pi which worked on jessie did not work under stretch. I kept getting a host is down
fault yet it was clearly not. The line i had in fstab before was;
//192.168.1.1/Drive /media/nas_documents cifs credentials=/home/drakx/.nas_credentials,sec=ntlmv2,uid=1000,gid=1000,iocharset=utf8 0 0
trying combinations of this and even removing the credentials requirement still failed to mount. Eventually after much searching it appears that it is to do with nltm versions, the following worked;
sudo mount --verbose -t cifs -o sec=ntlm,username=****,password=****,vers=1.0 //192.168.1.1/location /mnt/nas_files
but honestly i dont understand it and need to go away and investigate but for now the drive is mapped and i’ve other things to look at.
dragelec to python3
Dragelec is still alive and going strong, i’ve now added code to have all data put into an sql database and converted to python3 which had its own peculiarities.
sql code to create the database
The following creates the database file with the required fields.
python code snippet start
sqlite_file = '/mnt/usbkey/home_mon_db.sqlite'
myfile = Path(sqlite_file)
if myfile.is_file():
# file exists
print('file exists')
else:
tn = 'home_mon'
# Connecting to the database file
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
# create table
c.execute('CREATE TABLE {tn} ({nf} {ft} PRIMARY KEY AUTOINCREMENT)'.format(tn='home_mon', nf='IDX', ft='INTEGER') )
c.execute("ALTER TABLE {tn} ADD COLUMN '{cn}' {ct}".format(tn='home_mon', cn="DATE", ct='DATE'))
c.execute("ALTER TABLE {tn} ADD COLUMN '{cn}' {ct}".format(tn='home_mon', cn="TIME", ct='TIME'))
c.execute("ALTER TABLE {tn} ADD COLUMN '{cn}' {ct}".format(tn='home_mon', cn="EXTERNAL", ct='REAL'))
c.execute("ALTER TABLE {tn} ADD COLUMN '{cn}' {ct}".format(tn='home_mon', cn="FRONTROOM", ct='REAL'))
c.execute("ALTER TABLE {tn} ADD COLUMN '{cn}' {ct}".format(tn='home_mon', cn="BEDROOM", ct='REAL'))
c.execute("ALTER TABLE {tn} ADD COLUMN '{cn}' {ct}".format(tn='home_mon', cn="KITCHEN", ct='REAL'))
python code snippet end
sql code to write data in
Code used to update the database, this is run everytime i get an input from one of the sensors
python code snippet start
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
c.execute("INSERT INTO {tn}(DATE,TIME,EXTERNAL,FRONTROOM,BEDROOM,KITCHEN) VALUES(?,?,?,?,?,?)".format(tn='home_mon'), (d_now, t_now, sensordict.get('AC'), sensordict.get('AB'), sensordict.get('AE'), sensordict.get('AD')))
conn.commit()
conn.close()
python code snippet end
python3 and the decode ‘b’
a change that caught me out was the change in how python handles incoming strings when read from the serial port previously i could simply read the incoming and assign direct to a dictionary or variable as python2 ignored the preceeding letter ie the received string looked like;
b'aAETMPA12.45'
reading the python documentation;
verse code snippet start
A prefix of 'b' or 'B' is ignored in Python 2; it indicates that the literal should become a bytes literal in Python 3 (e.g. when code is automatically converted with 2to3). A 'u' or 'b' prefix may be followed by an 'r' prefix.
verse code snippet end
So python2 ignored it but under python3 i need to decode it hence;
python code snippet start
llapMsg= ser.read(n)
sensordict['msg']=(llapMsg.decode('utf8'))
python code snippet end
So dragelec is back up and running with a new sql backend and under python3 next jobs are to improve the decode routine to handle false inputs and of course extract data from the backend for display on the server site.