Python -ban segítséget kérek

Sziasztok

Erősáramú villamosmérnök vagyok, a programozáshoz csak kicsit konyítok, a python-hoz viszont egyáltalán nem értek. Ezért szeretnék itt segítséget kérni.
Van egy Raspberry Pi-m ami időnként méri a hőmérsékletet és a páratartalmat, a mért értékeket InfluxDB -be tolja, majd mindezt Grafana-val jelenítem meg.
Működik is szépen megy minden hibátlanul, az egyedüli problémám az időnként előforduló mérési hibák, amik nagyon elcsúnyítják a grafikonokat.
Pl. néha 300% -os páratartalmat vagy 80°C-os hűmérsékletet mér. Napi 1-2 ilyen hibás mérés van de ez pont elég arra, hogy a grafikonokat szétcsessze.

Jelenleg egy python scipt-et futtatok crontab-al percenként.
Arra gondoltam hogy egy mérés helyett jó lenne egymás után mérni hármat, a legkisebb és legnagyobb értékeket eldobni, és csak a középső értéket beírni csak az adatbázisba.

És itt akadtam el. Nem tudom ezt python-ban hogyan lehetne egyszerűen megvalósítani, gondolva arra is hogy sokszor mind a három mért érték tizedre azonos lesz.

A scipt ami a mérést és az adatbázisba töltést végzi:

#!/usr/bin/python
import Adafruit_DHT
import requests
import time
sensor = Adafruit_DHT.AM2302
pin = 27
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

timestamp = time.time()

if humidity is not None and temperature is not None:
#Write the data to the database
#data = 'server_stack_temp,host=rpi1,location=basement value=' + str(temperature) + ' ' + str(timestamp)
data = 'temp,host=rpi1,location=roaming value=' + str(temperature)
print data
output = requests.post('http://127.0.0.1:8086/write?db=main', data=data)
print output
data = 'humidity,host=rpi1,location=roaming value=' + str(humidity)
print data
output = requests.post('http://127.0.0.1:8086/write?db=main', data=data)
print output

#Output the data to the screen
print 'Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(temperature, humidity)
else:
print 'Failed to get reading. Try again!'

Gondolom ez itt néhány embernek újgyakorlat, a segítségeket előre is köszönöm.

Hozzászólások

humidity1, temperature1 = Adafruit_DHT.read_retry(sensor, pin)
time.sleep(0.1)
humidity2, temperature2 = Adafruit_DHT.read_retry(sensor, pin)
time.sleep(0.1)
humidity3, temperature3 = Adafruit_DHT.read_retry(sensor, pin)
humidity = sorted([humidity1, humidity2, humidity3])[1]
temperature = sorted([temperature1, temperature2, temperature3])[1]

Beraktam két mérés közé 0.1s várakozást, ha nem kell, azokat kiszedheted.

En kicsit komplikaltabban oldottam meg. Tobb merest vegzek, es kidobom az osszes olyan merest, ami statisztikailag a standard elteresen kivulre esik. Ha erdekel, itt a hozza szukseges kodreszlet (value_l egy lista a meresi ertekekkel, amelybol ki akarom szorni a hibas mereseket):


import numpy
mean = numpy.mean(value_l)
std = numpy.std(value_l)
output_l = [value for value in value_l if abs(value - mean) <= std]

Sic Transit Gloria Mundi

Szerintem jó ötlet én is így csinálnám....

Bár lehet annyival bonyolítanám, hogy biztosabbra menjek, hogy internetről lekérdezném az aktuális hőmérséklet és páratartalom adatokat arra a területre vonatkozóan, majd összevetném a mért adatok tendencia függvényével... ami kívül esik azt eldobni.

Illetve lehet 2 érzékelőt raknék ugyan abba a helységbe pl talaj szintre az egyiket a másikat magasabbra :-) és azok alapján szűrném ki a hibás értékeket....

Nem lehet, hogy a 80 C pont a maximuma és valami hibakódot jelöl? (pl alacsony feszültség stb?) lehet alapból érdemes eldobni a minimummal együtt már ha pontosan mindig a 80.0 értéket adja vissza amikor hiba van....

Üdv:
Csabka

Nem pont 80 fok volt, és ilyen egyszer volt csak. Általában 30-40 fok közötti tüskék voltak, és olyankor amikor a load magas volt, tehát le volt terhelve valamivel az RPi.
Netes trendeket biztosan nem fogok használni, épp az érdekel hogy pl mosás után ha a szobában teregetem ki a ruhákat akkor mennyire megy fel a páratartalom, meg ilyesmi :)

Fero megoldását használva du. 3 óra óta nincs hibás érték, úgy tűnik ez beválik. Statisztikát se szívesen használnék, ahhoz min. 10+ mérés kellene hogy értelme legyen, és én egyetlen mért adat miatt nem mérnék 10+ -szor :)

Ha egy hétig nem lesz hibás mérésem akkor így marad, ha mégis lenne 1-2 akkor lehet hogy 3 helyett 5-ször méretek vele.

Apropó, csak hogy jól értem-e ezt a sorted függvényt:

5 mérésnél így kell?
temperature = sorted([temperature1, temperature2, temperature3, temperature4, temperature5])[2]

Tehát a végén kapcsos zárójelben (X-1)/2, ahol X a mérések száma (páratlan)??? És úgy kapom meg a középső értéket?

En is azzal kezdtem, hogy mertem 3-at, kidobtam a legkisebb es a legnagyobb erteket, majd ami maradt elmentettem. Ez nagyjabol megoldotta a tuskek kiszureset.
Jelenleg 10+ merest vegzek 1 masodperc varakozassal koztuk. Azert lett vegul ennyire szuksegem, mert miutan rakotottem egy TV tunert a RPi-re sok hibas meresem volt. Nem tuske, hanem hibas meres. Volt olyan, hogy 5-6 meres is sikertelen volt. Es, ha egy ilyen sorozatban felbukkant 1 tuske is, az eleg rendesen elrontotta az eredmenyt.

Sic Transit Gloria Mundi

Ha mégis több mérésre lesz szükség, akkor ebben csak a 'meres' változót kell átírni:


meres=3
H=[]    # üres lista
T=[]
for i in range(meres):  # i=0,... meres-1
    humi, temp = Adafruit_DHT.read_retry(sensor, pin)
    H.append(humi)      # hozzáfűzzük az új értéket
    T.append(temp)
    if i < (meres-1):   # a legutolsó mérés után, amelynél i=meres-1 , már nem kell 'aludni'
        time.sleep(0.1)

humidity= sorted(H)[meres//2]        
temperature= sorted(T)[meres//2]

--
eutlantis

Bonyolitani mindig lehet :} Nalam ezzel megoldodott az, hogy ne legyenek kiugro ertekek az adatbazisban.

Lehet olyat is csinalni, hogy meghatarozni minimum es maxim ertekeket. Pl egy szobaban jo esellyel nem fok 10-30C intervallumon kivul kerulni a homerseklet. Esetleg meg azt is lehetne, hogy osszehasonlitani a korabbi meressel. Ha nagy az elteres, akkor szinten hibat jelezni. Problemas helyzetek jelzesere be lehet vezetni egy ujabb mezot a tablazatba, amiben elmenteni a meres allapotat.

Sic Transit Gloria Mundi

Én egy kicsit ránéznék a kommunikációs libre is. Lehet, hogy ki lehetne javítani, vagy legalább dezektálni a hibás kommunikációt. (Pl: cpu belassulás az ok - időbélyegezni a folyamatot és ha túl sok telik el, akkor eldob és ismétel, adatátvitel zavar az ok - megnézni, hogy tud-e valami hibavédő CRC-t a HW és azt használni, stb...) Sok esetben meglepően gyatrák ezek a vashoz adott libek, pláne a hobbi szektorban.

lehet az enyémnek spec rigolyája van, de nekem nem szokta összevissza elrontani a méréseket csak mindig az "elsőt".
=
Mindig kettőt mérek 5s különbséggel és kidobom az elsőt. Azóta nulla hibás tüske. Nem néztem még bele a lib-be, de olyan mintha pár perc kihagyás után elmenne aludni és újra kellene inicializalnia a dht22-es szenzort.
A boot utáni első mérés mindig rossz volt, ebből jött a megoldás