[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.