Wednesday, June 4, 2025

Determine Dell Service Tag in Windows

  1. Open up a powershell window.

  2. Enter this command
    GWMI -Class Win32_Bios | select SerialNumber

  3. Press Enter.

System will return with your Dell Service Tag.

You can then enter that into the Dell site to get further information about the system.

Wednesday, May 21, 2025

OBS Replay using Source Record (2+ Cameras)

This replay will record multiple camera inputs simultaneously.  It wont record the program feed like the basic built in OBS replay does.

I show this in a 'from scratch' deployment of OBS, but you can add this to an existing input that you may already have.

This one uses a plugin called "Source Record" which allows us to directly record the camera feeds.

1> Download Exeldro's "Source Record" plugin and install it.  

https://obsproject.com/forum/resources/source-record.1285/

2> Setup a video source/input on your OBS

3> Right click on your video source that you want to record in your replay and select "FILTER"


4> Under "Effect Filters" select "Source Record"

5> You should now see something like this


6> Select the Path to put in the replay for this video source

7> Give it a unique file name for this replay recording.  This example will call this replay "Camera 1"


8> Scroll down to "Replay Buffer" and select the duration of the replay you want to have kept in memory.  OBS replay, in this case, will keep a buffer of the video in memory.  This example will keep 12 seconds in memory.


9> Now repeat steps 2-8 for the other inputs you wish to record.  Give them a unique reference however, like "Camera 2"  "Camera 3" 


10> Now we setup hotkeys to tell OBS to save the replay buffer in memory to a file on the computer drive.

Goto SETTINGS -> HOTKEYS

When you scroll through the list, you will want to look for the "Save Replay", but you will want the one that is referenced with "...Source Record" in the title.  Give them all the same hotkey.  This example uses F8.  By giving them all the same, when the hot key is pressed, all your camera angles will save at the same time, allowing you to play back different angles.


The default OBS buffer simply called "Replay Buffer" is not needed to be setup or used.

11> Press your hotkey that you assigned to the source record replay, and you should see a file appear in the directory you assigned in Step 6


If nothing appears, review your steps above.  Also exit OBS, then reopen it.  Sometimes that will fix the issue as well.

12> Now create a scene called "Replay Camera 1"

13> In that scene, add a "Media Source" and called it "Camera 1 Replay"

14> Set "Local File" and point it to the location and the file name for the recording.
Set the "SPEED" that you want the file to play back as.  For example 70% will play it at about 3/4 speed.


15>
Select "restart playback..."
        Select "Close file when inactive" (this keeps the file from being locked for subsequent replay saves

16> Now repeat steps 12-15 for each input you have.  Just change the name to identify each input.  Update the additional replay hotkeys that suit your deployment.

Using Replay

Now at any point press "F8".  I give the system about 1-2 seconds to create the files.
Cut to your "Replay Camera 1" scene, and you should see the video playing.  
You can now select "Replay Camera 2" and "Replay Camera 3" to watch each replay
When you are done you can cut back to your main camera feed.



You do not use the "start replay buffer" that is built into OBS.  this one is always running with Source Record.


OBS Replay using Source Record (1 Camera)

This replay will record a single camera input, not the program feed like the basic OBS replay does.

I show this in a 'from scratch' deployment of OBS, but you can add this to an existing input that you may already have.

This one uses a plugin called "Source Record" which allows us to directly record the camera feeds.

1> Download Exeldro's "Source Record" plugin and install it.  

https://obsproject.com/forum/resources/source-record.1285/

2> Setup a video source/input on your OBS

3> Right click on your video source that you want to record in your replay and select "FILTER"


4> Under "Effect Filters" select "Source Record"

5> You should now see something like this


6> Select the Path to put in the replay for this video source

7> Give it an unique file name for this replay recording.  This example will call this replay "Camera 1"


8> Scroll down to "Replay Buffer" and select the duration of the replay you want to have kept in memory.  OBS replay, in this case, will keep a buffer of the video in memory.  This example will keep 12 seconds in memory.



9> Now we setup a hotkey to tell OBS to save the replay buffer in memory to a file on the computer drive.

Goto SETTINGS -> HOTKEYS

When you scroll through the list, you will want to look for the "Save Replay", but you will want the one that is referenced with "...Source Record" in the title.


The default OBS buffer simply called "Replay Buffer" wont be used by us in this example.  We ignore that one.  
I've set the Hotkey of F8 beside my entry

10> Press your hotkey that you assigned to the source record replay, and you should see a file appear in the directory you assigned in Step 6


If nothing appears, review your steps above.  Also exit OBS, then reopen it.  Sometimes that will fix the issue as well.

11> Now create a scene called "Replay Camera 1"

12> In that scene, add a "Media Source" and called it "Camera 1 Replay"

13> Set "Local File" and point it to the location and the file name for the recording.


You can adjust the Speed of playback to let your replay be slow motion

14> Select "restart playback..."
        Select "Close file when inactive" (this keeps the file from being locked for subsequent replay saves

Using Replay

Now at any point press "F8".  I give the system about 1-2 seconds to create the file. \
Cut to your "Replay Camera 1" scene, and you should see the video playing.  
When its done you can cut back to your main camera feed.

You do not use the "start replay buffer" that is built into OBS.  Source Record is always running.

Using something like Advanced Scene Switcher, you can incorporate splash screens.  If that is something of interest, let me know in the comments.

Friday, April 18, 2025

Embed image data directly in an autohotkey script

Have an AutoHotkey GUI that uses images and you want to imbed those images INTO your script code? (and not have to use a path to an image file?)

The script will convert your image files into autohotkey data that can exist in your AHK script.

1> Download this conversion tool

computoredge.com/AutoHotkey/Downloads/Image2Include.ahk

2> Run the tool

Pick the image file that you want to include into your script

(This example an image called "colors.png", which is a TV style color bar pattern, is used)

3> Click the CONVERT IMAGE button


            Script shows a "successfully created!" at the bottom

4> Click on "SHOW SCRIPT"

You'll see something like this.  Not the first portion "Create_colors_png".  That is the name that you use in your code for the image name.


5> COPY all of the code and PASTE it somewhere in your script.
It would be suggested to put it at the very bottom.

6> If you have some gui code already that is loading a picture, you just replace the dir/image name with the following code syntax

% "HBITMAP:*" . Create_colors_png()

(NOTE!  You need to have the double parathesis at the end!  don't forget those)

Here's a quick example GUI that will show the image, in my example, a color bar pattern

gui, add, Picture,  , % "HBITMAP:*" . Create_colors_png()
Gui, Show
msgbox press key to continue

; # This #Include file was generated by Image2Include.ahk, you must not change it!
; ############################################################
Create_colors_png(NewHandle := False) {
Static hBitmap := 0

...rest of code copy/pasted from the conversion script

And if you run it, will look like this:


If this tutorial has been of any help to you, I'd love to know! 
If you have suggestions of how to improve it, let me know in the comments!  Thanks!


Tuesday, April 8, 2025

Install Windows Python in OBS

This is a GitHub link that goes into this in way more detail.  
GitHub - zooba/obs-python: A Python bundle for integration with OBS scripting

Here's the basic steps

  1. Go to this releases page and select the most recent version of Python
    Download the WIN64 version (at time of writing v21.2.16.1)
  2. Extract the ZIP file somewhere on your system that you prefer.
    (The Microsoft Windows included zip tool gives file errors, I used 7zip and worked perfectly, in case you run into similar issues)
  3. In OBS, open "Tools" - "Scripts"
  4. Select "Python Settings" tab and browse to the directory you extracted the ZIP file

It should reflect "Loaded Python Version: X"



If this tutorial has been of any help to you, I'd love to know! 
If you have suggestions of how to improve it, let me know in the comments!  Thanks!

Monday, March 24, 2025

Overlays.UNO - Update Stats from a Spreadsheet

Would you like to be able to use a spreadsheet data to update some Overlays.UNO fields? 
Here's a bit of a hack aka work around.  Its a work in progress, but I've used it fairly successfully.

What it does is take the values you put into the blue boxes in the sheet and then generate the JSON code that overlays.UNO want to update that element.  By copying/pasting them, it will update all or some of them, depending on what you paste.  In my own deployment, I've used keyboard macro to help speed up the copy/paste of the lines.  I think it would be possible to have this work from the spreadsheet itself, with some google script code or Microsoft excel macroing.

For example, the "Player BIO | Varsity" overlay:



All the data has to be entered in manually normally.  Not really convenient.  You could build a overlay for each person, but its cumbersome. 


Well, it COULD be done through a spreadsheet.

This sheet, again, it's not perfect at this point, but it's a start.

The data can be entered into the blue boxes on the left, and it will generate the appropriate code on the right that you can copy into a CMD prompt and run to update your sheet.  This data could also be scraped data from another scoring system that you could use.  I've done it successfully with Daktronics Dakstats websites.

You can select all the CMDs and paste them all at the same time to update everything, or just 1 at a time if you prefer.


Here's a link to the ODS spreadsheet file.


TO make it work, you'll need to first get your Overlay API and paste it into the sheet


Then you'll need the JSON ID. 

The sheet, when you put in the API value, will automatically generate the code for windows CMD prompt for you to get the JSON ID.  


Paste that syntax circled in red from your sheet into a CMD prompt and press enter.  
Will look something like this:


Once you paste this value into the sheet, you will be able to control the overlay.

Key in the data that you want to display.



Copy these lines if you want to update everything, or just copy the line beside the data you changed.


Then Paste it into a CMD prompt

You may get a warning

This comes up because you are pasting a bunch of lines.

You'll see a bunch of stuff on the CMD prompt window as the JSON code is sent to Overlays.UNO

You should see the data in Overlays now reflect what was in the spreadsheet.




To do the logs, go to your logos that you have uploaded to your account in Overlays.Uno




Copy the URL for the picture you want.

Then paste it in the spreadsheet for the Team Image and the Headshot


Copy/paste the CURL command to the right of it to update them.




If this tutorial has been of any help to you, I'd love to know! 
If you have suggestions of how to improve it, let me know in the comments!  Thanks!

Monday, March 17, 2025

Control Overlays.UNO from command line

Control Overlays.UNO alternatively to the GUI?  

  • To interact with Overlays.UNO without needing to rely on the GUI.
  • Control from OBS or vMIX if possible.
  • Avoid needing 3rd party applications or hardware and use basic keyboard hotkeys.

IN A NUT SHELL

Overlays.UNO uses PUT statements using JSON for control.

To make it work with as many systems as possible, the 
CURL command is used which isn't OS dependent outside of minor syntax formatting tweaks for your flavor of OS.  These examples in this document are for Windows CMD prompt, and required to have slashes in front of any quotation inside a curly brace

"{\"JSON CODE\"}"

Overlays.UNO need the URL API and in some cases a specific JSON ID associated to the overlay.

The CURL syntax below is an example of how to send direct commands to Overlays.uno. 

curl -i -H "Content-Type:application/json" -d "{"JSON CODE"}" -X PUT https://app.overlays.uno/apiv2/controlapps/xxxAPI_VALUExxx/api

The above command is reformatted below for Windows CMD with a slash marks as mentioned above:

curl -i -H "Content-Type:application/json" -d "{\"JSON CODE\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/xxxAPI_VALUExxx/api


It appears that Overlays.UNO may have retired the original "Hockey Scorebug | Standard" That I demoed originally, so here's the one they have now.  I'm building a new explanation, hopefully it will be more clear.  The original was mostly for my own notes until i had time to clarify everything.


First thing you need is your API url.


Now lets turn the Overlay OFF and ON.

Use the commands below, substitute your UNO API URL for your overlay.

HideOverlay 

Modify the command below with your API URL data.
Paste into a CMD prompt and press enter.

curl -i -H "Content-Type:application/json" -d "{\"command\": \"HideOverlay\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/YOURoverlayURL/api
And if you look at overlays.UNO, the overlay should be gone.

ShowOverlay

curl -i -H "Content-Type:application/json" -d "{\"command\": \"ShowOverlay\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/YOURoverlayURL/api


The majority of hiding/showing elements will follow that CURL syntax



DEMO (OLD)



For this demo the overlay "Hockey Scorebug | Standard" is being used.  Load this from overlays.uno and you should be able to apply the information in this doc with your own deployment.


Launch it and the default looks basically like this below:


Click on the question mark and click on API description


Your going to see this:


The API endpoint URL is displayed here at the top, so copy and save that for easy retrieval



For this Overlay example we are using here, the 
JSON ID is required.
Run the following command, substitute your API endpoint value that is in RED

curl -i -H "Content-Type:application/json" -d "{\"command\": \"GetOverlays\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api

Copy the ID that yours returns with as you will need it (yellow)



For demonstration, we'll start by turning the overlay ON and OFF. 

When we got the API endpoint URL above, it also contained some of the possible commands that could be issued, the first two being "ShowOverlay" and "HideOverlay"



HideOverlay 

Modify the command below with your JSON and API data.
Paste into a CMD prompt and press enter.

curl -i -H "Content-Type:application/json" -d "{\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"command\": \"HideOverlay\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
And if you look at overlays.UNO, the overlay should be gone.


ShowOverlay

By following the substitution steps above with the command will allow you to display the Overlay.

curl -i -H "Content-Type:application/json" -d "{\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"command\": \"ShowOverlay\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api



TEAM GOALS

You can "Increment" or "Decrement" the score by a specific value 
OR you can set the goal directly to any value.

Increase Team 2 Goals by 3
curl -i -H "Content-Type:application/json" -d "{\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"command\": \"IncrementOverlayContentField\",\"fieldId\": \"Team 2 Goals\",\"value\": \"3\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
Set Team 1 Goals to 13
curl -i -H "Content-Type:application/json" -d "{\"command\": \"SetOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"Team 1 Goals\",\"value\": \"13\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
CLOCK (Change the time)

Increment the clock by 1 minute
curl -i -H "Content-Type:application/json" -d "{\"command\": \"IncrementOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"Game Clock Minutes\",\"value\": \"1\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
Decrement the seconds by 15
curl -i -H "Content-Type:application/json" -d "{\"command\": \"DecrementOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"Game Clock Seconds\",\"value\": \"15\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
Change the minutes to a specific time "11"    
curl -i -H "Content-Type:application/json" -d "{\"command\": \"SetOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"Game Clock Minutes\",\"value\": \"11\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
Change seconds to a specific time "12"
curl -i -H "Content-Type:application/json" -d "{\"command\": \"SetOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"Game Clock Seconds\",\"value\": \"12\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api

START CLOCK  (Valid commands play, pause, reset and start)

curl -i -H "Content-Type:application/json" -d "{\"command\": \"ExecuteOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"GameClockControl\",\"value\": \"start\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/apicurl -i -H "Content-Type:application/json" -d "{\"command\": \"ExecuteOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"GameClockControl\",\"value\": \"True\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api

STOP CLOCK

curl -i -H "Content-Type:application/json" -d "{\"command\": \"ExecuteOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"GameClockControl\",\"value\": \"pause\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/apicurl -i -H "Content-Type:application/json" -d "{\"command\": \"ExecuteOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"GameClockControl\",\"value\": \"True\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api



Period
(You can put any txt you want) (1,1st,ShootOut, OT etc, different language versions)
curl -i -H "Content-Type:application/json" -d "{\"command\": \"SetOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"Period\",\"value\": \"2ND\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
ALERT ON/OFF  (replace TRUE with FALSE)
curl -i -H "Content-Type:application/json" -d "{\"command\": \"SetOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"alert\",\"value\": \"true\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
ALERT Text - Custom (Penalty, Timeout, GAME 3)
curl -i -H "Content-Type:application/json" -d "{\"command\": \"SetOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"Alert Text\",\"value\": \"REDS\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
TEAM NAMES

Change Team 1 to "BLUES"
curl -i -H "Content-Type:application/json" -d "{\"command\": \"SetOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"Team 1\",\"value\": \"BLUES\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
Change Team 2 to "REDS"
curl -i -H "Content-Type:application/json" -d "{\"command\": \"SetOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"Team 2\",\"value\": \"REDS\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
LOGOS ACTIVE  (on/off)
curl -i -H "Content-Type:application/json" -d "{\"command\": \"SetOverlayContentField\",\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"fieldId\": \"logosActive\",\"value\": \"false\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api

JSON commands in detail:

Another way to determine some of the JSON values, and syntax that can be helpful is to use "Postman" 
Download Postman | Get Started for Free which is a system to allow you to review JSON code and do interaction to sites like Overlays.  Might help you.  It helped me quite a bit



COMMANDS IN DETAIL

Now the API document that you can find in the help menu will show the command syntax you'll need.  This is helpful...it is very generalized and not super helpful.

Along with the above syntax sequence, you also will need the values in the names.  So how do you increase the 

The names of the fields somewhat match the names they are given in the above picture, but to get a full list, well at least one that you can search through, use this command: "GetOverlayContent"

curl -i -H "Content-Type:application/json" -d "{\"id\": \"45eac98d-cc99-4a8a-b430-872391c30aca\",\"command\": \"GetOverlayContent\"}" -X PUT https://app.overlays.uno/apiv2/controlapps/0mNA1zjHa8jiElWzdWJb0Y/api
You'll get a return like this:


You'll see things that you can adjust, and most names match the gui description, but not all the names are the same.  In the GUI its called "Game Clock Control", but in JSON its "GameClockControl". The above helps to sort out some of the differences. 




If this tutorial has been of any help to you, I'd love to know! 
If you have suggestions of how to improve it, let me know in the comments!  Thanks!