Frage: Einbindung zoneminder

Begonnen von deune, 02 März 2015, 17:41:16

Vorheriges Thema - Nächstes Thema

deune

Hallo fhem - Gemeinde,

hat das schon mal jemand geschafft - die Einbindung von zoneminder, um events im zoneminder in fhem notify´s auszulösen?

Es gab vor einiger Zeit ein ähnliches Thema, allerdings damals ohne Ergebnis.

Kurzum, ich habe nun einige Kameras um das Haus installiert und möchte in Abhängigkeiten von anderen Eigenschaften im fhem schalten bzw. nicht schalten.

Herzliche Grüße aus der Eifel

Holger

Shax

Hallo deune!

Genau das gleiche Suche ich gerade auch. Ich bin kein Freund von nur Standbildern speichern.
In Zoneminder kann ich die Ereignisse ja nach Motion Detection aufnehmen lassen und ansehen.

Eine Verbindung mit FHEM und dadurch Profile auslösen wäre cool, aber ich glaube das ist eine ganze Menge Arbeit das umzusetzen.

Ich versuche gerade ein Modul zu schreiben, welches reagiert wenn Zoneminder ein Ereignis auslöst. Ich will dadrüber eine Aussenlampe
schalten. Mal sehen ob es klappt ;)

Grüße
Shax
Raspberry Pi2 mit CUL SCC 1.2 - Raspberry Pi2 CUL SCC 2.0 - Raspberry Pi 3 mit RPI-RF-MOD - Raspberry Pi Relaissteuerung für Gartenstrom

deune

Hallo Shax,

es freut mich einen Ideengenossen gefunden zu haben, leider bin ich total unbegabt Code zu schreiben,
habe es einige Male versucht - liegt mir einfach nicht.

Was ich aber total gut kann, ist versch. Sachen zu puzzeln, vielleicht hilft Dir folgender Link (ist sogar perl Code):

http://www.zoneminder.com/wiki/index.php/FAQ#How_can_I_use_ZoneMinder_to_trigger_something_else_when_there_is_an_alarm.3F

Sieht so aus, als ob man dieses kleine Programm starten und eine fhem Eigenschaft  mit z.B.
fhem.pl <fhemhost>:7072 "<command>..." (Aus fhem commandref) ändern kann.
Bewegungsmelder aus der Homematic Serie funktionieren auch so, diese setzen auch nur die Motion readings, ein "unmotion" gibt es nicht.

Liebe Grüße aus der Eifel
Holger

Shax

Hier schonmal ein paar Codeschnipsel auf denen ich aufbaue:

sub
Control_ZM()
{

my $sock = new IO::Socket::INET (
                PeerAddr => '127.0.0.1',
                PeerPort => '6802',
                Proto => 'tcp',
                 );
die "Could not create socket: $!\n" unless $sock;
print $sock "6|on+60|250|alarm|TEST|test\n";
close($sock);

}

define zmevent notify ALARM:on.*  {fhem "set BLABLA on";; fhem "set BEFEHL off";;fhem "set BLUBB off";; Control_ZM}
Raspberry Pi2 mit CUL SCC 1.2 - Raspberry Pi2 CUL SCC 2.0 - Raspberry Pi 3 mit RPI-RF-MOD - Raspberry Pi Relaissteuerung für Gartenstrom

linusd

Hallo zusammen,

sollte das Thema bei Euch noch aktuell sein würde ich mich beteiligen.

Fhem löst eine Aufzeichnung im zmServer aus:
Bist Du mit Deinem Codeshnipsel weiter gekommen Shax?

Ich habe es vorerst mit einem shell-script umgesetzt.

  • fhem ruft das Script auf wenn ein Bewegungsmelder auslöst
  • Script schickt ein entsprechendes tcp-paket an meinen zmServer
FHEM

define notifyZMRecordUG notify bewegungTreppeUG {system('/opt/fhem/zmControl.sh&');;}


Shell-Script (zmControl.sh)

#!/bin/bash
# monitor#|action|priority|Cause|text|showtext where
#Aufzeichung im Arbeitszimmer für 30 Sekunden starten
echo '5|on+30|1|Bewegung UG|Bewegungsmelder' > /dev/tcp/<zmSetverIP>/6802


Ein notify wird im fhem ausgelöst wenn eine Aufzeichnung im zmServer stattgefunden hat
Hierzu hat Deune schon den richtigen Hinweis gefunden!
how-can-i-use-zoneminder-to-trigger-something-else-when-there-is-an-alarm
Im Grunde muss nur z.B. zyklisch das angegebene SQL abgesetzt und auf das Ergebnis reagiert werden.

Ich werde zunächst mit einem shell-Script und cron eine Pushnachricht mit Pushover an meine Phone senden wenn jemand vor der Tür steht! ;)
Eine Aktion in fhem ließe sich dann zwar auch mit dem Script auslösen, aber eine direkte Einbindung wäre natürlich schicker!

Vielleicht wird ja ein offizielles Modul draus! 8)

Meine Ergebnisse werde ich natürlich hier bereitstellen!

Gruß
Christian

Shax

Ich hab komplett gewechselt zu Synology Surveillance. Zoneminder hat bei mir noch andere Probleme gemacht ;)
Raspberry Pi2 mit CUL SCC 1.2 - Raspberry Pi2 CUL SCC 2.0 - Raspberry Pi 3 mit RPI-RF-MOD - Raspberry Pi Relaissteuerung für Gartenstrom

MadMax

Hallo,

ist zwar schon etwas älter aber ich habe mich damite heute mal befasst.
Ich höle mit das letzte Event mit der Startzeit und kann dann dort mit einem Notify drauf reagieren.
Hier mal mein Code wenn es jemand braucht.

+*00:00:10 {

use DBI;

my ($db_user, $db_name, $db_pass) = ('user', 'zm', 'pass');

my $dbh = DBI->connect("DBI:mysql:database=zm", $db_user, $db_pass);

my $query_test = $dbh->prepare('SELECT StartTime FROM Events ORDER BY Id DESC LIMIT 1');

$query_test->execute() or die $query_test->err_str;

fhem("set ZM_Event off");

while (my ($StartTime) = $query_test->fetchrow_array() ) {

fhem("set ZM_Event ".$StartTime);
}

$dbh->disconnect();

}


gruß
Max
Lenovo M910Q Tiny Debian 12, FHEM 6.3, 2x Siemens Logo 0BA7, Homematic CCU3, Philips HUE, 5x SMA Wechselrichter, BYD HVM, SMA EVCharger, Daikin Wärmepumpe über CAN

Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/MadMax

Ma_Bo

Zitat von: linusd am 13 März 2016, 21:09:56
Hallo zusammen,

sollte das Thema bei Euch noch aktuell sein würde ich mich beteiligen.

Fhem löst eine Aufzeichnung im zmServer aus:
Bist Du mit Deinem Codeshnipsel weiter gekommen Shax?

Ich habe es vorerst mit einem shell-script umgesetzt.

  • fhem ruft das Script auf wenn ein Bewegungsmelder auslöst
  • Script schickt ein entsprechendes tcp-paket an meinen zmServer
FHEM

define notifyZMRecordUG notify bewegungTreppeUG {system('/opt/fhem/zmControl.sh&');;}


Shell-Script (zmControl.sh)

#!/bin/bash
# monitor#|action|priority|Cause|text|showtext where
#Aufzeichung im Arbeitszimmer für 30 Sekunden starten
echo '5|on+30|1|Bewegung UG|Bewegungsmelder' > /dev/tcp/<zmSetverIP>/6802


Ein notify wird im fhem ausgelöst wenn eine Aufzeichnung im zmServer stattgefunden hat
Hierzu hat Deune schon den richtigen Hinweis gefunden!
how-can-i-use-zoneminder-to-trigger-something-else-when-there-is-an-alarm
Im Grunde muss nur z.B. zyklisch das angegebene SQL abgesetzt und auf das Ergebnis reagiert werden.

Ich werde zunächst mit einem shell-Script und cron eine Pushnachricht mit Pushover an meine Phone senden wenn jemand vor der Tür steht! ;)
Eine Aktion in fhem ließe sich dann zwar auch mit dem Script auslösen, aber eine direkte Einbindung wäre natürlich schicker!

Vielleicht wird ja ein offizielles Modul draus! 8)

Meine Ergebnisse werde ich natürlich hier bereitstellen!

Gruß
Christian

Hallo Christian, kannst du mir ein wenig zu den Parametern sagen ?

Zitatecho '5|on+30|1|Bewegung UG|Bewegungsmelder' > /dev/tcp/<zmSetverIP>/6802

Ich habe fhem auf einem Raspberry und möchte, wenn dort eine Bewegung über einen Bewegungsmelder gemeldet wird, auf einem anderen Rechner (NUC) auf dem Zoneminder läuft, eine Aufnahme starten und wieder stoppen.

Grüße Marcel
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

Ma_Bo

Ok, hat sich erledigt, wer lesen kann ist klar im Vorteil...  ::)
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

Ma_Bo

Gibt es irgendwo eine Übersicht, welche Parameter alle möglich sind...?


Gesendet von iPhone mit Tapatalk
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

Ma_Bo

#10
Vielleicht kann mir jemand helfen,

ich bekomme folgendes im LOG angezeigt, wenn ich das define notifyZMRecordUG notify bewegungTreppeUG {system('/opt/fhem/Zoneminder/zmControl.sh&');;} ausführe:

/opt/fhem/Zoneminder/zmControl.sh: connect: Connection refused
/opt/fhem/Zoneminder/zmControl.sh: line 4: /dev/tcp/192.168.178.126/6802: Connection refused


Bei Zoneminder (v1.26.5) habe ich unter Optionen den Punkt OPT_TRIGGERS aktiviert.
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

clumsy

hallo

falls jemand interessiert ist, ich habe Zoneminder ebenso ins FHEM eingebunden. Die einzelnen Cams (Status etc.) via HTTPMOD und ein kleinen externen Perl-Daemon geschrieben, welcher einerseits auf den Zoneminder Port (zmtrigger) connected um die Events in echtzeit mitzukriegen und diese dann umwurstelt und an das FHEM weitergibt, resp ein "get" der Kamera auslöst damit diese wieder den aktuellen Status hat.

Bei interesse kann ich die Codeschnipsel auch posten.

ernie0124

Ich wäre interessiert.

Das wäre superlieb.

clumsy

also hier mal ein paar codeschnipsel... ich versuche meine gedanken dahinter ein wenig zu erklären, wird aber wohl nicht möglich sein ohne anpassungen zu übernhemen.. also FHEM kenntnisse sind nicht nur von vorteil, sondern wohl nötig ;)

HTTPMOD define für eine ZM kamera:

  • das ZM API muss aktiviert sein. ebenso die ZMTrigger option.
  • <ZMUSER> ist ein ZM user der lesende berechtigungen hat auf den entsprechenden monitor und modify bei den systemberechtigungen. <ZMPASS> das passwort dazu. werde ich bei gelegenheit mal in replacments umbauen.
  • <zm.domain.com> ist der ZM FQDN. werde ich bei gelegenheit mal in replacments umbauen um redundanz loszuwerden.
  • das attribut "replacement01Value" muss auf die entsprechende MonitorId gesetzt werden (in diesem Beispiel die 27), danach wirds in den URL's automatisch richitg ersetzt.
  • das attribut "url" ist lediglich als "hint" resp an anderen orten weiter zu verwenden und definiert den pfad zum livebild (ich zeige das im FLOORPLAN an), wird hier nicht benötigt!
  • folgende readings werden im moment ausgelesen: alarm, enabled, function, presence, status, statustext. wobei presence via userattr gesetzt wird (present, absent, unknown, disabled).
  • als set befehl ist im moment lediglich enable mit den werten 0|1 implementiert, um die kamera im ZM zu aktivieren/deaktivieren (motion detection)


define http_zm_27 HTTPMOD none 20
attr http_zm_27 userattr get01Name get01Poll:0,1 get01PollDelay get01PollDelay:0,1 get01URL get02ExtractAllJSON:0,1 get02MaxAge get02Name get02Poll:0,1 get02URL get03JSON get03Name get03Poll:0,1 get03URL get04-1Name get04-2Name get04JSON get04Name get04Poll:0,1 get04URL readi
ng02MaxAge reading02MaxAgeReplacement replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value set01Data set01IMap set01Name set01URL sid1URL url
attr http_zm_27 alias Meine_Cam
attr http_zm_27 devStateIcon present:it_camera@0CFB0C absent:it_camera@E50005
attr http_zm_27 enableCookies 1
attr http_zm_27 event-on-update-reading .*
attr http_zm_27 get02ExtractAllJSON 1
attr http_zm_27 get02Name status
attr http_zm_27 get02Poll 1
attr http_zm_27 get02URL https://<zm.domain.com>/zm/api/monitors/daemonStatus/id:%%zm_id%%/daemon:zmc.json
attr http_zm_27 get03JSON status
attr http_zm_27 get03Name alarm
attr http_zm_27 get03Poll 1
attr http_zm_27 get03URL https://<zm.domain.com>/zm/api/monitors/alarm/id:%%zm_id%%/command:status.json
attr http_zm_27 get04-1Name enabled
attr http_zm_27 get04-2Name function
attr http_zm_27 get04JSON (monitor_Monitor_Enabled)|(monitor_Monitor_Function)
attr http_zm_27 get04Name Monitor
attr http_zm_27 get04Poll 1
attr http_zm_27 get04URL https://<zm.domain.com>/zm/api/monitors/%%zm_id%%.json
attr http_zm_27 group camera
attr http_zm_27 icon it_camera
attr http_zm_27 reAuthRegex "code": 401
attr http_zm_27 reading02MaxAge 10
attr http_zm_27 reading02MaxAgeReplacement 0
attr http_zm_27 replacement01Mode text
attr http_zm_27 replacement01Regex %%zm_id%%
attr http_zm_27 replacement01Value 27
attr http_zm_27 set01Data Monitor[Enabled]=$val
attr http_zm_27 set01IMap 0:0,1:1
attr http_zm_27 set01Name enable
attr http_zm_27 set01URL https://<zm.domain.com>/zm/api/monitors/%%zm_id%%.json
attr http_zm_27 sid1URL https://<zm.domain.com>/zm/index.php?username=<FHEMUSER>&password=<FHEMPASS>&action=login&view=console
attr http_zm_27 sortby 010
attr http_zm_27 stateFormat { return "present" if ((ReadingsVal("$name","statustext", undef) =~ "running") && (ReadingsVal("$name","status",undef) eq "1"));; return "absent" }
attr http_zm_27 timeout 5
attr http_zm_27 url /cgi-bin/nph-zms?mode=jpeg&scale=50&maxfps=10&buffer=1000&monitor=27&user=<FHEMUSER>&pass=<FHEMPASS>
attr http_zm_27 userReadings presence { return "absent" if (ReadingsVal("$name","function",undef) eq "none");; \
        return "disabled" if (ReadingsVal("$name","enabled", undef) eq "0");; \
        return "present" if ((ReadingsVal("$name","statustext", undef) =~ "running.*pid = [0-9]*") && (ReadingsVal("$name","status",undef) eq "1"));; \
        return "unknown" }


dann habe ich noch einen kleinen ZM zu FHEM perl-daemon geschrieben (sorry für meine schwachen programmierkentnisse...) der aktiv auf events vom ZM hört und diese an FHEM als "get" request weitergibt, so dass alarme in echtzeit im FHEM abgebildet werden und z.b. im FLOORPLAN angezeigt werden können (z.b. via ValueIcon und longpoll).

hier muss evtl. die Zeile:
$msg = sprintf("get http_zm_%d alarm\n", $id);
angepasst werden wenn die "definition" andere namen als "http_zm_<id>" enthält...


#!/usr/bin/perl

use IO::Socket;
use IO::Interface qw(:flags);
use strict;
use Proc::Daemon;
use Proc::PID::File;

sub my_daemon(){
MAIN:
{
    # Daemonize
    Proc::Daemon::Init();

    # If already running, then exit
    if (Proc::PID::File->running()) {
        exit(0);
    }

    # Perform initializes here

my $buf;
my $id;
my $event;
my $date;
my $seq;
my $msg;
my $zm;
my $fhem;

print "starting\n";

sub open_zm() {
  while (!$zm || !$zm->connected()) {
    $zm = IO::Socket::INET->new(
      Proto    => 'tcp',
      PeerPort => 6802,
      PeerAddr => 'localhost',
    ) or sleep(5);
  }
}

sub open_fhem() {
  while (!$fhem || !$fhem->connected()) {
    $fhem = IO::Socket::INET->new(
      Proto    => 'tcp',
      PeerPort => 7072,
      PeerAddr => 'localhost',
    ) or sleep(5);
  }
}


while(1) {
    open_zm();

    print "opened\n";

    while($buf = <$zm>) {
      print "received: ".$buf;
      ($id, $event, $date, $seq) = split(/\|/, $buf);
      print "id: ".$id." event: ".$event." date:".$date." sequence: ".$seq;
      $msg = sprintf("get http_zm_%d alarm\n", $id);
      open_fhem();
      $fhem->send($msg);
    }

}
}
}

my_daemon();


gerne kann ich versuchen weitere hilfe zu leisten, wenns nicht klappen sollte... einfach hier posten...

und ich bin sicher man hätte das viel eleganter lösen können... ich nehm gerne tipps entgegen... aber immerhin funktionierts ;)

viel spass beim tüfteln...

STefan

mani

Hallo clumsy,

glaube das ist genau das was ich suche, möchte deine Codeschnipsel für Zoneminder gerne verwenden jedoch ist mir nicht ganz klar wo ich den Perldaemon abspeichern muss ???

bitte um hilfe


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