[98_AUTOREMOTE] - Modul für Tasker AutoRemote (Android)

Begonnen von vbs, 20 Mai 2017, 12:01:03

Vorheriges Thema - Nächstes Thema

vbs

Hier ein Modul, das Events von FHEM an Tasker weiterleitet. Dafür wird das Plugin AutoRemote in Tasker benötigt. Auf die Events kann dann in Tasker reagiert werden, um beliebige Aktionen auszulösen.

Das Modul wird in FHEM einmalig als Gateway-Device angelegt und es können dann Events an beliebig viele Tasker-Geräte weitergeleitet werden. Das Gerät wird so angelegt:
define arGateway AUTOREMOTE http://192.168.2.42:1817/
http://192.168.2.20:1817/,^sz_tabS:.*
http://192.168.2.28:1817/,^sz_z1:.*,sz_z1_pres
APA91bG9_9BcOAN66eLohI_iq9qyz45A61S4YcQzYJVyEPvU8BNiIfTRErbP92Yx5bNIOURmcWCRrsTXT5CG-kSPi0Bn_Gn7WR8vCOwrRHyhNnOi-gRZfKcu-v2wB35E4xauW8Y39uPT,sz_tabS


Das Format pro Zeile ist:

<ziel>[,<filter>[,<presenceDevice>]]


Wenn ein Ziel-Gerät mit "http://" anfängt, dann werden die Events direkt per HTTP an das entsprechende Gerät gesendet. Ansonsten werden die Nachrichten über den AutoRemote-Relay-Server gesendet. Das nutzt dann Google Cloud Messaging (GCM).

Im Ausgangszustand werden erstmal alle Events von FHEM an alle Targets geschickt. Es kann jedoch auch für jedes Target durch ein Komma getrennt eine Regular Expression angegeben werden, gegen die die Events für das jeweilige Target gefiltert werden (wie bei einem notify).
Außerdem gibt es das Attribut "stateFilter", bei dem ebenfalls ein Filter angegeben werden kann. Der stateFilter greift für alle Targets, für die kein eigener Filter definiert wurde.

Getrennt durch ein weiteres Komma kann der Name eines Presence-Device angegeben werden. Wenn vorhanden, dann wird vor Absenden einer Nachricht geprüft, ob besagtest Devices "present" ist und nur dann gesendet (danke für die Idee @Schlimbo).

Hier gibts auch eine Variante für TNES anstatt für AutoRemote:
https://forum.fhem.de/index.php/topic,54243.0.html



Ein Beispiel (Work in progress!)
Man möchte beispielsweise die Helligkeit des Displays eines Android-Tablets über FHEM steuern können.

Anlegen eines Dummies für das Tablet:
define myTablet dummy
attr myTablet event-on-change-reading brightness
attr myTablet readingList brightness
attr myTablet setList brightness


Anlegen des AutoRemote-Gateways, um die entsprechenden Events an das Android-Gerät weiterzuleiten (das gleiche Gateway kann später auch Events an andere Android-Geräte weiterleiten):
define autoRemote AUTOREMOTE http://192.168.2.42:1817/,myTablet

Wenn man nun beispielsweise in FHEM den Befehl "set myTablet brightness 200" eingibt, dann sollte das Event im Event-Monitor zu sehen sein und auch an das Tablet weitergeleitet werden.

Jetzt auf dem Android-Gerät in Tasker ein Event-Profil anlegen und AutoRemote auswählen. Dann folgenden Text als "Message Filter" eintragen und "Use Regex" aktivieren:
brightness\s(.*)=:=myTablet

Es können nun beliebige Aktionen ausgelöst werden (z.B. "Display Brightness"). Der Wert für "brightness" aus dem AutoRemote-Regex ist als Variable "%arpar2" verfügbar.


Update 28.07.2017 - II
-nochmals Fehler in sendRaw behoben, sorry (Danke @Schlimbo)

Update 28.07.2017
-Fehler in sendRaw behoben (Danke @Schlimbo)

Update 27.07.2017
-Filter per PresenceDevice hinzugefügt

Update 26.05.2017
-Senden von beliebigen Strings per "send_raw" (immer an alle Devices)

pjakobs

Cool, das muss ich mir ansehen. So viele Möglichkeiten, so wenig Zeit.

pj

Kurz da auf dem Telefon getippt


Schlimbo

Hallo vbs,

Danke für das Modul, habe es gerade mal ausprobiert. Der Eventfilter will nicht so ganz.
Mein Define sieht so aus:
define arGateway AUTOREMOTE http://192.168.2.20:1817/,Multimedia:.*
Jedoch kommen trotzdem noch alle anderen Events durch.
Erst das setzten von stateFilter schaffte hier Abhilfe.

Habe mir gerade auch mal TNES angesehen und muss sagen das gefällt mir sogar noch besser als AutoRemote. (Kostenlos, wenig Berechtigungen) Werde denke ich erst mal damit weiter experimentieren. :)

Gruß Schlimbo

PS: In deinem Beispiel Define fehlt noch der Modul Namen und das Attribut "globalStateFilter" gibt es nicht, dafür aber "stateFilter".

vbs

Danke für die Hinweise, hab es im Text korrigiert!

Hatte vorhin in den Code geguckt, um nochmal zu verstehen, wie das Modul funktioniert und da noch eine Sache gefunden, die ich für einen Fehler gehalten habe und direkt geändert habe. War natürlich Quatsch und vermutlich der Grund, warum bei dir der Filter nicht geht.  8)
Habe oben die Version nochmal geupdatet. Bitte damit nochmal testen, sollte eigentlich dann gehen.

Schlimbo

Danke, mit der Version geht's jetzt.
Aber mein obiger Filter lässt auch Events vom Device "PCA301_Multimedia" durch.
Könntest du dir das Regex hierfür noch mal ansehen?

vbs

Da musst du wahrscheinlich ein "^" an den Anfang setzen. Dann matcht es nur, wenn es am Anfang vorkommt:
^Multimedia:.*

Werde ich im ersten Post mal in die Beispiele einbauen... ich meine früher hat das FHEM-notify das "^" am Anfang implizit ergänzt und dann irgendwann nicht mehr, so dass ich dachte, dass es dann analog zu notify wäre... kann mich aber auch irren...

Schlimbo

Das wäre mir neu, dass notify ein "^" am Anfang benötigt, hab es gerade auch noch mal getestet ein notify mit
define test.ntfy notify Multimedia:.*
lässt "PCA301_Multimedia" nicht durch.

Aber egal, mit "^" funktioniert es jetzt, soll mir auch recht sein, Danke

Schlimbo

Hallo vbs,
mit dem send Befehle
set arGateway send <device> <reading>
Können ja Readings Werte gesendet werden.
Würde aber auch gerne die Möglichkeit haben beliebigen Text zu senden?
Könntest du hier noch was machen?
z.B. einen msg Befahl:
set arGateway msg <message>
Dann könnte man das Modul nicht nur als "gateway" verwenden, sondern universell nutzen und beliebige Texte senden.

vbs

Werde mal versuchen, mich die Tage dran zu setzen. Müsste man leider ein paar Kleinigkeiten für umbauen.

vbs

Habe im ersten Post eine Version mit "send_raw" angehängt.

Schlimbo

Vielen dank für die Anpassung :)
Noch einen Wunsch:
Wenn das Empfangsgerät nicht erreichbar ist versucht das Gateway ja trotzdem die Events weiter zu leiten, fände es deshalb praktisch, wenn man das Gateway mit einen PRESENCE-Gerät koppeln könnte und dann nur im falle von "present" gesendet wird.
Was hältst du davon und könntest du da noch was machen?

vbs

#11
Finde ich recht speziell und würde ich daher nicht so gern ins Modul einbauen wollen. Kannst du aber einfach mit 2-3 Zeilen Perl-Code auf deiner Seite lösen.

EDIT:
Hab es bei mir übrigens ohne sowas laufen. Wenn das Gerät nicht online ist, dann kommt es einfach nicht an.

Schlimbo

#12
Okay, das verstehe ich natürlich.
Hab es jetzt bei mir Lokal eingebaut.

Falls es jemanden interessiert hier meine Anpassungen an 98_AUTOREMOTE.pm:
--- 98_AUTOREMOTE.pm.orginal 2017-07-20 12:19:13.105394359 +0200
+++ 98_AUTOREMOTE.pm 2017-07-20 12:22:34.254961818 +0200
@@ -11,7 +11,7 @@
   $hash->{DefFn}     = "AUTOREMOTE_Define";
   $hash->{NotifyFn}  = "AUTOREMOTE_Notify";
   $hash->{SetFn}     = "AUTOREMOTE_Set";
-  $hash->{AttrList}  = "queryTimeout stateFilter $main::readingFnAttributes ttl queryTimeout";
+  $hash->{AttrList}  = "queryTimeout stateFilter $main::readingFnAttributes ttl queryTimeout presenceDevice";
}

sub AUTOREMOTE_Define($$)
@@ -35,7 +35,12 @@
     my $ttl = AttrVal($name, "ttl", 60);
     my $sender = "FHEM";
     my $header = "agent: TeleHeater/2.2.3\r\nUser-Agent: TeleHeater/2.2.3\r\nAccept: application/json";
-
+    my $presence = ReadingsVal(AttrVal($name, "presenceDevice", ""), "presence", "present");
+
+  if ($presence ne "present") {
+            Log3 $name, 5, "AUTOREMOTE: presenceDevice $presence ";
+        }
+  else {
     if ($dest =~ m{^http://}) {
         my $data = "{\"message\":\"$message\", \"sender\":\"$sender\", \"ttl\":$ttl, \"communication_base_params\":{\"type\":\"Message\", \"fallback\":false, \"via\":\"Wifi\"},\"version\":\"1.62\"}";
         Log3 $name, 5, "AUTOREMOTE: Sending direct to URL: '$dest' data: '$data'";
@@ -86,6 +91,7 @@
         HttpUtils_NonblockingGet($param);                                                                                   
     }
}
+}

sub AUTOREMOTE_SendEvent($$$$)
{


Hiermit gibt es ein neues Attribut "presenceDevice", ist es gesetzt wird nur gesendet, wenn das Angegebene Device "present" ist.

edit: Das ist natürlich nur dann sinnvoll, wenn nur ein Gerät im define eingetragen ist.

Schlimbo

Das Modul ist als "Gateway-Device" ausgelegt und sendet erst mal alle Events weiter.
Wer aber das Modul nur zum versenden manueller Nachrichten nutzen möchte kann in der 98_AUTOREMOTE.pm einfach die Zeile 12 auskommentieren:
12 | #  $hash->{NotifyFn}  = "AUTOREMOTE_Notify";
Somit ist es ein "einfaches" msg-Device.
Ich habe für jedes Android Gerät, an das ich Autoremote Nachrichten senden möchte, eine eigenes AUTOREMOTE-Device angelegt.
Zusammen mit dem Patch vom vorhergegangenen Post habe ich jetzt ein msg-Device, dass nur sendet was ich will und nur wenn das Gerät auch erreichbar ist. :)

vbs

Sorry, hatte deinen Patch nicht gesehen (ich glaube Edits lösen keine Benachrichtigungen aus). Werde ich mir angucken und gerne ins Modul übernehmen, wenn ich keine Probleme sehe.

siggi85

Hab das in der Vergangenheit mal manuell über HTTP umgesetzt, schön dass es jetzt ein Modul dafür gibt. Momentan habe ich nicht viel Zeit, aber werde das demnächst sicher mal antesten. Vorab schon mal danke für die Arbeit! :)

vbs

@Schlimbo
Hab mir den Patch angesehen und die eigentliche Filterung gefällt mir gut. Die Implementierung geht leider etwas entgegen dem eigentlich Konzept eines zentralen Gateways, da das Attribut presenceDevice nicht pro Gerät gesetzt werden kann (aber das war dir glaub ich auch schon aufgefallen).
Ich hab das grundsätzliche Filtern übernommen, aber etwas anders eingebaut, so dass man das presenceDevice in der Definition pro Gerät mitgeben kann (als weiteren Parameter separiert durch Komma). Also danke dir für Idee & erste Umsetzung!

Neue Version damit im ersten Post.

Schlimbo

Hallo vbs,
freut mich wenn ich helfen könnte. Vielen dank für die Anpassung und Integration des presenceDevice.
Ein kleiner Fehler hat sich noch eingeschlichen:
Send RAW funktionierte erst nach Anpassung der Zeile 145
von
return !AUTOREMOTE_IsPresent($hash, @toks);
auf
next if !AUTOREMOTE_IsPresent($hash, @toks);
Gruß Schlimbo

vbs

Danke für den Hinweis! Hab ich übernommen und im ersten Post geupdatet.

vbs

Sorry, ich war schlampig... nochmal einen Bug in send_raw behoben und nochmals Danke an Schlimbo...

vbs

Zitat von: ToM_ToM am 23 August 2017, 22:25:44
Hey vbs,

irgendwie verstehe ich das noch nicht. Wie kann ich denn Befehle an das Tablet senden?

Definition in FHEM:
defmod AutoRemoteGateway AUTOREMOTE https://goo.gl/L6E4M5BS:1817

Mein Tablet habe ich in der App "AsusTab" genannt.
Sobald ich nun aber den Befehl:

set AutoRemoteGateway send AususTab activateCamera

ausführen möchte, kommt die Meldung:

Device 'AususTab' has no reading 'activateCamera'!

VG, Thomas
Mit dem send-Befehl kannst du beliebige Readings versenden.

Eigentlich ist das Modul ist als Event-Gateway gedacht, also es leitet (konfigurierbar) Events an Tasker weiter. Ein Weg der Nutzung ist zB. dass du dir für dein Tablet ein Dummy in FHEM anlegst. Dann leitest du alle Events dieses Dummies an Tasker weiter (siehe ersten Post). Wenn du Aktionen auslösen willst, dann machst du das einfach auf dem Dummy, also zb "set myTablet on" oder "set myTablet brightness 150".
Dann kannst du in Tasker auf dem Tablet auf diese Events reagieren und entsprechende Aktionen auslösen (bzw. Profile aktivieren).

CoolTux

Klingt interessant, zumal man das Plugin auch in Automagic nutzen könnte. Gerade wegen dem Google Cloud Messaging (GCM). Umgekehrt geht es aber nicht, oder? So das man von unterwegs über Google Cloud Messaging (GCM) auf FHEM schalten könnte.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

cramu

Leider nicht, hier musst Du den Umweg über ein Android-Gerät im Heimnetz nehmen.
Aber schön, dass es inzwischen überhaupt ein Modul für AutoRemote gibt, musste mir da bisher mit HTTP-GET behelfen.
Vielen Dank an den Entwickler!

Gesendet von meinem Nexus 5 mit Tapatalk


vbs

Das ist ja praktisch dann, wusste nicht, dass es AutoRemote auch für AutoMagic gibt. Ich glaube umgekehrt geht mit GCM nicht. Ich denke, dass das Ziel für die GCM-Nachrichten immer ein Android-Endgerät sein muss.

cramu



Zitat von: vbs am 23 August 2017, 23:01:51Ich denke, dass das Ziel für die GCM-Nachrichten immer ein Android-Endgerät sein muss.
Nicht zwangsläufig, per Chrome werden auch andere Plattformen unterstützt, hierfür gibt es ein Addon des Entwicklers.
Aber das nützt uns nix . .


Gesendet von meinem Nexus 5 mit Tapatalk


CoolTux

Zitat von: vbs am 23 August 2017, 23:01:51
Das ist ja praktisch dann, wusste nicht, dass es AutoRemote auch für AutoMagic gibt. Ich glaube umgekehrt geht mit GCM nicht. Ich denke, dass das Ziel für die GCM-Nachrichten immer ein Android-Endgerät sein muss.

Naja nicht direkt für. Automagic kann eigentlich alle Plugins verwenden sie unter Tasker auch gehen.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ToM_ToM

Hallo vbs, könntest du vielleicht mal bitte in komplettes Beispiel posten?
Irgendwie verstehe ich die Verbindung noch nicht ganz.

defmod AutoRemoteGateway AUTOREMOTE https://goo.gl/L6E4M5BS:1817,.*,AsusTab

defmod AsusTabDummyForAutoRemote dummy
attr AsusTabDummyForAutoRemote DbLogExclude .*
attr AsusTabDummyForAutoRemote event-on-update-reading .*
attr AsusTabDummyForAutoRemote readingList camera
attr AsusTabDummyForAutoRemote setList camera:activate,deactivate


Wenn ich jetzt

set AsusTabDummyForAutoRemote camera activate

ausführe, passiert erst mal nichts.

PS: Ich verwende aktuell die AutoRemote Lite.

VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

CoolTux

Hallo Thomas, Du hast aber in Tasker schon noch etwas eingerichtet was Deinen FHEM Befehl dann auch umsetzt?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ToM_ToM

Hallo CoolTux,

ja in Tasker habe ich ein Profil definiert welches als Plugin Event AutoRemoteLite verwendet und als Filtertext hatte ich jetzt nur "activate" eingegeben.
Keine Ahnung ob das korrekt ist. Ich sehe aber auch in FHEM EventMonitor und auch im AutoRemote EventMonitor keine Events.

VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

vbs

Das erste Problem scheint zu sein, dass du keine Events im FHEM-EventMonitor siehst. Das muss auf jeden Fall erstmal klappen.

Ich hab mal im ersten Post versucht, ein Beispiel zusammen zu schreiben. Ist etwas mit der heißen Nadel gestrickt, ich kann also nicht garantieren, dass das 100% 1:1 so zu funktioniert. Aber ich denke, man kann mindestens das Vorgehen nachvollziehen.

ToM_ToM

Hey vbs,

das ist ein gutes Beispiel. Ich werde das heute Abend direkt mal ausprobieren.

Vielen Dank dafür.
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

ToM_ToM

Hallo vbs,

habe das jetzt getestet, aber bei mir will das nicht.

Sobald ich in meinem Dummy ein Event auslöse, bekommt mein RemoteGateway ein Event welches Ok zurück gibt, was ja schon mal gut ist.
Dem Tablet interessiert das aber nicht. Weder Tasker reagiert, noch zeig der Eventlog von der Autoremote irgendetwas an.

Ich denke, mein Fazit wird sein, mir nun doch mal Automagic und AMAD anzusehen.

Trotzdem vielen Dank!

VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

Schlimbo

Wenn du Nachricht direkt übers LAN auf dem Androiden empfangen willst musst du sicherstellen, dass dort auch der AutoRemote Wifi service läuft.
Der muss nämlich erst über einen Task gestartet werden.
Plugin --> AutoRemote --> Wifi

AlexBV

Hallo zusammen,

kann Mal jemand bestätigen, dass das Modul noch funktionsfähig ist? Über die URL aus der AutoRemote App kann ich einwandfrei Nachrichten an mein Handy senden. Über FHEM geht gar nichts. Die Definition ist wie folgt:


defmod arGateway AUTOREMOTE tu4VAuz5r5JPnlo,.*temp.*



vbs

Ja, Modul ist bei mir weiterhin im Einsatz. Ich würde mal ins (verbose-)Log gucken.

AlexBV

Einfacher aber guter Hinweis. Ich hatte schlichtweg den falschen Schlüssel  ::)

Sehr schönes Modul. Jetzt weiß ich unterwegs, was Zuhause los ist  ;D

AlexBV

Hi,

ich habe festgestellt, dass der stateFilter anders funktioniert, als der Filter-Parameter in der Definition. Mein Filter lautet:

(Esp32.*temp|Helligkeit|Sunset).*

In der Definition funktioniert er einwandfrei, aber als stateFilter nur sporadisch. Insbesondere das Esp32.*temp macht hier Probleme. Könnte hier noch ein Bug sein oder ist es grundsätzlich beabsichtigt, dass der Filter-Parameter und stateFilter unterschiedlich funktionieren?

vbs

Klar, ein Bug ist nicht ausgeschlossen. Aber eigentlich münden beide Varianten im gleichen Code und *sollten* sich daher auch identisch verhalten. Ich kann da nur wieder aufs Log verweisen (ins Log zu gucken ist immer eine gute Idee). Dort kannst du sehen, welcher Filter mit welchem Ergebnis verwendet wurde.
Wenn ich was dazu soll, dann bitte auch hier posten mit einem List des Devices.

AlexBV

Hi,

ich habe mir jetzt das Log mit Verbose 5 näher angesehen. In deinem Modul und dem Regex sieht alles gut aus. Ich vermute eher ein Performanceproblem. Die notify Loop scheint manchmal unterbrochen zu werden, wenn mehrere MQTT Messages gleichzeitig eintreffen. Das ist bei mir beim Filter "Esp32.*temp.*" der Fall. Nach der Temperatur kommt noch Luftdruck und die rel. Luftfeuchtigkeit. Die auf die Temperatur folgende Nachricht unterbricht manchmal die Notify Loop der Temperatur-Message, so dass alte Events nicht weiter verarbeitet werden, was wiederum erklärt, warum manche Temperatur-Events bei mir nicht übermittelt werden.

Leider habe ich aktuell keine Lösung des Problems.

vbs

Eigentlich sollte da in FHEM nichts verloren gehen. Da FHEM intern single-threaded ist, verbleiben unverarbeitete Daten einfach in den IO-Buffern, bis sie verarbeitet werden. Ich würde erstmal gucken, ob wirklich alle MQTT-Daten auch zu FHEM-Events werden per Event-Monitor, aber das hast du ja wahrscheinlich schon gemacht? Wenn da Daten fehlen, dann ist da irgendwo ein Bug mMn. Sowas darf nicht passieren.

AlexBV

Hi,

ziemlich sicher ist es kein Thema deines Moduls. Ich habe festgestellt, dass auch ein ganz normales Notify bei meinen Esp32-Events (MQTT-Messages) nicht auslöst, obwohl sie im Event Monitor angezeigt werden. Das ist mir bisher nicht aufgefallen, da keine solchen Notifys angelegt waren.

Nachdem ich Megabytes an Logs durchgesucht habe, ist meine Geduld auch am Ende. Ich versuche mir einen Workaraund mit doif o.ä. zu basteln.

vbs

Zitat von: AlexBV am 07 Oktober 2019, 17:21:40
Ich habe festgestellt, dass auch ein ganz normales Notify bei meinen Esp32-Events (MQTT-Messages) nicht auslöst, obwohl sie im Event Monitor angezeigt werden. Das ist mir bisher nicht aufgefallen, da keine solchen Notifys angelegt waren.
Also Events, die im Event-Monitor auftauchen aber trotzdem das notify nicht triggern, halte ich eigentlich für eher unwahrscheinlich. Ist das evtl. doch irgendwas blödes drum herum? Passiert ja immer mal...
Ansonsten, wenn das wirklich so sein sollte, dann ist das mMn ein Bug ziemlich tief drin in FHEM. Ist natürlich nie auszuschließen. Aber da notify so verbreitet ist, einfach unwahrscheinlich.

Aber das müsstest du doch recht einfach mit einem Test-notify, welches eine Logzeile erzeugt (bzw. im Fehlerfall dann eben auch nicht) belegen können. Also man sieht das Event im Event-Monitor, man sieht die Definition deines notify-Devices und man sieht im Log, dass es nicht getriggert hat? Mit dem Befehl "trigger" kannst du ja auch testweise beliebige Events erzeugen.