Free Code Day: März 2023 - Die Türklingel

Am Free Code Day kann sich jeder Entwickler bei der Surnet eigenen Software-Entwicklungsthemen widmen.

Roland Kurmann

Roland Kurmann

28. März 2023 · 6 min

Free Code Day

Für Start-Ups oder junge Unternehmen, können viele Dinge, die für andere Firmen selbstverständlich sind, ein wenig länger auf sich warten lassen. Es handelt sich dabei um Dinge denen erst bei Bedarf nachgegangen wird. Sei es eine funktionierende Telefon-Lösung und eine damit verbundene Telefonnummer die man überall publizieren kann, eine Webseite mit mehr als nur einem Kontaktformular oder eben einem beschriftetem Büro mit Türklingel.

Da wir unser Büro bis vor kurzem nicht richtig beschriftet hatten, waren wir gezwungen unsere Packete und Briefe mit dem Zusatz "c/o Atravis" zu ergänzen. Die Atravis ist unser Vermieter und Nachbar in Sempach Station. Entsprechend wurde ihre Türklingel immer wieder für unsere Belangen strapaziert und der Empfang der Atravis war plötzlich auch immer unser Empfang.

Diesem Misstand mussten wir nun endlich ein Ende setzen.

Die Idee

Nebst den beiden Klebebeschriftungen, eine zum zeigen, dass wir uns im 1.OG befinden und eine an der Eingangstür zu unserem Büro, musste nur noch eine Klingel her. Wir wollten möglichst keine Löcher bohren, Kabel einziehen oder Lautsprecher montieren, also versuchten wir möglichst die Mittel zu verwenden die wir bereits hatten.

Die beiden Sonos Lautsprecher in unserem Büro schienen geeignet dafür zu sein. Irgendwie soll also ein Ton wiedergegeben werden, wenn wir einen WiFi-fähigen Button, betätigen.

Der WiFi-Button wurde schnell gefunden, ein einfacher Shelly Button 1, sollte unseren Anforderungen vollkommen genügen.

Der Shelly Button kann verschiedene HTTP-GET-Requests pro Eingabeart absetzten. Dabei unterscheidet der Button zwischen einfachem-, zweifachem-, dreifachem- und langem Button-Push.

Entsprechend brauchten wir eine einfache Web-API welche die GET-Requests des Shelly Button entgegen nehmen kann und auf den Sonos einen Ton abspielen konnte.

Die Inspiration lies nicht lange auf sich warten und wurde auf GitHub gefunden estruyf/sonos-doorbell-api. Ein einfacher Endpoint mit Express.JS, welcher die Library node-sonos braucht, soll es also sein.

Obwohl wir noch viel mehr Möglichkeiten gehabt hätten, haben wir uns für 2 verschiedene Arten von Türklingel-Eingabearten entschieden.

Der normale einfache Knopfdruck:
Dieser bewirkt, dass ein zufälliger Ton aus einem Ordner voller MP3-Tonspuren abgespielt wird.

  • La Cucaracha von einem Mehrklanghorn.
  • Der Theme Song von "Das A-Team".
  • Der Theme Song von "Super Mario"
  • uvm.

Die zweite Eingabe Art ist für die Post gedacht der zweifache Knopfdruck:
Dieser spielt eine aus den Werbungen bekannte "Grüezi! Ech han es Päckli för Sie!" Tonspur ab.

Nachfolgend ein Codesnippet aus unserer Türklingel

import { Sonos } from 'sonos';
import { Group, Track } from "../models";
import { RingToneHelper } from "./RingToneService";

export class SonosService {

  public static async ring(ip: string, port: string | number, device: Group, debug: boolean = false) {
    // nachfolgend für jedes Sonos ausgeführt
    const officeSonos = new Sonos(device.host, device.port, null);

    // den Status zwischenspeichern, falls wir zurzeit am Musik hören sind
    const crntTrack: Track = await officeSonos.currentTrack();
    const crntState: string = await officeSonos.getCurrentState();
    const crntVolume: string = await officeSonos.getVolume();
    if (debug) {
      console.log(device.Name, crntTrack, crntState, crntVolume);
    }

    // die eine zufällige Tonspur auswählen
    let uri = `http://${ip}:${port}/clips/` + RingToneHelper.getRandomRingTone();
    try {
      // diese versuchen abzuspielen mit einer Lautstärke von 45/100
      await officeSonos.playNotification({uri: uri, volume: 45})
    } catch (e) {
      console.error(e);
    }
    if (debug) {
      console.log(`${device.Name}: Rang doorbell`);
    }
    
    // wenn wir zuvor Musik gehört haben, soll wieder die Lautstärke zurückgesetzt werden und wieder Musik abgespielt werden.
    if (crntTrack && crntTrack.uri && crntState && crntState === "playing") {
      try {
        await officeSonos.setVolume(crntVolume);
        if (debug) {
          console.log(`${device.Name}: Resume playback`);
        }
        await officeSonos.play();
      } catch (e) {
        console.error(e);
      }
    }
  }
}

Die Türklingel

Zur Inbetriebnahme wurde auf einem zentralen Rechner die neue API installiert welcher der Shelly-Button ansprechen konnte. Zusätzlich brauchten wir noch eine einfache Wandhalterung für den Shelly Button aus dem 3D-Drucker und fertig war unsere Türklingel:

Foto der Türklingel