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 :-)
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í.
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.
Co máte na mysli tou poslední větou (dva programy, předvídatelné ovládání, kolize)?
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.
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.
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.
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!
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.
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.
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/12a7cff21d28080e8069Stačí 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
print
u 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"
.
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.
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
Tak odpovedi jsou v jinem vlakne ohledne cetnosti beacon vysilani.
Pokusil jsem se pridat funkci i s alarmem:
https://gist.github.com/milhauszn/d77e5ef99a89b9df14ferad si prectu pripominky k chybam. Postupne bych i kod rad vybavil odesilanim mailu a to i treba pri detekci ze senzoru koure.
Powered by mwForum 2.29.3 © 1999-2013 Markus Wichitill