» »

Pomoč pri izdelavi Python skripte

Pomoč pri izdelavi Python skripte

«
1
2

zvmk ::

Zivjo,

Potreboval bi pomoč pti izdelavi python skripte.
Zakaj točno gre. Imam vmesnik Moteino ( http://lowpowerlab.com/)katerega mislim priključiti na vodomer. Z komando screen /dev/ttyAMA0 115200,-parenb,-cstopb,cs8 oz. cat /dev/ttyAMA0

Dobim nasledne podatke
[22] GAL:421.24 GPM:0.0 [RX_RSSI:-77]
[23] GAL:431.24 GPM:0.0 [RX_RSSI:-77]
[24] GAL:478.24 GPM:0.0 [RX_RSSI:-77]

22 in 23 predstavljata mrzlo vodo, 24 pa toplo. Podatek, ki mi je pomemben je GAL (Gallons):xxx.xx oz. kasneje bo pretvorjeno v Litre (mormam popraviti skripto)

Kar bi želel, da bi ko zaženem skripto, ta prebere podatke (v tem primeru)
[22] GAL:421.24 in ga pomnoži z [23] GAL:431.24 ter izpiše Mrzla voda: 852,48
in
[24] GAL:478.24 GPM:0.0 [RX_RSSI:-77] ter izpiše Topla voda: 478,24

ta podatek zapiše v (uporablam linux oz. RaspberryPi) /home/tmp/poraba_vode/poraba_datum_zapisa.txt tu bi lahko uporabil SQL bazo, samo nevem, če ne bo preveč zakomplicirano.

Nato pa da vzame podatek iz /home/tmp/poraba_vode/poraba_datum_zapisa.txt (prejšni mesec) odšteje mrzlo in toplo vodo, tako da bi dobil porabo enega meseca.

GAL: zapis je tako kot vodni števec se pravi vedno samo dodaja in se zapisuje na čip.

Podatek porabe meseca pa bi mi nato poslal na mail.

Za to sem že našel skripto, ki mislim, da bi jo lahko uporabil.

import smtplib  
sender = 'xxxx@gmail.com'
receivers = ['xxx@gmail.com']
message = """From: From Person <from@fromdomain.com>
To: To Person <to@todomain.com>
Subject: SMTP e-mail test

This is a test e-mail message.
"""
  
# Credentials (if needed)  
username = 'xxx@gmail.com'  
password = ''  
  
# The actual mail send  
server = smtplib.SMTP('smtp.gmail.com:587')  
server.starttls()  
server.login(username,password)  
server.sendmail(sender, receivers, message)  
server.quit() 


Python skripto bi nato dodal v cron job tako, da bi mi vsakega 25.v mesecu dobil mail z trenutno porabo vode.

BigWhale ::

Kaksno pomoc pa rabis? Kaj si pa ze naredil?

Datoteko odpres z open, potem pa v while zanki beres iz nje z readline() in si belezis podatke.

zvmk ::

Ojla,

Malce sem bil zaposlen z modifikacijo projekta. Takole zadnja varianta, ki sem jo dosegel oz. bi rad dosegel je.

Ko zaženem python skripto,

import time, sys, serial, threading
import collections
import httplib
import string
import smtplib
import re

### GENERAL SETTINGS ###
SERIALPORT = "/dev/ttyAMA0"  # the default com/serial port the receiver is connected to
BAUDRATE = 115200

ser = serial.Serial(SERIALPORT, BAUDRATE, timeout=10)
while True:
    line = ser.readline()   # read a '\n' terminated line
    print line
ser.close()


ki posluša ttyAMA0 dobim naslednji izpis

[24] VOLUMEN:33.18   [RX_RSSI:-44]

[23] VOLUMEN:25.73   [RX_RSSI:-40]

[22] VOLUMEN:32.73   [RX_RSSI:-49]

[24] VOLUMEN:33.18   [RX_RSSI:-44]


Izpis je dinamičen in se izpisuje konstantno.

Potreboval bi pomoč pri izdelavi skripte/vnosu, teh podatkov v mysql.

Zamislil sem si sledeče
ID so 22, 23 in 24
Null - Volumen
25.73 (ter ostale) so spremeljivka
Null - [RX_RSSI:-40]

Zapis v bazo bi naj bi se zgodil vsakič ko pride do spremembe števila volumna (npr 25.73 + 00.01)

dasf ::

Za interakcije z bazami si poglej SQLAlchemy.

Spura ::

22, 23, 24 so senzorji? Oziroma zakaj se 24 ponovi? Kolikokrat na sekundo pa dobis nove podatke? Ce prav razumem se podatki konstantno ponavljajo, ti bi pa rad pisal le spremembe?

zvmk ::

@Spura

Ja tako je. 22,23 in 24 so senzorji podatek se z skripo, ki je zgoraj prikazujejo vsako sekundo. Tako, da ko pride do spremembe jo tudi izpiše.

Spura ::

Verjetno rabis tri stopce: ID, kolicino in timestamp, kdaj je prislo do spremembe. In potem klices insert vsakic ko pride do spremembe.
Recimo naredis tabelo s tremi stolci ID, VOLUMEN, TS.
TS stolpec deklariras da je po defaultu current timestamp. V create table stavku ga deklariras kot
TS TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

In potem insert:
INSERT INTO STEVEC (ID, VOLUMEN) VALUES (43, 32.73)

Verjetno bos hotel index met postavljen na ID stolpec.

zvmk ::

Bolj ko berm forum-e in različna navodila manj mi je jasno.

Ali lahko začnemo od začetka in po postopkih.

najprej bi rad preoblikoval string iz
[24] VOLUMEN:33.18 [RX_RSSI:-44]
[23] VOLUMEN:25.73 [RX_RSSI:-40]
[22] VOLUMEN:32.73 [RX_RSSI:-49]
v
24 33.18
23 25.73
22 32.73

Probal sem z
import time, sys, serial, threading
import collections
import httplib
import string
import smtplib
import re

### GENERAL SETTINGS ###
SERIALPORT = "/dev/ttyAMA0"  # the default com/serial port the receiver is conn$
BAUDRATE = 115200

ser = serial.Serial(SERIALPORT, BAUDRATE, timeout=10)
while True:
    value = float(ser.readline().strip())
   print '\[([0-9]+)\] VOLUMEN:([0-9]+\.[0-9]+) \[RX_RSSI:(-?[0-9]+)\]'.format($
ser.close()


in mi vrne error
File "water4.py", line 15
    print '\[([0-9]+)\] VOLUMEN:([0-9]+\.[0-9]+) \[RX_RSSI:(-?[0-9]+)\]'.format(value)
                                                                                     ^
IndentationError: unindent does not match any outer indentation level

Predvidevam, da sem se zadeve lotil na napačni strani.

Zgodovina sprememb…

  • spremenilo: zvmk ()

jinzo ::

Tip: Python je občutljiv na zamaknjenost kode. To ti tudi lepo izpiše.

Predlagam da si malo odpočiješ in umiriš glavo, ter potem s svežimi očmi pogledaš zadevo. Ker ti je ja lepo javlo napako in kaj točno je narobe. Samo brat je treba (pa včasih googlat).

Tip2: Jaz nebi takoj na regexe se vrgel (še posebaj če se komaj učiš). Ampak je včasih tud kaka .split(..) funkcija uporabna/lažja za začetek.

technolog ::

zamikaj s tabulatorji, ne s presledki, da se izogneš tem napakam.

zvmk ::

Takole bo. Mislim, da nekam napredujem.

Probal sem z

import time, sys, serial, threading
import collections
import httplib
import string
import smtplib
import re

### GENERAL SETTINGS ###
SERIALPORT = "/dev/ttyAMA0"  # the default com/serial port the receiver is conn$
BAUDRATE = 115200

ser = serial.Serial(SERIALPORT, BAUDRATE, timeout=10)
while True:
    line = ser.readline()   # read a '\n' terminated line
    line2 = line.replace("VOLUMEN:", '').replace("RX_RSSI:", '')
    line3 = line2.split (' ')
    print line3
ser.close()


Izpis je
['[22]', '33.15', '', '', '[-52]\r\n']
['[24]', '33.34', '', '', '[-41]\r\n']
['[23]', '25.86', '', '', '[-41]\r\n']

Ali mi lahko kdo razloži kako odstranim [] pri številki 23,22 in 24 in pa zapis na koncu stringa [-52]\r\n']. Probal sem z \[RX_RSSI:(-?[0-9]+)\] pa mi ne dela. Kakšna idea. oz mogoče link, bi sam probal samo rabim malo usmeritve.

Hvala in lp

Zgodovina sprememb…

  • spremenilo: zvmk ()

BigWhale ::

technolog je izjavil:

zamikaj s tabulatorji, ne s presledki, da se izogneš tem napakam.


Seveda, se zamika s presledki in NE s tabulatorji.

http://legacy.python.org/dev/peps/pep-0...

technolog ::

Njegova napaka je bila ta, da je naredil en presledek preveč.

To se mu ne bi moglo zgoditi, če bi zamikal s tabulatorji.

zvmk ::

Hey,

Trenutno mi je ratalo dobiti izpis, ki ga želim. Uporabil sem

import time, sys, serial, threading
import collections
import httplib
import string
import smtplib
import re

### GENERAL SETTINGS ###
SERIALPORT = "/dev/ttyAMA0"  # the default com/serial port the receiver is connected to
BAUDRATE = 115200

ser = serial.Serial(SERIALPORT, BAUDRATE, timeout=10)
while True:
    line = ser.readline()   # read a '\n' terminated line
    line2 = line.replace("VOLUMEN:", '').replace("RX_RSSI:", '')
    line3 = line2.split (' ')
    print [x.strip("[]\r\n") for i, x in enumerate(line3) if i<2]
ser.close()


Izpis pa je
['24', '33.34']
['22', '33.20']
['23', '25.86']

Kako bi to sedaj spravil v MYSQL bazo ? 22, 23 in 24 bi uporabil za ID število za njim pa bi vpisal samo ob spremembi.

ragezor ::

zamika se s presledki. tudi pri tabulatorjih pride do napak, ko imas naenkrat zmesane tabulatorje in presledke.

@zvmk
nad line najprej odstranis leve in desne presledke, tabulatorje ter newline s strip()
potem replacas [ in ] z praznim stringom, kot si ze naredil z volumnon
potem odstranis duplicirane presledke v stringu in na koncu se splittas

lahko se pa poglobis v regularne izraze in napises izraz, ki ti poisce ven predznacene integerje in floate. ne bi smelo biti prevec zahtevno.

while True:
    line = ser.readline().strip()   # read a '\n' terminated line
    line2 = line.replace("VOLUMEN:", '').replace("RX_RSSI:", '').replace('[', '').replace(']', '')
    line3 = ' '.join(line2.split(' ')).split(' ') # tole je mal tricky, probaj razumet
    print line3

technolog ::

Zamešani presledki ne morejo bit argument proti tabulatorjem. Je argument proti obema. Je argument proti konsistentnosti. Odloči se za eno in se tega drži.

Pa še to, kolikor vem, tale style guide: prvič, ni uraden, drugič, je samo priporočilo.

Zgodovina sprememb…

zvmk ::

A pa ma mogoče kdo ideo kako bi se lotil problema vpisa v bazo

['24', '33.34']
['22', '33.20']
['23', '25.86']
prvo je bi bil ID drugo m3 (poraba)
Hvala

Zgodovina sprememb…

  • spremenilo: zvmk ()

technolog ::

Uporabi google. Najlažja opcija je kar SQLite.

V kakšni meri boš poizvedoval po podatkih? Če ne boš veliko / pogosto, shranjuj kar v neko .CSV datoteko.

brodul ::

Ena varjanta je http://docs.python.org/2/library/sqlite.... Torej vgrajena knjiznica za sqlite

Druga varjanta je sqlalchemy, ki je zelo kompleksna knjiznica.
Pretending to be a mature adult is so exhausting.

b4d ::

Lepo da bi se rad naucil uporabljati baze, ampak za 1x mesecno prebrat, bo tekstovna datoteka cisto dovolj, pa neprimerno lazja je implementacija.
b4d.sablun.org

zvmk ::

Živjo, napredujem v svojo smeri, kniženja v mysql bazo.

Za brane in obdelavo semn uporabil

import time, sys, serial, threading
import collections
import httplib
import string
import smtplib
import re
import MySQLdb
### GENERAL SETTINGS ###
SERIALPORT = "/dev/ttyAMA0"  # the default com/serial port the receiver is connected to
BAUDRATE = 115200

ser = serial.Serial(SERIALPORT, BAUDRATE, timeout=10)
while True:
    line = ser.readline()   # read a '\n' terminated line
    line2 = line.replace("VOLUMEN:", '').replace("RX_RSSI:", '')
    line3 = line2.split (' ')
    line4 = [x.strip("[]\r\n") for i, x in enumerate(line3) if i<2]
    node = line4[0]
    m3=int(float(line4[1])*100)
    print node, m3
ser.close()


Izpis je sledeč

22 3515
23 2594
24 3343
22 3515
23 2594
24 3343
22 3515
.
.
.

Sedaj pa bi rad za podatek vpisal v MySQL vsakič ko se spremeni ena od vrednosti. Da ne pride so zmešnjave 22,23,24 bi oz. predstavljajo ID štirimestno število do sedaj trenutna poraba.

Bazo imam narejeno na sledeč način.
+-------------------+
| Tables_in_moteino |
+-------------------+
| sensor_name       |
| sensor_readout    |
+-------------------+

mysql> DESCRIBE sensor_readout;
+-----------+-----------+------+-----+---------------------+-------+
| Field     | Type      | Null | Key | Default             | Extra |
+-----------+-----------+------+-----+---------------------+-------+
| timestamp | timestamp | NO   |     | 0000-00-00 00:00:00 |       |
| sensor_id | char(2)   | NO   |     | NULL                |       |
| volume    | int(4)    | NO   |     | NULL                |       |
+-----------+-----------+------+-----+---------------------+-------+
3 rows in set (0.01 sec)

mysql> DESCRIBE sensor_name;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| sensor_id | char(2)     | YES  |     | NULL    |       |
| name      | varchar(20) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

Koda, ki mislim da bi bi prišla prav je spodaj. Samo rabim pomoč pri preoblikovanju.

#connecting to mysql databse
conn = MySQLdb.connect( host='localhost', db='moteino', user='****', passwd='*****' )
x = conn.cursor()

try:
    x.execute( 'insert into sensor_readout values (%s, %s, %s)', (ts,node, m3))
    conn.commit()
except:
    conn.rollback()

# We can also close the connection if we are done with it.
# Just be sure any changes have been committed or they will be lost.
conn.close()

Zgodovina sprememb…

  • spremenilo: zvmk ()

BigWhale ::


except:
    ....
finally:
    if conn is not None:
        conn.close()


Bi bil mal lepsi nacin handlanja povezave na bazo. :)

zvmk ::

Ojla probal s predlogom,

pa mi vrne error

  File "water5.py", line 29
    ....
    ^


Še kaka idea kako bi to spravu v bazo?
Tukaj je celotna skripta

import time, sys, serial, threading
import collections
import httplib
import string
import smtplib
import re
import MySQLdb
### GENERAL SETTINGS ###
SERIALPORT = "/dev/ttyAMA0"  # the default com/serial port the receiver is conn$
BAUDRATE = 115200

ser = serial.Serial(SERIALPORT, BAUDRATE, timeout=10)
while True:
    line = ser.readline()   # read a '\n' terminated line
    line2 = line.replace("VOLUMEN:", '').replace("RX_RSSI:", '')
    line3 = line2.split (' ')
    line4 = [x.strip("[]\r\n") for i, x in enumerate(line3) if i<2]
    node = line4[0]
    m3=int(float(line4[1])*100)
    print node, m3
#connecting to mysql databse
conn = MySQLdb.connect( host='localhost', db='moteino', user='****', passwd='******' )
x = conn.cursor()

try:
    x.execute( 'INSERT INTO sensor_readout (timestamp,sensor_id,volume) VALUES($
    conn.commit()
except:
    ....
finally:
    if conn is not None:
        conn.close()
ser.close()

Zgodovina sprememb…

  • spremenilo: zvmk ()

jype ::

Tiste pičice bi morale biti koda, ki se izvede v primeru napak.

zvmk ::

Torej ali napaka je ali ni?

Moje znanje pythona je dokaj lajično pa bi si vseeno želel pripeljati projekt do konca. Tudi ni vprašanje, da se ga ne bi rad naučil samo predvidevam, da predno bom prišel do ugotovitve, kaj točno mi manjka bo preteklo kar nekaj časa.

Ali ima kdo kak konkreten predlog kako naj spravim podatke v bazo (ob vsaki spremembi seveda).

Mogoče lahko začnemo pri bazi. Ali sem to pravilno nastavil ali bi moral kaj spremeniti?


lp Z

Zgodovina sprememb…

  • spremenilo: zvmk ()

jype ::

Tiste pičice moraš zamenjati s kodo, ki jo sam napišeš. Najmanj, kar daš tja, je običajno traceback.print_exc()

zvmk ::

Hvala za nasvet. Dodal sem in mi izpisuje v terminalu v bazo pa se ne vpisuje nič.

Terminal view
23 2650
22 4100
24 3354
23 2650
22 4100
24 3354
23 2650
22 4100
24 3354
23 2650
22 4100
24 3354
.
.
.


Še kakšna idea kaj bi lahko naredil?

ragezor ::

ja daj vpisovanje v bazo v isto while zanko kot mas printanje...

zvmk ::

A bi mi lahko to prosim na primeru pokazu. Tnx

Apple ::

zvmk: mene zanima, kakšen "senzor" imaš to in kako je priklopljen :) . Sam imam senzor za nivo vode v štirni. Spodaj je del kode, kako imam definirano povezavo in kako insertam zapis v bazo...

import MySQLdb

ssl = {'cert': '/home/pi/newcerts/client-cert.pem', 'key': '/home/pi/newcerts/client-key.pem'}
conn = MySQLdb.connect(host= "x.x.x.x",
                  user="En_User",
                  passwd="En_Passwd",
                  db="En_DB", ssl=ssl)
.
.
.

try:
    x.execute("""INSERT INTO Dezevnica (TimeStamp, Kolicina) VALUES (NOW(),'%s')""",(int(S1_data)))
    conn.commit()

LP, Apple

zvmk ::

Imam vodni števev Enerkon na katerega imam priključen impulz meter na impulz meter pa sm priklopil Moteino modul (note). Ko pride do interrupta se število poveča za 00.01 (to je 10L)

Prvi izpis, ki sem ga imel je bil
[24] VOLUMEN:33.18 [RX_RSSI:-44]
[23] VOLUMEN:25.73 [RX_RSSI:-40]
[22] VOLUMEN:32.73 [RX_RSSI:-49]

nato sem ga s skripti, ki je zgoraj preoblikova v

24 3354
23 2650
22 4100

24, 23, 22 predstavljalo node (moteino)
števila zadaj pa so trenutna poraba vode. Se pravi naj bi pisalo enako kot na vodnem števcu.

Apple ::

Uhuhu... zanimivo :)

A ta števec bi mi priznali na Komunali? :D
LP, Apple

zvmk ::

Hej tole imam montirano.

http://www.enerkon.si/ckfinder/userfile...

Drugače pa nevidim razloga zakaj ti nebi priznali. Če jim vsak mesec sporočiš porabo vode. Oni ti to zaračunajo tako ali tako pa je po pravilih, da moraš imeti 1x/leto pregled dejanskega szanje. Se pravi odčitavanje direktno s števca, ki na to naredijo + oz- -. Enako oz. podobno kot rpi elektriki.

Če te pa zanima več o teh Moteino mudulih pa pojdi na www.lowpowerlabs.com

Zgodovina sprememb…

  • spremenilo: zvmk ()

zvmk ::

Hej

Probam sem uporabi tvojo kodo pa mi vrne error

uporabljena koda
try:
    x.execute("""INSERT INTO sensor_readout (timestamp, sensor_id, volume) VALUES (NOW(), '%s', '%s')""",(int(S1_data))
   #x.execute("""INSERT INTO Dezevnica (TimeStamp, Kolicina) VALUES (NOW(),'%s')""",(int(S1_data))
    conn.commit()
except:
    traceback.print_exc()
finally:
    if conn is not None:
        conn.close()
ser.close()


Izpis
  File "water5.py", line 29
    conn.commit()
       ^

BigWhale ::

Vsaj celo napako izpisi.

zvmk ::

ups:

Evo tukaj je

root@RaspberryPIServer:/home/ziga# python water5.py
  File "water5.py", line 29
    conn.commit()
       ^
SyntaxError: invalid syntax

BigWhale ::

Zaklepaj ti manjka v prejsnji vrstici...

zvmk ::

Np neki ne dela

try:
    x.execute("""INSERT INTO sensor_readout (timestamp, sensor_id, volume) VALUES (NOW(), '%s', '%s')""",(int(S1_data)))

   # x.execute('INSERT INTO senror_readout (TimeStamp, sensor_id, volume) VALUES (NOW(), '%s', '%s')',(int(S1_data)))
    conn.commit()
except:
    traceback.print_exc()
finally:
    if conn is not None:
conn.close()
ser.close()


output

root@RaspberryPIServer:/home/ziga# python water5.py
  File "water5.py", line 35
    conn.close()
    ^
IndentationError: expected an indented block

zvmk ::

BW ali bi si vzel par minut pa bi probala s teamviewer-jem. Mogoče bi lahko tako le prišel do konca tunela ;)

BigWhale ::

conn.close() moras zamaknit pod zgornji if, pa glej, da zamaknes za isto stevilo presledkov kot vse ostale bloke.

Ne, nimam casa. Ne morem te nauciti tecti, ker se niti iz maternice nisi ven padel. Vzami si eno dopoldne ali pa dva in se sprehodi skozi kak Python tutorial. Res, tako bos veliko lazje delal in lazje kaj naredil.

zvmk ::

np tudi to ni obrodilo sadov :(

try:
    x.execute("""INSERT INTO sensor_readout (timestamp, sensor_id, volume) VALUES (NOW(), '%s', '%s')""",(int(S1_data)))

   # x.execute('INSERT INTO senror_readout (TimeStamp, sensor_id, volume) VALUES (NOW(), '%s', '%s')',(int(S1_data)))
    conn.commit()
except:
    traceback.print_exc()
finally:
    if conn is not None:
    conn.close()
ser.close()

Output
root@RaspberryPIServer:/home/ziga# python water5.py
  File "water5.py", line 35
    conn.close()
       ^
IndentationError: expected an indented block

kr?en ::

Kaj pa ce bi naredil to, kar ti je omenil BigWhale, ker zgleda nimas pojma niti o osnovah, ti bi pa fural neke povezave na bazo in nevemkaj ...

Evo, da ne bos jokal, da se samo pizdim: http://learnpythonthehardway.org/book/

Zgodovina sprememb…

  • spremenil: kr?en ()

BigWhale ::

O kristus!

try:
    x.execute("""INSERT INTO sensor_readout (timestamp, sensor_id, volume) VALUES (NOW(), '%s', '%s')""",(int(S1_data)))
    conn.commit()
except:
    traceback.print_exc()
finally:
    if conn is not None:
        conn.close()
ser.close()

zvmk ::

@ Kr?en: Žal nekaj ne razumem! Vprašam po pomoči ti oz. kdor koli drug mi reče preberi si python. Mislm, da vsi, ki ga znate oz. brati, pisati to sigurno niste naredili vsi v enem dnevu ampak ste potrebovali malo več. Tako kot piše tudi v linku, ki si mi ga poslal. (Some people take about 3 months, others 6 months, and some only a week). Prav tako so pa v teh tutorials večinoma osnovni primeri, na katerih moraš nato skripto preoblikovati za svoje potrebe.

Projekt, ki sem si ga zastavil glede odčitavanja vode bom vrjetno naredil (no vsaj upam) in vprašanje kdaj naslednjič bom potreboval Python če sploh kdaj. Pa to vseeno ni mogoče razlog zakaj se ga ne bi naučil po drugi strani pa rabim samo dokončanje te skripte in to je to.

Da se ne bova narobe razumela hvala za link, ga bom prebral in upam, da si bom lahko pomagal, da dokončam. Žal sem samouk in grejo stvari bolj počasi za to je potrpežljivost mislim, da na prvem mestu. Če pa koga že motijo moja vprašaja, ki so več kot očitna čiste osnovne python funkcije pa lahko stvar enostavno ignorira ;)

Veliko lažje bi mi bilo, če bi lahko kdo raje prišel z primerom in rekel tako se vstavlja v bazo pa bi potem že probal graditi na tem. Kot pa vidiš točno to probavam samo se mi nekje zatika.

Lep sončen dan ti/vam želim
Ziga

BigWhale ::

Glej, tezava je v tem, da ti niti osnovne sintakse jezika ne razumes. Probleme ti delajo oklepaji in zamikanje kode. Vse lepo in prav, ampak ce bi si vsaj _nekaj malega_ o samem jeziku prej prebral in naredil nekaj Hello World primerov, si pogledal kako delujejo zanke, potem bi se tukaj lahko pogovarjali o konkretnih primerih zakaj ti stvari ne delujejo.

Sprasujes nas naj ti povemo kako priti iz Ljubljane v Kranj, ne ves pa kje je leva in kje desna. :)

zvmk ::

BW se popolnoma strinjam s tabo, da nimam pojam o python zadevi! Ampak mislim, da bi mi pa vseeno lahko mal prizanesli, če sem vseeno naredil nekaj pomambnih korakov.

Iz začetnega stringa

[24] VOLUMEN:33.18 [RX_RSSI:-44]
[23] VOLUMEN:25.73 [RX_RSSI:-40]
[22] VOLUMEN:32.73 [RX_RSSI:-49]

Sem z uporabo

import time, sys, serial, threading
import collections
import httplib
import string
import smtplib
import re
import MySQLdb
import MySQLdb as mdb
### GENERAL SETTINGS ###
SERIALPORT = "/dev/ttyAMA0"  # the default com/serial port the receiver is connected to
BAUDRATE = 115200

ser = serial.Serial(SERIALPORT, BAUDRATE, timeout=10)
while True:
    line = ser.readline()   # read a '\n' terminated line
    line2 = line.replace("VOLUMEN:", '').replace("RX_RSSI:", '')
    line3 = line2.split (' ')
    line4 = [x.strip("[]\r\n") for i, x in enumerate(line3) if i<2]
    node = line4[0]
    m3=int(float(line4[1])*100)
    print node, m3


Prišel to izpisa

24 3354
23 2650
22 4100

Katerega želim sedaj vpisat v bazo, ki je sestavljena na sledeči način
1
+-------------------+
| Tables_in_moteino |
+-------------------+
| sensor_name       |
| sensor_readout    |
+-------------------+
 
mysql> DESCRIBE sensor_readout;
+-----------+-----------+------+-----+---------------------+-------+
| Field     | Type      | Null | Key | Default             | Extra |
+-----------+-----------+------+-----+---------------------+-------+
| timestamp | timestamp | NO   |     | 0000-00-00 00:00:00 |       |
| sensor_id | char(2)   | NO   |     | NULL                |       |
| volume    | int(4)    | NO   |     | NULL                |       |
+-----------+-----------+------+-----+---------------------+-------+


Tu sem želel dodati v skripto ta stavek, da bi mi vpisal podatke.

#connecting to mysql databse
conn = MySQLdb.connect( host='localhost', db='moteino', user='***', passwd='****' )
x = conn.cursor()

try:
    x.execute("""INSERT INTO sensor_readout (timestamp, sensor_id, volume) VALUES (NOW(), '%s', '%s')""",(int(S1_data)))
    conn.commit()
except:
    traceback.print_exc()
finally:
    if conn is not None:
        conn.close()
ser.close()


A kot predvidevam imam težavo v zapisu x.execute("""INSERT INTO sensor_readout (timestamp, sensor_id, volume) VALUES (NOW(), '%s', '%s')""",(int(S1_data)))

Ker mi v bazo nic ne vpisuje. Ampak nevem za to pa sprašujem!!!

Trenutno vse kar sem naredil do sedaj imam občutek, da sem že na obvoznici oz. da sem vsaj zavil proti kranju vi/ti pa me pošiljate nazaj v center.

Ne glede na to vseeno upam, da se bo našel kdo, ki me bo usmeril v pravo smer. oz dal predlog kako naj to rešim. Kljub mojem ničnem znaju pythona :)

jype ::

Napako, ki si jo dobil zgoraj, si dobil zato, ker si narobe postavil znak '#'.

technolog ::

Zamikaj s faking tabulatorji.

Že drugič si fasal error zaradi tega. Tabulatorji so boljši, ker maš samo cel zamik ali pa ga nimaš. S presledki pa imaš lahko en zamik, en pa ena četrtina zamika, 0,75 zamika. In jasno se python pritoži.

Zgodovina sprememb…

ragezor ::

sem ti povedal zakaj ti ne zapisuje v bazo. kodo za zapisovanje v bazo imas izven while True loopa, kjer dobivas in obdelujes podatke, JIH PA NE DAJAS V BAZO

kako to popravis pa ti nebom povedal, ker je cas, da sam nekaj sprogramiras. tale koda ni tvojo delo, ker so ti jo drugi napisali, ti si jo samo zlepil skupaj pa se to zelo slabo. drugace pa ne razumes verjetno niti ene vrstice kaj tocno se dogaja.

BigWhale ::

*sigh*
x.execute("INSERT INTO sensor_readout (timestamp, sensor_id, volume) VALUES (NOW(), '{0}', '{1}')".format(node, m3))


Vendar, tale stavek se mora izvesti v tisti while zanki, tam kjer imas sedaj print stavek. Poleg tega pa x.execute ni najboljsi nacin kako vnasati stvari v bazo. In tole je izredno slaba praksa, ker omogoca SQL injection.

Za prvi poizkus bo dovolj dobro.
«
1
2


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Komuniciranje med PHP in python

Oddelek: Programiranje
51172 (904) filips
»

Kako na linuxu (Raspberry PI) prepričati NTP, da bo uporabil podatke iz GPS-a

Oddelek: Operacijski sistemi
202735 (2096) misek
»

[Java]: replace - slovar v txt

Oddelek: Programiranje
121691 (1549) Spura
»

Shell scripta

Oddelek: Programiranje
61436 (1040) BigWhale
»

c++ serijski port

Oddelek: Programiranje
252551 (1942) fx

Več podobnih tem