Seite 1 von 2

Howto - Posteinwürfe mit Raspberry Pi Zero WH und IR-Kamera erkennen

Verfasst: 17.04.2018, 17:11
von dtp
Hallo,

angeregt durch diesen Thread möchte ich euch gerne ein kleines Projekt vorstellen, mit dem ich Briefkasteneinwürfe über einen Raspberry Pi Zero WH samt Infrarot-Kamera detektiere und mir dann eine Push-Nachricht samt Bild über Pushover und/oder Telegram zusenden lasse.

Kern des Projekts bildet - wie gesagt - ein kleiner Raspberry Pi Zero WH, den man schon für unter 15,- € bekommt.
RaspiZeroCam_01.jpg
An dem Raspi ist eine 5MPixel-Kamera inkl. zweier IR-Sendedioden per Flachbandkabel angeschlossen. Geschützt ist der Raspi durch ein kleines Kunststoffgehäuse, das es für kleines Geld mit sehr nützlichem Zubehör gibt. Inklusive Micro-USB-Kabel zur Energieversorgung und 16GB-µSD-Karte kostet das gesamte Setup so gerade mal knappe 60,- €.

Meinen Briefkasten hatte ich ja schon im Rahmen des DoorPi-Projekts vorgestellt. Beide Projekte sind jedoch nahezu unabhängig voneinander. Auch die CCU und die HomeMatic werden eher nicht benötigt. Trotzdem nutze ich ein paar wenige Informationen der HomeMatic und des DoorPi auch hier. Aber dazu später mehr.

Da unser Briefkasten zweigeteilt ist, habe ich den Raspi Zero in das obere Servicefach eingebaut, wo sich auch schon der Raspi 3 für den DoorPi befindet (keine Sorge; für dieses Projekt wird alles, was blau markiert ist, nicht benötigt. 8) )
RaspiZeroCam_02.jpg
Versorgt werden beide Raspis über ein 24-V-Netzteil (2,5 A) von Mean Well, das im Verteilerschrank im HWR sitzt. Ich hatte es zunächst mit einem 5-V-Netzteil (3 A) versucht, aber da gab es dann leider ein paar Störungen auf die Kamera des Raspi Zero, so dass deren Bild zum Flackern neigte. Eine galvanische Trennung über einen DC-Buck-Converter brachte dann zwar kurzzeitig Besserung, nur leider war damit dann die Spannung für den Raspi Zero zu gering, so dass sich dessen Kameramodul immer wieder ausschaltete. Also wechselte ich zum 24-V-Netzteil und schloss beide Raspis an den 5-Volt-Ausgang des DC-Buck-Converters. Nun ist alles gut.

Übrigens kann ich jederzeit die Masseverbindung zwischen 24-V-Netzteil und DC-Buck-Converter über einen 1-Kanal-Funk-Schaltaktor, HM-LC-Sw1-Ba-PCB, unterbrechen, um die Raspis ferngesteuert neu zu starten. Das ist insbesondere deshalb nötig, weil beide Raspis nur per WLAN zu erreichen sind.

Das untere Fach des Briefkasten dient zum Einwerfen der Post.
RaspiZeroCam_03.jpg
Hier habe ich die Kamera derart mit Schrauben auf einem kleinen Kunststoffsockel montiert, dass sie auf den Boden des Faches gerichtet ist. Mit dem Fisheye-Objektiv wird ungefähr der grau markierte Bereich (ca. 220°) abgedeckt. Die beiden IR-LEDs strahlen den Briefkasten im Dunkeln sehr gut aus. Um Reflexionen am Boden des Briefkastenfaches zu reduzieren, habe ich dort zwei Papieretiketten aufgeklebt. Mit Hilfe eines Multitools wurde ein kleiner Schlitz zwischen den beiden Briefkastenfächern für das Flachbandkabel gesägt.

Das war's auch schon von der Hardware-Seite. Im nächsten Beitrag geht's dann mit der Software weiter.

Bis dann,

Thorsten

Installation der nötigen Software

Verfasst: 17.04.2018, 22:03
von dtp
Die Installation der Software ist im Grunde genommen ziemlich einfach und wurde hier schon beschrieben. Der Vollständigkeit halber möchte ich das aber noch mal kurz wiederholen.

Hinweis: Ich hatte irgendwann Probleme nach Updates von Raspbian Jessie Lite bzw. Stretch Lite und des RPi_Cam_Web_Interfaces, weil die aktuelle GLIBC nicht mehr gefunden werden konnte. Daher habe ich auf Raspbian Buster Lite gewechselt. Damit läuft alles sauber und problemlos.

Vorbereitung des Raspberry Pi Zero

Zunächst sollte man sich Raspbian Buster Lite herunterladen. Wählt man die zip-Datei, dann diese entpacken und das Image z.B. mit dem Win32DiskImager auf eine µSD-Karte installieren. Danach die Karte in den Raspi stecken und ihn mit Strom versorgen. Hat man sich das oben von mir erwähnte Gehäuse zugelegt, dann verfügt man bereits über den erforderlichen HDMI-Adpater, um sich den Output am Bildschirm anschauen zu können. Zudem sollte man den Raspi noch mit einer Tastatur und ggf. mit einer Maus per USB verbinden. Auch hier ist in der Regel ein Adapter von USB auf Micro-USB erforderlich.

Nach dem ersten Booten des Raspis loggt man sich erstmalig mit dem User "pi" und dem Passwort "raspberry" (Achtung: die Tastatur dürfte noch auf Englisch stehen, so dass das Y auf der Z-Taste liegt) ein. Anschließend ruft man die Konfiguration mit

Code: Alles auswählen

sudo raspi-config
auf. Hier nun in Kurzform die erforderlichen Einstellungen:
  • Change User Password -> Zur Änderung des Standardpassworts "raspberry" für den User pi.
  • Network Options -> Zum Einstellen des Hostnamens (z.B. bei mir "LBoxPi"), der SSID des eigenen Routers und des WLAN-Passworts, falls gewünscht.
  • Localisation Options -> Zum Ändern des WiFi-Lands (z.B. DE), der Zeitzone (z.B. Europa, Berlin) und des Keyboard-Layouts (alle drei de_DE-Optionen aus- und en abwählen; danach de_DE.UTF-8 und die verwendet Tastatur mit den Standardeinstellungen für Deutsch übernhemen).
  • Interfacing Options -> Zur Aktivierung insbesondere des Kamera-Moduls und der Secure Shell (SSH).
Abschließend den Raspi neu booten.

Vergeben einer statischen IP-Adresse für die WLAN-Verbindung

Ich würde grundsätzlich empfehlen, statische IP-Adressen für Geräte zu vergeben, die innerhalb des WLANs von anderen Geräten häufig angesprochen werden müssen. Dies ist auch bei DHCP-Betrieb möglich, wobei dann eine IP-Adresse außerhalb des DHCP-Bereichs gewählt werden sollte.

Die Einrichtung ist z.B. hier (Variante 2 wählen) sehr gut beschrieben.

Zur statischen IPv4-Konfiguration öffnet man die Datei "/etc/dhcpcd.conf" mit dem Befehl

Code: Alles auswählen

sudo nano /etc/dhcpcd.conf
Dann fügt man z.B. für die statische WLAN-Adresse "192.xxx.xxx.xxx" des Raspi und im Falle der Server-Adresse "192.xxx.xxx.1" des WLAN-Routers die folgenden Zeilen am Ende von "dhcpcd.conf" hinzu:

Code: Alles auswählen

interface wlan0
static ip_address=192.xxx.xxx.xxx/24
static routers=192.xxx.xxx.1
static domain_name_servers=192.xxx.xxx.1
Vermeiden eines Abbruchs der WLAN-Verbindung (nicht für Buster Lite)

Ich hatte häufiger das Problem, dass mein Raspi irgendwann nicht mehr per WLAN erreichbar war. Der Grund dafür waren die Energiespareinstellungen für das WLAN-Modul. Mit folgendem Befehl lässt sich das Problem sehr einfach vermeiden:

Code: Alles auswählen

sudo apt-get remove ifplugd
Hinweis: Da dieses Paket bei Buster Lite nicht enthalten ist, muss es auch nicht mit obigem Befehl entfernt werden. Vielleicht hilft die Info aber ja trotzdem mal jemandem weiter. 8)

RPi_Cam_Web_Interface

Aus meiner Sicht ist das RPI_Cam_Web_Interface ein extrem flexibles Tool zur Steuerung von Kameras und zur Bewegungserkennung per Raspi. Um das RPI_Cam_Web_Interface unter Raspbian Buster Lite installieren zu können, muss zunächst git installiert werden:

Code: Alles auswählen

sudo apt-get install git
Anschließend kann mit der Befehlsfolge:

Code: Alles auswählen

sudo git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.git
cd RPi_Cam_Web_Interface
sudo ./install.sh
das eigentliche Interface installiert werden. Danach erfolgt dann automatisch die Abfrage sämtlicher Parameter.
RPi_Cam_Web_Interface_01.png
RPi_Cam_Web_Interface_01.png (16.5 KiB) 7576 mal betrachtet
Standardmäßig ist als Cam subfolder "html" eingestellt. Ich habe auf dieses Unterverzeichnis verzichtet, da auch schon mein anderer Raspi so konfiguriert ist. Wer es bei "html" belässt, muss dies auch entsprechend für das Verzeichnis der Datei motion_event.sh berücksichtigen (dazu später mehr). Zudem verwende ich den Webport 8181 statt 80. Auch das ist eher dem anderen Raspi geschuldet, weil dort bereits der Port 80 belegt war.

Raspbian Buster findet nach dem erstmaligen Aufruf nicht alle Pakete.
RPi_Cam_Web_Interface_Pakete.png
Daher ist nach dem Drücken auf den OK-Button vermutlich erst mal ein

Code: Alles auswählen

sudo apt-get update
mit anschließendem, nochmaligem

Code: Alles auswählen

sudo ./install.sh
notwendig. Danach sollte aber das nachfolgende Interface automatisch gestartet werden.
RPi_Cam_Web_Interface_02.png
RPi_Cam_Web_Interface_02.png (8.49 KiB) 7576 mal betrachtet
Das Interface lässt sich übrigens später jederzeit durch Aufruf von

Code: Alles auswählen

sudo ./install.sh

im Verzeichnis "/RPi_Cam_Web_Interface" öffnen.

Der eigentliche Aufruf des Web-Interfaces sowie dessen Konfiguration und die der Bewegungserkennung erfolgt durch Eingabe der IP-Adresse des Raspi in einem Browser-Fenster. Wurde ein Port vergeben, der nicht dem Standard-Port 80 entspricht, muss auch dieser angegeben werden, also z.B. "http://192.xxx.xxx.xxx:8181".
RPi_Cam_Web_Interface_03.png
Im nächsten Abschnitt geht's dann um die Konfiguration und das Shell-Skript zum Senden der Push-Nachrichten.

Konfiguration

Verfasst: 17.04.2018, 22:04
von dtp
Kamerainstellungen

Nach Aufruf des Web-Interfaces im Browser sollte zunächst die Kamerauflösung angepasst werden.
RPI_Cam_Web_Interface_03.png
Für die Fisheye-Kamera habe ich die Auflösung 533 x 300 (entspricht 16:9) gewählt. Es macht aus meiner Sicht keinen großen Sinn, die Auflösung deutlich höher zu wählen, weil man dadurch nur die Übertragung der Bilder verlangsamt, ohne ein Mehr an Informationen zu erhalten (die Bilder sind dafür nicht scharf genug).

Unter "Annotation" kann man sich einen Einblendtext konfigurieren. Mit "%D.%M.%Y %h:%m:%s" lasse ich mir z.B. Datum und Uhrzeit anzeigen. Gerade die Sekunden sind oftmals sehr hilfreich, um die Synchronizität mit anderen Auslösern überprüfen zu können und um im Videobild leichter erkennen zu können, dass die Kamera funktioniert.

Mit %a kann man sich noch einen beliebigen Text einblenden lassen, der in der Datei "dev/shm/mjpeg/user_annotate.txt" enthalten ist. Wie man diese Datei z.B. über die CCU beschreiben kann, werde ich später noch beschreiben. Nur soviel; ich lasse mir da die Anzahl der Briefkasteneinwürfe, die bei mir per DoorPi und CCU gezählt werden, sowie die Leerung des Briefkastens einblenden. Über "Annotation size", "Custom text color" und "Custom background color" kann man sich noch die Schriftgröße sowie die Text- und die Hintergrundfarbe einstellen. Bei "Custom text color" und "Custom background color" nicht vergessen, das Auswahlmenü auf "Enabled" zu setzen; und immer, wenn vorhanden, mit "OK" zu bestätigen.

Da für das vorliegende Projekt keine Videoaufzeichnung des Briefkastens erforderlich ist, wir aber gerne ein Standbild per Telegram oder Pushover bei einer detektierten Bewegung erhalten möchten, setzen wir im Hauptbildschirm unter "Camera Settings" den "Motion detect mode" auf "Monitor".
RPi_Cam_Web_Interface_04.png
RPi_Cam_Web_Interface_04.png (20.74 KiB) 10626 mal betrachtet
Sollte das Bild in einer ungünstigen Position angezeigt werden, so kann man es unter "Rotation" sehr einfach drehen.

Bewegungserkennung

Damit nun die Bewegungserkennung bei jedem Start des Raspi Zero automatisch neu gestartet wird , trägt man im Scheduler nach Klick auf den Button "Edit schedule settings" in der Period "AllDay" unter "Period Start" "md 1" ein.
RPi_Cam_Web_Interface_05.png
Die Bedeutung der einzelnen Befehle kann man unter "Command reference" nachlesen. Dabei lassen sich auch verschiedene Befehle durch getrennt durch jeweils ein Simikolon verknüpfen.

EDIT: Tests haben ergeben, dass der Befehl "im" in "Motion Start" nicht für das Triggern des Shellskripts notwendig ist. Da direkt in "motion_event.sh" ein Snapshot erzeugt wird, kann man "im" komplett weglassen.

Schließlich werden die Einstellungen mit Klick auf den Button "Save Settings" gespeichert. Mit Klick auf "< Back" in der schwarzen Statutsleiste kommt man wieder zurück zum Hauptbildschirm.

Danach können unter "Motion Settings" die Einstellungen für die eigentliche Bewegungserkennung vorgenommen werden. Jedes Mal, wenn nun eine Bewegung erkannt wird, wird automatisch das Shell-Skript "motion_event.sh" im Verzeichnis "/var/www/macros" ausgeführt.

Hinweis: Wer es bei der Konfiguration unter "xCam" bei "html" belassen hat, der muss die Datei "motion_event.sh" im Verzeichnis "/var/www/html/macros" ablegen.
RPi_Cam_Web_Interface_06.png
Um den Einfluss der Bewegung besser erkennen zu können, empfiehlt sich, zumindest temporär in die Zeile "Annotation" unter "Camera Settings" den Zusatz "f%fc%c" hinzuzufügen. %f zeigt dann die Frames an, die jeweils um eins hochgezählt werden, wenn die mit %c angezeigten Changes den unter "Threshold" angegeben Wert erreicht haben. Da muss man etwas spielen, um die für sich optimalen Werte zu finden. Bei mir haben sich bisher die folgenden Werte als recht praktikabel erwiesen:

Threshold: 300
Delay Frames to detect: 10
Change Frames to start: 20
Still Frames to stop: 200

Wenn nun die mit %f angezeigte Anzahl der "Change Frames" erreicht wurde, kommt es zur Auslösung der Datei "motion_event.sh". In dieser habe ich mir das Senden eines Snapshots per Telegram oder Pushover (je nachdem, was ich für das zPNP auf der CCU eingestellt habe) konfiguriert.

"/var/www/macros/motion_event.sh"

Code: Alles auswählen

#!/bin/bash
CCU_IP=192.xxx.xxx.xxx # IP-Adresse der CCU
LBoxPiZero_IP=192.xxx.xxx.xxx # IP-Adresse des LBoxPiZero

# Telegram Keys
TgHMinfo=xxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx # Telegram Bot Token "HomeMatic Info" Benutzer 1
TgChatId1=-xxxxxxxx # Telegram Chat-ID Benutzer 1
TgChatId2= # Telegram Chat-ID Benutzer 2

# Pushover Keys
PoHMinfo=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx # Token "HomeMatic Info"
PoUser1=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx # API-Key Benutzer 1
PoUser2= # API-Key Benutzer 2

# HomeMatic CCU ISE_IDs
HMiseid1=xxxx # "CCU SV Push Dienst" 0(aus) 1(alle) 2(Pushover) 3(Telegram)

# CCU-Systemvariable "CCU SV Push Dienst" auslesen
service=$(curl -s -k "http://${CCU_IP}:8181/rega.exe?x=dom.GetObject(${HMiseid1}).Value()")
service=${service##*<x>}
service=${service%%</x>*}
# echo $service

if [ $1 -eq 0 ] # Abfrage, ob Ende der Bewegungserkennung
  then
  # Snapshot in Datei speichern
  wget -O /var/www/media/Briefkasteninhalt.jpg http://${LBoxPiZero_IP}:8181/cam.jpg

  # Push-Nachricht senden
  if [ $service -eq 3 -o $service -eq 1 ] # Telegram
    then
    if [ -n "$TgChatId1" ] # Benutzer 1
      then
      curl -s -k "https://api.telegram.org/bot${TgHMinfo}/sendPhoto" -F chat_id=$TgChatId1 -F disable_notification=1 -F photo="@/var/www/media/Briefkasteninhalt.jpg"
    fi
    if [ -n "$TgChatId2" ] # Benutzer 2
      then
      curl -s -k "https://api.telegram.org/bot${TgHMinfo}/sendPhoto" -F chat_id=$TgChatId2 -F disable_notification=1 -F photo="@/var/www/media/Briefkasteninhalt.jpg"
    fi 
  elif [ $service -eq 2 -o $service -eq 1 ] # Pushover
    then
    if [ -n "$PoUser1" ] # Benutzer 1
      then
      curl -s -k -F token=$PoHMinfo -F user=$PoUser1 -F message="Briefkasteninhalt" -F attachment="@/var/www/media/Briefkasteninhalt.jpg" -F priority=-1 -F sound=none -F html=1 "https://api.pushover.net/1/messages.json"
    fi
    if [ -n "$PoUser2" ] # Benutzer 2
      then
      curl -s -k -F token=$PoHMinfo -F user=$PoUser2 -F message="Briefkasteninhalt" -F attachment="@/var/www/media/Briefkasteninhalt.jpg" -F priority=-1 -F sound=none -F html=1 "https://api.pushover.net/1/messages.json"
    fi
  fi
fi

exit 0
Der eigentliche Kern dieses Shell-Skripts sind die mit "curl" anfangenden Zeilen und der Befehl zum Speichern des Snapshots. Der Rest ist mehr oder weniger "nützliches Beiwerk". So schwer dürfte es aber nicht sein, das Skript an seine eigenen Anforderungen anzupassen. Ein weiteres Beispiel zum Senden von Snapshots per Telegram findet sich unter anderem auch hier.

Das Makro "motion_event.sh" wird normalerweise bei jedem Start und bei jedem Ende einer erkannten Bewegung aufgerufen. Für die Meldung der Briefkasteneinwürfe ist das jedoch eher ungünstig. Da ist es aus meiner Sicht besser, wenn das Skript nur nach Beendigung der Bewegung ausgeführt wird. Dies erreicht man durch die folgende Abfrage im obigen Shell-Skript:

Code: Alles auswählen

if [ $1 -eq 0 ] then ... fi
Hinweis: Nicht vergessen, die Datei "motion_event.sh" mit

Code: Alles auswählen

sudo chmod -R 755 /var/www/macros/motion_event.sh
ausführbar zu machen.

Erzeugen von Bemerkungen (Annotations) mittels CCU

Um von der CCU aus Dateien auf dem Raspi Zero schreiben und verändern zu können, sind zunächst folgende Schritte auf dem Raspi Zero und der CCU per PuTTY, Termius oder einem anderen Terminal-Programm auszuführen:

Raspi Zero (IPv4: 192.xxx.xxx.xxx)

Code: Alles auswählen

sudo mkdir /home/pi/.ssh
sudo chmod -R 777 /home/pi/.ssh
Die Schreibrechte müssen zunächst für alle eingeräumt werden, da ssh-copy-id sonst im nachfolgenden Schritt die Datei "authorized_keys" nicht anlegen kann.

CCU (IPv4: 192.xxx.xxx.xxx)
  1. Bemerkung: nicht für CCU3 erforderlich

    Code: Alles auswählen

    mount -o remount,rw /
  2. Code: Alles auswählen

    ssh-keygen -b 2048 -t rsa
  3. Enter file in which to save the key (/root/.ssh/id_rsa): Return-Taste drücken
  4. Enter passphrase (empty for no passphrase): Return-Taste drücken
  5. Enter same passphrase again: Return-Taste drücken
  6. Code: Alles auswählen

    ssh-copy-id 'pi@192.xxx.xxx.xxx'
Achtung (nur für CCU1 und 2 erforderlich): nach einem FW-Update der CCU gehen die rsa-Dateien im root-Verzeichnis der CCU in der Regel verloren (dies ist bei der Raspberrymatic nicht der Fall). Daher empfiehlt sich, das von uwe111 erzeugte WebUI-Addon ssh-keygen auf der CCU zu installieren. Damit sind die Dateien dann sicher.

Raspi Zero (IPv4: 192.xxx.xxx.xxx)

Wichtig: Die Schreibrechte des Ordners ".ssh" müssen abschließend auf den Eigentümer beschränkt sein (755 oder 700). Ansonsten wird immer wieder eine Authentifizierung verlangt und das automatische Einwählen der CCU auf dem Raspi schlägt fehl.

Code: Alles auswählen

sudo chmod -R 755 /home/pi/.ssh
Nun legt man mit

Code: Alles auswählen

sudo nano /home/pi/RPi_Cam_Web_Interface/user_annotate.txt
eine leere Datei im Verzeichnis "/home/pi/RPi_Cam_Web_Interface" an und beendet den Editor mit Ctrl-X und J zum Abspeichern. Anschließend vergibt man noch Lese- und Schreibreichte für alle:

Code: Alles auswählen

sudo chmod 666 /home/pi/RPi_Cam_Web_Interface/user_annotate.txt
Wichtig: Standardmäßig ist raspimjpeg so konfiguriert, dass es die Datei "user_annotate.txt" im Verzeichnis "/dev/shm/mjpeg" erwartet. Dies führt aber leider dazu, dass die Datei bei jedem Refresh des Verzeichnisses wieder gelöscht wird und die Annotations nur flüchtig sind. Daher muss "/etc/raspimjpeg" mit

Code: Alles auswählen

sudo nano /etc/raspimjpeg
so umkonfiguriert werden, dass der Eintrag

Code: Alles auswählen

user_annotate /dev/shm/mjpeg/user_annotate.txt
in

Code: Alles auswählen

user_annotate /home/pi/RPi_Cam_Web_Interface/user_annotate.txt
geändert wird. Danach den Raspi mit

Code: Alles auswählen

sudo reboot
zur Übernahme der Änderungen neu starten.

Mit dem nachfolgenden Skript-Schnipsel der CCU lassen sich nun bei jedem Aufruf die Einwürfe um eins hoch zählen und in die Datei "user_annotate.txt" schreiben.

Code: Alles auswählen

string svMailCount = "EG Briefkasten SV Einwürfe"; ! Systemvariablen-Name (Typ Zahl) für die Anzahl der Einwürfe
string login = "pi@192.xxx.xxx.xxx"; ! Einwahldaten des LBoxPiZero
integer inserts; ! Anzahl der Einwürfe

inserts = (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svMailCount)).Value();
inserts = inserts + 1;
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svMailCount)).State(inserts);
(dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("echo -n "#inserts#" Einwurf | ssh "#login#" 'cat > /home/pi/RPi_Cam_Web_Interface/user_annotate.txt");
Hier nun ein Beispiel für ein WebUI-Programm samt zweier Skripte, die jeweils beim Öffnen der Briefkasten-Klappe (Post-Einwurf) und der -Tür (Post-Entnahme) aufgerufen werden. Als Trigger dienen virtuelle Tasten (VT), weil die eigentliche Auslösung durch den DoorPi erfolgt, der bekanntlich selbst keine HM-Komponente ist. Ich möchte an dieser Stelle jedoch nicht zu sehr ins Detail gehen, da das den Rahmen dieser Projektbeschreibung sprengen würde. Der geneigte Leser sei auf meine Signatur und das darin verlinkte DoorPi-Projekt verwiesen. 8)
EG Briefkasten PRG Post.png
WebUI-Skript zum Zählen der Briefkasteneinwürfe

Code: Alles auswählen

! Briefkasten-Einwürfe um Eins erhöhen und Meldung Briefkasten leeren
! Version 3.0.5, Autor: dtp

! Namen der verwendeten Systemvariablen
string svPushText = "CCU SV Push Text"; ! gem. zPNS-xx, obligatorisch
string svPushPrio = "CCU SV Push Prio"; ! gem. zPNS-xx, obligatorisch
string svMailCount = "EG Briefkasten SV Einwürfe"; ! Anzahl der Einwürfe, obligatorisch
string svPushoverSound = "CCU SV Pushover Sound"; ! gem. zPNS-Po, optional

! Name des zentralen Push-Nachrichten-Programms
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch

! Einwahldaten des LBoxPiZero
string login = "pi@192.xxx.xxx.xxx";

! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################

! +++++ Variablendeklaration +++++
string message;
integer inserts;
object svObject; object svObjectList;

! +++++ Systemvariablen erzeugen bzw. falls vorhanden, auslesen +++++
if(!svMailCount){svMailCount = "EG Briefkasten SV Einwürfe";}
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svMailCount);
if(!svObject){
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
  svObject.Name(svMailCount); svObject.DPInfo("Anzahl der Briefkasteneinwürfe"); svObject.Internal(false); svObject.Visible(true);
  svObject.ValueType(ivtFloat); svObject.ValueSubType(istGeneric); svObject.ValueUnit(""); svObject.ValueMin(0); svObject.ValueMax(65000); dom.RTUpdate(true);
}

! +++++ Setzen der Priorität für die Push-Nachricht +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State("0");

! +++++ Sound für Pushover-Nachricht +++++
if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)).State("intermission");}

! +++++ Anzahl Einwürfe hochzählen +++++
inserts = (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svMailCount)).Value().ToInteger();
inserts = inserts + 1;
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svMailCount)).State(inserts);

! +++++ Erzeugen der Nachricht und Einwürfe in Datei auf LBoxPiZero schreiben +++++
message = "<font color=royalblue>Briefkasten leeren!\n</font> ";
if(inserts == 1){
  message = message#"1 Einwurf.";
  (dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("echo -n "#inserts#" Einwurf | ssh "#login#" 'cat > /home/pi/RPi_Cam_Web_Interface/user_annotate.txt'");
}
elseif(inserts > 1){
  message = message#inserts#" Einwürfe.";
  (dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("echo -n "#inserts#" Einwuerfe | ssh "#login#" 'cat > /home/pi/RPi_Cam_Web_Interface/user_annotate.txt'");
}

! +++++ zPNP ausführen +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
(dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
WebUI-Skript für das Leeren des Briefkastens

Code: Alles auswählen

! Meldung Briefkasten geleert
! Version 3.0.3, Autor: dtp

! Namen der verwendeten Systemvariablen
string svPushText = "CCU SV Push Text"; ! gem. zPNS-xx, obligatorisch
string svPushPrio = "CCU SV Push Prio"; ! gem. zPNS-xx, obligatorisch
string svPushoverSound = "CCU SV Pushover Sound"; ! gem. zPNS-Po, optional

! Name des zentralen Push-Nachrichten-Programms
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch

! Einwahldaten des LBoxPiZero
string login = "pi@192.xxx.xxx.xxx";

! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################

! +++++ Variablendeklaration +++++
string message;

! +++++ Setzen der Priorität für die Push-Nachricht +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State("-2");

! +++++ Sound für Pushover-Nachricht +++++
if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)).State("gamelan");}

! ++++ Anzeigetext für Kamera LBoxPiZero auf "geleert" setzen +++++
(dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC")).State("echo -n geleert | ssh "#login#" 'cat > /home/pi/RPi_Cam_Web_Interface/user_annotate.txt'");

! +++++ Erzeugen der Nachricht +++++
message = "<font color=yellowgreen>Briefkasten geleert.</font>";

! +++++ zPNP ausführen +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
(dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
Und schließlich das dritte Skript, das beim Nachhausekommen daran erinnern soll, den Briefkasten zu leeren, wenn sich Post darin befindet.

Code: Alles auswählen

! Meldung Briefkasten leeren
! Version 1.0, Autor: dtp

! Namen der verwendeten Systemvariablen
string svPushText = "CCU SV Push Text"; ! gem. zPNS-xx, obligatorisch
string svPushPrio = "CCU SV Push Prio"; ! gem. zPNS-xx, obligatorisch
string svMailCount = "EG Briefkasten SV Einwürfe"; ! Anzahl der Einwürfe, obligatorisch
string svPushoverSound = "CCU SV Pushover Sound"; ! gem. zPNS-Po, optional

! Name des zentralen Push-Nachrichten-Programms
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch

! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################

! +++++ Variablendeklaration +++++
string message;
integer inserts;
object svObject; object svObjectList;

! +++++ Systemvariablen erzeugen bzw. falls vorhanden, auslesen +++++
if(!svMailCount){svMailCount = "EG Briefkasten SV Einwürfe";}
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svMailCount);
if(!svObject){
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
  svObject.Name(svMailCount); svObject.DPInfo("Anzahl der Briefkasteneinwürfe"); svObject.Internal(false); svObject.Visible(true);
  svObject.ValueType(ivtFloat); svObject.ValueSubType(istGeneric); svObject.ValueUnit(""); svObject.ValueMin(0); svObject.ValueMax(65000); dom.RTUpdate(true);
}

! +++++ Setzen der Priorität für die Push-Nachricht +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State("0");

! +++++ Sound für Pushover-Nachricht +++++
if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)).State("intermission");}

! +++++ Anzahl Einwürfe +++++
inserts = (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svMailCount)).Value().ToInteger();

! +++++ Erzeugen der Nachricht und Einwürfe in Datei auf LBoxPiZero schreiben +++++
message = "<font color=royalblue>Briefkasten leeren!\n</font> ";
if(inserts == 1){message = message#"1 Einwurf.";}
elseif(inserts > 1){message = message#inserts#" Einwürfe.";}

! +++++ zPNP ausführen +++++
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
(dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
Empfang der Push-Nachrichten

Die per Pushover gesendeten und auf dem iPhone empfangenen Nachrichten sehen dann so aus:
Pushover_Briefkasten.PNG
Mit Telegram geht es aber genau so. Hier mal ein Screenshot der Telegram App unter Windows 10:
Telegram_Briefkasten.png

Update des RPi_Cam_Web_Interfaces

Zum Updaten des RPi_Cam_Web_Interfaces zunächst einfach die folgenden Schritte durchführen und die dann erscheinenden Fenster jeweils mit OK bestätigten.

Code: Alles auswählen

cd /RPi_Cam_Web_Interface
sudo ./update.sh

Im Anschluss daran muss die Datei "user_annotate.txt" im Verzeichnis "/dev/shm/mjpeg" mit

Code: Alles auswählen

sudo nano /etc/raspimjpeg
noch wieder so umkonfiguriert werden, dass der Eintrag

Code: Alles auswählen

user_annotate /dev/shm/mjpeg/user_annotate.txt
in

Code: Alles auswählen

user_annotate /home/pi/RPi_Cam_Web_Interface/user_annotate.txt
geändert wird. Dies ist leider nach jedem Update notwendig, da "user_annotate.txt" immer mit den Standardwerten überschrieben wird. Danach den Raspi mit

Code: Alles auswählen

sudo reboot
zur Übernahme der Änderungen neu starten.

Bis dann,

Thorsten

Re: Posteinwürfe mit Raspberry Pi Zero WH und IR-Kamera erke

Verfasst: 18.04.2018, 08:49
von stan23
Hübsch! Wird da auch gleich der Adressat per OCR ausgelesen und dann entsprechend deine Frau oder du benachrichtigt? :)

Re: Posteinwürfe mit Raspberry Pi Zero WH und IR-Kamera erke

Verfasst: 18.04.2018, 10:18
von dtp
Ich nehm das mal auf die ToDo-Liste. ;)

Re: Posteinwürfe mit Raspberry Pi Zero WH und IR-Kamera erke

Verfasst: 22.04.2018, 23:26
von my2005
Sehr cooles Projekt.

Mit dem kleinen PI inkl. Cam kann man noch viele weitere interessante Projekte machen.

Re: Posteinwürfe mit Raspberry Pi Zero WH und IR-Kamera erke

Verfasst: 26.04.2018, 16:16
von dtp
Und hier dann noch mal eine Umsetzung mit ioBroker.vis.

[Die Dateierweiterung mp4 wurde deaktiviert und kann nicht länger angezeigt werden.]

Bis dann,

Thorsten

Re: Posteinwürfe mit Raspberry Pi Zero WH und IR-Kamera erkennen

Verfasst: 04.11.2018, 15:56
von osu
Sehr, sehr cool, lieber Thorsten.

Bin dieses Jahr noch zu nix gekommen. DoorPI Prototyp fährt hier auf dem Schreibtisch rum und verstaubt. :cry:

Gruß,
Oli

Re: Posteinwürfe mit Raspberry Pi Zero WH und IR-Kamera erkennen

Verfasst: 19.11.2018, 09:45
von dtp
osu hat geschrieben:
04.11.2018, 15:56
Sehr, sehr cool
Danke Oli,

aber sag das lieber meiner Frau. Die hält mich für komplett bekloppt. 8)

Gruß,

Thorsten

Re: Posteinwürfe mit Raspberry Pi Zero WH und IR-Kamera erkennen

Verfasst: 28.05.2019, 18:17
von Tibin
Hallo Thorsten,
ich nutze dein Programm jetzt auch für die Briefkasteneinwürfe. Danke dafür schon mal :!:
Nur halt nicht mit Kamera, sondern nur einfach mit TFK's.
Funktioniert einwandfrei (Daumen hoch), habe nur 2 Sachen als kleinen Hinweis für dich....

Code: Alles auswählen

svObject.Name(svMailCount); svObject.DPInfo("Gasverbrauch aktueller Tag");
:mrgreen:

Und...

Code: Alles auswählen

message = "<font color=royalblue>Briefkasten leeren!\n</font> ";

Code: Alles auswählen

message = "<font color=yellowgreen>Briefkasten geleert.</font>";
Da gibt es wieder das gleiche Problem wie mit "orange", das kennst du ja schon :wink:
Ich habe für royalblue = #4169e1 und für yellowgreen = #9acd32 genommen.
dtp hat geschrieben:
19.11.2018, 09:45
aber sag das lieber meiner Frau. Die hält mich für komplett bekloppt.
Mach weiter so und lass dir nix von deiner Frau einreden :mrgreen:
Gruß Tino.