Hitting a Home Run with Ignition

45 min video  /  39 minute read
 

Speakers

Kyle Chase

Chief Technology Officer

Kymera Systems

Sophia Ruduke

Systems Integrator

Kymera Systems

Ignition is not limited to industrial applications alone; its powerful features extend to use cases of all kinds. From its intuitive design features to its robust scripting capabilities, you can harness the full potential of its flexible architecture and rich tool-set to create innovative solutions in non-industrial automation development. Witness this potential firsthand through a baseball scoring and statistics app developed entirely in Perspective, while providing examples of how tags, persistence, scripting, and views can be utilized in a non-industrial setting. Our goal is to inspire others to elevate their lives and hobbies in new creative ways with Ignition.

Transcript:

0:00
Travis Cox: Good afternoon. How y'all doing?

00:05
Audience Member 1: Great.

00:06
Travis Cox: Alright. Well, we got a great session for you today here, "Hitting a Home Run with Ignition." We have two great speakers. First and foremost, Kyle Chase. He has been working with Ignition for, I think going on 18 or 19 years, quite a long time from the pretty much very beginning, an expert in the product, and he's with Kymera Systems. He's the Chief Technology Officer. And Kymera has actually also done a lot of module development over the years and has helped a lot of members of the community. We also have Sophia Ruduke. She's a Systems Integrator with Kymera Systems, and she's very skilled software developer and integrator at Kymera Systems. And she has been enriched with a valuable experience in module development, industrial integration, and process automation. So please help me welcome both Kyle and Sophia.

01:04
Kyle Chase: Well, welcome to our session. I hope it's as good as the last one I did here. It's the end of the conference, so my voice is going a little bit, but at least I know if this doesn't work, I do contract media marketing for your videos. I can do some sultry ASMR for you if you guys really need it.

01:19
Sophia Ruduke: Oh, my goodness, thank you for the great introduction, Travis. That was a good five minutes of my presentation just cut off, but that's okay. Anyways, ICC 2023, day three. Are you guys having fun, enjoying it? Yeah, that's right. Thank you. Also, I wanted to say, bear with me and my voice since yesterday was my 21st birthday. So, anyways. Well, as Travis said, today we'll be presenting you "Hitting a Home Run with Ignition." I am Kyle Chase 2.0 or Sophia Ruduke, and obviously CTO of Kymera Systems right here. And today we want to go over Ignition beyond industry. So a big highlight of this entire conference has been SCADA and process and automation and how to make everything out there on the field a lot easier. But we want to see how it will help us in our hobbies and our regular personal lives. Then we'll go into some project briefing and what we actually worked on. And then we'll get into a demo and show you the product we've been building. And as in we, it's Kyle, me, and Travis Cox. And for takeoff, we want to give you some incentive as to how you could amplify your life and elevate with Ignition and using it for your own hobbies.

02:39
Kyle Chase: So first off, a little bit about Kymera. We're a system integrator. We've been working with Inductive Automation since Factory PMI version one, Factory SQL version two. So about 2005. I've grown up with Travis, Carl, and Colby, which it's been very rewarding. We work at, we do module development, we do system integration, and we work in the cybersecurity space. We work across all verticals. I like to tell people that our vertical is Ignition, but primarily we're oil and gas, manufacturing, and mining. Kymera helps companies engage proven and emerging technologies sooner. We help them make better decisions and then make sure those technologies go the test of time. And like I said, we've been working with Ignition and Inductive Automation for 18 years, so we really believe in this product.

03:35
Sophia Ruduke: So Ignition beyond industry.

03:37
Kyle Chase: So some of the stuff that Kymera has done that is outside of your traditional industrial use cases, we've gone ahead and we built time tracking and invoicing platforms for certain integrators. Certain instrument electrical companies. This has the ability for them to get signatures from site. It lets them have a... Click the report, it'll use a web API and it'll go to a company that'll then print that PDF and then mail it to their clients for invoicing. We've built point-of-sale systems for overseas deployments where they don't have a real network infrastructure. So we built a point-of-sale system using NFC cards to transfer data back and forth between the end device and the point-of-sale system. We built data entry systems where we're using Ignition Edge to collect data from site, bringing it back, and then using that as a medium to transfer data from site to a central server.

04:35
Kyle Chase: I personally use it as an emergency notification system. I'm a type 1 diabetic, so in my house, as an example, I have the ability to detect when my blood sugars are low. And if I'm not responding to an alarm within, say, half an hour, it sets off sirens in my house so my family can wake up. Never needed it, but it is there just in case. Travis and I both build home security, our own home automation system using Ignition. And we've also built personal tracking systems. Well, I have for my kids because when they say they're at school and they're not and they're at their girlfriend's place, well, I get notified of that as well.

05:15
Sophia Ruduke: So there's a lot to consider when it comes to actually building an application, whether it's a web application or a mobile application. So one of the first things is what language do we even use? Python, Java, Go, Rust? There's plenty to choose from. And another thing to consider is frontend. Are we using HTML, CSS, JavaScript, React? Plenty to choose from, but the biggest thing is connecting your frontend and your backend. Sometimes it's not that simple. Normally, there's APIs you can use, but sometimes, depending on the language of choice that you go with, there isn't always directly compatible frontend and that causes a lot of turbulence, I would say. Another thing is, what database do we use? There's plenty to choose from. Obviously, in some cases, a time series one doesn't make sense. Do we go with MySQL? Do we go with SQLite?

06:14
Sophia Ruduke: Do we go with MariaDB? Which driver, which language do we want to use? Another thing as well is: how do we even deal with running the application? Do we want it on the cloud? Do we want to run it locally? Another thing is how do we secure it? Do we want our own encryption method or do we want to use something like OAuth 2? Another thing as well is how stable are the libraries that we are using? Oftentimes, there's lots of transitive dependencies that we have that can have vulnerabilities and cause our application to be insecure. So we have to be up-to-date on the latest updates on all of these libraries and make sure that our application is not prone to any vulnerabilities. As well, how do I share the data between the parts of the application? Oftentimes there's not a shared space and we'll have to use some sort of event handling or listeners, or some sort of hooks to communicate with different parts of the application.

07:13
Sophia Ruduke: So, when it comes to Ignition, we have it a lot easier. With Ignition, it takes a lot of the plumbing out of building a traditional application. Instead of having to deal with frontend and backend, how am I going to connect it? What encryption method am I going to use? Am I going to use an open-encryption method? All we really have to consider is what database do we want to use? There's plenty of drivers that Ignition already has support for. Another thing, Perspective or Vision? And the last but not least, will this eventually become Skynet? So for some logic briefing, I'll hand it over to Kyle.

07:50
Kyle Chase: So the big thing, at least for me, is baseball, and for Travis and Sophia, baseball's pretty important, at least in my life and in our lives. We needed something that made it easy to share the events with friends and family. A lot of the existing applications that exist, they need you to use their own application. They're pretty low-quality streaming, like the main one that we use is 720p, 30 frames per second. We want to be able to go to any video platform, whether it's YouTube, Facebook, and we'll be able to be at 1080p, 60 frames per second. We want that data to be readily available for analysis. We don't want to have to just use the built-in tools. So we figured, well, we have a platform we can build solutions on. Let's use Ignition to do that.

08:40
Sophia Ruduke: So some of our key features at the moment is we have scorekeeping. So we have an interactive field UI of where you can see the status of all players and their positions. We also have a scoreboard which features the balls and the strikes at the moment, as well as the score of the two teams, who's batting and who's pitching. We have team roster and player management. So this deals more with persistence and making sure we keep track of every player and every team that we have. The roster will connect the teams with the players. We also have game and player statistics. So we do have the backend for this at the moment. We have now built a frontend, beautiful Perspective page, but we have stats of all player events, and we can keep track of individual events that happened. So when you go back to a game, instead of having to trace through the entire game, you can filter by a single player and see, hey, they got a home run or it wasn't really their day that game. So essentially, this is a streaming tool. This is to be used for OBS and to be used to stream to more available services for family and friends.

09:55
Sophia Ruduke: Hello? Because the original software we were using was not very readily accessible for those around us, we wanted our friends and our family to watch our friends and our kids play baseball, but that wasn't an option. So we went with something ourselves that was easy for those around us to view. And persistence: obviously, we don't want to lose all of our data, if for some reason, we're at the baseball game and something happens and we have to close the app. We know that as soon as we open it, our game state is exactly as we left it.

10:31
Kyle Chase: So future features that we're adding, we're looking at adding Bluetooth radar. There's some radars out there that communicate over Bluetooth. We want to be able to get pitch speed and bat velocities. We're adding a heat map to be able to see where pitchers and batters are, or where balls are being pitched. Where is that pitcher having balls hit to, and for batters, where are they actually hitting the balls to? We want to be able to add the ability to support leagues. So right now, it's really built around a single team scoring their own games. You want to be able to have baseball organizations use this as a tool that they can then own their own data and be able to customize how the streams look for their customers. We want to add multi-year support. So as a kid grows through his baseball career, we want to be able to see track stats year over year. And eventually we're going to be adding a play-by-play review and the ability to export a game summary at the end of the game.

11:29
Sophia Ruduke: So we're going to get into the demo, but before we get there, we're going to start with the setup and what it actually takes to run our application effectively.

11:36
Kyle Chase: So the tools that we use for this, we need a local computer. So I use a Surface Pro 9. It's going to go ahead and run Ignition as well as OBS Studio. We need the ability to have a local network. The solution we have actually supports multiple cameras through OBS, so we need a network to be able to bring all those cameras into one location. We need an Internet-providing device. So it could be a cell phone, could be a modem, could be just local Wi-Fi. We need cameras that support technology that allow us to bring streams in. So I'm using a Mevo Start. It supports the NDI protocol, really low latency, and it allows you to synchronize streams. So if you had a picture of a batter and an over-the-shoulder of a pitcher, they'd actually synchronize those streams and not be out. And then YouTube or Facebook and where we're streaming everything to. We also record locally. So if the, if your network goes down, we still have all of that high-quality footage that we can then re-upload to those clouds later.

12:38
Sophia Ruduke: Okay. So we're first getting it started with the OBS setup so you guys can get more of an actual intuition as to what we're even talking about and what it looks like when we get to use this application to score our baseball games. So essentially, in OBS, you can set your media sources. So this will be the actual stream of the baseball game that we recorded. So...

13:00
Audience Member 2: And this is prerecorded?

13:04
Kyle Chase: But during a normal game, it would be through an NDI source.

13:09
Sophia Ruduke: So this is Kyle's son actually playing at provincials. But another setting that you can add is you can set web browser sources. So with Perspective being a web server source, we can set the link to our Perspective views and embed that into our recording. So we have two different scoreboards. We have a large one that we place on the top, and we have another one that goes in the bottom left. You can put it wherever you like, but this will be the URL to the other Perspective view. And essentially, so these are completely in sync, and these will keep track of the game and tell us exactly what state we're in. But the thing that guides these views is our controller. So to add our controller, but to not actually record it in the video, we're going to add something called a dock.

13:58
Sophia Ruduke: So this goes right into our OBS, and here we're going to bind it to the side, and essentially, once we're ready to start scoring, we'll have this field view, and anything we do on the controller, we'll update live onto our two scoreboards. So that's the OBS setup. We'll get into...

14:20
Kyle Chase: I'm sorry. Go on.

14:21
Sophia Ruduke: So this is our players right here. We have multiple, multiple players. Since we have support for all 30 of the MLB teams. With players, we have functionality to add, edit, and delete. Players are saved by their first name, their last name, which direction they bat, and the hand that they throw with. And another thing too: if you're not too certain about which hand they throw with, you can always go back and fix it later. So in our case, in spirit of ICC 2023, we made a Ignition baseball team. So we picked 13 of some top Ignition employees and we made players for them, and put together an Ignition team.

15:03
Sophia Ruduke: So here, you can see how easy it is. You literally just press the plus button, you put a first name and a last name. If you're not sure which way they bat or which hand they throw with, you can always put it in later. It's not like it's too crucial to your game stats anyways. But as simple as that to start off, and anytime you make an error, you can always go back and delete. But essentially, there's no limit to how many players you can have. And players can be on multiple teams as well, which we'll get to in this section. So here you can see our 30 MLB teams, and with each team you can also store a nice SVG logo. Here as well, you can add, edit, delete teams as necessary. Each team has an organization, has a name, a short name in the case that the name is too long.

15:52
Sophia Ruduke: It has a background color, a foreground color, and a place to edit the roster. So in our case, we're going to make our organization Inductive Automation, and our name is going to be The Igniters. For our short name, we'll just put IA, of course, and we'll go with the classy logo with the blue and the orange. I believe we set blue for background and orange for foreground. And just like that, we already have our team set up, but we're going to have to add our 13 IA employees. So it's just as easy as hitting a plus button and searching for a player and assigning them a number. For the sake of simplicity, we just went with ordinal numbers and just went one, two, three. We didn't have a chance to ask them their favorite numbers. But anyways, just as simple as this, the 13 players we just added, we're going to find and go through.

16:47
Sophia Ruduke: We are planning to get a bulk feature for this, but since you have to specify the number, it does have to be a little verbose in that sense. But pretty much that simple to set up a team as well. For the SVGs, we still need to implement some support for local uploads. Currently, the way the SVGs are stored is in the database using a path to an SVG. So you'll see that we'll assign it in just a second, but we're just taking a look at our roster that just saved to show that persistence. And right away... So here we have our nice new SVG. This is just the path to the SVG in the pictures directory. And in a few simple steps, we already have our team set up, and we are ready to start playing a game. So here we're going to set up a game. A game will consist of obviously a home team, an away team, a start time. And you can also set a location. We do have some cool ideas for location. We did want to implement a map, as well as, didn't we want to do some Google Maps things?

18:05
Kyle Chase: Yeah. We'll be adding the ability to store baseball field locations via Google location codes. But we're not quite there yet.

18:16
Sophia Ruduke: So for now, it's just coordinates or whatever works for where you're playing your baseball game. But for today, we'll set it as 1:15 as our presentation. For our home team, we'll set it as Ignition, and for away team, since we are Canadian, we'll set it to the Blue Jays. And we can save as well. One thing that happens quite often in baseball is sometimes the location of the game can change. So if that's ever the case and you ever need to go back and a location was to be determined, you can always go back and edit it later. So in our case, we're at ICC 2023, and just like that, those are all the parameters and inputs we need to get ready with the game, and then we can get into the fun parts. So for actually scoring, we did not use these two teams, although that would have been fun since we don't have footage of the IA employees playing. But essentially, this is kind of the overview of the field, and we can...

19:16
Sophia Ruduke: We'll show you guys how to set up, but I just kind of wanna go over this for a second. So at the top, we have our scoreboards; we have balls, strikes, and outs. Right over here, we have our inning, and we have our inning state, so we're at the top half of the inning. We have our away team and our home team, and right underneath, you see set value at the moment, that's gonna be for our pitcher and batter. So you'll see, once we set our pitchers and our batters, those will be filled and telling us who is going. Then we have buttons for each of our positions. So we have our catcher right here in the bottom, we have our pitcher, first base, second base, third base, shortstop, we have our left field right here, center field, and our right field. So there's one way you can assign players from this screen, and that's by clicking on these buttons and going in and assign your members. So that is what will be shown right away.

20:14
Sophia Ruduke: So this one is a little verbose and takes some time because you'll have to go into each button and then go through the list of who's been assigned or who's on the bench and select your players. So here we can see everybody's on the bench right now, and we're gonna go ahead and select Doug Dudley to be our left field. And again, we can set our center field from this view, and we're gonna set Matt to be our killer center field. But if that takes a little too long, we have this really handy view to set up the batting order and the positions. So up in the top here, we have this view with all the positions, we have the short prefixes for... Right here we have pitcher, catcher, first base, second base, third base, shortstop, left field, center field, and right field. And we can go in and select the players that are playing for this game. So one thing that is very handy with this pop-up is that players will be added to the batting order in the order that you selected. So this is handy in the case that you don't just wanna add everybody and then shift people around. It will remember what order you pressed them in. So here we're gonna add everybody to play in our star game, and as well, we can even add players on the fly in the case we forget somebody. But now we have everybody here, automatically signed as an extra hitter, but then we can go ahead and set up our positions accordingly.

21:43
Sophia Ruduke: As well, there's these arrows to move people around in the batting order in the case anything switches. We have these substitution buttons which will swap people in place, as well, we can get rid of people from the batting order. And now, when we return, we can see that all of our players are set accordingly, and as well, we have to do the same thing for the away team before we can start scoring. So we do that really quickly for the Canadian team with the Blue Jays, the fake Blue Jays if you cannot recognize any of the names on there as it's prepopulated data. And so now we can see up here on the top we have our batter and our pitcher, and this will update accordingly as the game goes on. So that is just the process of how to get set up with the game. Before you can even start scoring, you'll have to set your players, you'll have to set where they're playing, and then we can get to the really, really fun part. Or, I believe I show substitutions first. So here we can substitute players that are already fielding, or we can substitute players on the bench. I might just carry on. Alright, and get to the fun piece. So here we have footage of Kyle's son playing at his provincial game, and so we did the exact same process that we just did previously. We already set up our batting order and our positions for the two teams.

23:22
Sophia Ruduke: So now what we can do with our controller is we can score the game as it's happening. So if you notice that the video playing on the left is a little out of sync of the one on the right, it's slowed down so that you can see what's happening and process it a little better. But over here on the right, we have the video in 2x speed and the video on the left in 1x speed. So we can see, as things are happening, we go into our controller and we update it accordingly. So if we go back, even small events like an attempted pickoff, we have support for it. So if we go back, 'cause we might have just missed it, this player right over here tried to get an attempted pickoff, so we can go in and say the runner on first was safe and he tried to get a pickoff. But as well, anytime a pitch is thrown, we can call it a strike or a ball, but the most fun happens when there's a ball in play. So I'm not sure what timeframe we have a ball in play, but essentially, so you'd be at your game, somebody's recording, somebody's streaming, somebody else could be scoring, or it could be you as well. And we have support for all the different events that can happen, whether it's something more passive, like a ball or a strike, or any sort of player event.

24:43
Sophia Ruduke: If a player advances during the play, stays on a base, it doesn't matter. We have support for every possible event. So here, I'm gonna skip a little forward so we can get a ball in play. Oh, this is perfect, I believe. So here we can say the player advanced because he stole a base.

25:24
Sophia Ruduke: And next, sorry, I believe I saw a ball in play, but perhaps not. Anyways, one of the really key features that is really nice with this whole game engine is the fact that it takes into consideration what happens to everybody else. Just because the current player who batted hit a double or hit a single, it doesn't mean that everybody else automatically advanced. We need to know exactly what happened to them. So in this case, we just had a batter out and it had to do with the pitcher, but the runner that was on second actually advanced. So that is an event that we need to take care of, so we can advance the runner on second and say he was safe, and just like that, he moves over and advances the game. So just like this, it has a whole game engine in the back that is scripted using the scripts in Ignition. And once you reach like four balls, you get a walk, once you reach three strikes, it advances the outs. So it has the intuition of a baseball game, but it's all through this Perspective view, and we'll guide the game accordingly. As well, one really good feature that we have is the undo button. So in the case that you accidentally mark an event as not what it actually turned out to be, because sometimes after some time you might be like, "That wasn't a ball, that was a strike," you can always undo and go back to the previous game state. So how does this actually all work? What's on the backend and what's going on?

27:05
Sophia Ruduke: How are we utilizing Ignition's key features to get this controller to work and to update our scoreboard? So that's what we're gonna get into shortly.

27:23
Kyle Chase: So what we did is we added a bunch of tags that give us state that allows us to synchronize all that information between all the different views that we have. So we're all familiar with tags. So here's an example of our structure: we have the ability to store who's batting, how many pitches, how many balls, what's the count, what's the batting order, what's the roster. You can see an example of the roster; we're using a five-digit Base64 code, should give us room for about two billion players, which, hopefully, if we succeed that, that would be awesome, but I doubt it. And then just the positions of the batting order. It's just a simple list, simple dictionary of all things that we're all used to working with.

28:04
Sophia Ruduke: Totally. And even just some more intuition as the individual tags that we're keeping track of. We definitely need to keep track of the players on both of the teams, the rosters, the positions. So this is where everything happens. Anytime a change happens, we're writing to here, and as well, this game state and these tags are always saved to the database. So that is how we're able to restore the state with just a simple undo button. We just go back, write to the tags as they just were, and just like that, we have our previous state. As for our players table, so we have five tables. Our players one is quite straightforward, using that five-character Base64 encoded ID for their unique identifier. We have F name for the first name, L name for the last name, we have a single character for the direction that they bat in, or L or A for ambidextrous, and then for throws, same thing, R for right, L for left, and A for ambidextrous. And here we have some examples.

29:10
Kyle Chase: And a lot of our other tables are also very... As you can imagine, the UI follows what's in the database. So teams will have all the same information we entered, games will be there, and then eventually we get to the game state database.

29:24
Sophia Ruduke: Eventually.

29:25
Kyle Chase: So the game state database is a little less apparent, but we eventually store event code, and we store game state. So the game state, each of those keys is gonna reference a tag inside of Ignition, and we wrote a simple Python script to be able to synchronize the database information with the tags itself. For certain event codes, we wanna be able to know what happened in that event. So there was an overthrow to first. Was the error on the pitcher or on the first baseman? Did the player eventually end up at second, or did he end up at third? So we designed the database to be able to have a dynamic, ability to store dynamic information, and then also be able to revert back to a previous game state.

30:11
Sophia Ruduke: That's right. I'll just do a brief overview of the other tables that we have. So this is our teams one, containing the five-character unique identifier for the team. The organization and all the strings that we set in those Perspective views. As well, the roster connects our teams with players, so the ID team and the ID player are foreign keys. So in this case, this is what connects it, because multiple players or a player can play for multiple teams, so we didn't want to restrict that in our implementation. And the game state that Kyle was referencing is this crazy table over here. But essentially, we have predetermined and unique keys that we established for all of the baseball events. And here you can see over on the left, so B is for ball, we have Cs for, or Sc for a called strike, that's right. And as well, every game consists of a set order of events that occur. So you'll notice that for every game that just starts off, we'll have an hrost and an arost event; hrost is a home roster event, and arost is an away roster event. This is what sets up our teams, so we know which IDs we're working with for that game. Then we have an hbord and an abord, which sets the batting order, and these are very handy when we come into reactivating games and switching between scoring games, because all we need are these events to restore the state and the players of a previous game.

31:46
Sophia Ruduke: Then we get into all of the scoring. So here we have a ball and a foul ball, and we have all the players that were involved. So for taking off, how can we actually use Ignition's key features in personal projects and projects related to our hobbies? So tags are very useful for sharing resources. You can access tag values in scripts, and you can also access tag values in the actual bindings and components that you're using in Perspective. As well, it's all real time, so you know that when you're pulling from a tag, that is the current value. It's not something that was cached or stored a while ago. With the database, you can store persistent data. With Perspective, you can build plenty of templates and interactive UIs, and with reports as well, you can get the full experience of exporting any important information that is in your Ignition.

32:57
Kyle Chase: So other resources that we use are gonna be Python scripting. So our whole game-state engine is developed in Python. So again, the scripting understands how baseball works and what certain events need for more information. We're gonna handle authentication just using the built-in IdP that's built into Ignition. Some modules that we're gonna build to eventually make this better, where we're gonna build a module that allows OBS Studio to interface with Ignition, or the opposite actually, for OBS Studio to pull data from Ignition so we know when a stream starts, we can relay that to a specific time of day. So if someone hits a home run, we can then pipe that out to FFmpeg to cut out that specific play, so that then each player can see all the plays that they were involved in. We're also gonna add, again, the Bluetooth radar integration; that's gonna be a serial connection to a Bluetooth radar, and then we're gonna be able to pull back the speed.

33:52
Sophia Ruduke: Alright, so I'm Sophia Ruduke, and he's Kyle Chase, and our plans with this project are to release it open source on GitHub and hopefully get other people's help on working with the future features. As well to have it open for people to use for their baseball careers and lives. So if you guys want to see more of just the scoring, I'll put that on in the background, but I think now is a good time to go into some questions.

34:23
Travis Cox: Alright. Let's open it up to questions. Any questions out there for these two? Yeah.

34:31
Audience Member 3: So I really liked your undo button. How far back can you undo? Is it just the previous state, or does it go and queue them up so you could go back and back and back?

34:42
Kyle Chase: So yeah, it allows you to go back all the way to the very beginning of a game, so every single... We're very verbose on the data that we store every time an event happens. So when you go back, it's just literally picking the previous event in the stack and restoring that game state. It's gonna go all the way back to the very beginning of the game.

34:58
Audience Member 4: Does your decision to put it up on GitHub that you just mentioned change now that we announced multitenancy?

35:04
Kyle Chase: Yes, yes, it does, and community edition. Yeah.

35:11
Travis Cox: Any other questions? Back there?

35:15
Audience Member 5: Seems like it might be fun to mess with some computer vision applications to do the scoring for you.

35:21
Kyle Chase: So yeah, we actually were thinking about doing that. The radar that I have doesn't have Bluetooth, so we were gonna use a phone running and the ability to read the speed off of that. I don't know if we'd be able to detect the type of pitch as an example or the type of a hit, but that's outside of my realm of knowledge, but yeah, definitely wanna get into it.

35:44
Audience Member 5: It does have me thinking you could have a computer vision model for each umpire.

35:47
Kyle Chase: Yeah.

35:48
Audience Member 5: So it detects strikes and balls.

35:50
Kyle Chase: But they come in all different shapes and sizes, so I don't know how.

35:53
Sophia Ruduke: Well, for sure. Need a lot of training.

35:56
Travis Cox: There's a question down here in the front.

36:04
Audience Member 6: Thank you, this is awesome. So what does it look like on the consumption side, and are there different ways of looking at that, like via app or video or...?

36:14
Kyle Chase: So right now, the primary consumption is, or the only real way to consume it is we're streaming to YouTube or to Facebook and then you'll watch essentially the right side of the screen as what you would see through that vehicle. We do wanna add the ability for people to go in and see their kids or be able to go in and see a review of all the games to see what their averages are, what their stats are, and to see the video of the events that they're involved in. But we're just not quite there yet.

36:46
Audience Member 6: Awesome, thanks.

36:46
Travis Cox: Yeah. Yeah, the question back in the back. We're gonna make him run.

37:00
Audience Member 7: Thank you, this is really cool. I coach my son's baseball team, and we use GameChanger. It looks very similar to that, I'm sure that kind of inspired it.

37:07
Kyle Chase: Yeah.

37:08
Travis Cox: But a lot better.

37:08
Audience Member 7: A little bit.

37:09
Kyle Chase: Yeah, yeah.

37:10
Audience Member 7: So I'm just wondering, as far as the person that's actually doing the scorekeeping, are they using a laptop computer and are they logged into the Perspective?

37:22
Kyle Chase: So there's kind of two ways that I've done it: I've done it where I've just got my Surface with OBS Studio running, and I'm scoring it right from OBS. We designed the interface to almost blend in with the OBS default view. The other way is you can just open it up on your phone, and someone can score it off their phone as well. Eventually, we wanna get to the point where we're looking at other technologies where you have server-side rendering of the video so that you won't need a Surface on site and you can use a cloud-hosted version of Ignition. But we we're still pretty early in that part of the project.

37:55
Audience Member 7: Yeah, it's pretty sweet.

37:57
Kyle Chase: Yeah.

37:58
Audience Member 7: Thank you.

38:03
Audience Member 8: It was so good, I can't even heckle you, but UI design was great. I just need to know, is it available for slow-pitch wiffle ball?

38:14
Kyle Chase: I wouldn't consider that real baseball, but yeah, you could use it for that. We were gonna design one for football as well, but we only play three-down football in Canada, I don't think anyone here would understand how that works, so.

38:30
Audience Member 9: Yeah, so you mentioned putting this on GitHub, so I was just curious: have you guys been putting this on GitHub already as a private repository?

38:39
Kyle Chase: I don't think...

38:39.5
Sophia Ruduke: Yeah, it's privately managed by us, but we'll need to do some alterations before we release it public.

38:45
Kyle Chase: Yeah. And our code was too bad to upload the first couple iterations, so yeah. Yeah, we're gonna put it on GitHub, and we're also gonna put it on the Exchange, so it'll be easier to use as well, so.

38:57
Audience Member 9: Thanks.

38:58
Travis Cox: There's a question down... Oh, yeah.

39:00
Audience Member 10: The licensing cost is a question: what's it costing from a licensing perspective?

39:06
Kyle Chase: So licensing, so for me, I'm using a Maker Edition. I'm not making money off of this. it's not for a commercial entity. I think that's gonna be what most people are using it for. I'm not a licensing expert, I would imagine if you're involved in a... If you have a Community Edition of Ignition that they just announced, you might be able to use that. Outside of that, we tried to keep the features that we need to a minimum. Really, you need Perspective and you need the SQL Bridge Module. We're not using Historian, we're not using SFCs, we're not using anything else. It would be a pretty minimal cost if you wanted to use it for an enterprise or for a for-profit organization.

39:48
Travis Cox: Yeah. Was there another question over there?

39:51
Audience Member 11: Yeah. Do you have a rough hour counter of how much work this was to put together?

40:01
Sophia Ruduke: I think the presentation was the maximum. Building the app was the fun part. Yeah.

40:08
Kyle Chase: Yeah, I would say like 40-50 hours, I think, between the bunch of us.

40:13
Sophia Ruduke: Two, three of us.

40:13
Kyle Chase: We went back and forth on a whole bunch of changes, but I think if we actually preplanned it, we'd probably be in the 50 to, probably, 50-60 hours.

40:22
Audience Member 11: Yeah. That's impressive, thank you.

40:27
Travis Cox: We have a question down here in the front.

40:36
Audience Member 12: So your app, does it have any scheduling in it where you can put like the season games where it's gonna be at, so you can get like parents and next...

40:46
Kyle Chase: Yeah, so when you create a game, you can set the time for the game. We don't really have any multitenancy yet for people to see their own game and for notifications. But again, that's stuff that we do wanna add as we add the league feature, that'll be pretty important for that.

41:03
Travis Cox: Yeah. Any other question? Oh, there's one over there.

41:09
Audience Member 13: Sorry. So you mentioned that you guys want to be able to have people to skip to the exact point in the game when something cool happened.

41:21
Kyle Chase: Yeah.

41:22
Audience Member 13: Are you timestamping every single one of these events and event changes? Is that how you kind of intend to do that?

41:28
Kyle Chase: Yeah, so we store time of day when each event happens, and so when we integrate with OBS, we will... Ignition will know when the OBS stream started. So we'll be able to say, okay, if it started at one o'clock in the afternoon, but then the event happened at 1:20, then when you run everything through FFmpeg to cut the video out, you would know you'd have to start 20 minutes into the stream. So you're taking a precise time or an absolute time, and then we have to convert to a relative time for FFmpeg.

42:01
Travis Cox: Yeah. Any other questions? I think right here. Oh yeah, we've got quite a few.

42:15
Audience Member 14: I guess with this being on site with the game that you're gonna be there, are you gonna create logins for, I guess, people to be able to have access to this while they're on site, like be able to, like, "Hey, how's this game going?" Being able to see the stats and be able to log in and see how their players are doing, how their kids are doing.

42:37
Kyle Chase: Yeah, yeah. It's gonna be...

42:39
Audience Member 14: Without, I guess, changing their... Making their kids look good or something like that.

42:44
Kyle Chase: Yeah.

42:44
Sophia Ruduke: Yeah, 27-0, like that's not happening. So we'll certainly need some sort of authentication to make sure only privileged users can actually make changes to games. But that will not be too hard to implement with Ignition's IdPs.

43:04
Audience Member 15: You had mentioned earlier that you are working on some other application also, like monitoring and medical alert, something like that. Are you guys trying to put that on GitHub also?

43:17
Kyle Chase: I'm sorry, say that again.

43:19
Audience Member 15: So you mentioned earlier you had developed blood sugar monitoring application and those... Are you guys planning to put that on GitHub also?

43:29
Kyle Chase: Yeah, all it really is is just, my phone publishes data every five minutes to an existing solution, and then I just use Ignition to involve or to call a web API from that server. And then if I haven't responded in 30 minutes, which again has never happened, but if I'm not acknowledging an alarm within 30 minutes, it sets off a siren in my house. So it's not really... We can talk, I can share with you if you want. Yeah.

43:56
Travis Cox: We have time for maybe one more question. Any?

44:00
Audience Member 16: Yeah. So something we really like about some Exchange resources is especially like an example would be like the Ad Hoc Trend Component. When you install it, it automatically detects your database connection and populates the tables needed for that. Is that something that you guys would put in there for this application to maybe just make it just more easily importable?

44:25
Kyle Chase: Yeah. So we have a Python script that we call that will go ahead and set up all the database tables for us. We don't have like a quick start automated, but we can add that, yeah.

44:35
Audience Member 16: Yeah, that'd be cool. Alright, thanks.

44:38
Travis Cox: Alright. Well, thank you, everybody. Let's give them a round of applause.

44:47
Travis Cox: Good job.

Posted on December 18, 2023