Klingel-Cam auf dem Wand-Tablet: Live-Stream automatisch anzeigen mit openHAB und Fully Kiosk

Klingel-Cam auf dem Wand-Tablet: Standbild + Live-Stream automatisch mit openHAB und Fully Kiosk

In einem früheren Beitrag habe ich gezeigt, wie man bei Klingeln ein Standbild per Telegram verschickt: Klingeling – wer ist da?.

Der nächste logische Schritt: Die Kamera direkt auf dem Wand-Tablet einblenden, das es genau dann das Klingelbild anzeigt, wenn geklingelt wird, und die Anzeige dann auch wieder automatisch zurückschaltet.

In diesem Beitrag zeige ich die komplette Umsetzung mit openHAB MainUI, Fully Kiosk und einer bestehenden Webcam-URL. Ergebnis: Beim Klingeln wird für eine definierte Zeit automatisch auf eine Kameraseite umgeschaltet. Links steht ein frisches Standbild, rechts der Live-Stream.

Voraussetzungen

  • openHAB MainUI
  • Tablet mit Fully Kiosk Browser
  • Erreichbare Kamera-URLs, z. B.:
    • Standbild: http://CAM-IP:8080/?action=snapshot
    • Live-Stream (MJPEG): http://CAM-IP:8080/?action=stream
  • Klingel-Event als Item (im Beispiel: KLINGEL_Press_Short)

Werbung:

1) Fully Kiosk vorbereiten

Was ist Fully Kiosk?
Fully Kiosk Browser ist eine Android-App für Tablet-Wanddisplays im Kiosk-Modus. Die App kann Webseiten dauerhaft anzeigen, den Bildschirm steuern und über eine integrierte Remote-API von außen Befehle annehmen (z. B. Bildschirm einschalten oder eine bestimmte URL laden). Genau diese API nutzen wir hier für die automatische Kameraumschaltung bei Klingeln.

In Fully Kiosk werden zwei Dinge benötigt:

  1. Remote Admin / API aktivieren
  2. Passwort setzen (wird in der openHAB-Rule verwendet)

Wichtige API-Kommandos (Beispiele):

http://TABLET-IP:2323/?cmd=screenOn&password=DEIN_PASSWORT
http://TABLET-IP:2323/?cmd=loadUrl&url=http%3A%2F%2FOPENHAB-IP%3A8080%2Fpage%2Fcam_eingang&password=DEIN_PASSWORT
http://TABLET-IP:2323/?cmd=loadStartURL&password=DEIN_PASSWORT

2) Konfigurierbare Items in openHAB

Damit das Verhalten im UI steuerbar bleibt, sind zwei Konfigurations-Items sinnvoll:

Switch configKlingelCamUmschaltungTablet "Automatische Cam-Umschaltung Tablet" (gruppeConfigKlingel, hauskonfiguration)
Number configKlingelCamAnzeigeSekunden "Dauer Kamera-Einblendung in Sekunden" (gruppeConfigKlingel, hauskonfiguration)

Zusätzlich wird ein internes Hilfs-Item für das Cache-Busting des Standbilds verwendet:

Number KlingelCamStandbildZeit "Klingel Cam Standbild Zeitstempel"

Werbung:

3) MainUI-Widget: links Standbild, rechts Live-Stream

Das Personal Widget widget_cam_stream ist zweigeteilt aufgebaut. Links wird das Snapshot-Bild geladen, rechts der Stream, was auf meinem horizontal ausgerichteten Tablet ganz gut passt:

uid: widget_cam_stream
tags:
  - camera
  - stream
props:
  parameters:
    - name: title
      label: Titel
      type: TEXT
      default: Eingang Cam
    - name: snapshotTitle
      label: Ueberschrift Standbild
      type: TEXT
      default: Standbild
    - name: streamTitle
      label: Ueberschrift Live-Stream
      type: TEXT
      default: Live-Stream
    - name: snapshotUrl
      label: Standbild URL
      type: TEXT
      default: http://CAM-IP:8080/?action=snapshot
    - name: streamUrl
      label: Live-Stream URL
      type: TEXT
      default: http://CAM-IP:8080/?action=stream
    - name: height
      label: Hoehe
      type: TEXT
      default: 72vh
component: f7-card
config:
  title: =props.title ? props.title : "Eingang Cam"
slots:
  default:
    - component: f7-card-content
      slots:
        default:
          - component: f7-row
            slots:
              default:
                - component: f7-col
                  config:
                    width: "50"
                  slots:
                    default:
                      - component: Label
                        config:
                          text: =props.snapshotTitle ? props.snapshotTitle : "Standbild"
                      - component: oh-image
                        config:
                          url: =(props.snapshotUrl ? props.snapshotUrl : "http://CAM-IP:8080/?action=snapshot") + "&t=" + ((items.KlingelCamStandbildZeit && items.KlingelCamStandbildZeit.state && items.KlingelCamStandbildZeit.state != "NULL" && items.KlingelCamStandbildZeit.state != "UNDEF") ? items.KlingelCamStandbildZeit.state : "0")
                          style:
                            width: 100%
                            height: =props.height ? props.height : "72vh"
                            object-fit: contain
                - component: f7-col
                  config:
                    width: "50"
                  slots:
                    default:
                      - component: Label
                        config:
                          text: =props.streamTitle ? props.streamTitle : "Live-Stream"
                      - component: oh-image
                        config:
                          url: =props.streamUrl ? props.streamUrl : "http://CAM-IP:8080/?action=stream"
                          style:
                            width: 100%
                            height: =props.height ? props.height : "72vh"
                            object-fit: contain

Danach eine eigene Seite (z. B. cam_eingang) erstellen und dort das Widget einbinden.

4) Rule: Beim Klingeln automatisch umschalten

Die Rule schaltet das Tablet ein, setzt den Standbild-Zeitstempel, öffnet die Cam-Seite und springt nach Ablauf wieder auf die Start-URL zurück:

rule "Kiosk Tablet Klingel Cam Anzeige"
when
    Item KLINGEL_Press_Short changed from OFF to ON
then
    if (configKlingelCamUmschaltungTablet.state != ON) return

    var int camShowSeconds = 30
    try {
        if (configKlingelCamAnzeigeSekunden.state != NULL && configKlingelCamAnzeigeSekunden.state != UNDEF) {
            val int parsedShowSeconds = Double::parseDouble(configKlingelCamAnzeigeSekunden.state.toString).intValue
            if (parsedShowSeconds >= 5 && parsedShowSeconds <= 120) camShowSeconds = parsedShowSeconds
        }
    } catch (Throwable t) {
        // Fallback auf 30 Sekunden
    }

    // Fully Kiosk Daten anpassen
    val String kioskTabletRemoteBaseUrl = "http://TABLET-IP:2323/"
    val String kioskTabletRemotePassword = "DEIN_PASSWORT"
    val String kioskTabletCamPageUrl = "http://OPENHAB-IP:8080/page/cam_eingang"

    sendHttpGetRequest(kioskTabletRemoteBaseUrl + "?cmd=screenOn&password=" + kioskTabletRemotePassword, 8000)

    // Standbild aktualisieren
    KlingelCamStandbildZeit.postUpdate("" + now.toInstant.toEpochMilli)

    val String encodedCamUrl = java.net.URLEncoder::encode(kioskTabletCamPageUrl, "UTF-8")
    sendHttpGetRequest(kioskTabletRemoteBaseUrl + "?cmd=loadUrl&url=" + encodedCamUrl + "&password=" + kioskTabletRemotePassword, 8000)

    createTimer(now.plusSeconds(camShowSeconds), [ |
        sendHttpGetRequest(kioskTabletRemoteBaseUrl + "?cmd=loadStartURL&password=" + kioskTabletRemotePassword, 8000)
    ])
end

Werbung:

5) Bedienung in der Hauskonfiguration

In meinem Fall hängt die Steuerung in der MainUI unter Hauskonfiguration:

  • Automatische Cam-Umschaltung Tablet (AN/AUS)
  • Dauer Kamera-Einblendung in Sekunden (5 bis 120)

Damit kann man die Funktion ohne Rule-Änderung direkt im Alltag anpassen.

Fazit

Die Kombination aus Klingel-Event, Fully Kiosk API und einer dedizierten Cam-Seite ist für ein Wand-Tablet eine sehr robuste Lösung. Besonders praktisch ist die Trennung in Standbild und Live-Stream: Das Standbild ist sofort da, der Stream läuft parallel für die Live-Sicht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.

Durch die weitere Nutzung der Seite wird der Verwendung von Cookies und den Inhalten der Datenschutzerklärung zugestimmt. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen