Slide 1

Slide 1 text

Google Home ͱ Android Things ͰՈ ిΛૢ࡞͢Δ shibuya.apk #23 2018/3/20 Kazumasa Kumamoto (@kumamo_tone) 1

Slide 2

Slide 2 text

໨࣍ 1. ༧උ஌ࣝ (Google Home, IFTTT, Firebase, Android Things, Raspberry Pi, ੺֎ઢϦϞίϯ) 4 ࣌ؒͷ౎߹্ Android Things, ੺֎ઢϦϞίϯ Ҏ֎ͷ આ໌͸ඈ͹͠·͢ 2. ࣮ࡍͷ΍Γํͷ঺հ 3. ·ͱΊ 2

Slide 3

Slide 3 text

۽ຊ ࿨ਖ਼ 4 iOS/Android ΤϯδχΞˏϠϑʔ 4 Bonfire iOS ͱ͍͏ษڧձΛ΍ͬͯ ͍·͢ 4 potatotips ͱ͍͏ษڧձͰΑ͘ϒ ϩάΛॻ͍͍ͯ·͢ https://twitter.com/ kumamo_tone 3

Slide 4

Slide 4 text

໨࣍ 1. ༧උ஌ࣝ (Google Home, IFTTT, Firebase, Android Things, Raspberry Pi, ੺֎ઢϦϞίϯ) 4 ࣌ؒͷ౎߹্ Android Things, ੺֎ઢϦϞίϯ Ҏ֎ͷ આ໌͸ඈ͹͠·͢ 2. ࣮ࡍͷ΍Γํͷ঺հ 3. ·ͱΊ 4

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

6

Slide 7

Slide 7 text

Google Home mini ͕࣌ʑηʔϧͰ 3,000 ԁͰചͬͯ Δ ࢲత͓ؾʹೖΓίϚϯυɿ 4 X෼ޙʹىͯ͜͠ 4 Իָֻ͚ͯ 4 ࠓ೔ͷఱؾ͸ʁ 4 ࡿཁΔ͔Ͳ͏͔ 4 ిؾ͚ͭͯ / ΤΞίϯ͚ͭͯ 7

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

IFTTT 4 IF/THEN ͷ૊Έ߹ΘͤͰ֤छαʔϏεΛ૊Έ߹ΘͤΒΕΔ αʔϏε 4 ྫ: GoogleAssistant IFϨγϐ 4 ʮOK Google, ͓΍͢Έʯ Ͱىಈ 4 ྫ: WebHook THEN Ϩγϐ 4 APIΛୟ͘ 9

Slide 10

Slide 10 text

10

Slide 11

Slide 11 text

Firebase Realtime Database 4 NoSQLσʔλϕʔε 4 ΞϓϦଆ͔Β؂ࢹͯ͠ϦΞϧλΠϜʹॲཧ͢Δ͜ͱ͕Մೳ 4 ΦϑϥΠϯΩϟογϡػೳ΋͋Γ 4 Android Studio ͔Β؆୯ʹ࢖͑Δ 11

Slide 12

Slide 12 text

12

Slide 13

Slide 13 text

Android Things IoT޲͚ͷϓϥοτϑΥʔϜ ≒ Raspberry PiͳͲͷϓϥοτϑΥʔϜʢ࣍ϖʔδͰ આ໌ʣ্Ͱಈ͘Android 4 Android ͷࢿ࢈͕ྲྀ༻Ͱ͖ΔʹAndroid ΞϓϦΛ࡞ΔཁྖͰ։ൃ 4 Android Studio, Java/Kotlin, Gradle, JUnit ͕࢖͑Δ API24ʙ 4 Peripheral I/O API ͷ௥Ճ 4 GPIO(൚༻ೖग़ྗ), I2C, PWM SPI ... ͳͲ IoT༻ͷAPI 4 Android Things Console Ͱ OTAʢOver-The-Airʣιϑτ΢ΣΞΞοϓσʔτ 13

Slide 14

Slide 14 text

Android Things 4 2018೥3݄ݱࡏɺRaspberry Pi 3 ͷ΄͔ɺ NXP Pico i.MX7D, NXP Pico i.MX6UL, NXP Argon i.MX6UL Ͱಈ࡞ ࠓճ͸ࠃ಺ͰखʹೖΓ΍͍͢ Raspberry Pi 3 Λ࢖͍·͢ 14

Slide 15

Slide 15 text

ͪͳΈʹ DroidKaigi ͷ Codelab Ͱ࢖ͬͯͨͷ͸ ͨͿΜ NXP i.MX7D aStarter Kit ͱ͍͏΍ͭ 15

Slide 16

Slide 16 text

Raspberry Pi 3 4 ҰൠతͳΧʔυͱಉ͙͡Β͍ͷখܕPC Wi- Fi, Bluetooth, GPIO ͳͲ͕͍͍ͭͯΔ 4 Raspbian OS(debianϕʔε)ͷ΄͔ Android ThingsͷΠϝʔδ΋ىಈͰ͖Δ 4 ઈରඞཁͳ΋ͷ 4 ຊମ + USBిݯ(5V 3.0A) 4 ͋Δͱศར 4 HDMIͰܨ͕ΔσΟεϓϨΠ 4 ώʔτγϯΫ෇͖έʔε 16

Slide 17

Slide 17 text

17

Slide 18

Slide 18 text

eRemote mini 6,000 ԁ͙Β͍ͷ੺֎ઢϦϞίϯ Amazon.co.jp ϕετηϥʔ 4 BroadLink RM Mini 3 4 eRemoteͷւ֎൛ جຊతʹػೳ͸ಉ ͬ͡Ά͍ $10+ૹྉ ͙Β͍ɹٕదͳ͠ 4 Alexa ʹ͸ରԠ͍ͯ͠ΔΒ͍͠ 4 API͕ެ։͞Ε͍ͯͳ͍ɹAPI͕ެ։͞ Ε͍ͯΔ Nature Remo(¥13,000) ͷ΄ ͏͕Կ͔ͱศར͔΋… 18

Slide 19

Slide 19 text

໨࣍ 1. ༧උ஌ࣝ (Google Home, IFTTT, Firebase, Android Things, Raspberry Pi, ੺֎ઢϦϞίϯ) 4 ࣌ؒͷ౎߹্ Android Things, ੺֎ઢϦϞίϯ Ҏ֎ͷ આ໌͸ඈ͹͠·͢ 2. ࣮ࡍͷ΍Γํͷ঺հ 3. ·ͱΊ 19

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

21

Slide 22

Slide 22 text

Firebase ͷઃఆ Firebase ίϯιʔϧ͔Β࡞੒ https:// console.firebase.google.com/u/1/ 22

Slide 23

Slide 23 text

Firebase ͷઃఆ ϓϩδΣΫτͷ࡞੒ 23

Slide 24

Slide 24 text

Firebase ͷઃఆ 4 Database > Realtime Database > σʔλ ͔Βɺͨͱ͑͹ҎԼͷΑ ͏ʹઃఆ͢Δ ϓϩδΣΫτ໊-xxxxx └ googlehome ɹ └ word: "" 24

Slide 25

Slide 25 text

Firebase ͷઃఆ 4 ϧʔϧ͔ΒಡΈॻ͖ΛڐՄʢຊ֨ తʹӡ༻͞ΕΔ৔߹͸஫ҙʣ { "rules": { ".read": "true", ".write": "true" } } 25

Slide 26

Slide 26 text

26

Slide 27

Slide 27 text

IFTTT ͷઃఆ - if this Google AssistantϨγϐͷʮSay a phrase with a text ingredientʯΛ ࢖͏ ిؾ $ʢిؾ͚ͭͯɺిؾফͯ͠ɺ …ʣͱ͍͏ίϚϯυ͕࢖͑ΔΑ͏ʹͳ Γɺ$ ͸ thatʹૹΒΕΔ 27

Slide 28

Slide 28 text

IFTTT ͷઃఆ - then that WebhooksϨγϐ ҎԼͷURLʹPUT͢ Ε͹σʔλͷߋ৽͕Ͱ͖Δ https://ϓϩδΣΫτ໊- xxxxx.firebaseio.com/googlehome/ word.json 4 light ͱ {{TextField}} ʹ͸εϖʔ εΛೖΕΔ 28

Slide 29

Slide 29 text

29

Slide 30

Slide 30 text

eRemote mini ʹ৴߸ΛૹΔ 4 εϚϗΞϓϦ(e-Control)͕Ͳ͏΍ͬͯ௨৴͍ͯ͠Δ͔ݟ Δ 4 https://qiita.com/tattn/items/ dc022890b686b6fd2a99 ΛࢀߟʹwiresharkΛ࢖ͬͯ ௨৴಺༰ΛݟΔ 4 MacͰ΋brew caskͰೖΔ 30

Slide 31

Slide 31 text

eRemote mini ʹ৴߸ΛૹΔ 4 Ͳ͏΍ΒQUICͱ͍͏UDPϕʔεͷϓϩτίϧͰ௨৴͍ͯ͠ΔΒ͠ ͍͜ͱ͕Θ͔Δ ಉҰωοτϫʔΫ্ʹܨ͕͍ͬͯΔػث͸ sudo arp-scan -I en0 -l ͳͲͰௐ΂ΒΕΔ 31

Slide 32

Slide 32 text

eRemote mini ʹ৴߸ΛૹΔ ϖΠϩʔυΛ߇͓͑ͯ͘ 32

Slide 33

Slide 33 text

33

Slide 34

Slide 34 text

ηοτΞοϓϓϩάϥ ϜΛμ΢ϯϩʔυ ͜ͷը໘͕ͳʹ͛ʹͲ͜ʹ͋Δͷ͔෼ ͔ΓͮΒ͍ 34

Slide 35

Slide 35 text

35

Slide 36

Slide 36 text

microSD ʹ Android Things ͷΠϝʔδΛম ͘ ίϯιʔϧͰ࣭໰ʹ౴͍͑ͯ͘ ͍͍ͩͨ6෼͙Β͍ 36

Slide 37

Slide 37 text

microSDΛૠͯ͠ىಈ 37

Slide 38

Slide 38 text

microSDΛૠͯ͠ىಈ 38

Slide 39

Slide 39 text

LANέʔϒϧΛࢗ͢ 39

Slide 40

Slide 40 text

WiFiηοτΞοϓ ༗ઢ͚ͩͰ΋Ͱ͖Δ͕͍ͭͰʹ΍ͬͯ ͓͘ IPΞυϨεͱSSIDͷID/PASSΛ ࢦఆͯ͠ઃఆ͢Δ 40

Slide 41

Slide 41 text

WiFiηοτΞοϓ DONE WiFi͕දࣔ͞ΕΔ 41

Slide 42

Slide 42 text

Android ͰϓϩδΣΫτ࡞੒ 42

Slide 43

Slide 43 text

43

Slide 44

Slide 44 text

44

Slide 45

Slide 45 text

Android Studio ͰϓϩδΣΫτ࡞੒ 4 ωοτϫʔΫӽ͠ʹసૹͰ͖Δ $ adb connect 192.168.3.13 45

Slide 46

Slide 46 text

4 Firebase Ͱ؂ࢹ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val reference = FirebaseDatabase.getInstance().getReference("googlehome").child("word") reference.setValue("") reference.addValueEventListener(object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { val str = dataSnapshot.getValue(String::class.java) ?: return val words = str.split(" ") when (words.first()) { "light" -> { changeLight(words) } "aircon" -> { changeAircon(words) } "tadaima" -> { imhome() } "oyasumi" -> { oyasumi() } } } override fun onCancelled(databaseError: DatabaseError) {} }) } 46

Slide 47

Slide 47 text

4 ͷ, Λ ͳͲͷॿࢺ͸εΩοϓ 4 ʮ͚ͭͯʯ͚ͩͰͳ͘ʮ͚ͭ ͯʯͷΑ͏ʹೝࣝ͞ΕΔ͜ͱ ͕͋ΔͷͰɺ྆ํఆٛ private fun changeAircon(words: List) { when (words.getOrNull(1)) { "ͷ", "Λ" -> { changeAircon(words.subList(1, words.count())) } "͚ͭ", "͚ͭͯ", "෇͚", "෇͚ͯ" -> { sendToRemocon(getString(R.string.heat)) } "͚͠", "͚ͯ͠", "ফ͠", "ফͯ͠" -> { sendToRemocon(getString(R.string.aircon_off)) } "আ࣪" -> { sendToRemocon(getString(R.string.humid)) } else -> { return } } } 47

Slide 48

Slide 48 text

4 java.nio Λ࢖͏ɻUDP ͱಉ͡ཁྖͰྑͦ͞͏ 4 ίϧʔνϯ, είʔϓؔ਺ use ΍ also, Λ࢖͖ͬͯͬ͢Γ private fun sendToRemocon(data: String) { launch { DatagramChannel.open().use { it.socket().bind(InetSocketAddress(9999 /* ૹΓݩϙʔτ */)) val buf = ByteBuffer.allocate(data.length).also { it.clear() it.put(data.hexStringToByteArray()) it.flip() } it.send(buf, InetSocketAddress(getString(R.string.ipaddress), 80)) } } } 48

Slide 49

Slide 49 text

4 ͍ͨͩ·, ͓΍͢ΈͳͲͷෳ਺΍Δ͜ͱ͕͋ΔίϚϯυ͸ async/await Ͱ private fun imhome() { launch { async { sendToRemoconWithoutCoroutine(getString(R.string.light_on)) }.await() async { sendToRemoconWithoutCoroutine(getString(R.string.heat)) }.await() } } 49

Slide 50

Slide 50 text

4 ͍ͨͩ·, ͓΍͢ΈͳͲͷෳ਺΍Δ͜ͱ͕͋ΔίϚϯυ͸ async/await Ͱ private fun oyasumi() { launch { async { sendToRemoconWithoutCoroutine(getString(R.string.light_off)) }.await() async { sendToRemoconWithoutCoroutine(getString(R.string.aircon_off)) }.await() async { sendToRemoconWithoutCoroutine(getString(R.string.timer7hours)) } } } 50

Slide 51

Slide 51 text

׬੒ʂ 51

Slide 52

Slide 52 text

σϞ 52

Slide 53

Slide 53 text

53

Slide 54

Slide 54 text

54

Slide 55

Slide 55 text

ࠓճ࢖ͬͨίʔυ https://github.com/kumamotone/ ERemoteThingsSample 55

Slide 56

Slide 56 text

໨࣍ 1. ༧උ஌ࣝ (Google Home, IFTTT, Firebase, Android Things, Raspberry Pi, ੺֎ઢϦϞίϯ) 4 ࣌ؒͷ౎߹্ Android Things, ੺֎ઢϦϞίϯ Ҏ֎ͷ આ໌͸ඈ͹͠·͢ 2. ࣮ࡍͷ΍Γํͷ঺հ 3. ·ͱΊ 56

Slide 57

Slide 57 text

·ͱΊ 4 Android Studio ͱ Kotlin ͕࢖͑Δͷྑ͍ʂ 4 IFTTT ͱ Firebase Λ࢖͏ͱ͍͍ͩͨͷ෺͕ܨ͛ΒΕΔ 4 ৭ʑͳٕज़Λͪΐ͍ͪΐ͍৮Εָ͍ͯ͠ 57

Slide 58

Slide 58 text

ࠓޙ΍Γ͍ͨ͜ͱ 4 Android ThingsͷڧΈʮAndroidͷࢿ࢈Λ࠶ར༻Ͱ͖ ΔʯΛ͢Δ 4 AndroidΞϓϦ༻ͷIoT੡඼Λ͔ͭ͏ 4 ݰؔͷυΞ͕։ดͨ͠ΒిؾΛૢ࡞ͳͲ 4 σʔλΛऔΔʢ͍ͭؼ͖͍ͬͯͯͭ৸ͯΔ͔Θ͔Δ͔΋ʣ 58

Slide 59

Slide 59 text

References 4 Google Homeʹ࿩͔͚ͯ͠ΤΞίϯΛૢ࡞ͯ͠ΈΔ 4 https://qiita.com/miso_develop/items/204b2e16b1e58e52dc07 4 ೔༵HackͰHomeKitͱٔΕͨ࿩ 4 https://speakerdeck.com/tattn/ri-yao-hackdehomekittoxi- retahua 4 Droidkaigi2018ͰʮAndroidThingsͱFirebaseͰ࢝ΊΔϗʔϜηΩϡϦς Οʯͱ͍͏λΠτϧͰొஃ͖ͯ͠·ͨ͠ 4 http://crossbridge-lab.hatenablog.com/entry/2018/02/10/150429 59

Slide 60

Slide 60 text

4 Google Home ͱ Android ThingsͰLνΧ͢Δ 4 http://crossbridge-lab.hatenablog.com/entry/googlehome-androidthings-led 4 HomebridgeͱWiresharkͰAPIඇެ։ͷֶशϦϞίϯΛHomeKit (Siri) ରԠͯ͠Έͨ 4 https://qiita.com/tattn/items/dc022890b686b6fd2a99 4 JavaͰUDP௨৴Λͯ͠Έͨ 4 https://qiita.com/niusounds/items/7cb0989aa7792bcb0681 4 Supported Platforms 4 https://developer.android.com/things/hardware/index.html 4 ͸͡Ίͯͷ Android Things 4 https://www.slideshare.net/akirasasaki1/android-things-81001368 4 ೖ໳Kotlin coroutines 4 https://qiita.com/k-kagurazaka@github/items/8595ca60a5c8d31bbe37 60

Slide 61

Slide 61 text

Thanks! ! 61