Komplexeres Ereignis mit DOIF oder doch lieber anders ?

Begonnen von visionsurfer, 02 November 2016, 19:35:24

Vorheriges Thema - Nächstes Thema

visionsurfer

Hallo,

ich plane gerade meine erste größere "Geschichte" zu realisieren. Für Profis wahrscheinlich eine Kleinigkeit. Für mich fast wie ein Schritt auf den Mond.

Ziel:
1a.: Ich möchte ein Bild von meiner IP Kamera an der Haustür auf mein Handy per Pushnachricht bekommen, wenn jemand an der Tür klingelt.
1b.: Ich möchte das automatisch das Andoird Wand Tablet sich anschaltet und mir ein Bild von der Kamera anzeigt, wenn jemand an der Tür klingelt.

Was ich bisher getan habe:
Alle möglichen Geräte und Devices in FHEM installiert.
- Fritzbox
- Callmonitor von Fritzbox
- AMAD2
- Nexus 7 Tablet
- IPCAM
- Pushsafer

Alles ist getestet und funktioniert einzeln. Zusätzlich hab ich ein TKS-IP Gateway. Damit hab ich ein SIP Verbindung zur Fritzbox herstellen können. Wenn jetzt also jemand an der Tür klingelt, dann klingeln auch alle meine Telefone, die mit der Fritzbox verbunden sind. Als Rufnummer, wird die Nummer 100 angezeigt, welche ich vorher angelegt habe. Das TKS-IP Gateway ruft quasi meine Fritzbox an.

Wie will ich vorgehen:
Wenn ich es richtig verstanden habe, muss ich ja die Readings auslesen ? Im Reading vom Callmonitor sehe ich z.B. das die Nummer 100 anruft. Mit dem GET Befehl der IPCAM bekomme ich ein aktuelles Livebild als JPG in einem Verzeichnis gespeichert. Mit AMAD2 kann ich mein Nexus7 Tablet dazu bringen eine bestimmte URL (URL mit dem JPG Bild) in einem Browser zu öffnen. Mit Pushsafe kann ich mir ein Bild per Push schicken lassen. Soweit gut, oder ?

Formel in der Theorie:
Wenn in FHEM Callmonitor die Nummer 100 aktiv anruft und im Reading erkannt wird (passiert dann, wenn man draußen auf die Klingel drückt), dann hole per GET ein aktuelles Livebild von der IP Kamera und schicke es per Pushnachricht auf das Handy oder öffne URL im Tablet mit dem Bild.

Soweit die Einleitung :)

Das mach ich am besten mit einem DOIF, oder ?

Grüße,
Visionsurfer



visionsurfer

Hi,

also ich hab mich nun mal damit probiert. Grundsätzlich hoffe ich, dass es der Weg in die richtige Richtung ist.
So hab ich es realisiert:

define tuerstation DOIF ([callmonitor:event] eq "ring")(get mobotix image)(set TabletNexus screen on)(set TabletNexus openURL http://192.168.178.49:8086/fhem/www/snapshots/mobotix_snapshot.jpg)

Es funktioniert alles wie gewünscht. Ich klingel an der Tür, das Tablet geht an und der Browser wird gestartet und auch ein Bild angezeigt.

ABER....leider nicht das aktuelle. Es wird immer die letzte Aufnahme angezeigt. Das neue Bild muss aber schon auf dem Server liegen, weil wenn ich im Browser "aktualisieren" anklicke, kommt sofort das gerade frisch gemachte Bild.

Ich dachte dann, dass ich vielleicht so Abhilfe bekomme:

attr tuerstation wait 0,1,4

Bis das es dann natürlich etwas länger dauert, hilft es aber überhaupt nicht.

Hier mein List:


Internals:
   CFGFN
   DEF        ([callmonitor:event] eq "ring")(get mobotix image)(set TabletNexus screen on)(set TabletNexus openURL http://192.168.178.49:8086/fhem/www/snapshots/mobotix_snapshot.jpg)
   NAME       tuerstation
   NR         17190
   NTFY_ORDER 50-tuerstation
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2016-11-02 22:32:48   Device          callmonitor
     2016-11-02 22:32:48   cmd             2
     2016-11-02 22:32:48   cmd_event       callmonitor
     2016-11-02 22:32:48   cmd_nr          2
     2016-11-02 22:32:48   e_callmonitor_event disconnect
     2016-11-02 22:32:48   state           cmd_2
     2016-11-02 22:32:30   wait_timer      no timer
   Condition:
     0          ReadingValDoIf($hash,'callmonitor','event','','',AttrVal($hash->{NAME},'notexist',undef)) eq "ring"
   Devices:
     0           callmonitor
     all         callmonitor
   Do:
     0:
       0          get mobotix image
       1          set TabletNexus screen on
       2          set TabletNexus openURL http://192.168.178.49:8086/fhem/www/snapshots/mobotix_snapshot.jpg
     1:
   Helper:
     event      event: disconnect,external_number: ***123,call_duration: 0,missed_call: ***123,external_name: unknown,direction: incoming,internal_number: 100,external_connection: SIP2,call_id: 0
     globalinit 1
     last_timer 0
     sleepdevice callmonitor
     sleepsubtimer -1
     sleeptimer -1
     timerdev   callmonitor
     timerevent event: disconnect,external_number: ***123,call_duration: 0,missed_call: ***123,external_name: unknown,direction: incoming,internal_number: 100,external_connection: SIP2,call_id: 0
     triggerDev callmonitor
     timerevents:
       event: disconnect
       external_number: ***123
       call_duration: 0
       missed_call: ***123
       external_name: unknown
       direction: incoming
       internal_number: 100
       external_connection: SIP2
       call_id: 0
     timereventsState:
       event: disconnect
       external_number: ***123
       call_duration: 0
       missed_call: ***123
       external_name: unknown
       direction: incoming
       internal_number: 100
       external_connection: SIP2
       call_id: 0
     triggerEvents:
       event: disconnect
       external_number: ***123
       call_duration: 0
       missed_call: ***123
       external_name: unknown
       direction: incoming
       internal_number: 100
       external_connection: SIP2
       call_id: 0
     triggerEventsState:
       event: disconnect
       external_number: ***123
       call_duration: 0
       missed_call: ***123
       external_name: unknown
       direction: incoming
       internal_number: 100
       external_connection: SIP2
       call_id: 0
   Internals:
   Itimer:
   Readings:
     0           callmonitor:event
     all         callmonitor:event
   Regexp:
     0:
     All:
   State:
   Trigger:
Attributes:
   room       Geräte
   wait       0,1,4


Hat noch jemand einen Tipp wie ich das richtige Bild angezeigt bekomme.

Hier noch die List von meiner IPCAM, falls es wichtig ist:


Internals:
   AUTHORITY  192.168.178.225
   DEF        192.168.178.225
   NAME       mobotix
   NR         368
   SEQ        0
   STATE      last: 2016-11-02 22:32:25
   TYPE       IPCAM
   Readings:
     2016-11-02 22:32:25   last            mobotix_snapshot.jpg
     2016-11-02 22:32:25   snapshot1       mobotix_snapshot_1.jpg
     2016-11-02 22:32:25   snapshots       1
Attributes:
   path       record/current.jpg
   room       Geräte
   storage    ./www/snapshots


Keine Ahnung, ob meine Vorgehensweise der richtige Weg ist.
Würde mich riesig über Hilfe freuen.

Grüße,
Visionsurfer

errazzor

#2
Wie filterst Du in deinem DOIF auf die Nummer 100? Reagiert es momentan nicht auf alle Anrufe?

Ich denke so sollte es gehen,falls die FB den Anruf als externen Ruf erkennt (interne gehen eigentlich nicht)


define tuerstation DOIF ([callmonitor:event] eq "ring" and [callmonitor:external_number] eq "100")(get mobotix image)(set TabletNexus screen on)(set TabletNexus openURL http://192.168.178.49:8086/fhem/www/snapshots/mobotix_snapshot.jpg)


Wenns ein interner Ruf ist müsstest Du die Türsprechstelle so umkonfigurieren, dass ein SIP-Call ausgelöst wird.

visionsurfer

Hi,

Ja die Nummer 100 ist der Anruf von meiner Türstation. Der Anruf ist als Sipcall definiert und wird meiner Meinung im Callmonitor richtig angezeigt. Also ich sehe die Nummer und auch Ring.

Werde das noch so wie von dir beschrieben erweitern.

Mein Hauptproblem ist eher, das ich nicht das aktuelle Bild angezeigt bekomme. Immer nur das Bild von davor. Das Aktuelle Bild muss aber schon auf dem Server liegen. Weil wenn ich im gestarteten Browser reload mache, kommt es sofort.

Und ich hab ja schon eine Verzögerung drin.

Noch jemand eine Idee?

visionsurfer

Moin,

ich habe mir das Reading vom Callmonitor noch mal angeschaut. Also die externe Nummer wird nicht angezeigt. Aber ich kann meiner Meinung mit der internen Nummer arbeiten. Weil ich hab ja extra die interne Nummer 100 für die Türstation eingerichtet. Ich hab mal von einem Handy angerufen und dann steht dort ja die andere Nummer. Also müsste sauber laufen.

Nur das Problem mit dem Bild kriege ich nicht hin.

Ich habe heute früh 3 Tests gemacht. 2 mal wurde das richtige Bild angezeigt und beim 3. Test wurde das Bild von Test 2 angezeigt.

Grüße,
Visionsurfer

Brockmann

Zitat von: visionsurfer am 03 November 2016, 09:10:48
Ich habe heute früh 3 Tests gemacht. 2 mal wurde das richtige Bild angezeigt und beim 3. Test wurde das Bild von Test 2 angezeigt.
Das deutet ja eher auf ein Timing-Problem hin. Ich denke, Du unterschätzt vielleicht die Zeit, die es braucht, bis das Bild übertragen und gespeichert wurde. Erhöhe die Wartezeit doch mal auf 10 Sekunden.

Was das Tablet angeht: Ich habe das bei mir mit einer App ("IP Cam Viewer Lite", aber es gibt auch andere) gelöst. Die zeigt ein Livebild der Kamera an.
Die App kann sogar ein Widget mit dem Livebild anzeigen. Das habe ich auf einer eigenen Startseite zusammen mit einem Button zum Öffnen der Tür. Wenn es klingelt, wechselt das Tablet einfach für x Sekunden auf diese Startseite und geht dann automatisch wieder zur Standardseite zurück.

jmike

Anstatt einfach länger zu warten könntest du den "set TabletNexus openURL" Befehl auch aus dem DOIF rausnehmen.

Ich hab eine ähnliche Lösung, mit Foto aufs Handy ( und 30 Sekunden Live-Video auf dem Tablet/Control Terminal ).

Wenn geklingelt wird löse ich aber nur ein Foto aus welches dann das Reading "last" des IPCAM Devices aktualisiert.
Auf dieses Event wartet ein weiterer Zweig des DOIF (oder notify oder was auch immer) und schickt es ans Handy - oder in deinem Fall über AMAD.

Somit hast du keine racing-conditions oder statische Wartezeiten sondern eine Verkettung der Ereignisse.



errazzor

Auch wenn es mit deinem problem nichts zu tun hat - könntest Du mal beschreiben, wie Du die SIP-Verbindung (SIP Call) zur Fritzbox eingerichtet hast?

Ich bekomme das bei mir nicht hin.

visionsurfer

Hi,

also es stellt sich wohl immer mehr raus, das es eigentlich überhaupt kein Problem vom Timing oder vom DOIF ist, sondern eher Cache Problem vom Browser auf dem Tablet.
Ich habe jetzt den Fully Browser installiert und damit gibt es 1. viele weitere Möglichkeiten und 2. scheint der nicht so stark zu cachen wie der Chrome Browser auf dem Tablet.

Zusätzlich wie @Brockmann beschrieben, hab ich auch mal eine IP Cam App installiert. Die zeigt mir nun auch ein Live Bild von meiner Kamera an. Ich kann also quasi von AMAD auch direkt die App öffnen lassen, wenn es klingelt. Keine Ahnung, irgendwie finde ich das im Browser aber besser.

@jmike
Könntest du dazu noch mal was sagen ? Wie schickst du das Foto auf dein Handy ? Mit welchen Pushdienst ? Ich hab jetzt meinen DOIF sogar noch erweitert und lasse mir auch am Ende noch das letzte aktuelle Foto auf das Handy schicken. Ich nutze Pushsafer. Das klappt auch, aber ich muss halt immer erst die App starten, das ich dann auch das Bild sehe. Den Text sehe ich in der Vorschau im Iphone. Aber leider nicht das Bild.

@Errazzor
Also ich nutze von Gira ein TKS-IP Gateway. Damit kann ich quasi einen SIP Call auslösen.
In der Fritzbox hab ich mir die Nummer 100 angelegt. Dort kann ich ja dann auswählen, das ich damit ein SIP Provider nutzen möchte. Als Provider habe ich einfach "other" ausgewählt. Dann dort ein Passwort vergeben und als Gateway die IP Adresse von meinem TKS-IP Gateway eingetragen.

Im TKS-IP Gateway hab ich dann als Benutzername die 100 eingetragen und Passwort, halt das Passwort was ich vorher bestimmt habe und schon haben die sich verbunden. Mit dem Callmonitor in FHEM lasse ich jetzt die Nummer 100 überwachen. Klappt aus meiner Sicht sehr gut.

Grüße,
Visionsurfer

Per

Zitat von: visionsurfer am 04 November 2016, 11:54:03sondern eher Cache Problem vom Browser
Sehe ich auch so.
Folgende Ansätze:
- dem Browser ein Aktualisieren schicken "set TabletNexus openURL javascript:location.reload()"
- dem Dateinamen einen Datumsstempel anhängen (Bsp: "mobotix_snapshot_2016_11_04_12_17_25.jpg"), dazu müsstest du den genauen Namen aber zum Zeitpunkt des Aufrufes kennen. Oder raten (aufgrund der aktuellen Zeit und dem "Wait" und so).
- statt des Bildes eine html-Seite mit Meta -> nocache aufrufen (ungetestet!).
- eine Website mit JavaScript laden, welche das Bild ungecached lädt
- statt des Bildes den Livestream schicken, da intern interessiert die Last ja nicht
- den Browser austrixen: "mobotix_snapshot.jpg?nix=2016_11_04_12_17_25" anbieten. Kann aber browserabhängig auch nicht klappen.

Letzteres wäre mein Favorit!

visionsurfer

Hi,

@Per
Geht sowas echt ? set TabletNexus openURL javascript:location.reload()

Weil das wäre ja eigentlich die Lösung. Ich lasse im meiner Befehlsreihenfolge einfach am Ende noch mal diesen Set Befehl laufen und schon wären alle Probleme gelöst. Er macht dann einfach ein Reload.
Wobei ich jetzt, wo ich gerade drüber nachdenke, nicht weiß wie es sich verhält. Weil ich will ja kein neues Browserfenster öffnen, sondern das schon geöffnete (durch das SET mit der URL davor), einfach reloaden. Kein neues.

Das mit dem Livestream wäre auch ne Möglichkeit. Meine Mobotix Kamera kann ziemlich viele HTTP Befehle. Muss ich mir mal raussuchen. Eventuell sogar eine kleine eigene fix und fertige HMTL Seite ? Keine Ahnung. Muss ich mal schauen.

Wie gesagt nutze ich jetzt den Fully Browser. Da kann man ja auch ziemlich krass viel einstellen. Da gibt es auch mehrere reload und cache Optionen. Muss ich mich auch erst mal durcharbeiten, welcher der Beste weg ist. Heute morgen hat es bei 3 Tests hintereinander ohne Probleme funktioniert. Es wurde immer das aktuelle Bild angezeigt. Im Fully kann man auch einstellen, dass er immer den Cache löschen soll, wenn er geschlossen wird. Jetzt muss ich nur noch rausfinden, wie ich den Browser einfach nach 2 Minuten oder so wieder automatisch schließen lassen kann.

Klar HMTL Seite würde wahrscheinlich auch alle Probleme lösen. Aber die müsste ich erst mal erstellen, dann irgendwie und irgendwo auf den Raspberry kopieren usw. Da bin ich noch nicht firm drin.

Grüße,
Visionsurfer

Per

Zitat von: visionsurfer am 04 November 2016, 13:00:55Geht sowas echt ?
Wenn der Browser JS-fähig ist und sich einigermaßen an die Regeln hält, ja.

visionsurfer

na ja, sollte der Fully Browser und auch Chrome ja eigentlich können. Werde ich heute Abend ausprobieren.
Danke.

Brockmann

Wenn es wirklich auf Caching-Probleme hinausläuft, stell das IPCAM-Modul um, so dass es einen Timestamp an die Dateinamen anhängt. Im Reading "last" kannst Du dann immer die genaue Bezeichnung der letzten Aufnahme auslesen und das dann im Browser anzeigen. Dann sollte der Cache keinen Ärger machen.
Einziger Nachteil: Du musst Dich selbst drum kümmern, dass die ganzen Bilddateien ab und zu gelöscht werden.

Per

Teste doch mal bitte diese Vatiante:
Zitat von: Per am 04 November 2016, 12:31:29- den Browser austrixen: "mobotix_snapshot.jpg?nix=2016_11_04_12_17_25" anbieten. Kann aber browserabhängig auch nicht klappen.
Habe leider gerade kein gecachtes Bild zum selbst Testen :(.