Free Code Day: März 2024 - Der Bier-Buzzer

Wie aus einem Spendenbarometer ein Bier-O-Meter wurde.

Roland Kurmann

Roland Kurmann

08. März 2024 · 6 min

Free Code Day

Im nachfolgenden Blog wird beschrieben wie es zum Bier-Buzzer und dem Bier-O-Meter gekommen ist und wie es gebaut wurde.

Die Geschichte

Als Mitlgied eines Vereines, welches sich dem organisieren von Rock- und Metal-Konzerten verschrieben hat, kann es als Informatiker ab und zu vorkommen, dass man mit lustigen Aufgaben konfrontiert wird. Weil wir ein Benefizkonzert organisierten war die Idee, ein Spendenbarometer zu programmieren. Es soll also eine Art Thermometer sein, welches anstelle einer Temparatur einfach den aktuell gespendeten Betrag an eine Leinwand gebeamt zeigen soll.

Nichts leichter als das: Gut routiniert in Angular erstellte ich also eine Web-Applikation, welche von einer API den aktuellen Betrag auslesen und in einem Barometer darstellen konnte. Die API hat dabei, ich hoffe ihr verzeiht mir, die Daten aus einem CSV gelesen, welches als Datenbank diente. Zu meiner Verteidigung: Ich habe mich für ein CSV entschieden, damit es via Excel für jeden in unserem Verein einfach zu bedienen ist.

Leider stellte sich aber als ich das Spendenbaromter meinen Freunden zeigte eine sehr gute Frage:

"Wer hat den ganzen Abend lang Zeit das Geld zu zählen und die neuen Zahlen dort einzutippen?"

Natürlich haben wir nach einem Weg gesucht die Idee noch zu retten, z.B. mit einer Zähl-App, bei welcher die Helfer hinter der Bar beim Einkassieren der Getränke immer noch kurz tippen würden, was sie gerade verkauft haben. Die Lösungsansätze erschienen uns alle zu Umständlich, also versuchten wir mit dem neu gewonnen Dashboard das beste zu machen. Als mich ein Freund schliesslich fragte: "Was ist mit einem Bier-Buzzer? Jedes Mal wenn jemand ein Bier bestellt hat, kann die Person einen Buzzer betätigen, welches den Zähler erhöht. Kriegst du das hin?" Challenge accpeted! Das Abenteuer konnte also losgehen.

Die Technik

Noch am selben Abend dachte ich, ich nehme ein ESP32, schreibe ein C-Programm welches den Input eines Buttons auf einem digitalen GPIO-PIN entgegen nimmt und darauf hin einen GET-Request auf eine API macht, was dann schlussendlich zum hochzählen führen würde. Jedoch wurde ich wieder einmal von der Einfachheit der uns zur verfügungstehenden Dingen überrascht. Die Firma Shelly, welche schon unsere Türklingel ermöglichte, bietet ein kleines WLAN-Universalmodul an. Die Rede ist vom Shelly UNI.

Kann ich ein C-Programm auf ein Shelly UNI flashen? Nein.

Muss ich ein C-Programm auf mein Shelly UNI flashen? Nein!

Denn viele, wenn nicht sogar alle, Shellys bieten die Funktionalität an, dass sie mit einem MQTT-Broker kommunizieren können. Zugegeben, ich musste ein Trace auf meinem HiveMQ Docker Container durchführen um herauszufinden, auf was für Channels/Topics der Shelly auf dem MQTT abboniert und erstellt. Es wäre vermutlich auch irgendewo in einer Dokumentation gestanden, aber schlussendlich zählt doch das Resultat.

Also schrieb ich kurzerhand eine einfache Node.JS Applikation welche sich auf das Topic abboniert und eine Zeile mit einem Zähler 1 meinem CSV hinzufügt:

import mqtt from 'mqtt';

import { addData } from './csv.helper.js';

export function subscribeToMqtt(brokerUrl, topic, dataPath) {
    
    const client = mqtt.connect(brokerUrl);

    client.on('connect', () => {
        console.log('Verbunden mit MQTT-Broker.');
        client.subscribe(topic, (err) => {
            if (!err) {
                console.log('Abonniert auf Thema:', topic);
            } else {
                console.error('Fehler beim Abonnieren des Themas:', err);
            }
        });
    });

    client.on('message', (topic, message) => {
        const res = JSON.parse(message.toString());
        if (res === 1) {
            console.log('🍺');
            addData(dataPath,'1')
        }
    });

    client.on('error', (error) => {
        console.error('Fehler bei der Verbindung zum Broker:', error);
    });
}

Da sich der Shelly mit 12V DC - 36V DC betreiben lässt und ich es einfach lässiger fand, wenn kein Kabel weg vom Not-Aus-Knopf-Gehäuse führen müsste, musste also eine Stromquelle her. Leider steht im offiziellen Datenblatt beim Stromverbrauch nur "< 1 Watt". Eine kurze Recherche in den Sozialen Medien spuckte dann bei 12V DC, 20mA aus.

Ich entschied mich als Stromquelle also einfach für 2 wiederaufladbare 9V Akkus im 9V Batterien Format und schaltete diese seriell um auf 18V zu kommen. Laut meiner Berechnung sollten die beiden Batterien das Ding über 12 Stunden betreiben können. Das sollte also für ein Benefizkonzert genügen.

Ein ganzer Kabelsalat, die zwei 9V Batterien, der Shelly Uni und eine kleine Platine mussten nun nur noch irgendiwe Platz im Buzzergehäuse finden.

Foto vom Gehäuse mit allen Komponenten

Das Endergebnis

Das Endergebnis GIF