httpmod Abfrage http stream

Begonnen von Tomk, 18 Mai 2017, 10:40:46

Vorheriges Thema - Nächstes Thema

Tomk

Hallo zusammen,

ich verzweifele gerade mit meiner ersten httpmod abfragt und brauche eure Hilfe.
Ich möchte meine IP Cam abfragen um eine Bewegung zu erkennen und weiter zu verarbeiten.

Hierfür bietet Hivision einen Stream unter "http://<ip>/ISAPI/Event/notification/alertStream" an der wie folgt aufgebaut ist:

<EventNotificationAlert version="2.0" xmlns="http://www.hikvision.com/ver20/XMLSchema">
<ipAddress>xxx.yyy.vvv.zzz</ipAddress>
<portNo>80</portNo>
<protocol>HTTP</protocol>
<macAddress></macAddress>
<channelID>1</channelID>
<dateTime>2017-05-18T09:40:37+01:00</dateTime>
<activePostCount>0</activePostCount>
<eventType>videoloss</eventType>
<eventState>inactive</eventState>
<eventDescription>videoloss alarm</eventDescription>
</EventNotificationAlert>
--boundary
Content-Type: application/xml; charset="UTF-8"
Content-Length: 518

<EventNotificationAlert version="2.0" xmlns="http://www.hikvision.com/ver20/XMLSchema">
<ipAddress>xxx.yyy.vvv.zzz</ipAddress>
<portNo>80</portNo>
<protocol>HTTP</protocol>
<macAddress></macAddress>
<channelID>1</channelID>
<dateTime>2017-05-18T09:40:38+01:00</dateTime>
<activePostCount>1</activePostCount>
<eventType>VMD</eventType>
<eventState>active</eventState>
<eventDescription>Motion alarm</eventDescription>
<DetectionRegionList>
</DetectionRegionList>
</EventNotificationAlert>
--boundary
Content-Type: application/xml; charset="UTF-8"
Content-Length: 518



1. Problem:
Wie erkenne ich folgendes Event im zweiten Block:
<eventType>VMD</eventType>
<eventState>active</eventState>
<eventDescription>Motion alarm</eventDescription>

Wenn das Event nicht ansteht fehlt der ganze Block.

2. Problem:
da es sich um einen Stream handelt wird httpmod immer ins Timeout laufen. Der Buffer ist gefüllt, aber wie stelle ich sicher das ich kein Event verpasse?

Besten Dank vorab!

Tom

Amenophis86

1. Mit einem eigenen HTTPMOD und reload auf die gewünschte Informationen
2. Verstehe ich nicht
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Tomk

#2
Bzgl. 2: der Stream läuft immer weiter, d.h. Wenn ich den link im Browser lade wird der scrollbalken immer kleiner, da immer wieder neue Infos rein kommen.

Bzgl. 1: was heißt denn reload auf die Information? Ich habe bereits mit readings versucht und mit xml, aber irgendwie habe ich nie ein Resultat bekommen. Wer kann mir hier mit der richtigen Regex helfen?

Tomk

Keiner eine Idee? Wer kann mir helfen zumindest die Regex zu finden? Mit den Timeouts werden ich schon irgendwie leben können...
Wie kann ich das Motion event dann abfragen?

herrmannj

ich vermute dass es notwendig sein wird hier ein eigenes modul zu programmieren. Deine Diagnose mit dem timeout ist vmtl korrekt, Du müsstest den stream kontinuierlich lesen und dann die jeweils neuesten Mitteilung weiterverarbeiten. Evtl kann man was frickeln indem man den timeout im httpmod sehr hochsetzt (geht das?) und beim erreichen des timeuts einmal clsoe und direkt wieder open. Wäre aber murks.

Darf ich fragen welche Kamera das ist ?

vg
joerg

herrmannj

die regex, btw, sollte doch einfach sein. Musst Du nicht nur auf "Motion alarm" achten ? also :
.*Motion alarm.*


Tomk

Hallo herrmannj,

danke für die Antwort. Es sind Hikvision Kameras... Ein eigenes Modul würde sicherlich auch noch mehr Möglichkeiten bieten, z.b. Notification der Kamera ohne ständig pollen zu müssen. Vielleicht arbeite ich mich irgendwann doch mal in Perl ein.

Aber bzgl. httpmod: ich glaube ich verstehe die Grundidee nicht...

ich habe jetzt folgende attribute angelegt:
defmod HikVisionHaustuer HTTPMOD http://IP/ISAPI/Event/notification/alertStream 5
attr HikVisionHaustuer userattr reading1Name reading1Regex
attr HikVisionHaustuer reading1Name MotionDetected
attr HikVisionHaustuer reading1Regex .*linedetection alarm.*


aber wie frage ich das attribute ab? wo sehe ich ob die Regex was gefunden hat?

distel

Hallo, leider bin ich auch eine PERL-Niete, hatte aber schon mal zum Thema alertStream recherchiert.

Bzgl. Perl war hier ein Beispiel:
http://www.perlmonks.org/?node_id=1132165

Und hier hatte jemand was ähnliches in Go geschrieben, was ja ggfs. auch eingebunden werden könnte:
https://github.com/ccontavalli/hicknotify

Cheers!
NUC-I37100
Docker: eBus, fhem, ha-bridge, unifi
Hardware: Homematic, FS20, Somfy RTS, 1wire, FBAHA, enOcean

distel

#8
Zitat von: distel am 20 Mai 2017, 14:05:26
Bzgl. Perl war hier ein Beispiel:
http://www.perlmonks.org/?node_id=1132165
Kleines Update: Hab den o.g. Code zum laufen gebracht (XML::Twig per cpan installiert) und gelernt, dass irgendeine Einstellung zum Thema "videoloss" dafür sorgt, dass beständig Events geschmissen werden (sprich "loss" = ausbleiben dieser Events).

Ich habe den Code umgestrickt, so dass das Print nur noch im Falle eines Events vom Type "linedetection" im Status "active" erfolgt. Dieses Event wird typischerweise 4-8 Mal geworfen... je nach Laufgeschwindigkeit. Das Event wird bei mir nur im Status "active" erzeugt.

An ein fhem Modul gedacht, müsste dieses

  • die Zugriffsparameter speichern, das passwort dabei "unsichtbar" wie bspw. IPCam
  • verschiedene readings für verschiedene EventTypen vorhalten
  • den Status der Event-Readings mit jedem empfangenen Event aktualisieren und nach einer bestimmten Zeit ohne weiteres Event zurücksetzen

Welches fhem-Modul könnte als Basis taugen? Wie gesagt, ich hab nicht viel von der Modul-Entwicklung, aber ggf. gibt es ja ähnliche Module die beständig etwas überwachen und als Reading bereitstellen. dann könnte ich weiteres versuchen. Andernfalls werde ich wohl noch ein wenig basteln, bis ich zumindest das IPCam-Modul getriggert bekomme um Bilder zu speichern.

Hier mein angepasster Code:
#!/usr/bin/perl

use XML::Twig;
use warnings;
use strict;
use LWP;

my $camUser = "<username>";
my $camPass = "<password>";
my $camIP   = "xxx.xxx.xxx.xxx";
my $camProt = "http";

my $url = "$camProt://$camUser:$camPass" . "@" . "$camIP/Event/notification/ale$
my $browser = LWP::UserAgent->new();

my $twig = new XML::Twig(
        twig_handlers => { EventNotificationAlert => \&AlertStreamHandler }
);

my $response = $browser->get(
        $url,
        ':content_cb'     => \&raw_handler,
        ':read_size_hint' => 1024,
);

sub raw_handler {
    my ( $data, $response ) = @_;
    unless ( $data =~ /^--boundary/ ) {
        $twig->parse($data);
    }
}

sub AlertStreamHandler {
        my ( $twig, $eventAlert ) = @_;
        my $eventIP    = $eventAlert->first_child("ipAddress")->text;
        my $eventDate  = $eventAlert->first_child("dateTime")->text;
        my $eventType  = $eventAlert->first_child("eventType")->text;
        my $eventState = $eventAlert->first_child("eventState")->text;

        #print "$eventDate $eventIP $eventType $eventState";
        if ($eventType eq "linedetection") {
                if ($eventState eq "active") {
                        print "ausgelöst...\n";
                } else {
                        print "nicht ausgelöst.\n";
                };
        };

        $twig->purge;  # delete the twig so far. Not sure if this is needed.
}


Als Event wird folgendes übertragen:
<EventNotificationAlert version="2.0" xmlns="http://www.hikvision.com/ver20/XMLSchema">
<ipAddress>xxx.xxx.xxx.xxx</ipAddress>
<portNo>xxx</portNo>
<protocol>HTTP</protocol>
<macAddress>xx:xx:xx:xx:xx:xx</macAddress>
<channelID>1</channelID>
<dateTime>2017-06-02T18:13:39+01:00</dateTime>
<activePostCount>1</activePostCount>
<eventType>linedetection</eventType>
<eventState>active</eventState>
<eventDescription>linedetection alarm</eventDescription>
</EventNotificationAlert>
--boundary


Wenn ich das richtig sehe, dann wäre für ein Modul die Nutzung von SubProzess notwendig, da der Stream ja kontinuierlich empfangen werden muss, um kein Event zu verlieren. Das scheint mir alles andere als trivial. Gibt es ne gute Möglichkeit solche Entwicklungen zu machen und zu testen? Vorzugsweise IDE auf dem Mac :)
NUC-I37100
Docker: eBus, fhem, ha-bridge, unifi
Hardware: Homematic, FS20, Somfy RTS, 1wire, FBAHA, enOcean

Tomk

Hallo distel,

das hört sich doch schon mal gut an... zumindest ein erster Schritt. Ich bin auch weiterhin sehr interessiert an einer Lösung, kann aber wahrscheinlich wenig dazu beitragen. Halt mich/uns auf dem laufenenden!

Danke!

distel

Hallo,

ich werde nicht weiter in die Implementierung eines fhem-Modules investieren. Ich habe im Netz "hiki" https://github.com/refinitive/hiki gefunden. Das basiert auf node.js. hiki läuft separat (auch als Docker-Container) und bietet zudem die Möglichkeit, gleich auch eine Aufzeichnung zu starten. Die Implementierung ist etwas "rudimentär", dafür aber auch simpel genug, um es schnell zu verstehen.

Für meine Bedürfnisse sind noch ein paar Anpassungen notwendig (z.B. Unterstützung des Line-Crossing Alarms). Mal schauen, ob ich forke oder versuche es im Original unterzubringen.


Gruß Dirk

PS: bei Start und Ende eines Events kann man ein Shell-Commando absetzen lassen, über dass man dann fhem triggern kann.
NUC-I37100
Docker: eBus, fhem, ha-bridge, unifi
Hardware: Homematic, FS20, Somfy RTS, 1wire, FBAHA, enOcean

mani

Hallo Distel,

möchte auch die Bewegungserkennung meiner HikvisionCam in Fhem verwenden...habe auch schon verschiedenstes probiert aber es scheint nur mit mit der alertStream Url zu laufen >:(
Wie hast du das nun Umgesetzt?




Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

EinEinfach

Habe auch eine Hikvision + fhem auf einem RPI.
Meine Lösung der Bewegungsüberwachung ist:
- Auf dem RPI läuft ein FTP-Server
- Beim Triggern eines Events lädt die Hikvision Bilder auf den FTP Server hoch
- FHEM überwacht, ob es was neues in dem FTP-Ordner gibt, kommt ein neues Bild dazu so löst ein DOIF aus mit einer entsprechenden Meldung per Telegramm + JPEG aus.
- DOIF wird nur Nachts und wenn niemand zu Hause ist aktiviert.

Größtenteils nach dieser Anleitung umgesetzt:
https://haus-automatisierung.com/hardware/fhem/2016/07/14/fhem-tutorial-reihe-part-11-benachrichtigung-mit-bild-bei-bewegung.html

Gruß
Alexander
fhem auf Intel NUC6CAYH mit Proxmox im LXC (Debian 10), KNX mit knxd über MDT SCN-IP000.02, Buderus GB192-15i über KM100, Solaredge WR SE9K über Modbus-TCP

mani

Hallo Alexander,

Jop das hört sich ja schon gut an :)

Würde das auch gehen wenn der zu überwachen de Ordner auf einem NAS liegt?


Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

EinEinfach

ZitatWürde das auch gehen wenn der zu überwachen de Ordner auf einem NAS liegt

Ich denke schon.
fhem auf Intel NUC6CAYH mit Proxmox im LXC (Debian 10), KNX mit knxd über MDT SCN-IP000.02, Buderus GB192-15i über KM100, Solaredge WR SE9K über Modbus-TCP