Raspberry Pi, OWFS och Python

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
brrmek
Inlägg: 51
Blev medlem: 26 maj 2012, 23:27:37
Ort: Ursviken

Raspberry Pi, OWFS och Python

Inlägg av brrmek »

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):

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)
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å):

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()
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:

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
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
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: Raspberry Pi, OWFS och Python

Inlägg av Lennart Aspenryd »

Alltid tacksamt att få följa en tanke och gärning för något praktiskt.
Så fortsätt gärna med beskrivningen!
Och TS, glöm inte bilder!
Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: Raspberry Pi, OWFS och Python

Inlägg av Oltronix »

Spännande!
Jag har en applikation som anväder 1-wiregivare, owfs, sh, rddtool och webserver. Hade tänkt ändra dataformateringen till python. Du har gått hela vägen och skrivit allt i python. Det blir mycket mer kompakt och lättläst. Finns det inget pythonbibliotek även för owfs?
Har det hänt något mer sedan ditt första inlägg?
brrmek
Inlägg: 51
Blev medlem: 26 maj 2012, 23:27:37
Ort: Ursviken

Re: Raspberry Pi, OWFS och Python

Inlägg av brrmek »

Lite mer har jag haft tid att labba med pajen. Har installerat openhabian på en liten zero w och satt upp stöd för 1-wire (utan owserver)

1. Lägg till raden "dtoverlay=w1-gpio-pullup,gpiopin=4" i filen /boot/config.txt (som sudo) och starta om pajen.
2. Anslut en 1-wire komponent t.ex. en DS18B20 tempgivare. 3v3 (pin 0), GND (pin6) och DQ till GPIO4 (pin7). Pin hittar du här https://pinout.xyz/pinout/1_wire#
3. Gå till katalogen "cd /sys/bus/w1/devices/" och lista innehållet (ls -l). Har du gjort rätt ska det finnas en katalog med samma namn som adressen till din 1-wirekomponent.
4. Gå till den katalogen, i mitt fall "cd 28-224887000900" och skriv kommandot "cat w1_slave". Du bör få ett svar i stil med detta:

Kod: Markera allt

9a 00 fe cb 7f ff 06 10 8e : crc=8e YES
9a 00 fe cb 7f ff 06 10 8e t=9625
Här är temperaturen 9.625°C. Lite kallt men det beror nog på att jag köpt en dålig givare från Kina.

Finns en sida med pythonkod här som jag tittat på: http://www.waveshare.com/wiki/Raspberry ... B20_Sensor
Provade bara att klistra in pythonkoden i en fil ds18b20.py i hemmakatalogen och resultatet när jag exekverade blev:

Kod: Markera allt

[16:07:23] openhabian@openHABianPi:~$ python ./ds18b20.py
 rom: 28-224887000900

 C=9.625  F=49.325
 C=9.625  F=49.325
 C=9.687  F=49.437
Detta tillsammans med det jag gjort tidigare borde man kunna sätta ihop till en helhet och få en förenklad publicering av t.ex. temperatur utan att installera apache/perl etc.

/M
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Raspberry Pi, OWFS och Python

Inlägg av lillahuset »

Ett litet tips kan vara att skapa en RAM-disk och skriva webbsidorna till om du inte har behov att spara dem. Iofs kanske du loggar så sällan att det inte sliter speciellt på SD-kortet.
Skriv svar