Python vraagje

Plaats reactie
Argon
Elite Poster
Elite Poster
Berichten: 1199
Lid geworden op: 21 mei 2007, 22:26
Uitgedeelde bedankjes: 18 keer
Bedankt: 41 keer

Hallo,

Ik ben wat aan het prusten met mijn Raspberry Pi en een Temp sensor. Ik volgde deze handleiding om de temperatuur uit te lezen en op te slaan in een Google spreadsheet: http://www.danielhansen.net/2013/03/ras ... using.html
Bij die persoon werkt zijn setup met 2 temp sensors, ik heb er maar eentje. Heb dus de code wat aangepast maar krijg toch telkens een foutmelding.

Dit is mijn huidige code

Code: Selecteer alles

#!/usr/bin/python3

import os, glob, time, gspread, sys, datetime

#Google account details
email = '[email protected]'
password = 'mijn.wachtwoord'
spreadsheet = 'Temperature_log' #the name of the spreadsheet already created

#attempt to log in to your google account
try:
    gc = gspread.login(email,password)
except:
    print('fail')
    sys.exit()

#open the spreadsheet
worksheet = gc.open(spreadsheet).sheet1

#initiate the temperature sensor
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

#set up the location of the sensor in the system
device_folder = glob.glob('/sys/bus/w1/devices/28-0000057bdd14')
device_file = [device_folder[0] + '/w1_slave']


def read_temp_raw(): #a function that grabs the raw temperature data from the sensor
    f_1 = open(device_file[0], 'r')
    lines_1 = f_1.readlines()
    f_1.close()
    return lines_1

def read_temp(): #a function that checks that the connection was good and strips out the temperature
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    temp = float(lines[1][equals_pos[0]+2:])/1000
    return temp

while True: #infinite loop
    temp = read_temp() #get the temp
    values = [datetime.datetime.now(), temp[0]]
    worksheet.append_row(values) #write to the spreadsheet
    time.sleep(600) #wait 10 minutes
Bij het uitvoeren krijg ik volgende foutmelding:

Code: Selecteer alles

Traceback (most recent call last):
  File "./temp.py", line 45, in <module>
    temp = read_temp() #get the temp
  File "./temp.py", line 41, in read_temp
    temp = float(lines[1][equals_pos[0]+2:])/1000
TypeError: 'int' object is not subscriptable
Er zit dus een fout in deze lijn:

Code: Selecteer alles

    temp = float(lines[1][equals_pos[0]+2:])/1000
Iemand die hier meer verstand van heeft dan mij? Ben momenteel een E-book over Python aan het doornemen en heb nog niet onmiddellijk iets bruikbaars gevonden...
Gebruikersavatar
honda4life
Elite Poster
Elite Poster
Berichten: 5659
Lid geworden op: 03 jan 2010, 21:42
Locatie: 127.0.0.1
Uitgedeelde bedankjes: 186 keer
Bedankt: 315 keer

Is helemaal niet zo moeilijk hoor, je maakt twee maal dezelfde fout.

Code: Selecteer alles

equals_pos = lines[1].find('t=')
Hier zoek je de startpositie van t= in lijn 1.
Hoe veel uitkomsten kan je hebben?
Slechts 1 hé, oké het kunnen er misschien wel meer zijn, maar denk niet dat er een standaard functie bestaat die al deze startposities voor jouw in een array steekt.

Code: Selecteer alles

temp = float(lines[1][equals_pos[0]+2:])/1000
Je zoekt in lijn 1 naar wat er achter t= staat, maar je hebt slechts 1 startpositie, waarom zou je dan een array met startposities hebben, zie uitleg hierboven.

Tip: float() / 1000 (geheel) is niet zo netjes vind ik persoonlijk. Daar maak je voor je eigen duidelijkheid beter 1000.0 van :wink:
Zo is de kans op fouten tussen reële en gehele getalbewerkingen veel kleiner.

Oplossing:

Code: Selecteer alles

temp = float(lines[1][equals_pos+2:])/1000.0

Code: Selecteer alles

values = [datetime.datetime.now(), temp[0]]
Heb je meer dan 1 temperatuur?

Oplossing:

Code: Selecteer alles

Nu zou je het antwoord reeds zelf moeten weten hé.
Heb zelf ook wat temperatuurlogging draaien naar Xively.
Een leuke van mij is deze: https://xively.com/feeds/127941/
Sterk XD kaartje van 32 MB aan het testen hoe veel cycles het afkan.
Een SD-kaartje (256 MB) heb ik er al aan gekregen na een dikke 100.000 cycles
Laatst gewijzigd door honda4life 06 maa 2014, 19:13, in totaal 1 gewijzigd.
✂ – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Astralon
Elite Poster
Elite Poster
Berichten: 3310
Lid geworden op: 26 jul 2005, 12:17
Locatie: Lochristi
Uitgedeelde bedankjes: 196 keer
Bedankt: 125 keer

Je hebt maar 1 waarde equals_pos

Dus

Code: Selecteer alles

temp = float(lines[1][equals_pos[0]+2:])/1000
moet zijn....

Code: Selecteer alles

temp = float(lines[1][equals_pos+2:])/1000
Tim.Bracquez
Elite Poster
Elite Poster
Berichten: 3202
Lid geworden op: 05 dec 2010, 15:09
Bedankt: 451 keer

Argon
Elite Poster
Elite Poster
Berichten: 1199
Lid geworden op: 21 mei 2007, 22:26
Uitgedeelde bedankjes: 18 keer
Bedankt: 41 keer

Perfect, bedankt aan allen!

Ik ga mij verder moeten verdiepen in die [] (wat jullie blijkbaar Array's noemen).

Terwijl we bezig zijn, ik vraag mij af of al die "lines" een variabele is die zelf aangemaakt wordt, of als het lines "commando" lid is van een andere functie?
Zelfde vraag voor die f_1 commando's. Is dit iets die de gebruiker zelf heeft uitgevonden, of terug lid van een andere functie?

Waarschijnlijk grote beginnersvragen, maar zoals reeds gemeld, ik ben mijn dik boek nog aan het doornemen ;-).

Edit: Resultaten worden nu inderdaad in Google Docs afgebeeld, maar de ene keer krijg ik de temp in dit formaat 20.185 en de volgende keer krijg ik die dan plots als 20758 . Blijkbaar doet de /1000.0 niet altijd zijn werk? Tips?
Gebruikersavatar
honda4life
Elite Poster
Elite Poster
Berichten: 5659
Lid geworden op: 03 jan 2010, 21:42
Locatie: 127.0.0.1
Uitgedeelde bedankjes: 186 keer
Bedankt: 315 keer

Je array kan je best vergelijken met een tabel.
Dit kan ook meer dan 1 dimensie hebben (denk maar aan Excel ofzo).
Je kan eenvoudig elementen selecteren en er iets met doen.
(Zie je "tekst" opsplitsen naar regels, toch erg eenvoudig zo)

Python is heel soepel op vlak van variabelen de declareren. Of dat een positieve zaak is buiten beschouwing geladen.
Het is zeer goed voor beginners, later zal je wellicht meer c / c++ kunnen appreciëren.

Je hebt een functie, neem nu open(), deze geeft een waarde terug van een bepaald type, deze waarde wil je bijhouden in variabele f_1 (een zelf gekozen naam dus), deze neemt dan hetzelfde type aan als de waarde die open() terug geeft.
f_1 bevat ook enkele "subfuncties", zoals die close(), dit is de tegenhanger van open().

Als je een bestand opent, moet je het ook sluiten hé om goed te zijn.
✂ – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
ubremoved_539
Deel van't meubilair
Deel van't meubilair
Berichten: 29849
Lid geworden op: 28 okt 2003, 09:17
Uitgedeelde bedankjes: 446 keer
Bedankt: 1985 keer

honda4life schreef:Je hebt een functie, neem nu open(), deze geeft een waarde terug van een bepaald type, deze waarde wil je bijhouden in variabele f_1 (een zelf gekozen naam dus), deze neemt dan hetzelfde type aan als de waarde die open() terug geeft.
f_1 bevat ook enkele "subfuncties", zoals die close(), dit is de tegenhanger van open().
Eigenlijk instantieer je een object (f1) waarbij oa. readlines() en close() een method is.
Gebruikersavatar
honda4life
Elite Poster
Elite Poster
Berichten: 5659
Lid geworden op: 03 jan 2010, 21:42
Locatie: 127.0.0.1
Uitgedeelde bedankjes: 186 keer
Bedankt: 315 keer

wou het nog wat begrijpbaar houden hé :wink:
✂ – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
ubremoved_539
Deel van't meubilair
Deel van't meubilair
Berichten: 29849
Lid geworden op: 28 okt 2003, 09:17
Uitgedeelde bedankjes: 446 keer
Bedankt: 1985 keer

honda4life schreef:wou het nog wat begrijpbaar houden hé :wink:
Meestal doe je dat door de dingen te noemen wat ze zijn :wink:

Door de dingen anders te noemen zorg je vaak voor verwarring (als de persoon verder gaat Google'n blijken dingen zich dan plots tegen te spreken).
Gebruikersavatar
honda4life
Elite Poster
Elite Poster
Berichten: 5659
Lid geworden op: 03 jan 2010, 21:42
Locatie: 127.0.0.1
Uitgedeelde bedankjes: 186 keer
Bedankt: 315 keer

Daar heb je wel een punt ja :wink:
✂ – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Plaats reactie

Terug naar “Development”