Hallo,
ich benutze z.Z. IP Webcam pro um 2 Handys als Überwachungscam in meine Oberfläche einzubauen. D,h. ich kann wie von dort aus alle in eine Übersicht sehen.
Alle 5 Sekunden wird ein Bild von jeder cam aus dem Videostream gemacht und in eine Ramdisk gespeichert. (Was mir nicht gefällt, da keine Motiondetection)
Anschließend wirds dort gezippt, dann zum Server gesendet. - So weit der Status.
Jetzt würde ich gerne den eigentlichen Vorteil der Handycams nutzen: Nämlich relativ hochauflösende Bilder anzufertigen.
IP Webcam bietet auch die Möglichkeit diese per URL "abzugreifen". Jedoch wird es mir mit dem Speicherplatz dann doch zu eng, wenn der alle 5 Sekunden ein Bild macht.
Ich würde gerne nur diese hochauflösenden Bilder machen, aber nur wenn eine Bewegung im Bild stattfindet. Das Problem ist... hier bietet IP Webcam nur die Möglichkeit VIDEOS bei Bewegungen aufzunehmen. - Gibt es eine Lösungsidee ?
Edit1: ICh bin schon ein Stück weiter gekommen. Ich bekomme ein json Objekt mit mit einer erkannten Bewegung unter "server:port/sensors.json?sense=motion_active"
Jetzt Müsste ich FHEM noch beibringen, wie man diese URL alle sekunde ausließt und wenn das json objekt den String "[1.0]" enthält, muss ein Foto von "server:port//photo.jpg" alle 5 sekunden in media/ramdisk/cam1 kopiert werden. Evtl könnte da jemand helfen!?
Such doch mal in der CommandRef (https://fhem.de/commandref_DE.html) nach JSON und/oder httpmod. Da dürfest du finden was du möchtest :)
leider musste ich gerade feststellen, dass es irgendwie wohl unsinnig ist ständig http requests abzufeuern um
eine bewegung festzustellen, zumal FHEM wohl mit HTTPMOD das ganze auf max. 1 request alle 6 sekunden reduziert hat.
PM HTTPMOD http://MyPoolManager/cgi-bin/webgui.fcgi 6
Jetzt stehe ich wohl wieder beim anfänglichen Problem.
Hat jemand noch eine idee ?
Also ich habe einen httpmod abfrage auf meine IPCam, wenn sie an ist und die bei Erkannte Bewegung Bilder auslöst und mir schickt. Daher verstehe ich nicht ganz was das Problem ist. Alternativ ist die Frage, ob dein Programm nicht einfach selbst einen Befehl absetzen kann, wenn sie Bewegung erkannt, dann musst du es nicht pollen.
Edit:
Alternativ stell einen Bewegungssensor auf und triggere mittels AMAD die Handycamera für ein Bild.
Also ein Sensor steht für mich außer frage, da er zusätzlich angeschafft werden müsste, denn eigentlich müsste es auch ohne extra hardware funktionieren.
Ich bin in sachen httpmod noch ein neuling und habe in der referenz noch etwas gelesen, dass mir auch helfen könnte um öfters zu triggern.
nochmal zu meinem Problem: Ich möchte, dass hochauflösende Bilder nur bei bewegung getriggert werden, ohne zusätzliche hardware. dazu verwende ich ältere handys + IP webcam pro.
weiterhin möchte ich gerne eine cam - liveansicht (die ich breits bei mir in FEHM integriert habe) weiternutzen. - bin also etwas gebunden an die app IP Webcam Pro.
Wie auch immer. Ich habe folgendes wobei ich es nicht hinbekommen mit Cam1MotionNotify beim get den request von Cam1Motion zu triggern. Könnte da jemand helfen?:
define Cam1Motion HTTPMOD http://192.168.0.100:8080/sensors.json?sense=motion_active 0
attr Cam1Motion enableControlSet 1
attr Cam1Motion userattr reread
attr Cam1Motion reading01Name CM1
attr Cam1Motion reading01Regex (\d\.\d)\]\]\]\}\}$
attr Cam1Motion stateFormat {sprintf("CM1 %.1f", ReadingsVal($name,"CM1",0))}
define Cam1MotionNotify at +*00:00:01 get Cam1Motion CM1
attr Cam1MotionNotify room Wohnung
Lös mal ein Abfrage mittels HTTPMOD aus, wenn keine Bewegung da ist und ein, wenn Bewegung da ist. Dann machst du jeweils ein list des Device und postest das Ergebnis hier. Sonst kann man nicht erkennen was eigentlich bei dem HTTPMOD passiert und ob es richtig läuft.
Schau dir mal ZoneMinder ( https://zoneminder.com/ ) an.
Ich sammle damit meine IPCam's verschiedener Hersteller ein, und lasse mir das dann in einer Übersicht anzeigen.
Motion Detection der einzelnen Kameras oder von ZM nutze ich nicht, da ich a) 24x7 aufzeichne und b) weitere Sensoren für die Bewegungserkennung nutze.
Das Teil ist ziemlich mächtig. Vllt. hilft es dir.
Gruß
Chris
Also ich habe den Intervall zum testen Cam1Motion - mal mit dem eigenen Intervall (alle 6 Sekunden) versehen siehe Code:
define Cam1Motion HTTPMOD http://192.168.0.100:8080/sensors.json?sense=motion_active 6
attr Cam1Motion enableControlSet 1
attr Cam1Motion userattr reread
attr Cam1Motion reading01Name CM1
attr Cam1Motion reading01Regex (\d\.\d)\]\]\]\}\}$
attr Cam1Motion stateFormat {sprintf("CM1 %.1f", ReadingsVal($name,"CM1",0))}
Ohne Bewegung oder Gerät aus ist STATE CM1 0.0 mit Bewegung ist STATE CM1 1.0
Läuft also wie erwartet.
Allerdings sind die 6 Sekunden ja zu wenig und ich möchte das Ganze über diese Zeilen öfters triggern, was aber nicht klappt:
define Cam1MotionNotify at +*00:00:01 get Cam1Motion CM1
attr Cam1MotionNotify room Wohnung
Leider weiss ich nicht wie man eine "Liste des Devices" erstellt, deswegen hier ein Screenshot.
@oetti77:
Danke für die Antwort. Schauen werde ich mal, aber so wie Du es beschreibst kommt es für mich aus den benannten Gründen (24/7) nicht in Frage.
Was ich meinte ist, du bindest deine Kameras in ZoneMinder ein, und definierst dort die Zonen für Motion Detection, Zeiträume, Events, Alerts etc.
Wie gesagt, nur eine Idee ;-)
Gruß
Chris
Zitat von: WhiteLion am 28 September 2017, 17:02:10
Leider weiss ich nicht wie man eine "Liste des Devices" erstellt, deswegen hier ein Screenshot.
https://forum.fhem.de/index.php/topic,71806.0.html
Ohne Bewegung:
Internals:
BUSY 0
DEF http://192.168.0.100:8080/sensors.json?sense=motion_active 6
Interval 6
LASTSEND 1506615714.48577
MainURL http://192.168.0.100:8080/sensors.json?sense=motion_active
ModuleVersion 3.4.0 - 9.9.2017
NAME Cam1Motion
NR 53
STATE CM1 0.0
TRIGGERTIME 1506615720.48458
TRIGGERTIME_FMT 2017-09-28 18:22:00
TYPE HTTPMOD
addr http://192.168.0.100:8080
buf HTTP/1.1 200 OK
Connection: close
Server: IP Webcam Server 0.2
Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0
Pragma: no-cache
Expires: -1
Access-Control-Allow-Origin: *
Content-Type: application/json
{"motion_active":{"unit":"","data":[[1506616562864,[0.0]]]}}
code 200
conn
data
displayurl http://192.168.0.100:8080/sensors.json?sense=motion_active
header
host 192.168.0.100
httpheader HTTP/1.1 200 OK
Connection: close
Server: IP Webcam Server 0.2
Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0
Pragma: no-cache
Expires: -1
Access-Control-Allow-Origin: *
Content-Type: application/json
httpversion 1.0
hu_blocking 0
hu_filecount 9
hu_port 8080
hu_portSfx :8080
ignoreredirects 0
loglevel 4
path /sensors.json?sense=motion_active
protocol http
redirects 0
timeout 2
url http://192.168.0.100:8080/sensors.json?sense=motion_active
value 0
QUEUE:
READINGS:
2017-09-28 18:21:54 CM1 0.0
REQUEST:
data
header
ignoreredirects 0
retryCount 0
type update
url http://192.168.0.100:8080/sensors.json?sense=motion_active
value 0
defptr:
readingBase:
CM1 reading
readingNum:
CM1 01
readingOutdated:
requestReadings:
update:
CM1 reading 01
sslargs:
Attributes:
enableControlSet 1
reading01Name CM1
reading01Regex (\d\.\d)\]\]\]\}\}$
stateFormat {sprintf("CM1 %.1f", ReadingsVal($name,"CM1",0))}
userattr reading01Name reading01Regex reread
Mit Bewegung:
Internals:
BUSY 0
DEF http://192.168.0.100:8080/sensors.json?sense=motion_active 6
Interval 6
LASTSEND 1506615858.5286
MainURL http://192.168.0.100:8080/sensors.json?sense=motion_active
ModuleVersion 3.4.0 - 9.9.2017
NAME Cam1Motion
NR 53
STATE CM1 1.0
TRIGGERTIME 1506615864.52751
TRIGGERTIME_FMT 2017-09-28 18:24:24
TYPE HTTPMOD
addr http://192.168.0.100:8080
buf HTTP/1.1 200 OK
Connection: close
Server: IP Webcam Server 0.2
Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0
Pragma: no-cache
Expires: -1
Access-Control-Allow-Origin: *
Content-Type: application/json
{"motion_active":{"unit":"","data":[[1506616706736,[1.0]]]}}
code 200
conn
data
displayurl http://192.168.0.100:8080/sensors.json?sense=motion_active
header
host 192.168.0.100
httpheader HTTP/1.1 200 OK
Connection: close
Server: IP Webcam Server 0.2
Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0
Pragma: no-cache
Expires: -1
Access-Control-Allow-Origin: *
Content-Type: application/json
httpversion 1.0
hu_blocking 0
hu_filecount 33
hu_port 8080
hu_portSfx :8080
ignoreredirects 0
loglevel 4
path /sensors.json?sense=motion_active
protocol http
redirects 0
timeout 2
url http://192.168.0.100:8080/sensors.json?sense=motion_active
value 0
QUEUE:
READINGS:
2017-09-28 18:24:18 CM1 1.0
REQUEST:
data
header
ignoreredirects 0
retryCount 0
type update
url http://192.168.0.100:8080/sensors.json?sense=motion_active
value 0
defptr:
readingBase:
CM1 reading
readingNum:
CM1 01
readingOutdated:
requestReadings:
update:
CM1 reading 01
sslargs:
Attributes:
enableControlSet 1
reading01Name CM1
reading01Regex (\d\.\d)\]\]\]\}\}$
stateFormat {sprintf("CM1 %.1f", ReadingsVal($name,"CM1",0))}
userattr reading01Name reading01Regex reread
Sehe auch gerade, dass ich mich verlesen habe. Dachte httpmod erkennt den Wert für Bewegung nicht. Sry, das klappt ja.
Wo haste das mit den 6 sek denn gelesen? Ich habe bei mir 5 definiert und es klappt. Solltest mit dem Wert aber auch nicht zu tief gehen. Und was du willst müsste
set <device> reread
sein, wenn du kein get definiert hast.
Danke, hatte es gerade hinbekommen, aber mir ist noch nicht ganz klar, dass ich ständig neu setzen muss im Trigger
Das hier funktioniert:
define Cam1Motion HTTPMOD http://192.168.0.100:8080/sensors.json?sense=motion_active 0
attr Cam1Motion enableControlSet 1
attr Cam1Motion reading01Name CM1
attr Cam1Motion reading01Regex (\d\.\d)\]\]\]\}\}$
attr Cam1Motion stateFormat {sprintf("CM1 %.1f", ReadingsVal($name,"CM1",0))}
define Cam1MotionNotify at +*00:00:01 set Cam1Motion reread
attr Cam1MotionTrigger room Wohnung
Aber das hier war die falsche Lösung.
define Cam1Motion HTTPMOD http://192.168.0.100:8080/sensors.json?sense=motion_active 0
attr Cam1Motion enableControlSet 1
attr Cam1Motion reading01Name CM1
attr Cam1Motion reading01Regex (\d\.\d)\]\]\]\}\}$
attr Cam1Motion stateFormat {sprintf("CM1 %.1f", ReadingsVal($name,"CM1",0))}
set Cam1Motion reread
define Cam1MotionNotify at +*00:00:01 get Cam1Motion CM1
attr Cam1MotionNotify room Wohnung
Ehrlich gesagt ist mir nicht ganz klar wie man anhand des Wikis darauf kommen sollte reread immer zu triggern!?
Dachte es wird beim ansprechen des Objektes Cam1Motion das reread getriggert. ... Phew war das eine schwere Geburt.
Freut mich, dass es klappt. Aber frage Michi merkwürdig noch wo du das mit den 6sek her hast?
Das will ich Dir gerne beantworten:
98_HTTPMOD.pm 15035 2017-09-09 12:02:21Z StefanStrobel:
#
# SET command - handle predifined control sets
################################################
sub HTTPMOD_ControlSet($$$)
{
my ($hash, $setName, $setVal) = @_;
my $name = $hash->{NAME};
if ($setName eq 'interval') {
if (!$setVal) {
Log3 $name, 3, "$name: no interval (sec) specified in set, continuing with $hash->{Interval} (sec)";
return "No Interval specified";
} else {
if (int $setVal > 5) {
$hash->{Interval} = $setVal;
Log3 $name, 3, "$name: timer interval changed to $hash->{Interval} seconds";
HTTPMOD_SetTimer($hash);
return "0";
} elsif (int $setVal <= 5) {
Log3 $name, 3, "$name: interval $setVal (sec) to small (must be >5), continuing with $hash->{Interval} (sec)";
return "interval too small";
}
}
} elsif ($setName eq 'reread') {
HTTPMOD_GetUpdate("reread:$name");
return "0";
} elsif ($setName eq 'stop') {
RemoveInternalTimer("update:$name");
$hash->{TRIGGERTIME} = 0;
$hash->{TRIGGERTIME_FMT} = "";
Log3 $name, 3, "$name: internal interval timer stopped";
return "0";
} elsif ($setName eq 'start') {
HTTPMOD_SetTimer($hash);
return "0";
} elsif ($setName eq 'upgradeAttributes') {
HTTPMOD_UpgradeAttributes($hash);
return "0";
} elsif ($setName eq 'storeKeyValue') {
my $key;
if ($setVal =~ /([^ ]+) +(.*)/) {
$key = $1;
my $err = HTTPMOD_StoreKeyValue($hash, $key, $2);
return $err if ($err);
} else {
return "Please give a key and a value to storeKeyValue";
}
return "0";
}
return undef; # no control set identified - continue with other sets
}
Wie Du siehst ist es hardcoded :( und bevor ich jetzt anfange die module zu bearbeiten (Die nach einem update dann vermutlich überschrieben werden),
wollte ich eine andere Lösung.
Schau an, nicht gewusst. Danke