Alan Ibrus

Tarkvara Arendaja |

Tark kodu. Raspberry PI ja valvesüsteem, kaamera, temperatuur, Messenger Bot…

(0 kommentaari)

Seekord uuest projektist.

Selline kasutajaliides vaatab mulle nüüd vastu koridorist.

Idee

Et majal oli DSC signalisatsioonisüsteem juba varasemalt paigaldatud, koos liikumis- ja usteanduritega siis tahtsin hirmsasti, et ma ei peaks seda koledat valget nuppudega valvepulti enam kunagi kasutama. Aga ma ei tahtnud kogu valvesüsteemi välja vahetama hakata. Alguses mõtlesin, et prooviks kuidagi andurite kaablid Raspberry külge ühendada. See kõlas natukene turvariskina ja samuti vajanuks üsna sügavuti elektroonikasse uppumist ja erinevate komponentide tellimist, jootmist… Ühesõnaga olnuks väga suur projekt.

Sai natukene rohkem uuritud ja leidsin asja nimega AlarmDecoder (link poodi), millel on Raspberry külge ühenduv moodul ja DSC, Ademco / Honeywelli signalisatsioonisüsteemidega ühilduvus. AD2PI nimeline toode maksab ~65€ ja kuna Euroopa mandrilt teda leida ei õnnestunud, tuli natukene maksta ka tolli. Transpordi ja maksudega jõudis ta mõned eurod alla 100 kätte. Odavam, kui mistahes muu lahendus. Lisaks – kogu vana valvesüsteem jääb töökorda ja häda korral (misiganes rike) saab siiski kasutada, valget, klassikalist nuppudega paneeli. Samuti, kuna originaal valvesüsteem käib ka aku pealt ja seda Raspberry-t ma aku peale ehitada ei kavatsenud, siis jääb originaal süsteem toimima ka voolukatkestuse korral.

Mida AD2PI teeb on sisuliselt lihtsalt signalisatsioonisüsteemile, toetatud serial interface läbi, käskude andmine ja sündmuste kuulamine ning pakub oma API-t sellega suhtlemiseks. Nö. “proxy” oma custom lahenduse ja valvesüsteemi vahel. Põhimõtteliselt, kui ma panen Raspberry kaudu maja valvesse, siis tegelikult juhtub taustal sama asi, kui ma sisestaks käsitsi oma PIN koodi originaal paneelist.

Ülesehitus ja tehniline pool

Minu targa kodu jaoks on kasutusel 3 Raspberry PI-d:

Esimesena Raspberry PI v3, mis on paigutatud koridori seina sisse ja mille ette on liimitud seinale puutetundlik ekraan ja ühenduses WiFiga on sisseehitatud WiFi abil. Tarkvara poolest jookseb Raspbian, LXDE ja kioski režiimis Firefox mis manab isetehtud kasutajaliidest, mis omakorda WebSocketiga Node.JS backendi küljes. Enne tänast jooksis seal paar kuud Google Chrome aga avastasin, et see kasutab Firefoxist oluliselt rohkem nii protsessorit kui mälu. Võrdluseks, Google Chrome kasutas stabiilselt ca 45% CPU-d ja 25% mälu. Firefox kasutab täpselt sama asja tehes 12% CPU-d ja 15% mälu. Wow… Firefox on vahepeal metsikult arenenud. Märgin ära, et suurima koormuse tekitaja on 5fps kaamerapildi näitamine. Node.JS backend suhtleb kahe järgmise PI-ga. Välistemperatuur ja ilmainfo tuleb OpenWeatherMap API kaudu.

Teiseks, Raspberry PI v1 koos eelnevalt mainitud AD2PI mooduliga. See PI on valvekapi külge ühendatud ja vähe korralikum WiFi pulk on ka küljes, sest PI1-l sisemine kiip puudub ja kuna valvekapp on üsna peidus, siis parem korralikum pulk, et WiFi sealt kinni püüda. Selle peal jookseb AlarmDecoderi enda moditud Raspiani image (lihtsalt mõned pakid eelinstalleeritud jne, et AD2PI töötaks out-of-box). Et mulle nende pakutud API niiväga ei meeldinud, lülitasin selle välja ja taustal käib ser2sock, mis kõik AD2PI serial sündmused TCP kaudu nähtavaks teeb. Ser2sock kaudu suhtles ka AD2PI enda API lahendus ja oli eelinstalleeritud/seadistatud. Seega tarkvara poolest on ta minu poolt näppimata, lihtsalt ressursi säästmise mõttes lülitasin lihtsalt nende veebiserveri kinni.

Kolmandaks, Raspberry PI v2, mille järel on valvekaamera ja temperatuuri andur. Tarkvara Rasbian ja motion. Ei pidanud ka siin väga vajalikuks mingit custom tarkvara ehitadagi, sai lihtsalt üks croni task iga minut temperatuuri temp.txt faili kirjutama pandud, mida siis esimene Raspberry sealt samuti iga minuti tagant vaatamas käib.

Mugavus

Mugav valvekoodide haldus: Kui mul on originaalpaneeli programmeeritud üks kood, ütleme 1234, siis Raspberry kaudu saadan ma samuti koodi 1234. Mida ma aga lisaks teha saan, on mappida enda interfaces lisakoodid. Näiteks sisestades ekraanilt 5555, saadan taustal valvesüsteemile ikkagi 1234. Koodide loomine on oluliselt lihtsam ja mugavam kui originaalsüsteemi neid sisestada.

Kasutajaliides: Kui midagi on juhtunud, vaja valvesse panna aga kuskil on midagi lahti või toimub mingi liikumine siis originaalpaneel vilgutab erinevaid LED-e. Et mul on kasutuses hunnik tsoone (liikumisandurid, uste andurid, suitsuandurid) siis kes kurat viitsib neid LED-e tõlgendada ja paberist näpuga vaadata, mis siis toimub või mille pärast signalisatsioon tööle läks. Tegin omale mappingu ja nüüd näitab kasutajaliides kenasti: liikumine garaažis; esiuks avatud jne. Kui süsteem on häiresse läinud, näen samuti ära kellaajaliselt, mis ja kus.

Laiendatavus: Ehk siis, ehita kõik ideed ise ära. Mina täiustasin asja Facebook Messenger Boti loomisega. Kui tuleb minu kasutaja ID-ga teade “arm” või “disarm”, läheb süsteem valvesse või vastavalt valvest maha. Kui valvesoleku ajal kuskil liikumine toimub, tuleb botilt teade. Kui saadan botile telefonist mõne pildi, muutub koridoris olev kasutajaliides korraks pildiraamiks ja näitab saadetud pilti. Messenger Bot on ehitatud ka Node.JS-is ja istub esimeses Raspberrys.

Messenger Bot lahendab mitu kärbest korraga. Tulevikus kavatsen näiteks selle kaudu saata telefonile teate, kui sauna temperatuur on “õige”.


Jätkub…

 

2.5 aastat hiljem

(0 kommentaari)

Viimane projekt, millest siin kirjutasin (Arvutist juhitav, mobiilse võrguga auto) sai küll mingil etapil “valmis” aga peale mida jäi asi kohe ka nurka seisma. Võtan siin korraks viimase seisu sellega kokku ja siis teen kohe postituse uuest, seekord päriselt valmis projektist.

Ühesõnaga, autoprojekt. Ei jõudnudki siin kajastada, et mispärast see üldse ette võetud sai. Niisiis siit ta tuleb:

Esimene plaan oli, et teeks enese harimiseks lihtsalt midagi lõbusat: lammutaks puldiga auto laiali ja teeks niimodi, et seda saaks arvuti teel juhtida. Loomulikult kaamerapildi abil.
Idee sündis muide poes, Prismas, juhuslikult eksinuna puldiga autode riiuli juurde. Krabasin (ok, ostsin) auto kaasa ja läksin koju ehitama. WiFi pulka kodust ei leidnud aga oli üks 3G USB modem üle. Sellest arenes idee, et ohoh, teekski siis nii, et mitte WiFi, vaid 3G – näiliselt: jäta auto metsa ja juhi ise kodust.
Mis edasi juhtus, saab juba varasematest postitustest näha. Kuhu aga projekt lõpuks jõudis, millest siin kajastada ei jõudnud?

Vahepeal ütlen GStreamer FTW! Tänaseni kõige optimaalsem lahendus Raspberry pealt kaamerapilti edastada. Kui keegi on täna küsimuse ees, et millega hardware accelerationi tuge kasutada ja Raspberryst kaamera pilti saata, siis, vähemalt veebruar 2017 seisuga, ärge nähke vaeva: midagi Gstreamerist asjalikumat veel ei ole. Õnneks on mõned lahendused work in progress.

Idee edasine versioon tekkis töökaaslasega spontaanselt tekkinud ajurünnakul. Teha sarnaseid autosid 4-5tk, ehitada neile oma rada, asendada 3G ikkagi kiire WiFiga ja lasta inimestel üle veebi nendega mängida. Ehk siis nagu arvutimäng aga päris graafikaga ja päris füüsikaga. Põnev! Selleks saigi VÄGA kriitiliseks omaduseks seatud videopildi as-realtime-as-possible edastamine. Ei taha keegi mängida nii, et kurvi pööramist peab alustama sekund varem ja kui maha magad, kütad autoga seina. Teine, natukene vähetähtsam omadus, mida paraku tollaste vahenditega lahendada ei saanudki, oli seda kõike teha brauseriaknas: nõnda sai küll alustatud ja asi ka esialgselt toimima aga videopildi viivitusest veebitehnoloogiatega jagu ei saanud.

Tehniliselt: Ilmselgelt jäi lukku üle UDP pildi saatmine, TCP overhead on saatanast. Pildi edastamine ja juhtimine läbis sellise teekonna: Auto saadab pildi serverisse saksamaal, klient avab ühenduse serveriga, võtab vastu pildi ja edastab läbi serveri autole käske. Klient tähendas tollal sisuliselt .NET rakendust mis tõmbas taustal käima Gstreameri instantsi ning avas suhtluse serveri ja kliendi vahel. UDP video jaoks ja TCP stream käskude jaoks. Tekkis eraldi Gstreameri aken videoga, mille viivitus muuseas oli isegi läbi saksamaa serveri, alla 80 millisekundi. Rakenduse enda aken jäi kuulama klaviatuuri sisendit (nooleklahvid juhtimiseks, SHIFT nupu all hoidmine aeglase sõidu jaoks). Serveris kogu backend Node.JS ja autos kogu juhtimine samuti Node.JS peal.
Toimis! Tehniliselt täiesti suurepäraselt toimis. Nagu päris. Küll eraldi allalaetava rakenduse abil, mitte läbi brauseri, aga toimis.

Vaimustus läks aga üle, kui leidsin ennast mõttelt, et neid masinaid oleks vaja 4-5tk teha, et ideega edasi minna. Esiteks hakkas mind kohutavalt häirima selle odava auto platvorm – pöördemehhanism… ah, mis pöördemehhanism… kogu auto platvorm oli jamps! Hakkasin eBays surfima ja uut platvormi otsima. Mitte midagi asjalikku ei leidnudki. Et sõitmine toimiks nagu vaja, peaks olema platvorm natukene kõrgem, tagaveoline ja korraliku pöördemehhanismiga. Kõik odavamad olid kas 4×4 robotiplatvormid, kus pööramine toimub ühe poole rataste vastupööramisega ja mis ei sobi kuidagi või siis samasuguse juustuse esisilla ehitusega, nagu minu praegune. Kõik kallimad olid aga sellise hobiprojekti jaoks liiga kallid ja disaini poolest keerulised, et sinna viisakalt Raspberry ja kolakas akupank veel peale aretada.

Kaks aastat hiljem leidsin siiski midagi, mis võiks juba natukene lubada:

Pole veel proovidagi saanud aga nüüd juba mõtlen, et ILMSELT tahaks saada ka vedrustust või siis vähemalt optilise stabilisaatoriga kaamerat. Eksole. Ei tea. Kui kokku saab, eks selgub. Kui on vaja, siis läheb asi jällegi liiga kalliks.

Äkki tuleks asi Open Source projektiks muuta ja Donate nupp lisada? ;)

Mobiilivõrgu-auto update: reaalajas video (peaaegu)

(0 kommentaari)

Sisuliselt kõik levinud videoedastusmeetodid ja -protokollid läbi proovitud! Olin peaaegu kogu projekti korstnasse kirjutamas, sest Raspberryst lihtsalt ei tundunud olema võimalik alla 1-sekundilise viivituse videot kuidagi kätte saada, seda isegi sisevõrgus. Olin päris nördinud, et tänasel päeval ei ole ainsatki normaalset lahendust. Lahendusi on aga kõik on suure viivitusega. Ja põhimõtteliselt reaalaja video edastamine veebi tuli kohe ära unustada. Uskumatu aga selleks ei leidnudki ühtki head lahendust ja selle üle olin väga pettunud kuna plaan oli teha 100% browser-based juhtimine.

Igatahes, lõpuks proovisin GStreamer-i nimelist vidinat ja tundus, et nüüd edasi on vaid softikirjutamise rida. Päris nii lihtne siiski ei olnud. Sisevõrgus autost arvutisse pildi saamine üle UDP, kasutades mõlemas otsas GStreameri enda rakendusi, oli tõesti lihtsamast lihtsam ja viivitus oli juba üsna madal:

Tjah. Proovitud sai ka üle TCP videot edastada sest nõnda oleks päris palju asju lihtsamini lahendatavad aga üle TCP overhead oli koheselt 1-2 sekundit mis ei ole kuidagi OK auto juhtimise seisukohalt. Natuke bitrate-i kohendades sai sisevõrgus üle UDP viivituse ülimadalaks, sisuliselt reaalajaks. Aga sisevõrgus juhtimine mind ei huvita ja nõnda läks jälle auto testimiseks väga olematut kiirust pakkuva netipulga peale. Siin aga tekkisid mõned UDP kasutamisest kaasnevad tagasilöögid. Auto-server-klient andmete edastamine olnuks TCP-ga väga lihtne, UDP-ga oli paras väljakutse. Autost serverisse – easy. Kuidas sealt edasi suvalisele kliendile kellel ei ole avatud porte, vajas natuke mõtlemist. Asi ka muidugi kergelt sellest, et olin siiani UDP-ga vähe kokku puutunud ja kolmeliikmelist lüli ning väljaspool sisevõrku ei olnud UDP-ga kunagi proovinud. Taaskord oli veider see, et Googlest ei leidnud ühtegi konkreetset näidet sellise ülesehituse kohta. Üritan sellest teemast eraldi postituse teha.

Igal juhul kui sain esimest korda näha üle netipulga edastatud near-realtime videot ja kui madal viivitus isegi läbi selle aeglase pulga/paketi tuli, üllatas väga:

Seejuures gStreamer töötleb videot GPU-s ning CPU kasutus jäi stabiilselt vaid ~5-8% juurde. Selline efektiivsus on hea ja see säästab kokkuvõttes oluliselt ka akut. ffmpeg ja alternatiivid kasutasid kõik 100% CPU-d.

Paraku olen hetkel sunnitud auto juhtimiseks kirjutama eraldi programmi ja videopildi jaoks kasutama gstreamerit mõlemas otsas. Kuna päevast-päeva tegelen veebitehnoloogiatega ja mulle tundus juba vaikselt, et veebis on tänasel päeval võimalik pea kõik ära teha siis tilgub süda natuke verd küll.

To be continued… :)

Puldiga auto transformeerumine videot edastavaks 3G autoks

(0 kommentaari)

Kunagi ammu tekkis mõte, et tahaks proovida kaameraga varustatud mänguautot arvutiga juhtida. Nii, et auto peal olev kaamera edastab üle võrgu videopilti ja ise juhin teda samal ajal klaviatuuri nooleklahvidest. Nõnda sai kunagi ostetud ka Prismast üks hästi suvaline ja lihtne puldiauto. Paraku jäi ta kohe ka ajanappuse ja vähese motivatsiooni tõttu riiulile seisma…

Eelmine nädal võtsin ennast siiski lõpuks kokku ja hakkasin katsetama. Tellida oli vaja Raspberry PI peale sobiv mootori draiver ja kohalikust poest haarasin ka ühe 6800mAh akupanga.

1613827_10152628863569592_3024820940279432370_n

Ruttu kõik vajalik kokku, mõni rida koodi ja saigi juba tulemusi näha:

Siis tekkis juba ka korralik motivatsioonipauk ja järgmine päev sai veel koodi täiendatud. Ja juba toimuski üle võrgu nooleklahvidega mootorite kontrollimine:

Järgmine etapp oli akupanga ja 3G pulga ühendamine ja siis sai latentsust proovida sest siiani oli ta ainult kaabliga sisevõrgu otsas olnud. Kuigi niigi kehvemapoolse pulga sisse sai ilma igasuguse netipaketita EMTi kaart, jäin sellise viivitusega üsna rahule.

Arendus oli siiani võtnud 4-5 tundi. Auto juhtimine toimis: autopoolne backend, server ning kliendi poolsed rakendused olid juhtimise seisukohalt OK. Et mitte kaotada motiveeritust liigse juhtimise koodi optimiseerimisega tuli kohe algust teha kaamera monteerimise ja videopildi striimimisega autost serverisse ja serverist kliendini. Ja tund hiljem sõitsingi juba autoga mida oli võimalik juhtida arvutist ilma autot ise nägemata. Video latentsus oli liiga suur aga vähemalt käis asi üle netipulga mitte üle wifi. Sealhulgas endiselt oli pulgas sees väga kehva kiirust pakkuv kaart. Video on küll masendav 320×240@10fps ja ülimadala bitrate’ga aga vähemalt nägin ära, et asjal võiks peale kergeid optimiseerimisi ja täiendamisi täitsa jumet olla:

Selgus ka, et auto on niivõrd raskeks läinud, et 6V mootorid enam raspberry 5V toite pealt eriti teda edasi liigutada ei jõudnud. Lahendus: teeme auto veel raskemaks! Garaažist tagasi tuppa ja lasin käiku 4xAA patareid mis läksid auto originaal patareihoidikusse ning mis toidavad nüüd ainult mootori draiverit. Raspberry käib endiselt akupangalt. Siis tuli asja uudistama ka sõber, kellel lasin autot esimese alpha-testijana garaažis juhtida ise samal ajal väga kehva kaameratööd tehes (ok, süüdistan fiks-58mm manuaal fookusega objet ja mul lihtsalt ei olnud võimalik kaugemale minna ;))

Auto lahtine kere kukkus mitu korda ümber; netipulga kehva ühenduse tõttu oli video viivitus 1.5-2 sekundit. Õnneks klahvi vajutused reageerisid peaaegu kohe. Juhtimine on väga hea, nüüd tuleb autole leida (oluliselt) parem võrguühendus, kasutada optimaalsemaid vahendeid video edastuseks ning siis proovida vähemalt 640×480@15fps ja mõistliku kvaliteediga edastada.

Tänaseks on asi jälle natuke soiku jäänud kuna ma ei ole enam rahul selle puldiauto platvormiga. Liiga madal, slikid rehvid, kehv pöördesüsteem, ainult üks nõrk mootor edasi liigutamiseks… Samas üritan ikkagi selle versiooni lõpuni teha, et näha enne kas kõik see mida ma tahan saavutada üldse realiseeritav on.
Mis plaan mul sellega lõppkokkuvõttes on, näeb siis kui olen ühe prototüübi vähemalt nii heaks saanud, et seda 100km kauguselt ilma seina kordagi põrutamata juhtida on võimalik.

To be continued… :)

Raspberry PI + NoIR Kaamera (+Testvideo)

(2 kommentaari)

Pole juba pikka aega siia kirjutama jõudnud. Ja ka nüüd jääb jutt esialgu lühikeseks (kunagi hiljem pajatan pikemalt).

Mulle jõudsid mõned uued mänguasjad inglismaalt – NoIR kaamerad Raspberry PI-le ja plaanisin nende osas väheke sõna levitada.

Raspberry ja NoIR kaamera

Tegemist on peaaegu täiesti tavalise RPI kaamera mooduliga, millest mõni ilmselt juba varem kuulnud on. Välimuselt eristab neid kaht ainult roheline vs must PCB. Olulisem erinevus on aga loetav nimelisandist: NoIR, ehk no infrared, mis vihjab ära, et kaamera  pildisensorist on eemaldatud infrapuna valguse filter. See annab kaamerale omajagu eeliseid (kellele mis eelis muidugi) ja hobikorras saab näiteks proovida kätt  infrapuna fotograafias, DYI variandina turvakaamera või timelapse’i tegemine, kus jäävad ka öösel, pimedas tehtud kaadrid selgelt näha… variante on igasuguseid.

… Loe edasi …

Raspberry PI + Node.JS + ID-kaart + Puutepaneeli demo

(3 kommentaari)

Viimasel ajal hakkab mul nähtavasti vähem-juttu-rohkem-videosi moto trendiks saama. Niisiis jätkan seda trendi ja jätkan ka üht teist trendi nimega Raspberry PI.

Järgnevas videos on näha väikene arendusprotsess ID-kaardi lugemises ja näha on ka, kuidas mu tavaline lauaarvuti on ühendatud Raspberry-s jooksva back-endi külge, tänu millele näitab minu arvuti täpselt sama informatsiooni, mida Raspberry PI oma ekraanil, reaalajas. Olgu mainitud, et kogu videos nähtav tarkvara on sisuliselt ainult JavaScript – nii backend, mis loeb ID-kaarti ja saadab andmeid kõikidele külgeühendatud striimidele, kui ka graafiline frontend, mis näitab valitud andmeid ekraanile. Ja video lõpus on näha natukene ka puutepaneeli demo :)

Raspberry PI + LCD + Puutepaneel

(13 kommentaari)

Uh, kiire täiendus mu Raspberry PI uuendustest ja saavutustest. Eriti pikalt kirjutada ei jõua, aga väike ülevaade siiski:

28.mai saabus mu postkasti Hong Kongist tellitud LCD ja puutepaneeli kontroller.

Peale ühendamist oli tulemus juba silmaga näha:

30.mai jõudis kohale ka puutepaneel, millele järgnes 6 tundi haardkoor häkkimist, mis sisaldas mitu korda kerneli kompileerimist ja ca 8 erineva kalibreerimistarkvara katsetamist. Nagu ikka toimis kõige viimasena proovitud variant, kuid ka see tuli patchida ja eraldi kompileerida (binaarversioon ei hakanud tööle). Igaljuhul tulemus on hea (kuigi sain parema kalibratsiooni peale video tegemist):

Raspberry PI + Node.JS + ID-Kaart

(3 kommentaari)

Hei. Pole päris ammu suvatsenud oma blogisse midagi postitada. Noh, tegelikult ei ole midagi asjalikku öelda olnud ja “pastakast” jutte imeda ka ei taha.
Täna otsustasin midagigi kirjutada, kuna mul on midagi, mida eestis tänase päeva seisuga on ilmselt vaid mõni üksik isend. Mõne kuu pärast on neid siin juba sadu, kui mitte tuhandeid. Ja sealt edasi juba ilmselt hakkavad need vidinad levima kui kulutuli.
Well…

… Loe edasi …