Optischer Sensor, Software: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Maskennamen in der Config angeben)
K (Masken ergänzt)
Zeile 47: Zeile 47:
"picture": "picture_kitchen",
"picture": "picture_kitchen",
"type": "jpg",
"type": "jpg",
"mask": "dishwasher",
...
...


Zeile 56: Zeile 57:
* "different_ROI": ist spannend: hier sagt man, wie viele LEDs (ROI = region of interesst) man überwachen will. (für jede ROI muss genau 1 Maske existieren)
* "different_ROI": ist spannend: hier sagt man, wie viele LEDs (ROI = region of interesst) man überwachen will. (für jede ROI muss genau 1 Maske existieren)
* "path_to_picture": logisch, wo liegt das Bild? In diesem Fall in einem Unterordner Namens Picture
* "path_to_picture": logisch, wo liegt das Bild? In diesem Fall in einem Unterordner Namens Picture
* "picture": der Name des Bildes (aufgemerkt: das Programm geht also immer vom gleichen Dateinamen aus!)
* "picture": der Name des Bildes (aufgemerkt: das Programm geht also immer vom gleichen Dateinamen aus!) (Quellbild)
* "type": bitte mit angeben; jpg, png...
* "type": bitte mit angeben; jpg, png...
* "mask": der erste Teil des Maskennamens
** die Dateiendung nicht angeben, bitte die gleiche wie beim Quellbild verwenden
** so kann man bei einem Quellbild verschiedene Masken angeben (in verschiedenen Config Dateien)
** bei Karten vom DWD z.B. kann man so aus einem Quellbild Werte für verschiedene Regionen ermitteln
** munic.conf, berlin.conf
** bei mehr Küchengeräten z.B. dishwasher.conf und waterboiler.conf


===Was sind diese Masken?===
===Was sind diese Masken?===

Version vom 4. August 2015, 03:53 Uhr


Todo: Das wird die Doku für den optischen Sensor. Der Programmcode ist ziemlich weit gediehen. Ich dachte mir, die Doku mal zum Start eines Projekts fertig zu haben, ist auch nicht schlecht


Was ich noch nicht weiß

  • soll das Programm regelmäßig per Cron ausgeführt werden, oder ist es schlauer einen WebSocket zu öffnen, so dass fhem dem Programm sagen kann, wenn es ein Bild bearbeiten soll
  • Treshold für Farben im Programm anwenden, oder nackten Zähler direkt an fhem senden

Übersicht

Das kleine Programm liest ein Farbbild ein. Anschließend werden (in definierbaren Bereichen) Farbwerte ermittelt. Das Resultat wird dann an fhem gesendet.

Wozu ist das gut?

Mein Anwendungsfall:

Eine USB Kamera am Raspberry macht regelmäßig Bilder meiner Küche. Darin sind insbesondere die Geschirrspülmaschine und der Herd zu sehen. Wenn meine Geschirrspülmaschine Dinge wie Salz oder Klarspüler benötigt, leuchtet eine entsprechende LED rot auf. Das kann das Programm erkennen und fhem mitteilen. Ähnlich beim Herd: ist der an, leuchtet es gelb. Beim Verlassen des Hauses kann mir fhem sagen, dass der Herd noch an ist...

Wichtig: Die Kamera darf nicht bewegt werden, sonst funktionieren die Masken nicht mehr! Also z.B. festschrauben...



Anderer Anwendungsfall:

Ein Bild (z.B. Bodenfeuchte) vom DWD runterladen (das müsst ihr selbst!), dann analysieren lassen, welche Bodenfeuchte bei euch ist. Selbiges wird an fhem gesendet.

Einfach für jede mögliche Farbe eine eigene Maske erstellen (die ist natürlich identisch), in die conf die Farbwerte und die setreadings schreiben, fertig...


Forumsthread

Beschreibung

Ein bisschen mehr ins Detail gehend:

Das Programm erwartet ein farbiges Bitmap Bild. Anschließend werden Masken über das Bild gelegt. Was übrig bleibt (idealerweise also der Bildausschnitt wo die entsprechende LED zu sehen ist) wird in den HSV Farbraum konvertiert. Eine Beschreibung warum und wie er funktioniert, folgt noch. Dann werden Die gewünschten Farben gefiltert. Intern übrig bleiben dann einige weiße Pixel auf schwarzem Grund. Die werden schlicht gezählt. Entweder sende ich die Anzahl der Pixel an fhem, oder aber man legt in der Config-Datei einen Treshold Wert fest. Siehe oben...

Konfiguration der Software

Das Programm an sich benötigt eine Config-Datei.

{
	"fhem_host_port": "http://192.168.5.31:8083",
	"fhem_request": "/fhem?cmd=",
	"different_ROI": "5",
	"path_to_picture": "./Picture",
	"picture": "picture_kitchen",
	"type": "jpg",
	"mask": "dishwasher",
...

Was ist hier einzustellen?

  • "fhem_host_port": Adresse des fhem Servers, ebenso wie der Port. (Muss man also anpassen)
  • "fhem_request": (weiß nicht, wie es heißt), sollte aber so passen
  • "different_ROI": ist spannend: hier sagt man, wie viele LEDs (ROI = region of interesst) man überwachen will. (für jede ROI muss genau 1 Maske existieren)
  • "path_to_picture": logisch, wo liegt das Bild? In diesem Fall in einem Unterordner Namens Picture
  • "picture": der Name des Bildes (aufgemerkt: das Programm geht also immer vom gleichen Dateinamen aus!) (Quellbild)
  • "type": bitte mit angeben; jpg, png...
  • "mask": der erste Teil des Maskennamens
    • die Dateiendung nicht angeben, bitte die gleiche wie beim Quellbild verwenden
    • so kann man bei einem Quellbild verschiedene Masken angeben (in verschiedenen Config Dateien)
    • bei Karten vom DWD z.B. kann man so aus einem Quellbild Werte für verschiedene Regionen ermitteln
    • munic.conf, berlin.conf
    • bei mehr Küchengeräten z.B. dishwasher.conf und waterboiler.conf

Was sind diese Masken?

Die sind cool. Einfache schwarz/weiß Bilder.

Zum erstellen: Ein Musterbild von der Kamera besorgen. In Gimp öffnen, den Bereich um eine der gewünschten LEDs ein Viereck oder ein Kreis, ist egal) markieren. Löschen, Füllfarbe weiß. Markierung umdrehen, löschen, Füllfarbe schwarz. Fertig.

Stellt euch vor, die Maske wäre aus Tonpapier. Da wo weiß ist, ist ein Loch drin. Die Maske wird über das Bild gelegt. Nun seht ihr nur noch die gewünschte LED...


Wichtig:

Die Maske braucht nun einen festen Dateinamen, damit sie gefunden wird! Hängt an den in der Config angegebenen Dateinamen ein _mask_1 an, für eure erste Maske. Hättet ihr ROI = 1, ist das alles. Bei ROI = 2 wollen wir 2 Masken abarbeiten.

Also, bei ROI = 3

  • quellbild.jpg (das, was eure Kamera immer generiert)
  • <AngegebenerName>_mask_1.jpg
  • <AngegebenerName>_mask_2.jpg
  • <AngegebenerName>_mask_3.jpg

Benötigte Frameworks

folgt noch

Kalibrierung des Sensors

Porgrammcode

Sensor

Config-File

Beispiel mit Bildern