Forum Turris
Fórum Turris Nápověda

Milí majitelé routerů Turris,

toto fórum bylo 9. 12. 2016 zmrazeno a nahrazeno naším novým Turris fórem. Ještě chvíli bude dostupné k prohlížení, ale již zde není možné přispívat. Více informací naleznete v oznámení o uzavření fóra.


Dear Turris routers users,

this forum has been frozen on Dec 9th, 2016 and replaced by our new Turris forum. It will be read-only accessible for some time after. For more information, read the announcement about closing the forum.

Nahoru Téma Majitelé routerů / Gadgets / Otazka zacatecnika - spusteni po restartu a jine
- - Od Milhauszn Dne 2015-07-25 13:08
Ahoj,
predem se omlouvam za nektere druhy dotazu, jelikoz mym hlavnim oborem neni programovani, nicmene vzdy me bavilo a obcas jsem i nucen neco jednoducheho tvorit.
Gadgets uz jsem rozbalil, sice bez videa, ale jsou to hezke hracky, sirenu spustil a uz dvakrat tim slusne vylekal zenu.
A ted k otazce, pokud budu uvazovat rekneme o "inteůeigentnim" rizenim svetla v obyvaku, bude potreba aby dany program v Pythinu bezel na pozadi a to stale i po pripadnem restartu Turrise.
Proto bych se rad zeptal kam a jakym zpusobem dany program spustit (s & na konci nekde v init?), coz bych si nasel na netu, ale spis jak osetrit to, ze kdyz nady program spadne, aby o tom byl zaznam (pokud hodi chybovou hlasku) a take jak by turris mohl poznat ze uz nebezi a sam ho opet spustil od zacatku.
Dekuji moc za pomoc, sice jsem od takovehoto stale spusteneho programu jeste daleko, ale ta otazka jednou nastane :-)
Nadřazený - - Od rene.kliment (>) Dne 2015-07-25 13:23
Systémové řešení by bylo napsat init skript - není nic složitého (1), (2), který přináší např. tu výhodu jako spuštění až po vybraných službách (na kterých aplikace závisí).
Nejkratší řešení je asi do /etc/rc.local přidat před řádek s exit 0 např. něco takového:
screen -dmS sl-arduino-tu /sym/saltlamp/sl_arduino_tu.py

Co se týče kontroly běhu služby tak takové triviální řešení je do cronu dát každou minutu script, který třeba grepne výpis příkazu ps a podle toho pustí třeba /etc/init.d/služba start, i když by to šlo řešit asi nějak chytřeji. Tolik ale k jednoduchému řešení.
Nadřazený - - Od Milhauszn Dne 2015-07-25 13:41
Diky moc, to byla rychlost, to jsem ani necekal.
Kdyz nad tim premyslim, tak vlastne misto reseni i toho init, by melo stacit v tom cronu jen to hlidani, a tim vlastne i treba po te minute po restartu se vse opet "samo" spusti, tim si clovek asi muze usetrit jednu praci.
Kazdopadne diky, myslim ze otazek bude vic.
Ted jsem i premyslel, zda na vsechno ovladani ma smysl spoustet dva programy ale kvuli moznosti predvidatelne ovladat vysilani a aby nedochazelo ke kolizy, by asi ten druhy mohl jen pasivne prijimat treba teplomer.
Nadřazený - - Od rene.kliment (>) Dne 2015-07-25 13:45
Co máte na mysli tou poslední větou (dva programy, předvídatelné ovládání, kolize)?
Nadřazený - - Od Milhauszn Dne 2015-07-25 13:58
No jako jeden ovladani_svetel.py  a druhy alarm.py spustene najednou, vzhledem k odesilani cele sekvence vsem modulum najednou by to asi nedopadlo dobre.
Ale pokud by druhy byl jen teplomer.py ktery jen pasivne posloucha cidlo a zapisuje tak by asi problem nemel byt.
Nadřazený - - Od rene.kliment (>) Dne 2015-07-25 14:08
Ach tak, už chápu. Řekl bych, že bude problém, pokud by k donglu měl přistupovat více než jeden program (jak vidno když se pustí minicom a pak se má echem něco posílat).
Řešením je buď mít ovládání světel i alarmu v jednom programu, nebo použít pro připojení k donglu program, který by byl jako jakási brána, ke které by se už mohlo připojit více programů, které by mohly posílat příkazy, nebo naopak zprávy od zařízení příjmat.

Mám skoro hotový skript, který právě Gadgety zpřístupňuje po MQTT protokolu - ještě čekám na objasnění některých věcí v dokumentaci, aby byl program kompletní. Pak samozřejmě zveřejním. Tím se nechá sedět na sériovém portu jen ten skript a jakákoliv aplikace se může připojit k mqtt brokeru a objednat si určité zprávy (například teploty), nebo posílat příkazy zařízením.
Nadřazený - Od Milhauszn Dne 2015-07-25 15:32
Tak ona ta brana je tak trochu asi i ty demo, jako posilani prikazu a cteni, chapu-li spravne.
Ale asi to vse zkusim nacpat v jednom programu a dle danne situace pouzivat cidla jako alaram ci jako jako ovladani svetel.

Priznavam ze o MQTT slysim poprve, takze aspon mam namet si precist o necem novem, ale tusim jak by to mohlo fungovat.

Urcite by nebylo od veci pote jako dalsi nadstavbu udelat (treba v GUI) obecna pravidla, co se ma stat kdyz se se tohle aktivuje, kde cekat, co sepnout,v jakou dobu atd. ktery pak vygeneruje program pro spusteni. Vzhledem zatim k omezenemu poctu gadgetu by to asi nemel byt problem.
Kazdopadne ja budu mit i radost kdyz se mi podari ovladani dle mych pevne zvolenych rozhodnuti.
Nadřazený - - Od Eskymák (>) Dne 2015-07-25 20:36
Včera jsem zrovna řešil a vyřešil spouštění snímání teploty po startu.

V rozhraní LuCi jsem do /system/startup
dolů přídal řádek na skript, který spouští samotné čtení
./mnt/sd2/gadgets/thermometer.sh
který obsahuje
cd /mnt/sd2/gadgets/
python thermometer.py


Cesty budeš mít pochopitelně jinak, já mám vše na sd kartě ve složce gadgets

práva k .sh souboru pak musí povolit spuštění, třeba 744

pokud jsem spouštěl přímo příkaz python /mnt/sd2/gadgets/thermometer.py tak to nefungovalo, proto jsem příkaz rozdělil na cd a samotné spuštění. A jde to!
Nadřazený - - Od Milhauszn Dne 2015-07-25 21:42
Diky, to vypada jako nejrychlejsi reseni.
To cd je nejspis treba, aby dany .py mohl cist z aktualniho adresare, protoze se pouziva device.py, a v pripade pusteni odjinud nemuze byt videt.
Nadřazený - Od Eskymák (>) Dne 2015-07-25 21:53
díky za vysvětlení, udělal jsem to právě proto, že mi to nedělalo ten csv soubor. :-)

Předpokládám, že .sh script bych mohl spustit i přes init.d. Bohužel jsem napřed dělal init.d a když jsem zjistil, že ten přímý příkaz nefunguje, tak jsem to udělal přes ten startup, kde to taky nefungovalo. Nakonec jsem na tu příčinu přišel, opravil ale nechal jsem to v tom startupu.
Nadřazený - Od Jan Čermák (>>) Dne 2015-07-27 09:16
Pokud byste chtěl jít elegantnější cestou init skriptu, o kterém hovořil pan Kliment, tady máte minimalistický mustr: https://gist.github.com/sairon/12a7cff21d28080e8069

Stačí ho přidat do /etc/init.d (konvence je bez té přípony .sh, ta je na Gistu kvůli zvýraznění syntaxe), upravit proměnnou SCRIPT a nastavit ho jako spustitelný (chmod +x nazev_souboru). Pokud budete chtít, aby standardní (chybový) výstup byl zaznamenáván do syslogu, odkomentujte řádek s option stdout, resp. stderr. Jen pozor - ty výstupy jsou bufferované, to znamená, že se ihned po printu ten text v logu nemusí objevit. Dá se to řešit více způsoby, nejjednodušší bude asi spuštět python s příznakem -u, čili stačí úprava příslušného řádku python "$SCRIPT".
Nadřazený - Od linker Dne 2015-07-27 18:58
Pracujem na deamonovi ktory bude sledovat jednotlive eventy z gadgets a bude na nich reagovat. Este to musim troska otestovat a vycistit kod. Pridam potom link na github.
- - Od Milhauszn Dne 2015-07-27 21:54
Pridam to sem.
Jelikoz se ucim v pythonu prakticky od nuly, tak se omlouvam za pripadne osklivosti proti zvyklostem.
Nicmene jsem si pokusne vytvoril kod na automaticke zhasnuti svetla pri otevrenem balkonu (proti komarum) a opetovne zapnuti, s tim ze sleduje i denni dobu sviti jen kdyz je potreba v nejakem rozmezi (ten cas zapadu by bylo dobre menit automaticky dle datumu, ale to az budu mit vyreseno vse ostatni).
Dalsi krok planuju porovnavat cas posledniho pohybu ze senozoru a pripade ze se clovek treba pulhodky nehybe, pak tez zhasnout a ne az v pulnoci.
Za jakykoliv komentar budu vdecny, mozna to jeste nefunguje jak ma, asi v pripade spusteni v case kdy se ma svitit.
Mam jen otazku, k pripadnemu timeoutu pri cteni line, takhle kod ceka na jakykoliv podnet, treba od teplomeru, ktery pravidelne vysila, a nebo od beacon vysilani (nenasel nekdo jak casto se tento beacon vysila, treba od magnetu?, nemeril jsem to a cekat se mi nechce). Nicmene pokud by se pouzil timeout, tak hrozi ztrata nejakeho vysilani, nebo zustane na sbernici a stihne se vycist v "dalsim kole"?
Tady je muj pokus:

from __future__ import print_function
import sys
import datetime

from device import Device

if __name__ == "__main__":
    device = Device(device="/dev/ttyUSB0")
    reader = device.gen_lines()
    balkon = "0"
    tma = False
    zapnuto = False
    cas= datetime.datetime.now()
    zapad =cas.replace(hour=20, minute=30, second=00, microsecond=0)     #treba pulhodka pred zapadem
    pulnoc = cas.replace(hour=23, minute=59, second=00, microsecond=0)
    pohyb_cas= datetime.datetime.now()
    while True:
        line = reader.next()
                   
        if line[1:9] == "xxxxxxxx" and len(line)> 32:     #cteni magnetu, delka kvuli beacon vysilani
            balkon = line[34]
            if balkon == "0" and tma:
                device.send_command("TX ENROLL:0 PGX:1 PGY:0 ALARM:0 BEEP:NONE")
            else:
                device.send_command("TX ENROLL:0 PGX:0 PGY:0 ALARM:0 BEEP:NONE")
       
      
        if line[1:9] == "xxxxxxxx" and line[23] == "S":   #cteni PIR
            phyb = True
            pohyb_cas= datetime.datetime.now()
           
        cas= datetime.datetime.now()
        if cas > zapad and cas< pulnoc:
            tma = True
        else:
            tma = False
       
        if tma and balkon =="0" and zapnuto == False:
            device.send_command("TX ENROLL:0 PGX:1 PGY:0 ALARM:0 BEEP:NONE")
            zapnuto = True
        elif tma== False and zapnuto:
            device.send_command("TX ENROLL:0 PGX:0 PGY:0 ALARM:0 BEEP:NONE")
            zapnuto = False
Nadřazený - Od Milhauszn Dne 2015-07-28 21:52
Tak odpovedi jsou v jinem vlakne ohledne cetnosti beacon vysilani.
Pokusil jsem se pridat funkci i s alarmem:

https://gist.github.com/milhauszn/d77e5ef99a89b9df14fe

rad si prectu pripominky k chybam. Postupne bych i kod rad vybavil odesilanim mailu a to i treba pri detekci ze senzoru koure.
Nahoru Téma Majitelé routerů / Gadgets / Otazka zacatecnika - spusteni po restartu a jine

Powered by mwForum 2.29.3 © 1999-2013 Markus Wichitill