Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: PedroKV 21. 01. 2017, 20:48:02
-
Ahoj, nemůžu přijít na to, kde udělali soudruzi chybu, když se cyklus spouští nejen v každou celou hodinu, ale i minutu poté. Ovšem ne vždy. :-/ Některou hodinu to proběhne jak má, některou ne.
Skript má jednou za hodinu zjistit vzdálenost (výšku uhlí) z ultrazvukového čidla v násypce kotle, hodnotu poslat přes ftp do .txt souboru a zavolat php skript, kterému předá výšku uhlí a php skript ji zapíše do SQL databáze (hostingy neví, co by si za externí přístup řekly...)
Díky za rady
x=0
while x==0:
if strftime("%M", localtime())=="00" and strftime("%S", localtime())=="00":
mereni=measure()
i=5
while (mereni==-1) & (i>0): # vysledek mereni je -1, kdyz je mimo rozsah,
mereni=measure() # zde 5 pokusu ziskat validni vysledek.
i=i-1
ftp=FTPupload(distance=mereni) # tohle a pak sqhhandover probehne
if mereni!=-1: # v kazdou celou, ale i minutu pote
php=phpsqlhandover(distance=mereni)
print timenow()+" KONEC SMYČKY. Čekám na další měření."
-
Nebude to tim, ze skript probehne moc rychle, takze pri druhem pruchodu je podminka taky jeste splnena?
Zkusil bych tam pridat nejaky sleep na 1 sekundu.
-
Nebude to tim, ze skript probehne moc rychle, takze pri druhem pruchodu je podminka taky jeste splnena?
Zkusil bych tam pridat nejaky sleep na 1 sekundu.
Jo minutu pote. Tak to placam blbosti...
-
Ahoj, nemůžu přijít na to, kde udělali soudruzi chybu, když se cyklus spouští nejen v každou celou hodinu, ale i minutu poté. Ovšem ne vždy. :-/ Některou hodinu to proběhne jak má, některou ne.
Skript má jednou za hodinu zjistit vzdálenost (výšku uhlí) z ultrazvukového čidla v násypce kotle, hodnotu poslat přes ftp do .txt souboru a zavolat php skript, kterému předá výšku uhlí a php skript ji zapíše do SQL databáze (hostingy neví, co by si za externí přístup řekly...)
Díky za rady
x=0
while x==0:
if strftime("%M", localtime())=="00" and strftime("%S", localtime())=="00":
mereni=measure()
i=5
while (mereni==-1) & (i>0): # vysledek mereni je -1, kdyz je mimo rozsah,
mereni=measure() # zde 5 pokusu ziskat validni vysledek.
i=i-1
ftp=FTPupload(distance=mereni) # tohle a pak sqhhandover probehne
if mereni!=-1: # v kazdou celou, ale i minutu pote
php=phpsqlhandover(distance=mereni)
print timenow()+" KONEC SMYČKY. Čekám na další měření."
Můžete to opravit přehozením těch testů. Nejdřív testovat vteřiny a potom minuty.
lepší by bylo použít cron, případně sleep.
-
x=0
while x==0:
if strftime("%S", localtime())=="00" and strftime("%M", localtime())=="00":
mereni=measure()
i=5
while (mereni==-1) & (i>0): # vysledek mereni je -1, kdyz je mimo rozsah,
mereni=measure() # zde 5 pokusu ziskat validni vysledek.
i=i-1
ftp=FTPupload(distance=mereni) # tohle a pak sqhhandover probehne
if mereni!=-1: # v kazdou celou, ale i minutu pote
php=phpsqlhandover(distance=mereni)
print timenow()+" KONEC SMYČKY. Čekám na další měření."
-
Tam je hlavni problem v tom, ze se testuji dva ruzne casy, dve volani localtime() (zaokrouhlene na vteriny muzou a nemusi byt stejne). Pak se muze stat (dost nahodne), ze prvni je hh:00:59 a druhy hh:01:00.
Staci neco jako
ltime = localtime() # jedine volani
if strftime("%S", ltime)=="00" and strftime("%M", ltime)=="00":
-
Tohle je neustálé testování v nekonečné smyčce, takže to úplně zbytečně vyhulí procesor na 100 %. Takže to bude víc topit a víc žrát.
Buď bych si zjistil, kolik sekund zbývá do konce hodiny, a udělal time.sleep(to_číslo), nebo bych to volal z cronu.
-
http://stackoverflow.com/questions/22715086/scheduling-python-script-to-run-every-hour-accurately
import datetime
import time
from apscheduler.scheduler import Scheduler
# Start the scheduler
sched = Scheduler()
sched.daemonic = False
sched.start()
def job_function():
print("Hello World")
print(datetime.datetime.now())
time.sleep(20)
# Schedules job_function to be run once each minute
sched.add_cron_job(job_function, minute='0-59')
-
Díky všem za odpovědi.
Zatím (než se k tomu večer opět dostanu), použil jsem metodu volání času 1x (ltime=localtime()) jak psal Jan Stránský.
Ještě předtím jsem si přes
top
zjistil, jak si na tom stojí procesor, jak psal Jenda. Ano, frčí na 100% díky procesu Python. Přes
vcgencmd measure_temp
jsem zjistil, že teplota procesoru je 52°C (RPi je momentálně v kotelně, kde je tak +-23°C), když vypnu ten pythoní skript, tak teplota poklesne o 5-6°C na cca 47°C.
Zatím jsem do smyčky upravené dle Jana stránského přidal ještě
time.sleep(3540)
tím bych měl na 59 minut procesoru ulevit. Systémově to ale není dobře, protože tu minutu to pojede na plný kotel, + kdyby náhodou měření + ftp upload + mysql zápis neproběhl do minuty (celá hodina + 59s), tak další měření neproběhne.
Večer tedy upravím program na apscheduler, s parametrem minute='0'. To by mělo zajistit spuštění programu v každou celou a pak na hodinu padla. Pak dám vědět.
-
Tak jsem to upravil na apscheduler, přes
pip install apscheduler
mi to vyhodilo chybu, pak jsem s tím laboroval dál, zpětně si uvědomuji, že jsem asi párkrát zblbnul počet "p" a "l" v názvu aplikace, nakonec nainstalováno přes
sudo easy_install appscheduler==2.1.2
Program spuštěn, za 9 minut se ukáže ;-) Top hlásí jako nejvytíženější program "top" - 15% a to asi 3 sekundy, pak spadne skoro/na nulu. Takže paráda. Teplota procesoru 46°C
Jen to má pro mě jednu vadu na kráse: běžící program nejde zastavit přes ctrl-c.
Spouštím ho v tmuxu, takže bych dokázal odstřelit tu tmux session přes "ctrl-b x". Je to takto OK? Nebo existuje jiné řešení?
Díky
-
Tak to šlape. V příloze posílám pár obrázků toho řešení. Na na grafu jde vidět, že čidlo občas změří nesmysl. Hlavně, když je násypka plná (90-100+cm), tak ukazuje někdy třeba 45cm. Na přijímač jsem tedy nasadil trubičku, doufajíc, že se omezí příjem vyslaného signálu odrazem (= delší uražená vzdálenost, = méně uhlí), nicméně v noci to jednou změřilo 46cm a poté 74cm. Až mi přijde jiné čidlo (US-015), vyzkouším to, jinak se s tím budu muset buď smířit, nebo detekovat, zda naměřený úbytek není větší jak třeba 10cm a pokud ano, provést opakované měření. V zásadě jsem ale vyřešil problém, jak zjišťovat, zda je v zásobníku uhlí, když tam nejsme (rekonstrukce).
Ještě se zeptám na jednu věc: když chci zveřejnit zdrojáky, kam bych je měl nahrát? Můžu na svůj web, ale napadl mě třeba github... Jen s githubem nemám žádné zkušenosti.