Wie du die Anzahl der Bil­der auf dei­nem Bil­der­rah­men in Home Assis­tent anzei­gen kannst

-

Ich bin immer wie­der über­rascht, was man mit der Open Source Home Assi­stant Soft­ware alles machen kann.

Eine Infor­ma­ti­on, die mich schon immer inter­es­siert hat, ist die Anzahl an Fotos, die sich aktu­ell auf mei­nem digi­ta­len Bil­der­rah­men befin­den.  Mit Home Assi­stant und MQTT ist das kin­der­leicht umzu­set­zen.

Die nach­fol­gen­de Anlei­tung setzt vor­aus, dass du Home Assi­stant und einen MQTT Bro­ker wie z.B. Cloud­MQTT ein­ge­rich­tet hast.

Wenn du dich hier­über erst noch schlau machen willst, dann lies mei­nen Arti­kel "Die Anwe­sen­heits­er­ken­nung von Home Assis­tent für das auto­ma­ti­sche Ein-/Aus­­schal­­ten des Bil­der­rah­mens nut­zen".

Mit Python rich­tig rech­nen

Der Python Befehl os.walk lässt sich in vie­len Berei­chen sehr fle­xi­bel ein­set­zen.

os.walk() gibt die Datei­na­men in einem Ver­zeich­nis wie­der, indem es ein Ver­zeich­nis ent­we­der hoch- oder run­ter "spa­ziert".

Bei dem Spa­zier­gang wer­den auch die Datei­en in Unter­ver­zeich­nis­sen berück­sich­tigt. Das Ergeb­nis kann man in Fol­ge nut­zen, um die Anzahl der Datei­en in einem Ver­zeich­nis zu ermit­teln.

Aller­dings funk­tio­nier­te das nicht rich­tig, als ich den os.walk Befehl aus­pro­bier­te. Die Anzahl der Objek­te in mei­nem Bil­der­ver­zeich­nis zeig­te in macOS rund 1300 an, aber in die­ser Zahl waren auch die Unter­ver­zeich­nis­se (rund 150) ent­hal­ten. os.walk behaup­te­te jedoch, über 2500 Datei­en zu zäh­len. Das konn­te aber nicht sein.

Aber ich hat­te schnell einen Ver­dacht.

So sehr ich Apple Com­pu­ter schät­ze, hat das macOS Betriebs­sys­tem die manch­mal unan­ge­neh­me Eigen­art beim Zugriff auf ein Netz­lauf­werk ver­steck­te Datei­en zu hin­ter­las­sen. (Win­dows ist da auch nicht ganz unschul­dig, man den­ke nur an die ver­steck­ten "thumbs.db" Datei­en, die bei Bil­der­ver­zeich­nis­sen auto­ma­tisch erstellt wer­den.)

Und aus wel­chem Grund auch immer, wer­den die­se ver­steck­ten Datei­en von os.walk() mit­ge­zählt.

Wenn man das aber weiß, ist die Lösung ein­fach.

Die Datei­en haben ein ".App­le­Dou­ble" Namens­be­stand­teil, der es ein­fach macht, sie zu iden­ti­fi­zie­ren. Die Datei­en sieht man aber nur in Linux, nicht in macOS. Ich muss­te also ein­fach mit "." mar­kier­te ver­steck­te Datei­en aus­schlie­ßen. Resi­lio Sync scheint auch noch ".sync" Datei­en zu kre­ieren, die eben­falls aus­ge­schlos­sen wer­den müs­sen.

Die­ser Aus­schluss wird als Bedin­gung defi­niert, womit man dann nur ech­te JPG Datei­en zählt.

if ext in ('.jpg') and not '.AppleDouble' in root and not name.startswith('.') and not '.sync' in root:

Nach­dem das geklärt ist, muss als ers­tes das fol­gen­de Python Skript in das Haupt­ver­zeich­nis des Rasp­berry Pis dei­nes Bil­der­rah­mens gelegt wer­den.

Den nach­fol­gen­den Code ein­fach kopie­ren oder von hier her­un­ter­la­den. Spei­che­re die Datei als count_images.py.

Set­ze dei­nen Benut­zer­na­men und Pass­word von Cloud­MQTT ein (sie­he oben erwähn­ter Arti­kel). Gib dein zu durch­su­chen­des Ver­zeich­nis statt "our­pho­tos" ein.

  1. #!/usr/bin/env python3
  2.  
  3. import paho.mqtt.client as mqtt
  4. import os
  5.  
  6. client = mqtt.Client()
  7. client.username_pw_set( "username" , "password" )
  8.  
  9. client.connect("m23.cloudmqtt.com", 17905, 60)
  10.  
  11. client.publish("frame/images/available", "online")
  12.  
  13. searchdir = r"/home/pi/Pictures/ourphotos"  # your search starts in this directory (your root) 
  14.  
  15. image_count = 0
  16. for root, dirs, files in os.walk(searchdir):
  17.     for name in files:
  18.         ext = os.path.splitext(name)[1].lower()
  19.         if ext in ('.jpg') and not '.AppleDouble' in root and not name.startswith('.') and not '.sync' in root:  # check the extension
  20.             image_count += 1
  21.  
  22. image_count = "{:,}".format(image_count)
  23.  
  24. print(image_count)
  25.  
  26. client.publish("frame/images", image_count)

Die Anzahl der gefun­de­nen Bil­der wird per MQTT im Topic "frame/images" gesen­det.

Um die Zahl stünd­lich zu aktua­li­sie­ren, musst du eine Zei­le in Crontab hin­zu­fü­gen.

crontab -e

Und dann ergänzt du:

0 */1 * * * python3 /home/pi/count_images.py

Nach dem Spei­chern und Schlie­ßen soll­test du den Rasp­berry Pi ein­mal neu star­ten.

Jetzt müs­sen wir noch Home Assi­stant sagen, wie die­ser Sen­sor auf­ge­grif­fen und ange­zeigt wer­den soll.

Den Bil­der­zäh­ler in Home Assi­stant ein­fü­gen

Füge die­sen Absatz zu dei­ner configuration.yaml hin­zu:

#MQTT Sensor
sensor:
  - platform: mqtt
    name: "image_count_frame"
    state_topic: "frame/images"
    unit_of_measurement: 'Photos'
    availability_topic: "frame/images/available"
    payload_available: "online"
    payload_not_available: "offline"

Star­te Home Assi­stant neu und über­prü­fe die Device Sta­tes.

Im Front­end von Home Assi­stant defi­niert ihr jetzt die Enti­ty, wie z.B.:

entities:
  - entity: sensor.image_count_frame
    icon: 'mdi:camera-burst'
    name: Number of images
show_header_toggle: false
title: Digital Picture Frame
type: entities

Star­te jetzt Home Assi­stant neu. Je nach dei­ner Ein­stel­lung im Crontab kann es bis zu einer Stun­de dau­ern bis der Wert ange­zeigt wird.

Herz­li­chen Glück­wunsch! Das war doch nicht schwer, oder?