Forum » Programiranje » Pomoč pri izdelavi Python skripte
Pomoč pri izdelavi Python skripte
zvmk ::
Živjo, sem čisto na koncu imam samo še eno težavo. Podatki se mi sedaj vpisujejo v bazo, a ker se serial port posodabla oz. izpisuje vsako sekundo to pomeni nov vpis v bazo vsako sekundo. Zanima me kako bi lahko naredil zanko v primeru, da je "volumen" enak se INSERT preskoči.
Koda, ki jo uporabljam je
Koda, ki jo uporabljam je
import time, sys, serial, threading import collections import httplib import string import smtplib import re import MySQLdb #establish connection to MySQL. You'll have to change this for your database. conn = MySQLdb.connect('localhost', '*****', '********', 'moteino') or die ("could not connect to database") #open a cursor to the database c = conn.cursor() ### GENERAL SETTINGS ### SERIALPORT = "/dev/ttyAMA0" # the default com/serial port the receiver is connected to BAUDRATE = 115200 try: print "Tryign....!",SERIALPORT ser = serial.Serial(SERIALPORT, BAUDRATE, timeout=10) except: print "Failed to connect on",SERIALPORT 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) try: c.execute("INSERT INTO sensor_readout (timestamp, sensor_id, volume) VALUES (NOW(), '{0}', '{1}')".format(node, m3)) conn.commit() #commit the insert except MySQLdb.IntegrityError: print "failed to insert data"
Zgodovina sprememb…
- spremenilo: zvmk ()
BigWhale ::
Nekaj v stilu:
Lahko pa nardis tudi kak INSERT .... ON DUPLICATE KEY IGNORE, samo je prvi nacin bolj resource friendly. :)
if prejsnji_m3 == m3: continue;
Lahko pa nardis tudi kak INSERT .... ON DUPLICATE KEY IGNORE, samo je prvi nacin bolj resource friendly. :)
brodul ::
Se malo smart-ass nasvetov:
zvmk:
Python ne pozna die() klica.
Podobno se doseze z:
oz. lahko enostavno, pred klicem, napises
Print za logging ze izogibamo, sploh ce ti bo skripta rasla.
Ce si ti ne da pisat init skripte, ki bo zastartala to skripto ti priporocam, da si pogledas tole:
http://reustle.io/blog/managing-long-ru...
http://supervisord.org/configuration.ht...
Samo ne startat nohup procesov pa screenov v katerih tece bash while true.
zvmk:
Python ne pozna die() klica.
Podobno se doseze z:
import sys sys.exit("some error message")
oz. lahko enostavno, pred klicem, napises
die = sys.exit
Print za logging ze izogibamo, sploh ce ti bo skripta rasla.
Ce si ti ne da pisat init skripte, ki bo zastartala to skripto ti priporocam, da si pogledas tole:
http://reustle.io/blog/managing-long-ru...
http://supervisord.org/configuration.ht...
Samo ne startat nohup procesov pa screenov v katerih tece bash while true.
Pretending to be a mature adult is so exhausting.
Invictus ::
Živjo, sem čisto na koncu imam samo še eno težavo. Podatki se mi sedaj vpisujejo v bazo, a ker se serial port posodabla oz. izpisuje vsako sekundo to pomeni nov vpis v bazo vsako sekundo. Zanima me kako bi lahko naredil zanko v primeru, da je "volumen" enak se INSERT preskoči.
A je tak problem v eno tabelo v RAMu zapisati 100 zapisov in jih potem z enim večjim SQLom insertat v bazo?
Poleg tega kaj pa tako pomembnega beležiš da rabiš 1 sekundni interval?
Živjo, sem čisto na koncu imam samo še eno težavo. Podatki se mi sedaj vpisujejo v bazo, a ker se serial port posodabla oz. izpisuje vsako sekundo to pomeni nov vpis v bazo vsako sekundo. Zanima me kako bi lahko naredil zanko v primeru, da je "volumen" enak se INSERT preskoči.
A je tak problem v eno tabelo v RAMu zapisati 100 zapisov in jih potem z enim večjim SQLom insertat v bazo?
Poleg tega kaj pa tako pomembnega beležiš da rabiš 1 sekundni interval?
Za ta tvoj primer bi uporabil set-asociativno polje, kjer je ključ izmerjena količina vode. Če se količina ni spremenila, bo preprosto prepisal prejšnjo vrednost.
Za bazo pa narediš en trigger ki ti briše podvojene vrednosti vsako uro.
"Life is hard; it's even harder when you're stupid."
http://goo.gl/2YuS2x
http://goo.gl/2YuS2x
Zgodovina sprememb…
- spremenil: Invictus ()
BigWhale ::
Za ta tvoj primer bi uporabil set-asociativno polje, kjer je ključ izmerjena količina vode. Če se količina ni spremenila, bo preprosto prepisal prejšnjo vrednost.
Za bazo pa narediš en trigger ki ti briše podvojene vrednosti vsako uro.
Joj, zakaj bi se ustavljal pri triggerjih? Itak INSERT klicat je totalno trapasto in predstavlja security risk. Poklice se stored proceduro, ki ima totalno omejene pravice, kdo jo lahko klice in potem stored procedura na master serverju skrbi za to, da nardi zapis v tabelo. Potem se pa vse to avtomatsko replicira na tri slave streznike, ki so tam za redundanco, ce bi slucajno kaj crknil. Vsak ta slave je pa na enem drugem providerju in ima se eno HA instanco zraven. Ko pa hoces do podatkov dostopat pa uporabis enega izmed popularnih content delivery networkov.
...
Nehajte komplicirat s triggerji, ki brisejo podvojene vrednosti, ce se lahko te zadeve resi s preprostim if stavkom ali pa pravilno sestavljenim INSERT stavkom.
zvmk ::
Vpis v bazo sem si zamisli za to, da lahko na koncu meseca preverim kakšna je bila poraba v preteklem mesecu. Prav tako, da lahko pogledam kakšna je bila/bo poraba za nazaj (npr. za celo leto).
Vem to bi lahko naredil z log.txt datotekam. Cron bi mi zagnal vsakega 23. skripto ta bi naredila trenutno porabo in jo zapisala v log file.
Nato drugo skripro, ki bi mi naredila izračun za mesečno obdobje.
Odločil sem se za Mysql, da bom te podatke lahko na uporabil tudi na grafičnem prikazovalniku.
Vem to bi lahko naredil z log.txt datotekam. Cron bi mi zagnal vsakega 23. skripto ta bi naredila trenutno porabo in jo zapisala v log file.
Nato drugo skripro, ki bi mi naredila izračun za mesečno obdobje.
Odločil sem se za Mysql, da bom te podatke lahko na uporabil tudi na grafičnem prikazovalniku.
zvmk ::
Zivjo, na noben način mi ne rata prepričit DUPLICATE :( HELP!
Za lažjo predstavo izpis iz MySQL
Za lažjo predstavo izpis iz MySQL
2014-03-29 20:45:36 | 24 | 3390 | | 2014-03-29 20:45:37 | 23 | 2631 | | 2014-03-29 20:45:41 | 24 | 3390 | | 2014-03-29 20:45:42 | 23 | 2631 | | 2014-03-29 20:45:46 | 24 | 3390 | | 2014-03-29 20:45:47 | 23 | 2631 | | 2014-03-29 20:45:51 | 24 | 3390 | | 2014-03-29 20:45:52 | 23 | 2631 | | 2014-03-29 20:45:56 | 24 | 3390 | | 2014-03-29 20:45:57 | 23 | 2631 | | 2014-03-29 20:46:01 | 24 | 3390 | | 2014-03-29 20:46:02 | 23 | 2631 | | 2014-03-29 20:46:06 | 24 | 3390 | | 2014-03-29 20:46:07 | 23 | 2631 | | 2014-03-29 20:46:11 | 24 | 3390 | | 2014-03-29 20:46:12 | 23 | 2631
Invictus ::
Ali je tako težko v skripti dodati še eno spremenljivko ki shrani prejšnje stanje in ga potem primerjati s trenutnim in ustrezno ukrepati?
Hudiča, saj to so osnove programiranja, ne neko težko "advanced" sranje.
Lahko uporabiš katerekoli bazo.
Za tvoj namen je dovolj SQLite.
Hudiča, saj to so osnove programiranja, ne neko težko "advanced" sranje.
Odločil sem se za Mysql, da bom te podatke lahko na uporabil tudi na grafičnem prikazovalniku.
Lahko uporabiš katerekoli bazo.
Za tvoj namen je dovolj SQLite.
"Life is hard; it's even harder when you're stupid."
http://goo.gl/2YuS2x
http://goo.gl/2YuS2x
Zgodovina sprememb…
- spremenil: Invictus ()
BigWhale ::
Zivjo, na noben način mi ne rata prepričit DUPLICATE :( HELP!
Na koliko nacinov si pa probal? Sedem? Dvanajst? Triinpetdeset?
Resno, a bi pri hudicu ze prebral en sam, 'learning python' prirocnik? V pol dneva preberes zadevo, se manj! Pa potem ne sprasujes ljudi naj ti pomagajo pri abecedi.
zvmk ::
Tako, rešil sem problem. Mogoče pride še komu prav. Trenutna nastavitev vpiše podatek ob vsaki spremembi volumna.
V MySql-u sem spremenil PRI KEY
Ter dodal IGNORE
c.execute("INSERT IGNORE INTO sensor_readout (timestamp, sensor_id, volume) VALUES (NOW(), '{0}', '{1}')".format(node, m3))
Celotna koda sedaj zgleda tako
Vsem hvala za namige :)
V MySql-u sem spremenil PRI KEY
mysql> DESCRIBE sensor_readout; +-----------+-----------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-----------+------+-----+---------------------+-------+ | timestamp | timestamp | NO | | 0000-00-00 00:00:00 | | | sensor_id | char(2) | NO | PRI | NULL | | | volume | int(4) | NO | PRI | NULL | | +-----------+-----------+------+-----+---------------------+-------+
Ter dodal IGNORE
c.execute("INSERT IGNORE INTO sensor_readout (timestamp, sensor_id, volume) VALUES (NOW(), '{0}', '{1}')".format(node, m3))
Celotna koda sedaj zgleda tako
import time, sys, serial, threading import collections import httplib import string import smtplib import re import MySQLdb #establish connection to MySQL. You'll have to change this for your database. conn = MySQLdb.connect('localhost', '*****', '****', 'moteino') #open a cursor to the database c = conn.cursor() ### GENERAL SETTINGS ### SERIALPORT = "/dev/ttyAMA0" # the default com/serial port the receiver is connected to BAUDRATE = 115200 try: print "Tryign....!",SERIALPORT ser = serial.Serial(SERIALPORT, BAUDRATE, timeout=10) except: print "Failed to connect on",SERIALPORT 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) try: c.execute("INSERT IGNORE INTO sensor_readout (timestamp, sensor_id, volume) VALUES (NOW(), '{0}', '{1}')".format(node, m3)) conn.commit() #commit the insert except MySQLdb.IntegrityError: print "failed to insert data
Vsem hvala za namige :)
BigWhale ::
Tole sicer dela, ampak nevem, ce je res najboljsa praksa, da imas merjeno kolicino, kot primarni kljuc v podatkovni bazi.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Komuniciranje med PHP in pythonOddelek: Programiranje | 1196 (928) | filips |
» | Kako na linuxu (Raspberry PI) prepričati NTP, da bo uporabil podatke iz GPS-aOddelek: Operacijski sistemi | 2774 (2135) | misek |
» | [Java]: replace - slovar v txtOddelek: Programiranje | 1716 (1574) | Spura |
» | Shell scriptaOddelek: Programiranje | 1453 (1057) | BigWhale |
» | c++ serijski portOddelek: Programiranje | 2570 (1961) | fx |