Strona główna Polish Python Coders Group
   Strona główna   Pomoc Zaloguj się Rejestracja  
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Aktualności: PyStok #42 - wystąpią Łukasz Langa i Dominik Kozaczko
Szukaj Szukaj
Strony: [1]   Do dołu
Drukuj
Wątek: Skrypt odbierający dane z UART i wysyłający je do bazy  (Przeczytany 510 razy)
« : 20:45 23/12/18 »
Maximus_kr Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 1


Witam
Na potrzeby korzystania z Domoticz obsługującego inteligenty dom "wypociłem" taki skrypt
Kod
#!/usr/bin/env python
import requests
import json
import os
import time
import sys
import serial
import subprocess
 
import urllib
import urllib2
 
server = "http://192.168.0.100"
port = 8080
 
#numery Idx w bazie Domoticz
deviceidx_1 = 1
deviceidx_2 = 2
deviceidx_3 = 3
deviceidx_4 = 4
deviceidx_5 = 5
deviceidx_6 = 6
deviceidx_7 = 7
deviceidx_8 = 49
 
ser = serial.Serial(
       port='/dev/ttyUSB0',
       baudrate =19200,
       parity=serial.PARITY_NONE,
       stopbits=serial.STOPBITS_ONE,
       bytesize=serial.EIGHTBITS,
       timeout=1
)
 
while 1:
   if ser.inWaiting():
       my_string = ser.readline()
 
#        print (my_string)
 
#podzial odebranego stringu - string ma format $,6,21.4,22.4,19.8,16.7,24.6,29.6 , czyli znak
#poczatkowy, ilosc danych oraz 9 zmiennych z temperaturami
#my_string.split(",")
 
       init_sign,nr_dat,dat_1,dat_2,dat_3,dat_4,dat_5,dat_6,dat_7,dat_8,dat_9 = my_string.split(",")
       hum_str = dat_8 + ";" + dat_9 + ";0"
 
#gdy pierwszy odebrany znak to $ przeslij przez JSON do Idx Domoticz
# %s - dane typu string, %d - dane numeryczne ( calkowite )
       if init_sign == "$":
           r =  requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%s" % (server, port, deviceidx_1, dat_1))
           send_n = r.text.find("Update Device")
       if send_n <> -1:
           time.sleep(2)
           r =  requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%s" % (server, port, deviceidx_2, dat_2))
           send_n = r.text.find("Update Device")
       if send_n <> -1:
           time.sleep(2)
           r =  requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%s" % (server, port, deviceidx_3, dat_3))
           send_n = r.text.find("Update Device")
       if send_n <> -1:
           time.sleep(2)
           r =  requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%s" % (server, port, deviceidx_4, dat_4))
           send_n = r.text.find("Update Device")
       if send_n <> -1:
          time.sleep(2)
          r =  requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%s" % (server, port, deviceidx_5, dat_5))
          send_n = r.text.find("Update Device")
       if send_n <> -1:
          time.sleep(2)
          r =  requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%s" % (server, port, deviceidx_6, dat_6))
          send_n = r.text.find("Update Device")
       if send_n <> -1:
          time.sleep(2)
          r =  requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%s" % (server, port, deviceidx_7, dat_7))
          send_n = r.text.find("Update Device")
       if send_n <> -1:
          time.sleep(2)
          r =  requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%s" % (server, port, deviceidx_8, hum_str))
          send_n = r.text.find("Update Device")
 
 
 

Jako, że to pierwszy mój kontakt z Pythonem, chciałem się upewnić czy jest dobrze napisany, może coś użyłem nie potrzebnie - bo raczej wszystkie potrzebne biblioteki są dołączone, bo skrypt działa, ale "wysypuje" się po kilku lub kilkunastu godzinach.

Może ktoś mądrzejszy ode mnie przyjrzy się i doradzi ?
Zapisane
« Odpowiedz #1 : 21:52 23/12/18 »
DJangoL Offline
Professional Python User

Zobacz profil
***

Reputacja: 30
Wiadomości: 427


Fajny projekt, lubię DOMOTICZA.

Co do kodu, zbyt wiele razy powtarzasz te same fragmenty kodu. Użyj funkcji. I zobacz jak można zrobić w pythonie coś na wzór instrukcji switch:

https://stackoverflow.com/questions/60208/replacements-for-switch-statement-in-python

Zainteresuj się też f-strings:

https://realpython.com/python-f-strings/
Zapisane
« Odpowiedz #2 : 03:08 25/12/18 »
Guaz Offline
Expert Python User

Zobacz profil
****

Reputacja: 69
Płeć: Mężczyzna
Wiadomości: 513


switch tutaj jest niepotrzebny, a raczej wręcz zbędny.

Ogólnie zamiast powtórzenia (dokładnie takiego samego, tylko z różnymi argumentami):
Kod
        if send_n <> -1:
          time.sleep(2)
          r =  requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%s" % (server, port, deviceidx_8, hum_str))
          send_n = r.text.find("Update Device")
Można zrobić to pętlą, ale zacznijmy powoli:


Załóżmy że twoja struktura tego:
Kod
deviceidx_1 = 1
deviceidx_2 = 2
deviceidx_3 = 3
deviceidx_4 = 4
deviceidx_5 = 5
deviceidx_6 = 6
deviceidx_7 = 7
deviceidx_8 = 49
Wygląda tak:
Kod
 devices_idxs = [1, 2, 3, 4, 5, 6, 7, 49]
#Daty też tak można zrobić:
dats = my_string.split(",")
"""[2:] oznaczałoby że bierzemy bez dwóch pierwszych elementów, ale jeden z nich wykorzystujesz w programie, drugiego może tylko nie widzę. Ale w razie czego możesz je zawsze wziąć jak teraz lub wyjąć, jeszcze potrzebujemy naszego hum_str:"""
dats.append(dats[9]+';'+dat[10]+";0")

A teraz robimy twój init_sign:
Kod
        if dats[0] == "$":
           r =  requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%s" % (server, port, devices_idxs[0], dats[2]))
           send_n = r.text.find("Update Device")
#Tu trzeba pamiętać że w dats, dwa pierwsze elementy to sign oraz nr_dat.
 

No i w końcu możemy przejść do pętli:
Kod
    for index in range(1, len(devices_idxs)): #od 1, ponieważ jeden już wykorzystaliśmy.
       if send_n <> -1:
           time.sleep(2)
           r =  requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%s" % (server, port, devices_idxs[index], dats_[index+2]))
           send_n = r.text.find("Update Device")
#Gdybyśmy do dats wyciągnęli bez dwóch pierwszych, albo je gdzieś wyekstraktowali, wtedy byśmy nie musieli za każdym razem indeksu zwiększać o dwa :).
 

W takim kodzie też prościej będzie zmienić to na stringi formatowane :d, pytanie czy piszesz w pythonie2 czy 3, bo z tego kodu ja osobiście nie jestem w stanie ocenić Uśmiech
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
Strony: [1]   Do góry
Drukuj
Skocz do:  

© 2007 - 2019 Polish Python Coders Group
Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | Theme by PixelSlot