Raspberry Pi, OWFS och Python
Postat: 13 augusti 2017, 19:16:14
Hej, har suttit och lekt lite med en rpi i helgen och tänkte dela med mig lite av vad jag gjort. Fäljer man guider hur man startar ett 1wire nät blir det för det mesta en blandning av av olika skriptspråk, sh-skript, perl m.m. Tänkte att det går väl att göra det mesta i python som utmaning. Satte upp en jessie lite dist och satte igång.
Installerade först python-rrdtool, python-supervisor och python-webpy med apt-get.
Sen en fil som loggar temp från en ds18s20. (Skapa en katalog under /home/pi som heter rrd först):
Sen dags för en graf. Lika bra att publicera den på en html sida direkt (Skapa en katalog som heter images under /home/pi/ också):
Vidare för att få skripten att gå använde jag supervisor och en conf-fil under /etc/supervisor/conf.d som heter owtemp.conf t.ex:
Owtemp_web startar och lägger ut en sida under port 80 (skriver man inget blir det 8080).
Det enda jag inte fått att fungera är att starta owfs med supervisor. Gissar att jag får lägga upp en autostart i /etc/inet.d för den även om målet var att undvika sh-skript...
Nästa steg blir att ta in 1wire via GPIO isf med USB.
/M
Installerade först python-rrdtool, python-supervisor och python-webpy med apt-get.
Sen en fil som loggar temp från en ds18s20. (Skapa en katalog under /home/pi som heter rrd först):
Kod: Markera allt
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#owtemp.py. This script prints the measured temperature in C and updates every minute.
import time
import os
import rrdtool
rrd_file_name=os.path.join("/","home","pi","rrd","rrdfil.rrd")
file_name=os.path.join("/","mnt","1wire","10.BA6B13020800","temperature") #Byt till egen adress på ds18s20 givare här
while 1:
file_object=open(file_name,'r')
line=file_object.read()
#print(line+'°C')
rrdtool.update(rrd_file_name,'N:'+line)
last = rrdtool.last(rrd_file_name)
#print('Senaste: '+ time.strftime('%Y-%m-%d %H:%M',time.localtime(last)))
file_object.close()
time.sleep(60)
Kod: Markera allt
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#owtemp_graph.py. RRDTOOL graph.
import os
import rrdtool
import tempfile
import locale
import web
locale.setlocale(locale.LC_ALL, 'sv_SE.UTF-8')
def makeGraph():
rrd_file_name=os.path.join("/","home","pi","rrd","rrdfil.rrd")
fd,path = tempfile.mkstemp('.png')
rrdtool.graph('./images/3h.png',
'--imgformat', 'PNG',
'--width', '540',
'--height', '100',
'--start','end-3h',
'--font','DEFAULT:0:arial',
'--font','WATERMARK:8:arial',
'--color', 'MGRID#00BFFFAA',
'--color', 'ARROW#000000',
'--vertical-label', 'Temp [°C]',
'--title', 'En liten titel (Tre timmar)',
'--watermark','Egen vattenstämpel',
'DEF:utetemp=./rrd/rrdfil.rrd:utetemp:AVERAGE',
'AREA:utetemp#87CEFA',
'COMMENT:\t\t\tNu Medel Max Min\\n',
'LINE1:utetemp#1E90FF:Ute\t\t',
'GPRINT:utetemp:LAST:%6.1lf',
'GPRINT:utetemp:AVERAGE:%6.1lf',
'GPRINT:utetemp:MAX:%6.1lf',
'GPRINT:utetemp:MIN:%6.1lf\\n')
urls = (
'/', 'index',
'/images/(.*)', 'images' #this is where the image folder is located....
)
class index:
def GET(self):
makeGraph()
webString = "<html>\n<head></head>\n<body>\n"
webString += " <h1>Temp</h1>\n <img src='/images/3h.png' border=0>\n"
webString += "</body>\n</html>"
return webString
class images:
def GET(self,name):
ext = name.split(".")[-1] # Gather extension
cType = {
"png":"images/png",
"jpg":"images/jpeg",
"gif":"images/gif",
"ico":"images/x-icon" }
if name in os.listdir('images'): # Security
web.header("Content-Type", cType[ext]) # Set the Header
return open('images/%s'%name,"rb").read() # Notice 'rb' for reading images
else:
raise web.notfound()
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
Kod: Markera allt
[program:owtemp]
command=/usr/bin/python /home/pi/owtemp.py
directory=/home/pi
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/owtemp/owtemp.err.log
stdout_logfile=/var/log/owtemp/owtemp.out.log
user=root
[program:owtemp_web]
command=/usr/bin/python /home/pi/owtemp_web.py 80
directory=/home/pi
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/owtemp/owtemp_web.err.log
stdout_logfile=/var/log/owtemp/owtemp_web.out.log
user=root
Det enda jag inte fått att fungera är att starta owfs med supervisor. Gissar att jag får lägga upp en autostart i /etc/inet.d för den även om målet var att undvika sh-skript...
Nästa steg blir att ta in 1wire via GPIO isf med USB.
/M