Kazalo:

Alexa, kje so moji ključi?: 4 koraki
Alexa, kje so moji ključi?: 4 koraki

Video: Alexa, kje so moji ključi?: 4 koraki

Video: Alexa, kje so moji ključi?: 4 koraki
Video: 🚀 AMAZON 2.0 - ИНТЕРНЕТ МАГАЗИН с нуля за 6 часов [Next / React / Nest / PostgreSQL / Prisma / TS] 2024, Julij
Anonim
Image
Image
Vdor v svetilnike Bluetooth
Vdor v svetilnike Bluetooth

Alexa je še posebej primerna za naloge iskanja informacij in spremljanje sredstev z uporabo brezžičnih domačih omrežij. Naravno je razmisliti o dajanju dragocenosti na mrežo za hiter priklic. Vdremo v poceni bluetooth nizkoenergijske svetilnike za doseg omrežja in dolgo življenjsko dobo baterije ter izdelamo pametno aplikacijo, tako da Alexa ve, kje smo pustili ključe.

Kako narediti…

1. korak: Vdor v svetilnike Bluetooth

Komplet 3 svetilnikov je mogoče kupiti za manj kot 15 USD in jih podpirajo aplikacije za Android/iOS, vendar se bomo zaradi zasebnosti odločili. Poleg tega iskanje ključev ne bi smelo prerasti v iskanje telefona.

Ta vadnica adafruit o pametnih lučeh za vzvratno inženiring nam je pomagala pri nadzoru svetilnikov. Začnite tako, da vklopite optično branje naslova naprave tako, da zaženete:

sudo hcitool lescan

Poiščite in kopirajte naslov z imenom 'iTag', nato zaženite:

sudo gatttool -I

Interaktivno se povežite z napravo tako, da zaženete:

povežite AA: BB: CC: DD: EE: FF

Poskusite zagnati "help" za ogled možnosti ali "primary" za ogled storitev:

Če zaženete "char-desc", ki mu sledi servisni ročaj, kot je opisano zgoraj, najdemo UUID-je, ki jih poiščemo s sklicevanjem na specifikacije značilnosti gatt in specifikacije storitev. Za več informacij o teh storitvah si oglejte to. Ko pregledamo promet z Wiresharkom, ugotovimo, da 0100111000000001 sproži alarm in ga logično izklopi 0000111000000001. Zdaj imamo preprosto funkcijo python:

uvoz pexpectdef sound_alarm (BD_ADDR): child = pexpect.spawn ('gatttool -I') child.sendline ('connect {}'. format (BD_ADDR)) child.expect ('Povezava uspešna', časovna omejitev = 30) child.sendline ('char-write-cmd 0x000b 0100111000000001')

Nato se osredotočimo na ustvarjanje spretnosti Alexa, ki sproži svetilnik, ko iščemo ključe.

2. korak: Ustvarite Alexa spretnost in aplikacijo

Ustvarjanje Alexa spretnosti in aplikacije
Ustvarjanje Alexa spretnosti in aplikacije
Ustvarjanje Alexa spretnosti in aplikacije
Ustvarjanje Alexa spretnosti in aplikacije

Ustvarjamo veščino, ki bo povezana z lokalnim strežnikom. Nato konfiguriramo naš strežnik za izvajanje kakršnih koli dejanj, ki jih želimo, v tem primeru podamo približek, kje se lahko nahajajo ključi, in oddaja signalni svetilnik Bluetooth. Flask ponuja preprosto in enostavno uporabo knjižnice python za serviranje aplikacije. S pomočjo flask-ask lahko strežnik konfiguriramo tako, da komunicira z našimi veščinami Alexa, ki jih bomo zgradili kasneje. Vročite aplikacijo z Ngrokom, ki nam bo dal povezavo https, ki jo potrebujemo za naše znanje Alexa. Najprej smo sestavili aplikacijo z najpreprostejšo funkcionalnostjo: tako, da bo naš svetilnik BLE piskal, ko se sproži.

#!/usr/bin/env python iz uvoza bučke Flask iz flask_ask import Vprašaj, uvoz stavka pexpect app = Flask (_ name_) ask = Vprašaj (app, '/') BD_ADDR = 'AA: BB: CC: DD: EE: FF '#You bluetooth beacon id here @ask.intent (' findkeys ') def retrievr (): sound_alarm () speech_text = "Vaši ključi so tukaj nekje." return statement (govorni_tekst) def sound_alarm (): child = pexpect.spawn ('gatttool -I') child.sendline ('connect {}'. format (BD_ADDR)) child.expect ('Povezava uspešna', časovna omejitev = 60) child.sendline ('char-write-cmd 0x000b 0100111000000001'), če je _name_ == "_main_": app.run (host = '127.0.0.1', port = '5000')

Za pisk BLE smo uporabili funkcijo sound_alarm (), ki smo jo napisali prej. Za funkcijo, ki bo uporabljena za namen, dodamo dekoraterja ask z našo namero "findkeys". Ko na nadzorni plošči za razvijalce Amazon razvijemo znanje Alexa, bomo to ime uporabili za svoj namen. Ta skript zapišite v datoteko z imenom app.py in zaženite

python app.py

To bo vaši prijavi posredovano na https:// localhost: 5000. Zaženite strežnik ngrok in kopirajte ustvarjeno povezavo https. Potrebovali boste, ko konfigurirate spretnost Alexa. Za več podrobnosti si oglejte to objavo. Uspešno smo nastavili preprosto aplikacijo, zdaj bomo napisali spretnost Alexa. Pomaknite se na nadzorno ploščo razvijalca Amazon in se prijavite. Kliknite Alexa in začnite uporabljati komplet Alexa Skill

Sledite navodilom gui.

Na zavihku Interation Model boste želeli polje Intent Schema izpolniti z naslednjim:

V polje Sample Utterances želite vnesti nekaj vzorčnih ukazov, ki jih lahko oseba uporabi za priklic spretnosti. Napisali smo tole:

findkeys find my keysfindkeys where my keys findkeys izgubil sem ključe

  • Na zavihku Konfiguracija izberite končno točko storitve na HTTPS. Kopirajte svojo povezavo https in jo prilepite v polje Privzeto pod njo. Povezovanje računov lahko pustite na št.
  • V potrdilu SSL izberite srednjo možnost: "Moja razvojna končna točka je poddomena domene, ki ima nadomestni certifikat organa za potrdila".
  • Zavihek Test vam bo omogočil, da preizkusite novo spretnost tako, da vnesete enega od vzorčnih ukazov.

Zadnja dva zavihka dokončajte, dokler vse kljukice ne postanejo zelene. Nato zaženite svoje znanje s funkcijo Beta Testing. To vam omogoča, da pred objavo svoje spretnosti gostite na kateri koli odmevni napravi. Sledite navodilom na e -poštni povezavi, da namestite spretnost v svojo odmevno napravo.

3. korak: naredimo naše sposobnosti pametnejše

Naj bodo naše sposobnosti pametnejše
Naj bodo naše sposobnosti pametnejše
Naj bodo naše sposobnosti pametnejše
Naj bodo naše sposobnosti pametnejše
Naj bodo naše sposobnosti pametnejše
Naj bodo naše sposobnosti pametnejše

Neaktivne računalnike, razpršene po hiši, smo spraševali po bluetooth svetilniku za poročanje o jakosti signala RSSI.

Če beremo odčitke z več naprav, lahko moč signala uporabimo kot približek za razdaljo. Ugotoviti moramo, kako to uporabiti za izračun najverjetnejšega dela hiše za iskanje svetilnika.

Obrnili se bomo na strojno učenje. Delo crontab vsake 2 minuti ustvari nabor naborov RSSI. Če svetilnik postavimo na različna mesta, kot so 'Spalnica', 'Kopalnica', 'Kuhinja', 'Bivalni prostor', označimo dnevnike RSSI. Ko smo kartirali dom, lahko uporabimo drevesne modele, kot je xgboost XGBClassifier.

Izvajanje povečanja gradienta xgboost bo obravnavalo manjkajoče podatke iz časovno omejenih odčitkov in usposabljanja v nekaj sekundah. Uporabite python pickle za vztrajanje usposobljenega modela in naložite v našo aplikacijo alexa retrievr. Ko je spretnost poklicana, aplikacija poišče bralnik RSSI bluetooth in ustvari predvideno lokacijo, alexa pa lahko odgovori in predlaga, da "poskusite pogledati v kopalnico."

4. korak: Združite vse skupaj

Ker imamo model za približevanje zadnje lokacije ključev, ga lahko dodamo v aplikacijo za izboljšanje izjave, ki jo vrne Alexa. Skript smo spremenili tako, da se glasi:

import osfrom flask import Flask from flask_ask import Ask, stavek import pexpect uvoz pickle uvoz pand kot pd import numpy kot np iz zbirk import defaultdict, števec iz reverse_read import reverse_readline app = Flask (_ name_) ask = Vprašaj (app, '/') @ ask.intent ('findkeys') def retrievr (): os.system ("/path/to/repo/sound_alarm.py &") speech_text = guess_locate () return statement (speech_text) def guess_locate (): read_dict = {} line_gen = reverse_readline ('YOUR_DATA_FILE.txt') res_lst = medtem ko je len (res_lst)! = 20: ln = naslednji (line_gen), če je ln.startswith ('Host'): _, ip, _, branje = ln.split () read_dict [ip] = branje res_lst.append (read_dict), če je ip == 'ip.of.one.computer': read_dict = {} else: pass val = pd. DataFrame (res_lst).replace ({'N/ A ': np.nan}). Vrednosti mdl_ = pickle.load (open (' location_model_file.dat ',' rb ')) preds = mdl_.predict (val) guess = Counter (preds) guess = guess.most_common (1) [0] [0] reply_str = 'Poskusi poiskati' če ugibam == 1: reply_str += 'spalnica' elif uganka == 2: reply_str += 'kopalnica' elif uganka == 3: reply_str += 'kuhinja' elif uganka == 4: reply_str += 'dnevna soba' vrnitev reply_str če _name_ == "_maj_": app.run (gostitelj = '127.0.0.1', port = '5000')

Ustvarili smo novo funkcijo, imenovano guess_locate (), ki vzame datoteko z najnovejšo močjo signala rssi. Nato bo vzorce izvedel proti našemu vloženemu modelu xgboost in vrnil najverjetnejši niz lokacije. Ta lokacija bo vrnjena, ko bo Alexa pozvan. Ker vzpostavitev povezave z svetilnikom lahko traja nekaj sekund, zaženemo ločen postopek, ki to funkcijo pokliče v sound_alarm.py.

Priporočena: