WiFi Tally for ATEM Mini on the cheap

I’ve tried to find out the cheapest option for getting tally lights on my canon xa cameras. I’ve previously done some work with the Wemos D1 Mini (ESP8266) and found that there is a neat RGB-shield for these that make them super simple to put together and thanks to the work by OneGuyOneBlog and Kasper Skårhøj getting the code working was not too much of a hassle. Next version will add a wifi manager and webinterface for changing switcher ip, camera id and LED brightness. Maybe also build a 3D-printed case with a coldshoe and light defuser. What do you guys think?

Not affiliated links

1 Like

Looks nice, I tried to do the same but put it on hold due to lack of time. Does it have any proxy server or connects straight to ATEM? Apparently there is a limit on a number of connections to ATEM.

Can you share the details of how it works (SW, wiring)?
I tried using an ESP8266 and the code from OneGuyOneBlog with no success. I am using the 8.4/8.5 ATEM software. I’m wondering if the OneGuyOneBlog code worked for previous ATEM software revisions, but something in 8.4 broke the magic.

I’ll put up a GitHub repo within a few days.

1 Like

I don’t use a proxy by now. The ATEM suposedly has a limit of 5 connections for controll and for the Atem Mini I will probably never be using more than 3 tally lights. That leaves one connection for the ATEM software and one for Companion. If that does not work I would maybe start looing into how to use a ESP32 or something as a proxy.

Any update on this? I’m eager to get a tally light going. :slight_smile:

In my research I found a path that might work althought I havent tried it.
I wonder if one could use AtemOSC to intercept atem commands and translate them to OSC, then use a sketch on an ESP8266 to receive the OSC commands and control LEDs (i.e. "if /atem/send-status/mix-effect-block returns “cam1”, light up a red LED)

Hi. Still working on it. Having some issues with the wifi manager as I’m not really much of a programmer but I’ll post it as soon as I have something that works.


Do you think you could upload the code you used for the setup in the video (I assume without the wifi manager you are working on)? I’m not a programmer either, but I might be able to decipher your code).

Sure thing :slight_smile:

  Tally light ESP8266 for Blackmagic ATEM switcher

  Version 1.5

  A wireless (WiFi) tally light for Blackmagic Design
  ATEM video switchers, based on the Wemos D1 Mini ESP8266 development
  board with WS2812B RGB Shield and the Arduino IDE.

  Based on the work of Kasper Skårhøj:
  and OneGuyOneBlog

//library for Wifi
#include <ESP8266WiFi.h>

//libraries for ATEM              https://github.com/kasperskaarhoj/SKAARHOJ-Open-Engineering
#include <SkaarhojPgmspace.h>
#include <ATEMbase.h>
#include <ATEMstd.h>

//library for RGB Shield.
#include <Adafruit_NeoPixel.h>    //https://github.com/adafruit/Adafruit_NeoPixel


const char* ssid = "YOUR SSID";               // The wifi network you would like to connect to
const char* password =  "**********";         // Password of the wifi network
int led_brightness = 25;                      // Percentage of LED brightness
int cameraNumber = 1;                         // Camera Input number on your ATEM Switcher
IPAddress clientIp(192, 168, 1, 202);         // IP address of the ESP8266
IPAddress switcherIp(192, 168, 1, 200);       // IP address of the ATEM switcher

//--- Nothing beyond this point needs changing unless you want to develop the code. ---

ATEMstd AtemSwitcher;

#define PIN 4
#define LED_NUM 7

int PreviewTallyPrevious = 1;
int ProgramTallyPrevious = 1;

Adafruit_NeoPixel leds = Adafruit_NeoPixel(LED_NUM, PIN, NEO_GRB + NEO_KHZ800);

void setup() {

  leds.begin(); // This initializes the NeoPixel library.

  Serial.println("Serial is up");

// Start the Ethernet, Serial (debugging) and UDP:
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    led_set(0, 0, led_brightness);//blue
    Serial.println("Connecting to WiFi.."); 
  Serial.println("Connected to the WiFi network");
  led_set(led_brightness, led_brightness, led_brightness);//white

  // Initialize a connection to the switcher:



void led_set(uint8 R, uint8 G, uint8 B) {
  for (int i = 0; i < LED_NUM; i++) {
    leds.setPixelColor(i, leds.Color(R, G, B));

void loop() {
  // Check for packets, respond to them etc. Keeping the connection alive!

  int ProgramTally = AtemSwitcher.getProgramTally(cameraNumber);
  int PreviewTally = AtemSwitcher.getPreviewTally(cameraNumber);

  if ((ProgramTallyPrevious != ProgramTally) || (PreviewTallyPrevious != PreviewTally)) { // changed?

    if ((ProgramTally && !PreviewTally) || (ProgramTally && PreviewTally) ) { // only program, or program AND preview
      led_set(led_brightness, 0, 0);//red
    } else if (PreviewTally && !ProgramTally) { // only preview
      led_set(0, led_brightness, 0);//green
    } else if (!PreviewTally || !ProgramTally) { // neither
      led_set(0, 0, 0);//off


  ProgramTallyPrevious = ProgramTally;
  PreviewTallyPrevious = PreviewTally;

If you have a more or less static setup you could just flash each of your tallies with different settings and leave it at that.


I tried out your code with the built-in LED on the ESP8266 and it seems to work!
Next steps for me is wiring up some Neopixels and making an enclosure.