» »

Pomoč pri izdelavi Python skripte

Pomoč pri izdelavi Python skripte

1
2
»

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

zvmk je izjavil:

Ž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?

Invictus je izjavil:

zvmk je izjavil:

Ž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

Zgodovina sprememb…

  • spremenil: Invictus ()

BigWhale ::

Invictus je izjavil:

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.

zvmk ::

Zivjo, na noben način mi ne rata prepričit DUPLICATE :( HELP!

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.

zvmk je izjavil:


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

Zgodovina sprememb…

  • spremenil: Invictus ()

BigWhale ::

zvmk je izjavil:

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

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

ragezor ::

tole nevem, ce dela tako kot ti mislis, da dela ampak glavno da si zadovoljen

BigWhale ::

Tole sicer dela, ampak nevem, ce je res najboljsa praksa, da imas merjeno kolicino, kot primarni kljuc v podatkovni bazi.
1
2
»


Vredno ogleda ...

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

Komuniciranje med PHP in python

Oddelek: Programiranje
51100 (832) filips
»

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

Oddelek: Operacijski sistemi
202553 (1914) misek
»

[Java]: replace - slovar v txt

Oddelek: Programiranje
121591 (1449) Spura
»

Shell scripta

Oddelek: Programiranje
61375 (979) BigWhale
»

c++ serijski port

Oddelek: Programiranje
252486 (1877) fx

Več podobnih tem