Hallo zusammen, ich habe viel mit dem Thema herumexperimentiert und bin jetzt zu einer für mich schönen Lösung gekommen, die ich hier zur Verfügung stellen möchte.
Ich habe ioBroker in einer virtuellen Maschine im VM Ware Player laufen: Ubuntu 20.04.01 Server. Motioneye läuft in einer zweiten VM, auch Ubuntu 20.04.01 Server. Die motioneye Installation hat zu 100% nach Anleitung funktioniert:
https://github.com/ccrisan/motioneye/wiki/(Install-On-Ubuntu-(20.04-or-Newer)
In beiden VMs ist der selbe shared folder aktiviert:

sudo nano /etc/fstab
Am Ende ergänzen:
.host:/ /mnt/hgfs fuse.vmhgfs-fuse defaults,allow_other 0 0
Damit steht in beiden VMs (iobroker und motioneye) der Ordner /mnt/hgfs/rack_HDD zur Verfügung. Der Name ist im Player natürlich frei wählbar.
Ich habe beide VMs mit statischen IP-Adressen versehen: iobroker: endet mit .50, motioneye mit .52
Im ioBroker muss in der Web-Adapter-Instanz (bei mir web.0) noch "Eingebautes 'Simple-API'" aktiviert werden. Wenn der Port nicht 8082 ist, muss das in den curl-Anweisungen in motioneye entsprechend geändert werden. Die Vorgehensweise unten bezieht sich auf 8082.

Konfiguration von motioneye:
mit putty einloggen
sudo nano /etc/motioneye/motioneye.conf
Wir wollen mit iobroker neben dem motioneye webinterface auch auf motion zugreifen, daher den Zugriff nicht auf localhost beschränken (motion_control_localhost false):
# whether motion HTTP control interface listens on
# localhost or on all interfaces
motion_control_localhost false
Noch kurz den Control-Port überprüfen:
motion_control_port 7999
Ich habe bei mir über die Web-Konfiguration der IP-Kamera folgende Werte eingestellt: 1280x720, 15 fps. Damit kriege ich einen ausreichend flüssigen Stream und die CPU-Last der VM (host: i5 3. Generation) liegt bei <20%.
Jetzt kann die Konfiguration von motioneye im Browser geöffnet werden, ich gebe hier noch Werte an, die bei mir ganz gut funktionieren:
<IP-Adresse Motioneye>:8765
ggf. Benutzer wechseln - admin (ohne PW)
- Preferences: die beiden Dimmer habe ich auf 100% gestellt, die Grenzen habe ich ja in der Kamera konfiguriert
- Video Device:
Camera Name: ist wohl selbsterklärend, z.B. Garten
Camera Device: bei einer IP-Kamera kommt hier der Link zum Stream rein, z.B. rtsp://... bzw. der Wert aus der Erst-Konfiguration ist eingetragen.
Video Resolution und Framerate: so wie in der Kamera eingestellt, bei mir also 1280x720, 15 fps
- File Storage:
Root Directory: hier kommt jetzt der gemeinsam genutzte Ordner rein, z.B. /mnt/hgfs/rack_HDD/motioneye
Run A Command: ON
Command: curl <IP-Adresse von iobroker>:8082/set/javascript.0.motioneye.getLastPic?value=%f
Damit übergeben wir den Namen des letzten gespeicherten Bildes (z.B. bei Bewegung) an ioBroker.
- Text Overlay:
Left Text: Camera Name
Right Text: Custom Text: %Y-%m-%d\n%T-%q
Mit -%q wird der Frame mit angezeigt, d.h. bei 15 fps sieht man in einer Sekunde, wie von 0 bis 14 hochgezählt wird. Damit erkennt man die aktuelle Stream-Geschwindigkeit gut.
Text Scale: 3, damit kann man bei der Auflösung von 1280x720 die Schrift gut lesen
- Video Streaming:
Streaming Frame Rate: 15 (entspricht der Einstellung der IP-Kamera)
Streaming Quality: 100% (je nach Bedarf kann man auch mit weniger zufrieden sein)
Motion Optimization: ON Damit wird der Stream ohne erkannte Bewegung auf 1 fps reduziert und hochgefahren, wenn Bewegung erkannt wird. Den Effekt sieht man durch -%q dann auch im Bild rechts unten.
Streaming URL: Die Adresse kommt in vis z.B. in das Widget "basic -Image": Quelle. Damit hat man dann in der vis-Runtime den Live-Stream
- Still Images:
Image File Name: %Y-%m-%d/%H-%M-%S_%q
Durch %q wird vermieden, dass, sollten mehrere Bilder in einer Sekunde aufgenommen werden, Bilder überschrieben werden. %q hängt die Frame-Nummer an.
Capture Mode: Motion Triggered (One Picture)
Damit wird nur der Frame mit der meisten Bewegung (Anzahl geänderte Pixel) bei erkannter Bewegung (Event) gespeichert und nicht jedes einzelne Bild, was zu einer Bilder-Flut führt.
- Movies: habe ich deaktiviert
- Motion Detection:
Frame Change Threshold: 0.4%
Das sind knapp über 3.500 Pixel. die sich ändern müssen, um Bewegung zu erkennen. Habe ich durch (viel) probieren ermittelt und passt bei mir ganz gut
Maximum Change Threshold: 50.000
Damit wird bei mir vermieden, dass Bewegung erkannt wird, wenn z.B. nachts die Scheinwerfer eines Autos Licht in den überwachten Bereich werfen. In Kombination mit Light Switch Detection. Wenn sich die Kamera ziemlich dicht an sich bewegenden Objekten befindet, z.B. direkt über einer Tür, kann 50.000 viel zu niedrig sein. Gilt auch für Light Switch Detection weiter unten. Die Zahl der bewegten Pixel wird weiter unten auch angezeigt, damit bekommt man ein gutes Gefühl für sinnvolle Werte.
Auto Threshold Tuning: off
"On" hat bei mir zu viele Fehlauslösungen provoziert
Auto Noise Detection: off
"On" hat bei mir zu viele Fehlauslösungen provoziert
Noise Level: 12%
Wirkt vor allem nachts/ bei schwarz-weiß Bild der Kamera. Ich habe den Wert durch probieren ermittelt, um Fehlauslösungen zu vermeiden, aber Bewegung trotzdem zu erkennen.
Light Switch Detection: 10%
Der Wert darf nicht zu niedrig sein, eher >10%, Weil sonst echte Bewegung mit entsprechend vielen Pixeln als "Licht" interpretiert und nicht gemeldet wird. Wirkt vor allem, wenn die Kamera sich nachts bei Dunkelheit empfindlich einstellt und dann bei Lichteinfall das ganz Bild "weiß" wird, bis sich die Kamera an die neuen Lichtverhältnisse angepasst hat, was ja innerhalb weniger Sekunden der Fall ist.
Show Frame Changes: ON
Damit wird rechts oben im Bild die Anzahl der geänderten Pixel angezeigt und das bewegte Motiv wird rot umrandet.
- Motion Notification:
Run A Command: ON
Command: curl <IP-Adresse von iobroker>:8082/set/javascript.0.motioneye.getEventStart?value=true
Damit übergeben wir erkannte Bewegung an ioBroker
Run An End Command: ON
Command: curl <IP-Adresse von iobroker>:8082/set/javascript.0.motioneye.getEventStop?value=true
Damit übergeben wir beendete Bewegung an ioBroker
Jetzt können wir uns an die Blockly-Skripte machen:
- Telegram
Zuerst müssen die Datenpunkte angelegt werden (übernimmt Blockly):
javascript.0.motioneye.getLastPic
javascript.0.motioneye.takeSnapshot
Dann die Logik:
- Foto unabhängig von Bewegung auslösen (z.B. über Telegram oder ein anderes Objekt):
exec Befehl: muss in der Javascript-Instanz aktiviert sein: Erlaube das Kommando "exec"
curl <IP-Adresse von motioneye>:7999/1/action/snapshot
7999 ist der motion_control_port, den wir ganz oben aus der motioneye.conf geholt haben.
1 ist die Kamera-ID. Bei mehreren Kameras ist hier die entsprechende ID anzugeben. Dann müssen ggf. auch mehrere Skripte mit unterschiedlichen (nummerierten) Datenpunkten
javascript.0.motioneye.getLastPic
javascript.0.motioneye.takeSnapshot
angelegt werden.
- aktuellestes Foto an Telegram senden (ausgelöst durch Bewegung oder Telegram bzw. anderes Objekt):
Bildname wird durch curl <IP-Adresse von iobroker>:8082/set/javascript.0.motioneye.getLastPic?value=%f (angegeben in der Motioneye-Konfiguration unter "File Storage" - s.o.) an ioBroker übergeben.

- Aktion bei erkannter Bewegung auslösen, z.B. Licht schalten (=Bewegungsmelder)
Zuerst müssen die Datenpunkte angelegt werden (übernimmt Blockly):
javascript.0.motioneye.getEventStart
javascript.0.motioneye.getEventStop
Auch hier gilt: Bei mehr als einer Kamera ggf. mehrere Skripte mit nummerierten Datenpunkten anlegen.
Dann die Logik:
"Bewegung_erkannt_durch_Kamera_EINGANG" ist aus meinem Datenpunkt-Haushalt, bei euch ist das ein entsprechend anderes Objekt.

Um ein Bild mit Telegram auszulösen noch ein text2command anlegen:
Regel: Schalte irgendetwas an oder aus
Name: Foto

text2command muss in der Telegram-Adapter-Instanz aktiviert sein (=> NACHRICHTEN).
Wenn man jetzt also "Foto" an seinen Bot schickt, wird ein Foto ausgelöst und geschickt.
Das war er soweit auch schon. In der Anleitung steckt ein Haufen Arbeit, also nicht einfach hier rauskopieren und weiterverteilen - danke!