Python 2.7: hodinový cyklus pro spuštění akce

Python 2.7: hodinový cyklus pro spuštění akce
« kdy: 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

Kód: [Vybrat]
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í."   

« Poslední změna: 22. 01. 2017, 19:13:45 od Petr Krčmář »


David

Re:Python 2.7-hodinový cyklus pro spuštění akce
« Odpověď #1 kdy: 21. 01. 2017, 20:57:47 »
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.

David

Re:Python 2.7-hodinový cyklus pro spuštění akce
« Odpověď #2 kdy: 21. 01. 2017, 21:01:21 »
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...

gll

Re:Python 2.7-hodinový cyklus pro spuštění akce
« Odpověď #3 kdy: 21. 01. 2017, 21:37:34 »
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

Kód: [Vybrat]
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.

gll

Re:Python 2.7-hodinový cyklus pro spuštění akce
« Odpověď #4 kdy: 21. 01. 2017, 21:41:00 »
Kód: [Vybrat]
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í."   


Jan Stránský

Re:Python 2.7-hodinový cyklus pro spuštění akce
« Odpověď #5 kdy: 21. 01. 2017, 22:11:53 »
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

Kód: [Vybrat]
ltime = localtime() # jedine volani
if strftime("%S", ltime)=="00" and strftime("%M", ltime)=="00":

Jenda

Re:Python 2.7-hodinový cyklus pro spuštění akce
« Odpověď #6 kdy: 21. 01. 2017, 23:39:49 »
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.

Tomas Korcak

Re:Python 2.7-hodinový cyklus pro spuštění akce
« Odpověď #7 kdy: 21. 01. 2017, 23:44:23 »
http://stackoverflow.com/questions/22715086/scheduling-python-script-to-run-every-hour-accurately

Kód: [Vybrat]
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')

Re:Python 2.7-hodinový cyklus pro spuštění akce
« Odpověď #8 kdy: 22. 01. 2017, 09:56:24 »
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
Kód: [Vybrat]
topzjistil, jak si na tom stojí procesor, jak psal Jenda. Ano, frčí na 100% díky procesu Python. Přes
Kód: [Vybrat]
vcgencmd measure_tempjsem 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ě
Kód: [Vybrat]
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.

Re:Python 2.7-hodinový cyklus pro spuštění akce
« Odpověď #9 kdy: 22. 01. 2017, 10:51:25 »
Tak jsem to upravil na apscheduler, přes
Kód: [Vybrat]
pip install apschedulermi 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
Kód: [Vybrat]
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

Re:Python 2.7-hodinový cyklus pro spuštění akce
« Odpověď #10 kdy: 22. 01. 2017, 11:19:11 »
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.