Neues Modul: FHEM als Websocket-Client mit Pushbullet bzw. IFTTT-Maker

Begonnen von _Markus_, 14 September 2015, 15:06:43

Vorheriges Thema - Nächstes Thema

_Markus_

Hallo zusammen,

vorerst: Ich bin kein wissender FHEM Modul-Entwickler. Was folgt ist meine laienhafte Ausarbeitung der letzten zwei Tage.

Ich habe bei mir zu Hause die Situation, dass ich hinter einem Unitymedia DS Lite Anschluss sitze, was es mir schwer macht Automation (z.B. IFTTT) über externe Devices (z.B. Handy) zu realisieren. Das Senden von Location-based E-Mails hat mir nicht so recht zugesagt, da gefühlt eher unsicher.

Daher bin ich zu einer Lösung gekommen, die FHEM mit einem beliebigen Websocket verbindet, auf diesem horcht und events an diesen schickt. Events können auf dem Websocket ausgewertet werden. FHEM Befehle, die an den Websocket geschickt werden, werden im FHEM ausgeführt. Sowohl Events, als auch eingehende Commands sind per Regex filterbar. Alles ist in einem Modul gekapselt.

Da mir kein geeigneter Websocket im Internet zu Hand war, der auch gut mit IFTTT kommunizieren kann, habe ich das Modul auf Pushbullet (JSON via Websocket) erweitert. Mein Modul nutzt dazu das schon existierende Pushbullet Modul. Nun kann ich Events (Device:State) and Pushbullet schicken und Commands (set device state) via Pushbullet an FHEM.

Leider kann FHEM nun noch immer nicht direkt mit IFTTT sprechen, da letzteres nicht auf Pushbullet mitlesen kann. Daher habe ich mein Modul weiter erweitert, so dass es nun auch den Maker-Channel (HTTP-POST) von IFTTT bedienen kann.

Mit diesem Setup kann ich nun recht komfortabel gefilterte Events an IFTTT schicken und wieder zurück (über Pushbullet) an FHEM - und habe so alle IFTTT Rezepte verfügbar : )

Das Modul findet ihr angehängt. Natürlich könnte man die einzelnen Funktionalitäten noch in verschiedene Module auslagern - aktuell ist es eher ein proof of concept. Außerdem ist der Name mittlerweile irreführend... Drei Module à la Websocket_Client, IFTTT_Maker und Pushbullet_IO wären sicher gut - wenn jemand sich berufen fühlt, würde es mich freuen!

Das Websocket_Client device legt ihr wie folgt an:

define t Websocket_Client wss://echo.websocket.org

attr t filter_recv_args ^(off|on)$
attr t filter_recv_cmds set
attr t filter_recv_devices ^(Bar|Esszimmer)$

attr t filter_notify_devices Bar
attr t filter_notify_events ^off$|^on$

attr t send_method websocket


Das device t schickt events, die mit den Attributen filter_notify_devices und filter_notify_events gefiltert sind an den Websocket. Alles was vom Websocket kommt und entsprechend durch die regulären Ausdrücke von filter_recv_cmds, filter_recv_devices und filter_recv_args läuft, wird ausgeführt. Mit dieser Konfiguration werden Plain-Text Nachrichten ausgetauscht.

Um den Pushbullet-Websocket zu nutzen ist die Konfiguration folgendermaßen zu ändern/erweitern:

define t Websocket_Client wss://stream.pushbullet.com/websocket/<accessToken>

attr t filter_recv_args ^(off|on)$
attr t filter_recv_cmds set
attr t filter_recv_devices ^(Bar|Esszimmer)$

attr t filter_notify_devices Bar
attr t filter_notify_events ^off$|^on$

attr t pushbullet_accessToken <accessToken>
attr t pushbullet_device "" # default: empty string = all devices
attr t pushbullet_title FHEM Event # default
set t pushbullet on

attr t send_method pushbullet


Nachrichten werden jetzt im JSON Format an Pushbullet geschickt. Tatsächlich geschieht die Kommunikation über HTTP Calls im Pushbullet.pm Modul. Allerdings wird auf dem Pushbullet-Websocket auf eingehende tickles (Nachrichtenhinweise) gehorcht. Diese triggern dann den HTTP GET Call um den Nachrichten-Stream (Pushes) von Pushbullet abzurufen.

Um nun Maker ins Spiel zu holen ist die Konfiguration folgendermaßen zu ändern/erweitern:

define t Websocket_Client wss://stream.pushbullet.com/websocket/<accessToken>

attr t filter_recv_args ^(off|on)$
attr t filter_recv_cmds set
attr t filter_recv_devices ^(Bar|Esszimmer)$

attr t filter_notify_devices Bar
attr t filter_notify_events ^off$|^on$

attr t pushbullet_accessToken <accessToken>
set t pushbullet on

attr t maker_key <maker_key>
attr t maker_event fhem_event # Präfix des Event namen: "fhem_event_device_state". Das Event hat den Body: {value1: "Device:State", value2: "Device", value3: "State" }
set t maker on

attr t send_method maker


Nachrichten werden nun an IFTTT-Maker geschickt. Trotzdem horcht das Modul noch auf Pushbullet und holt die Nachrichten ab, die dort eingehen. Ein IFTTT Rezept sieht also bspw. wie folgt aus: Maker<fhem_event_Bar_on> -> Pushbullet<set Bar2 on>

Damit das ganze funktioniert, musste ich das DevIO Modul leicht anpassen (vielleicht aus Unwissenheit). Es konnte m.E. noch nicht mit verschlüsselten TCP Ports sprechen. Daher habe ich in Zeile 239 wie folgt geändert:

my $conn;
my $port = $2;
    if($port eq "443") {
require IO::Socket::SSL;
$conn = IO::Socket::SSL->new(PeerAddr => $dev, Timeout => $timeout);
} else {
$conn = IO::Socket::INET->new(PeerAddr => $dev, Timeout => $timeout);
}


Ich würde mich über Verbesserungsvorschläge freuen! Sehr viel Zeit zum Anpassen, Ändern, Supporten habe ich leider nicht, daher schreibt Änderungsvorschläge am besten direkt in Perl ; )

Viele Grüße
Markus!

P.S.: Vermutlich gehört der Thread in das Developers Forum. Darauf habe ich aber keine Schreibrechte.
P.P.S.: Wenn gewünscht, würde ich das Modul maintainen, beschreiben, Wiki-Seite erstellen, etc.

_Markus_

Habe noch eine neue Version mit asynchronen Aufrufen und keineren Bug-Fixes angehängt.

VG

Kai-Alfonso

ich hätte ein starkes Interesse, wenn Du das Modul maintainen und ein Wiki erstellen könntest
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

rretsiem

Ich schließe mich dem Wunsch von Kai-Alfonso mal an, das hört sich alles schon sehr gut an.
Gibt es dazu Updates, wird das irgendwo gepflegt?

febus

Ich würde mir auch wünschen, dass das Modul maintained wird! Danke für die Arbeit! Marc

Viele Grüße,
Marc


juergen012

Fhem unter Proxmox

FitzZZ


_Markus_

Hi, jep noch aktiv : )

Wäre prima, wenn du es mal testest. Bei mir läuft das Modul seit einige Zeit durch.

Kai-Alfonso

könntest Du vielleicht ein Wiki Artikel und/oder ein genaueres HowTo beisteuern? Werd aus dem da oben nicht ganz so schlau
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

hartenthaler

Spannend! Ich habe mich mal auf meinem RaspberryPi ans Nachvollziehen gemacht. Als erstes musste ich drei Pakete nachinstallieren:

  • HTTP::Async
  • Sub::ScopeFinalizer
  • Protocol::WebSocket::Handshake::Client

Ich bekomme nun die folgenden Meldungen im Logfile, also wird zumindest der Pushbullet-Herzschlag empfangen (das sollte aber besser nicht zu Logfile-Einträgen führen):

2016.04.02 16:28:51 3: Incoming Message: {"type": "nop"}
2016.04.02 16:28:51 2: Incoming message ("{"type": "nop"}") must have at least three segments: <cmd> <device> <arg>

Es gibt ziemlich häufige Meldungen "disconnect"/"reappared". Warum weiß ich nicht.

Aber es erscheint keine Meldung im Logfile und auch keine Aktion, wenn ich von einem anderen Gerät aus eine pushbullet-Nachricht etwa mit "set HUEDevice8 on" an alle absetze. Was ich einmal gefunden habe, war die Meldung:
Incoming Message: {"type": "tickle", "subtype": "push"}

Allerdings erscheint in der pushbullet-Verwaltung auch kein Device, das mein raspberrypi/fhem sein könnte. Muss ich irgendwie so ein Device erzeugen?
Die maker/IFTTT/pushbullet-Kopplung habe ich noch nicht in Angriff genommen.

In fhem bekomme ich als list-Ausgabe (3 mal den key durch xxx ersetzt):

Internals:
   DEF        wss://stream.pushbullet.com/websocket/xxx
   DeviceName stream.pushbullet.com:443
   FD         15
   Interval   300
   NAME       PushBulletSocket1
   NR         128
   NTFY_ORDER 50-PushBulletSocket1
   PARTIAL
   STATE      opened
   TYPE       Websocket_Client
   url        wss://stream.pushbullet.com/websocket/xxx
   Readings:
     2016-04-02 16:53:16   state           opened
   Events:
     HUEDevice10:off 1459550911.80397
     HUEDevice1:off 1459604013.674
     HUEDevice1:on 1459604010.14543
     HUEDevice2:off 1459550569.66576
     HUEDevice4:off 1459550569.84328
     HUEDevice5:off 1459550569.7829
     HUEDevice8:off 1459608806.57366
     HUEDevice8:on 1459608804.26347
Attributes:
   filter_notify_devices HUEDevice
   filter_notify_events ^off$|^on$
   filter_recv_args ^(off|on)$
   filter_recv_cmds set
   filter_recv_devices ^(HUEDevice8)$
   pushbullet_accessToken xxx
   pushbullet_title FHEM
   room       Server
   send_method pushbullet

Es scheinen Events beim Schalten von Lampen registriert worden zu sein, aber es ist keine pushbullet-Nachricht raus gegangen. Woran kann es noch hapern?
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

hartenthaler

Aha. Habe doch noch etwas gefunden: In der Anleitung steht:
set t pushbullet on
Aber das muss wohl so heißen:
attr t pushbullet 1
Nun gehen die Nachrichten per pushbullet sofort raus, wenn ich an einer HUEDevice rumschalte. Und schalten kann ich über pushbullet nun auch. Kleine Ursache - große Wirkung. Geniales Modul! Danke.

Nun geht es an den letzten Schritt, die Kopplung mit IFTTT.
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

Murdock

Hallo zusammen,

Gibt es mittlerweile schon ein Wiki mit einer verständlichen Anleitung ? Ich habe mir hier alles gut durchgelesen und auch so einiges getestet. Die Module hochgeladen und auch die fhem.cfg entsprechend installiert. Auch den access token habe ich von Pushbullet bekommen...trotz allem bekomme ich am ende nur eine Fehlermeldung:

"Cannot load module Websocket_Client Please define t first"

Ich komme leider mit meinem "Halbwissen" hier, wie wohl einige andere, nicht entsprechend weiter. Vielleicht hat ja hjemand eine Anleitung für "Halbwissende" ;-)

Ich habe einen Amazon Echo, welchen ich zu Sprachsteuerung für fhem benutze. Das Teil ist wirklich super. Um aber mit fhem zu kommunizieren sind zur Zeit folgende Schritte nötig:

Amazon Echo (Spracheingabe) > IFTTT (Pushbullet Chanel) > Pushbullet (Android Tablet) > Tasker > andFhem Plugin (Tasker) > fhem

Das kommt oft nur sehr zeitverzögert an, kann sogar mal bis zu 10 Sekunden dauern. Also keine zufriedenstellende Lösung.
Deswegen möchte ich abkürzen und ab IFTTT direkt zu fhem übergeben. Das scheint dieses coole Modul wohl hinzubekommen.
Ich bin wirklich nicht auf den Kopf gefallen, aber eine etwas einfachere Anleitung wäre echt Nice, weil ich voll Bock habe das Modul auch benutzen zu können. Vielleicht kann ja jemand etwas helfen.

8)

Danke im vorraus

VG
fhem auf Raspberry PI  3 - V3 Cul 868 MHZ - V3 Cul433 MHZ - Jeelink 868MHZ - HMMLan - Gigaset G Tag - Nut LT-BT

hartenthaler

#13
Hallo Murdock,
wenn Du eine Fehlermeldung bei define t Websocket_Client wss://stream.pushbullet.com/websocket/<accessToken>
erhältst, dann fehlt eventuell noch eine Voraussetzung. Ich nutze als Plattform einen Raspberrypi und da musste ich zuvor noch drei Module installieren, die in meinem Beitrag oben stehen. Und natürlich das neue  websocket-client-Modul von Markus. Und ich musste auch DevIo so anpassen wie Markus es beschrieben hat. Das ist unschön, weil man dann dieses Standard-Modul aus den automatischen Updates herausnehmen muss, aber das ist halt Stand der Entwicklung.

Siehst Du im fhem Logfile noch weitere Meldungen?

fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

Murdock

Hallo hartenthaler,

danke für deine Antwort.

Ich nutze fhem auch auf dem PI 3. Ich muß also 3 Module bei nachinstallieren, oder sind es Pakete auf dem Pi, so wie du es am 02.04. schreibst ?

Ich nehme an Module, weil ich gerade nach weiteren Tests folgende Fehlermeldung bekommen habe:

Can't locate HTTP/Async.pm in @INC (you may need to install the HTTP::Async module) (@INC contains: /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.20.2 /usr/local/share/perl/5.20.2 /usr/lib/arm-linux-gnueabihf/perl5/5.20 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.20 /usr/share/perl/5.20 /usr/local/lib/site_perl . ./FHEM) at ./FHEM/00_Websocket_Client.pm line 12.
BEGIN failed--compilation aborted at ./FHEM/00_Websocket_Client.pm line 12.


Wo bekomme ich denn die 3 Module her bzw. wo kann ich Sie in der richtigen Version herunterladen ?

Du schreibst ich muß ich muß das DevIo anpassen. Ich habe im DevIo.pm die Zeile:
my $conn = IO::Socket::INET->new(PeerAddr => $dev, Timeout => $timeout);
Durch Markus Zeilen ersetzt:

my $conn;
   my $port = $2;
    if($port eq "443") {
      require IO::Socket::SSL;
      $conn = IO::Socket::SSL->new(PeerAddr => $dev, Timeout => $timeout);
   } else {
      $conn = IO::Socket::INET->new(PeerAddr => $dev, Timeout => $timeout);
   }


Wie kann ich diese aus den automatischen Updates herausnehmen, da diese zwischenzeitlich durch ein Update schon wieder in die alte Version zurück versetzt wurde ?

Ich glaube das sind erstmal genug Fragen  :) Ich warte jetzt erstmal gespannt auf eine Antwort und versuche dann wieder ein Stück weiter zukommen.

Danke
fhem auf Raspberry PI  3 - V3 Cul 868 MHZ - V3 Cul433 MHZ - Jeelink 868MHZ - HMMLan - Gigaset G Tag - Nut LT-BT