Speak Python with Devices
CC Attribution - NonCommercial - ShareAlike 3.0 Unported:
You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal and non-commercial purpose as long as the work is attributed to the author in the manner specified by the author or licensor and the work or content is shared also in adapted form only under the conditions of this
Chu, Petertc
The talk will be a getting start guide on controlling hardware devices with Python. We know Python users are very keen on multitasking and always wish to know more about how it can be used in different tasks. This talk will help audiences exploring new Python skillset. Audiences may be inspired by this talk and apply it to many scenarios, e.g., IoT and infrastructure automation. Intended audiences include: 1. wish to know how Python can be used beyond data analysis and web dev 2. a Pythonista who interested in craft some touchable things 3. want to acquire something new into your Python skillset Audiences are expected to have basic knowledge about: 1. Python syntax and control flow 2. Computer and operating system (especially UNIX) After this talk, audiences will have: 1. The basic idea of controlling devices with Python 2. Expanding their Python skillset. Know how to use Python in another interesting and useful task besides ML, web scrapping, etc.
 Perfect. Welcome, welcome, welcome. It is day two of Ero Python. I hope everyone is keeping fine. I hope everyone is having loads of fun so far. I have here with me already Peter Chu, our first speaker for today. Hello, Peter. Hello, everyone. So Peter is doing it from Taiwan, right? Yeah, that's true. And it's doing it's doing afternoon there. It's 7am for me. But let's do this. Let's kick this off. Perfect. So Peter is going to talk to us today about speak Python with devices. How Python can be used in IoT infrastructure automation. So it's your turn now. Take it away, Peter. Thank you, my friend. And hello, everyone. Hello, Europe. And I'm Peter. Thank you for joining me in this session. And let me first introduce myself. I am a software engineer in Taiwan and love Python like all you guys. Besides that, I am a conference scholar. I like to share myself, what I learned, and more importantly, the more fathers after the conference. And in fact, I have course on open source conference in Taiwan. And in fact, we have a conference next week, two days, 14 tracks, and 1,000 people in person. And I would like to invite you to come. You know, due to the pandemic, so next time maybe. And in law, I cannot join you person today. I can't see all the things. So now it's your turn. Why are you interested in this session? Apparently, I cannot join with you one more time. But I guess most of you are working on data and lights, and web development, things like that. These are the most common ways people use Python. But you know that Python is very powerful and useful language, which can be used in a variety of tasks, not just those I mentioned. So if you wish to acquire something new into your business, you are in the right talk. We will see how to use the power of Python to build some amazing things for a tiny IoT device to a large-scale platform system. This is why I talked about today. Since this talk is for beginners, we will start with some fundamental concepts of the operating system. On the other hand, if you are a ready-to-experienced engineer, I'm sorry, but here is the point. Let's begin. In Instagram, there's like-grandpa, and the power means physical hardware devices. There are two layers in the OS, user space and girl space, respectively. Your Python for currently being user space, on the other hand, device drivers are living in girl space. We know that Alex is trying to see language. So notice not if the device you consider does not have a corresponding driver. Sorry, but as a Python engineer, we can do nothing at all. So in the following slides, let's ensure the driver is ready. Fair enough, the OS will represent our devices as the sound space of files in the file system. You can see that in the slides screen shot. Roughly speaking, those files are located in the depth directory in Linux. So you may have been unlocking units. Everything is a file. Last also tool for device. I emphasize this here because it means that we can manipulate a device like a file. And the great thing is you are able to manipulate a file. Let's see an example. And if you run the snippet here in a REST verified, you can make an onboard LED blink. You can see the demonstration on my camera. Take it. You can see here something blinking. And yeah, a blinking libel is boring, you might think. The interesting thing is the code here just opens a device file, writes something, then the behavior of the device is changed like magic. Do you think it's trivial? Yeah, it is. The last now the fourth story, there is one more operation people can know. And it's our living after today. IOCT alone. IOCT alone means input out of control. As it's not suggested, the purpose of it is to control devices. We don't need it in the LED sample since it's the simplest one. We can manipulate it with merely reading and writing. But for many devices, that's not enough. And it's simple as a model. And later things to do with the data by reading and send data by writing. But how can we send a copy of it? For example, this is why and where IOCT is a place for. This is why it looks like it has three parameters, five script requests and arguments. Notice that request is constructed with four more parameters. Here are some of the details I don't want to go through with them. Instead, an analogy may be more helpful. No matter what you work for, you should feel comfortable with RESTful API right? I find that we can have the mapping between RESTful API requests and the parameters of IOCT alone. For example, as you have known, RESTful API always has two paths, the header and the body. Then we can say IOCT alone also has header and the body. The second parameter of IOCT alone, the request is the header. The third parameter of it, the arguments, is the body. From this mapping, I expect you can understand all parameters of IOCT alone. So you can read it in seconds. Yeah, got it. So indeed, many people feel struggle to understand IOCT alone for the very first time. So as we saw. But after studying, I found out IOCT alone is just like HTTP. It comes in the face to interact with resources, but resources are hardware devices at least. No, we know IOCT alone. But hey, we are presently stuck. How can we use it in Python? And that's getting stuck for a meaning example. In this example, we use IOCT alone to get device names. Two buttons, people mouse and some virtual parts and devices. That's why I have on my computer. To achieve it in Python, there are three common criteria we have to meet. The first is to create IOCT request if you forgot what it is. The request let the driver know what do you want to do like a actor like a respore API header. The second is since we communicate with drivers and drivers are run in C, we have to convert the data types between C and Python. And lastly, we have to manage to access IOCT alone in the Python environment. Then we can call in. There are many ways to meet this criteria and we will see two approaches today. The first approach, we write a seed exchange module. We have to write some seed calls in this approach and it only works on seed Python. On the other hand, the second is a pure Python approach. I will explain both of them step by step. And let's start on the first one. Firstly, we define the IOCT function, the thing you intend to do. Here we define a function called get device net. It has three arguments. The first is the device file path. The second answer is an address of a piece of memory and it says we can carry so far it after we call this function. I think the call is well-safely explained instead of a thing slide. Let's have a look at it. We create an IOCT request at this line. We can see I use a micro and then a VIOCG name here. In general, device drivers will provide open micros like this. So you can use that easier. And another thing is remember an IOCT request is constructed with four parameters. So if you expand the micro here, you can see it exactly takes four parameters as shown in the line 17. After the IOCT function is defined, let's implement a wrap function out of it. This function consumes a device file path and retails a corresponding device net. This function is what we actually access in our Python code. So you can see we have a Python style function net and arguments and with the values are both high address. High address is one of the most common address structure provided by C Python. And most labels to implement are converting the data types between C and Python. You can see I use some type prefix micros to do it. These micros are also provided by C Python. This is a trivial case. Since the arguments and return types are just streamed, it can be a state-structured or FICT-nary in some more complex example. Okay. In the last step, the last step is to do some packaging works. In this approach, what we actually get is a Python module. So to build this module, we have to provide some necessary information such as module net, at least some functions available in this module, things like that. Just follow the C Python spec here. So now our module is ready. We can install it, let's import it, and then go in the neutral Python way as shown in the screenshot. We get a device then called vios first. Okay. Now let's turn to a second approach. In this approach, we do similar things like the first one. At least we don't have to write a musical. Okay. Let's start by creating the IOCTA request. We use a micro to do it in the last step. But how can we access micro in Python? No, we can. We have to port necessary micro to Python. Fortunately, common micro for creating IOCTA request has been provided by some good guys. So we just need to pull driver spec micro. And it's actually not a big deal. Just build lines. Again, we have to cover the data type. And it's still trivial here since we just didn't go into Python code right here. Notice that we use a viewing module called fcnl here. It's provided to use IOCTA function so we don't have to write any sitcom at this time. Finally, we can send resource as we saw before. No, you might be moving your mind. Enough theories. Please give me something in practical. Okay. So let me find a convincing example for you. A couple of feet might be something interesting. Just attach a sensor onto a respiratory line, get a sensor status. And then a car is approaching. Open again. Yeah. But I want to show you something more impressive. Like this one. Do you know what it is? It's a very unique massive storage system used in nuclear experiments. Unlike the interest of the media we use, this system is based on magnetic caps, dozens of caps. They use the system to store data of how our universe works. You can see what's inside of it in the video in the right part. There are many kinds of devices, mobile arms, bubble readers, type drives, things like that. All these devices need to be controlled and coordinated by some systems. So this gives us a great idea to show what we can do from what we learned today. So in the following slides, last image, we build a system with Python. That's the game. We will use the tape simulator today so you can make it at home. You can see my virtual drives and their device file path in the screenshot. We will use that later. And we also need a driver. It already has one, so no worry about it. Now let's see how to use the tape storage. To write data in tape cottage, we need to find it and note it. And then we write our provided to a correct position. And then we can start to write. For proof of concept, we will see how to implement rewind and get status today. First, let's see how to get the data. We have a reducing how to manipulate a device with IOCTL and Python. But it's a little bit more complex this time. In the previous case, we just asked string and the device name. And this time we get the status in a C-struct. Notice how we convert C-struct into a Python dictionary in the sleeping. Okay, let's go to the next one. In the previous one, we used C-station and now let's try a pure Python approach. You can see how to use the struct module here to encode arguments and decode return values in this course maybe. And here is the last course need. And besides the poetry we covered today, the C-type module is also very useful. C-type is a pointer function library for Python. It's for ISP-compatible data type and ordering code C functions like IOCTL. You can see how we use it to implement the rewind function in this course maybe. And you can run course maybe and get a result like this. You can see how we fetch and change the type position. It's the first step to build a massive storage. We just saw. Okay, let's see it. Summary. The purpose of this talk is to let you know we can use Python to build some amazing things for our cartwheel feeder to a massive storage system. You just need to know how the computer works and how to manipulate a device in Python. Then you can make it. And that's the end of the talk. Thank you. Yay, thank you. Thank you very much. Wonderful. You, we took a little bit less time. So let's go, let's see who has questions. So far we didn't have any questions. I think it's a bit early for everyone. No, we're having, we're having someone is typing a question, I believe. So any case saying, yeah, it's applauding as well. Perfect. So our first question. So do you know any robotic kits that will be great to experiment with? You said, no, no, no, no, no storage system. I just saw. I just saw. Okay. And do you have any other suggestions as well? Or like that's your favorite. Sorry, can you say that again? Is that the one you just showed? Is that your favorite? Or do you have other suggestions as well? Oh, no, I just, I just, in the past few years, I tried to work on sample drugs just like the system I show you. So I think it's simple. Yeah. Okay, so why are we getting, we're waiting for questions. Yeah, tell me more about your participation on PICON Taiwan. How long have you been part of the community? Yeah, I love PICON Taiwan. In fact, I like all PICONs in the, you know, in the past few years, I have attended PICON Hong Kong and PICON Japan. And yeah, I think the PICON community have, you know, big connections, international connections. So I enjoy the, yeah, all PICONs, not just Taiwan. Okay. There is a, yeah, the PICON, the next PICON Japan is coming up soon, right? The CFP just closed. Yeah, that's true. Yeah, we're quite excited. You just submit anything to it. Yeah, but you know, a pandemic, so maybe we can just virtually traveling around the world this year. Yes, I think that's going to be the case. But well, it's okay. Any more questions? Anyone has any other questions for Peter here? I see people typing, but I don't see, I don't see their actual outposts. Well, it's maybe just caste typing. Yeah, let's see. No, I don't think we have anything else right now. Okay, well, if you have any more questions for Peter, please just type your questions on speak by tone devices. There is a room for that under the knee breakouts. So well, Peter, thank you very, very much. It was an absolute pleasure. Thank you for joining us. Yeah, thank you. And I will be waiting for your more questions. You can have a copy and think about us. Thank you. Thank you. Thank you.
 Perfect. Welcome, welcome, welcome. It is day two of Ero Python. I hope everyone is keeping  fine. I hope everyone is having loads of fun so far. I have here with me already Peter  Chu, our first speaker for today. Hello, Peter. Hello, everyone. So Peter is doing it from  Taiwan, right? Yeah, that's true. And it's doing it's doing afternoon there. It's 7am for me.  But let's do this. Let's kick this off. Perfect. So Peter is going to talk to us today about  speak Python with devices. How Python can be used in IoT infrastructure automation. So  it's your turn now. Take it away, Peter. Thank you, my friend. And hello, everyone. Hello,  Europe. And I'm Peter. Thank you for joining me in this session. And let me first introduce myself.  I am a software engineer in Taiwan and love Python like all you guys. Besides that, I am a  conference scholar. I like to share myself, what I learned, and more importantly, the  more fathers after the conference. And in fact, I have course on open source conference in Taiwan.  And in fact, we have a conference next week, two days, 14 tracks, and 1,000 people in person.  And I would like to invite you to come. You know, due to the pandemic, so next time maybe.  And in law, I cannot join you person today. I can't see all the things. So now it's your turn.  Why are you interested in this session? Apparently, I cannot join with you one more time. But I  guess most of you are working on data and lights, and web development, things like that. These  are the most common ways people use Python. But you know that Python is very powerful and useful  language, which can be used in a variety of tasks, not just those I mentioned. So if you wish to  acquire something new into your business, you are in the right talk. We will see how to use the  power of Python to build some amazing things for a tiny IoT device to a large-scale platform system.  This is why I talked about today. Since this talk is for beginners, we will start with some fundamental  concepts of the operating system. On the other hand, if you are a ready-to-experienced engineer,  I'm sorry, but here is the point. Let's begin. In Instagram, there's like-grandpa,  and the power means physical hardware devices. There are two layers in the OS, user space and  girl space, respectively. Your Python for currently being user space, on the other hand,  device drivers are living in girl space. We know that Alex is trying to see language. So notice  not if the device you consider does not have a corresponding driver. Sorry, but as a Python  engineer, we can do nothing at all. So in the following slides, let's ensure the driver is ready.  Fair enough, the OS will represent our devices as the sound space of files in the  file system. You can see that in the slides screen shot. Roughly speaking, those files are located  in the depth directory in Linux. So you may have been unlocking units. Everything is a file.  Last also tool for device. I emphasize this here because it means that we can manipulate a device  like a file. And the great thing is you are able to manipulate a file. Let's see an example.  And if you run the snippet here in a REST verified, you can make an onboard LED blink. You can see  the demonstration on my camera. Take it. You can see here something blinking. And yeah,  a blinking libel is boring, you might think. The interesting thing is the code here just opens  a device file, writes something, then the behavior of the device is changed like magic. Do you  think it's trivial? Yeah, it is. The last now the fourth story, there is one more operation  people can know. And it's our living after today. IOCT alone. IOCT alone means input out of  control. As it's not suggested, the purpose of it is to control devices. We don't need it in the  LED sample since it's the simplest one. We can manipulate it with merely reading and writing.  But for many devices, that's not enough. And it's simple as a model. And later things to do with  the data by reading and send data by writing. But how can we send a copy of it? For example,  this is why and where IOCT is a place for. This is why it looks like it has three parameters,  five script requests and arguments. Notice that request is constructed with four more  parameters. Here are some of the details I don't want to go through with them. Instead,  an analogy may be more helpful. No matter what you work for, you should feel comfortable with  RESTful API right? I find that we can have the mapping between RESTful API requests and  the parameters of IOCT alone. For example, as you have known, RESTful API always has two  paths, the header and the body. Then we can say IOCT alone also has header and the body. The  second parameter of IOCT alone, the request is the header. The third parameter of it, the  arguments, is the body. From this mapping, I expect you can understand all parameters of  IOCT alone. So you can read it in seconds. Yeah, got it. So indeed, many people feel  struggle to understand IOCT alone for the very first time. So as we saw. But after studying, I  found out IOCT alone is just like HTTP. It comes in the face to interact with resources,  but resources are hardware devices at least. No, we know IOCT alone. But hey, we are  presently stuck. How can we use it in Python? And that's getting stuck for a  meaning example. In this example, we use IOCT alone to get device names. Two buttons,  people mouse and some virtual parts and devices. That's why I have on my computer. To  achieve it in Python, there are three common criteria we have to meet. The first is to  create IOCT request if you forgot what it is. The request let the driver know what do you  want to do like a actor like a respore API header. The second is since we communicate with  drivers and drivers are run in C, we have to convert the data types between C and Python.  And lastly, we have to manage to access IOCT alone in the Python environment. Then we  can call in. There are many ways to meet this criteria and we will see two approaches  today. The first approach, we write a seed exchange module. We have to write some  seed calls in this approach and it only works on seed Python. On the other hand, the second  is a pure Python approach. I will explain both of them step by step. And let's start  on the first one. Firstly, we define the IOCT function, the thing you intend to do. Here  we define a function called get device net. It has three arguments. The first is the  device file path. The second answer is an address of a piece of memory and it says we can  carry so far it after we call this function. I think the call is well-safely explained  instead of a thing slide. Let's have a look at it. We create an IOCT request at this  line. We can see I use a micro and then a VIOCG name here. In general, device drivers  will provide open micros like this. So you can use that easier. And another thing is  remember an IOCT request is constructed with four parameters. So if you expand the  micro here, you can see it exactly takes four parameters as shown in the line 17.  After the IOCT function is defined, let's implement a wrap function out of it. This  function consumes a device file path and retails a corresponding device net. This function  is what we actually access in our Python code. So you can see we have a Python style  function net and arguments and with the values are both high address. High address is one  of the most common address structure provided by C Python. And most labels to  implement are converting the data types between C and Python. You can see I use some  type prefix micros to do it. These micros are also provided by C Python. This is a trivial  case. Since the arguments and return types are just streamed, it can be a state-structured  or FICT-nary in some more complex example. Okay. In the last step, the last step is  to do some packaging works. In this approach, what we actually get is a Python module. So  to build this module, we have to provide some necessary information such as module  net, at least some functions available in this module, things like that. Just follow  the C Python spec here. So now our module is ready. We can install it, let's  import it, and then go in the neutral Python way as shown in the screenshot. We get a  device then called vios first. Okay. Now let's turn to a second approach. In this  approach, we do similar things like the first one. At least we don't have to write a  musical. Okay. Let's start by creating the IOCTA request. We use a micro to do it in  the last step. But how can we access micro in Python? No, we can. We have to port  necessary micro to Python. Fortunately, common micro for creating IOCTA request has  been provided by some good guys. So we just need to pull driver spec micro. And it's  actually not a big deal. Just build lines. Again, we have to cover the data type. And  it's still trivial here since we just didn't go into Python code right here. Notice that  we use a viewing module called fcnl here. It's provided to use IOCTA function so we  don't have to write any sitcom at this time. Finally, we can send resource as we saw  before. No, you might be moving your mind. Enough theories. Please give me something  in practical. Okay. So let me find a convincing example for you. A couple of  feet might be something interesting. Just attach a sensor onto a respiratory  line, get a sensor status. And then a car is approaching. Open again. Yeah. But I want  to show you something more impressive. Like this one. Do you know what it is? It's a  very unique massive storage system used in nuclear experiments. Unlike the interest  of the media we use, this system is based on magnetic caps, dozens of caps. They use  the system to store data of how our universe works. You can see what's inside of it in  the video in the right part. There are many kinds of devices, mobile arms,  bubble readers, type drives, things like that. All these devices need to be controlled  and coordinated by some systems. So this gives us a great idea to show what we can do  from what we learned today. So in the following slides, last image, we build  a system with Python. That's the game. We will use the tape simulator today so you  can make it at home. You can see my virtual drives and their device file path in  the screenshot. We will use that later. And we also need a driver. It already has  one, so no worry about it. Now let's see how to use the tape storage. To write data  in tape cottage, we need to find it and note it. And then we write our provided to  a correct position. And then we can start to write. For proof of concept, we will see  how to implement rewind and get status today. First, let's see how to get the  data. We have a reducing how to manipulate a device with IOCTL and Python. But it's  a little bit more complex this time. In the previous case, we just asked string and  the device name. And this time we get the status in a C-struct. Notice how we convert  C-struct into a Python dictionary in the sleeping. Okay, let's go to the next one.  In the previous one, we used C-station and now let's try a pure Python approach. You  can see how to use the struct module here to encode arguments and decode return  values in this course maybe. And here is the last course need. And besides the  poetry we covered today, the C-type module is also very useful. C-type is a  pointer function library for Python. It's for ISP-compatible data type and ordering  code C functions like IOCTL. You can see how we use it to implement the rewind  function in this course maybe. And you can run course maybe and get a result like  this. You can see how we fetch and change the type position. It's the first step to  build a massive storage. We just saw. Okay, let's see it. Summary. The purpose of  this talk is to let you know we can use Python to build some amazing things for  our cartwheel feeder to a massive storage system. You just need to know how the  computer works and how to manipulate a device in Python. Then you can make it.  And that's the end of the talk. Thank you.  Yay, thank you. Thank you very much. Wonderful. You, we took a little bit less  time. So let's go, let's see who has questions. So far we didn't have any  questions. I think it's a bit early for everyone. No, we're having, we're having  someone is typing a question, I believe. So any case saying, yeah, it's applauding  as well. Perfect. So our first question. So do you know any robotic kits that  will be great to experiment with? You said, no, no, no, no, no storage  system. I just saw. I just saw. Okay. And do you have any other suggestions as  well? Or like that's your favorite. Sorry, can you say that again? Is that  the one you just showed? Is that your favorite? Or do you have other suggestions as  well? Oh, no, I just, I just, in the past few years, I tried to work on sample  drugs just like the system I show you. So I think it's simple. Yeah. Okay, so why are  we getting, we're waiting for questions. Yeah, tell me more about your participation  on PICON Taiwan. How long have you been part of the community? Yeah, I love  PICON Taiwan. In fact, I like all PICONs in the, you know, in the past few years,  I have attended PICON Hong Kong and PICON Japan. And yeah, I think the PICON  community have, you know, big connections, international connections. So I enjoy  the, yeah, all PICONs, not just Taiwan. Okay. There is a, yeah, the PICON, the next PICON Japan is coming up soon, right? The CFP just closed. Yeah, that's true. Yeah, we're quite excited. You just submit anything to it. Yeah, but you know, a pandemic, so maybe we can just virtually traveling around the world this year.  Yes, I think that's going to be the case. But well, it's okay. Any more questions? Anyone has any other questions for Peter here? I see people typing, but I don't see, I don't see their actual outposts.  Well, it's maybe just caste typing. Yeah, let's see.  No, I don't think we have anything else right now.  Okay, well, if you have any more questions for Peter, please just type your questions on speak by tone devices. There is a room for that under the knee breakouts. So well, Peter, thank you very, very much. It was an absolute pleasure. Thank you for joining us.  Yeah, thank you. And I will be waiting for your more questions. You can have a copy and think about us. Thank you. Thank you. Thank you.
Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_0_155.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_156_227.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_228_287.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_288_539.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_540_719.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_720_767.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_768_911.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_912_1187.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_1188_1427.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_1428_5759.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_5760_6155.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_6156_7367.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_7368_8435.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_8436_8819.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_8820_8927.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_8928_10535.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_10536_11363.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_11364_11735.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_11736_13163.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_13164_16643.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_16644_17339.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_17340_19547.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_19548_19775.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_19776_20471.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_20472_21539.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_21540_22991.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_22992_23855.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_23856_24359.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_24360_25115.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_25116_28559.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_28560_30671.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_30672_31943.png Petertc_Chu_-_Speak_Python_with_Devices_BpgtN8GK1M8_31944_32014.png